Merge "Maintenance script for exporting site definitions"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Fri, 20 Feb 2015 11:16:18 +0000 (11:16 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Fri, 20 Feb 2015 11:16:18 +0000 (11:16 +0000)
599 files changed:
.jscsrc
Gruntfile.js
RELEASE-NOTES-1.25
autoload.php
composer.json
docs/extension.schema.json
docs/hooks.txt
docs/kss/Makefile
docs/kss/README.txt
docs/kss/styleGuideModules.txt [new file with mode: 0644]
docs/mwlogger.txt
img_auth.php
includes/CategoryViewer.php
includes/ChangeTags.php
includes/DefaultSettings.php
includes/Defines.php
includes/EditPage.php
includes/Feed.php
includes/GlobalFunctions.php
includes/Html.php
includes/Import.php
includes/Linker.php
includes/MediaWiki.php
includes/Message.php
includes/NoLocalSettings.php [new file with mode: 0644]
includes/OutputPage.php
includes/Preferences.php
includes/ProtectionForm.php
includes/Revision.php
includes/Sanitizer.php
includes/Setup.php
includes/Status.php
includes/TemplateParser.php [new file with mode: 0644]
includes/Title.php
includes/User.php
includes/UserRightsProxy.php
includes/WebStart.php
includes/actions/HistoryAction.php
includes/actions/InfoAction.php
includes/api/ApiCheckToken.php [new file with mode: 0644]
includes/api/ApiEditPage.php
includes/api/ApiFeedContributions.php
includes/api/ApiMain.php
includes/api/ApiManageTags.php [new file with mode: 0644]
includes/api/ApiPageSet.php
includes/api/ApiQueryBlocks.php
includes/api/ApiQueryInfo.php
includes/api/ApiQueryLogEvents.php
includes/api/ApiQueryRevisionsBase.php
includes/api/ApiQuerySearch.php
includes/api/ApiQuerySiteinfo.php
includes/api/ApiQueryStashImageInfo.php
includes/api/ApiQueryTags.php
includes/api/ApiQueryUserInfo.php
includes/api/ApiUpload.php
includes/api/i18n/ar.json
includes/api/i18n/av.json [new file with mode: 0644]
includes/api/i18n/awa.json [new file with mode: 0644]
includes/api/i18n/be-tarask.json
includes/api/i18n/bn.json [new file with mode: 0644]
includes/api/i18n/ca.json
includes/api/i18n/cs.json
includes/api/i18n/de.json
includes/api/i18n/en-gb.json
includes/api/i18n/en.json
includes/api/i18n/es.json
includes/api/i18n/eu.json
includes/api/i18n/fa.json
includes/api/i18n/fr.json
includes/api/i18n/frc.json
includes/api/i18n/gl.json
includes/api/i18n/he.json
includes/api/i18n/ia.json
includes/api/i18n/it.json
includes/api/i18n/ja.json
includes/api/i18n/ko.json
includes/api/i18n/ksh.json
includes/api/i18n/ku-latn.json [new file with mode: 0644]
includes/api/i18n/lb.json
includes/api/i18n/ln.json [new file with mode: 0644]
includes/api/i18n/lzh.json [new file with mode: 0644]
includes/api/i18n/mk.json
includes/api/i18n/nap.json [new file with mode: 0644]
includes/api/i18n/nds.json [new file with mode: 0644]
includes/api/i18n/nl.json
includes/api/i18n/pam.json [new file with mode: 0644]
includes/api/i18n/pl.json
includes/api/i18n/pt-br.json [new file with mode: 0644]
includes/api/i18n/pt.json
includes/api/i18n/qqq.json
includes/api/i18n/ru.json
includes/api/i18n/sr-ec.json
includes/api/i18n/sv.json
includes/api/i18n/tl.json [new file with mode: 0644]
includes/api/i18n/uk.json
includes/api/i18n/vi.json
includes/api/i18n/zh-hans.json
includes/api/i18n/zh-hant.json
includes/cache/BacklinkCache.php
includes/cache/bloom/BloomFilters.php
includes/changes/RecentChange.php
includes/db/Database.php
includes/db/DatabaseMssql.php
includes/db/DatabaseMysqlBase.php
includes/db/DatabasePostgres.php
includes/db/DatabaseSqlite.php
includes/db/LoadBalancer.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/SamplingHandler.php
includes/debug/logger/monolog/Spi.php
includes/debug/logger/monolog/SyslogHandler.php [new file with mode: 0644]
includes/deferred/HTMLCacheUpdate.php
includes/deferred/LinksUpdate.php
includes/diff/DifferenceEngine.php
includes/filebackend/FileBackend.php
includes/filebackend/FileBackendStore.php
includes/filebackend/filejournal/FileJournal.php
includes/filebackend/lockmanager/LockManagerGroup.php
includes/filebackend/lockmanager/MemcLockManager.php
includes/filebackend/lockmanager/RedisLockManager.php
includes/filerepo/FileRepo.php
includes/filerepo/FileRepoStatus.php
includes/filerepo/file/ArchivedFile.php
includes/filerepo/file/File.php
includes/filerepo/file/LocalFile.php
includes/filerepo/file/UnregisteredLocalFile.php
includes/gallery/ImageGalleryBase.php
includes/htmlform/HTMLCheckField.php
includes/htmlform/HTMLCheckMatrix.php
includes/htmlform/HTMLFloatField.php
includes/htmlform/HTMLIntField.php
includes/htmlform/HTMLTagFilter.php
includes/installer/DatabaseInstaller.php
includes/installer/MysqlUpdater.php
includes/installer/PostgresUpdater.php
includes/installer/i18n/ca.json
includes/installer/i18n/eml.json [new file with mode: 0644]
includes/installer/i18n/et.json
includes/installer/i18n/fa.json
includes/installer/i18n/fi.json
includes/installer/i18n/fr.json
includes/installer/i18n/fy.json
includes/installer/i18n/gl.json
includes/installer/i18n/hu.json
includes/installer/i18n/id.json
includes/installer/i18n/it.json
includes/installer/i18n/ku-latn.json
includes/installer/i18n/lb.json
includes/installer/i18n/nap.json
includes/installer/i18n/nb.json
includes/installer/i18n/pt-br.json
includes/installer/i18n/pt.json
includes/installer/i18n/ru.json
includes/installer/i18n/sr-ec.json
includes/installer/i18n/sv.json
includes/installer/i18n/vi.json
includes/installer/i18n/zh-hant.json
includes/jobqueue/JobQueueRedis.php
includes/jobqueue/JobRunner.php
includes/jobqueue/jobs/RecentChangesUpdateJob.php [new file with mode: 0644]
includes/jobqueue/jobs/RefreshLinksJob.php
includes/jobqueue/jobs/RefreshLinksJob2.php [deleted file]
includes/jobqueue/jobs/UploadFromUrlJob.php
includes/libs/CSSMin.php
includes/libs/DeferredStringifier.php
includes/libs/ExplodeIterator.php [new file with mode: 0644]
includes/libs/MessageSpecifier.php [new file with mode: 0644]
includes/libs/ProcessCacheLRU.php
includes/libs/ReplacementArray.php [new file with mode: 0644]
includes/libs/StatusValue.php [new file with mode: 0644]
includes/libs/StringUtils.php [new file with mode: 0644]
includes/libs/normal/.gitignore [new file with mode: 0644]
includes/libs/normal/Makefile [new file with mode: 0644]
includes/libs/normal/README [new file with mode: 0644]
includes/libs/normal/RandomTest.php [new file with mode: 0644]
includes/libs/normal/UtfNormal.php [new file with mode: 0644]
includes/libs/normal/UtfNormalBench.php [new file with mode: 0644]
includes/libs/normal/UtfNormalData.inc [new file with mode: 0644]
includes/libs/normal/UtfNormalDataK.inc [new file with mode: 0644]
includes/libs/normal/UtfNormalDefines.php [new file with mode: 0644]
includes/libs/normal/UtfNormalGenerate.php [new file with mode: 0644]
includes/libs/normal/UtfNormalMemStress.php [new file with mode: 0644]
includes/libs/normal/UtfNormalTest.php [new file with mode: 0644]
includes/libs/normal/UtfNormalTest2.php [new file with mode: 0644]
includes/libs/normal/UtfNormalUtil.php [new file with mode: 0644]
includes/libs/replacers/DoubleReplacer.php [new file with mode: 0644]
includes/libs/replacers/HashtableReplacer.php [new file with mode: 0644]
includes/libs/replacers/RegexlikeReplacer.php [new file with mode: 0644]
includes/libs/replacers/Replacer.php [new file with mode: 0644]
includes/logging/LogEntry.php
includes/logging/LogFormatter.php
includes/media/FormatMetadata.php
includes/media/ImageHandler.php
includes/media/MediaTransformInvalidParametersException.php [new file with mode: 0644]
includes/normal/.gitignore [deleted file]
includes/normal/Makefile [deleted file]
includes/normal/README [deleted file]
includes/normal/RandomTest.php [deleted file]
includes/normal/Utf8Test.php [deleted file]
includes/normal/UtfNormal.php [deleted file]
includes/normal/UtfNormalBench.php [deleted file]
includes/normal/UtfNormalData.inc [deleted file]
includes/normal/UtfNormalDataK.inc [deleted file]
includes/normal/UtfNormalDefines.php [deleted file]
includes/normal/UtfNormalGenerate.php [deleted file]
includes/normal/UtfNormalMemStress.php [deleted file]
includes/normal/UtfNormalTest.php [deleted file]
includes/normal/UtfNormalTest2.php [deleted file]
includes/normal/UtfNormalUtil.php [deleted file]
includes/objectcache/APCBagOStuff.php
includes/objectcache/BagOStuff.php
includes/objectcache/EmptyBagOStuff.php
includes/objectcache/HashBagOStuff.php
includes/objectcache/MemcachedBagOStuff.php
includes/objectcache/MemcachedClient.php
includes/objectcache/MemcachedPeclBagOStuff.php
includes/objectcache/MemcachedPhpBagOStuff.php
includes/objectcache/MultiWriteBagOStuff.php
includes/objectcache/ObjectCache.php
includes/objectcache/ObjectCacheSessionHandler.php
includes/objectcache/RedisBagOStuff.php
includes/objectcache/SqlBagOStuff.php
includes/objectcache/WinCacheBagOStuff.php
includes/objectcache/XCacheBagOStuff.php
includes/page/Article.php
includes/page/ImagePage.php
includes/page/WikiPage.php
includes/parser/DateFormatter.php
includes/parser/Parser.php
includes/parser/ParserOutput.php
includes/poolcounter/PoolWorkArticleView.php
includes/profiler/Profiler.php
includes/profiler/TransactionProfiler.php
includes/registration/ExtensionProcessor.php
includes/registration/ExtensionRegistry.php
includes/resourceloader/ResourceLoader.php
includes/resourceloader/ResourceLoaderImage.php
includes/resourceloader/ResourceLoaderModule.php
includes/revisiondelete/RevDelRevisionList.php
includes/search/SearchHighlighter.php
includes/skins/QuickTemplate.php
includes/skins/Skin.php
includes/skins/SkinApiTemplate.php
includes/skins/SkinFallbackTemplate.php
includes/skins/SkinTemplate.php
includes/specials/SpecialActiveusers.php
includes/specials/SpecialAllMessages.php
includes/specials/SpecialFileDuplicateSearch.php
includes/specials/SpecialLinkSearch.php
includes/specials/SpecialLog.php
includes/specials/SpecialMediaStatistics.php
includes/specials/SpecialMovepage.php
includes/specials/SpecialNewpages.php
includes/specials/SpecialProtectedpages.php
includes/specials/SpecialProtectedtitles.php
includes/specials/SpecialRunJobs.php
includes/specials/SpecialStatistics.php
includes/specials/SpecialTags.php
includes/specials/SpecialTrackingCategories.php
includes/specials/SpecialUndelete.php
includes/specials/SpecialUpload.php
includes/specials/SpecialUploadStash.php
includes/specials/SpecialUserrights.php
includes/specials/SpecialVersion.php
includes/specials/SpecialWatchlist.php
includes/specials/SpecialWhatlinkshere.php
includes/templates/NoLocalSettings.mustache [new file with mode: 0644]
includes/templates/NoLocalSettings.php [deleted file]
includes/templates/Usercreate.php
includes/templates/Userlogin.php
includes/upload/UploadBase.php
includes/upload/UploadFromChunks.php
includes/utils/StringUtils.php [deleted file]
languages/Language.php
languages/Names.php
languages/i18n/ang.json
languages/i18n/ar.json
languages/i18n/as.json
languages/i18n/ast.json
languages/i18n/awa.json
languages/i18n/az.json
languages/i18n/azb.json
languages/i18n/bcl.json
languages/i18n/be-tarask.json
languages/i18n/be.json
languages/i18n/bg.json
languages/i18n/bgn.json
languages/i18n/bn.json
languages/i18n/bs.json
languages/i18n/ca.json
languages/i18n/ce.json
languages/i18n/ckb.json
languages/i18n/crh-cyrl.json
languages/i18n/crh-latn.json
languages/i18n/cs.json
languages/i18n/da.json
languages/i18n/de.json
languages/i18n/diq.json
languages/i18n/egl.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/fo.json
languages/i18n/fr.json
languages/i18n/frr.json
languages/i18n/fy.json
languages/i18n/gd.json
languages/i18n/gl.json
languages/i18n/gu.json
languages/i18n/he.json
languages/i18n/hi.json
languages/i18n/hif-latn.json
languages/i18n/hu.json
languages/i18n/hy.json
languages/i18n/ia.json
languages/i18n/id.json
languages/i18n/inh.json
languages/i18n/it.json
languages/i18n/ja.json
languages/i18n/ka.json
languages/i18n/kk-cyrl.json
languages/i18n/ko.json
languages/i18n/ksh.json
languages/i18n/ku-latn.json
languages/i18n/lb.json
languages/i18n/lrc.json
languages/i18n/lv.json
languages/i18n/lzh.json
languages/i18n/mg.json
languages/i18n/mk.json
languages/i18n/ml.json
languages/i18n/mr.json
languages/i18n/ms.json
languages/i18n/nap.json
languages/i18n/nb.json
languages/i18n/nds-nl.json
languages/i18n/nds.json
languages/i18n/ne.json
languages/i18n/nl.json
languages/i18n/oc.json
languages/i18n/pam.json
languages/i18n/pl.json
languages/i18n/pms.json
languages/i18n/ps.json
languages/i18n/pt-br.json
languages/i18n/pt.json
languages/i18n/qqq.json
languages/i18n/rm.json
languages/i18n/ro.json
languages/i18n/ru.json
languages/i18n/rue.json
languages/i18n/sa.json
languages/i18n/sah.json
languages/i18n/scn.json
languages/i18n/sl.json
languages/i18n/sr-ec.json
languages/i18n/sr-el.json
languages/i18n/su.json
languages/i18n/sv.json
languages/i18n/szl.json
languages/i18n/te.json
languages/i18n/th.json
languages/i18n/tl.json
languages/i18n/tr.json
languages/i18n/tt-cyrl.json
languages/i18n/uk.json
languages/i18n/ur.json
languages/i18n/uz.json
languages/i18n/vi.json
languages/i18n/vo.json
languages/i18n/xal.json
languages/i18n/yi.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
languages/messages/MessagesAce.php
languages/messages/MessagesAf.php
languages/messages/MessagesAr.php
languages/messages/MessagesArz.php
languages/messages/MessagesAst.php
languages/messages/MessagesAv.php
languages/messages/MessagesBe_tarask.php
languages/messages/MessagesBg.php
languages/messages/MessagesBgn.php [new file with mode: 0644]
languages/messages/MessagesBho.php
languages/messages/MessagesBr.php
languages/messages/MessagesBs.php
languages/messages/MessagesCa.php
languages/messages/MessagesCdo.php
languages/messages/MessagesCe.php
languages/messages/MessagesCkb.php
languages/messages/MessagesDe.php
languages/messages/MessagesDiq.php
languages/messages/MessagesEl.php
languages/messages/MessagesEo.php
languages/messages/MessagesEs.php
languages/messages/MessagesEt.php
languages/messages/MessagesFa.php
languages/messages/MessagesFi.php
languages/messages/MessagesFr.php
languages/messages/MessagesFrp.php
languages/messages/MessagesGl.php
languages/messages/MessagesHaw.php
languages/messages/MessagesHe.php
languages/messages/MessagesHi.php
languages/messages/MessagesHr.php
languages/messages/MessagesHsb.php
languages/messages/MessagesHu.php
languages/messages/MessagesId.php
languages/messages/MessagesIt.php
languages/messages/MessagesJa.php
languages/messages/MessagesKo.php
languages/messages/MessagesKsh.php
languages/messages/MessagesKw.php
languages/messages/MessagesLb.php
languages/messages/MessagesLzh.php
languages/messages/MessagesMg.php
languages/messages/MessagesMin.php
languages/messages/MessagesMk.php
languages/messages/MessagesMl.php
languages/messages/MessagesMn.php
languages/messages/MessagesMr.php
languages/messages/MessagesMs.php
languages/messages/MessagesMt.php
languages/messages/MessagesMzn.php
languages/messages/MessagesNan.php
languages/messages/MessagesNb.php
languages/messages/MessagesNds_nl.php
languages/messages/MessagesNe.php
languages/messages/MessagesNl.php
languages/messages/MessagesNn.php
languages/messages/MessagesOc.php
languages/messages/MessagesOr.php
languages/messages/MessagesPa.php
languages/messages/MessagesPl.php
languages/messages/MessagesPt.php
languages/messages/MessagesPt_br.php
languages/messages/MessagesQu.php
languages/messages/MessagesRo.php
languages/messages/MessagesRu.php
languages/messages/MessagesRue.php
languages/messages/MessagesSa.php
languages/messages/MessagesSh.php
languages/messages/MessagesSq.php
languages/messages/MessagesSr_ec.php
languages/messages/MessagesSr_el.php
languages/messages/MessagesSv.php
languages/messages/MessagesTe.php
languages/messages/MessagesTet.php
languages/messages/MessagesTly.php
languages/messages/MessagesTr.php
languages/messages/MessagesTyv.php
languages/messages/MessagesUk.php
languages/messages/MessagesUr.php
languages/messages/MessagesUz.php
languages/messages/MessagesVi.php
languages/messages/MessagesYi.php
languages/messages/MessagesZh.php
languages/messages/MessagesZh_hans.php
languages/messages/MessagesZh_hant.php
languages/messages/MessagesZh_tw.php
maintenance/Maintenance.php
maintenance/archives/patch-hitcounter.sql [deleted file]
maintenance/archives/patch-user-newtalk-userid-unsigned.sql [new file with mode: 0644]
maintenance/convertExtensionToRegistration.php
maintenance/doMaintenance.php
maintenance/eval.php
maintenance/interwiki.list
maintenance/interwiki.sql
maintenance/language/generateNormalizerDataAr.php
maintenance/language/generateNormalizerDataMl.php
maintenance/namespaceDupes.php
maintenance/postgres/tables.sql
maintenance/rebuildtextindex.php
maintenance/resources/update-oojs-ui.sh
maintenance/runJobs.php
maintenance/storage/compressOld.php
maintenance/storage/moveToExternal.php
maintenance/storage/resolveStubs.php
maintenance/tables.sql
maintenance/update.php
package.json
profileinfo.php
resources/Resources.php
resources/assets/poweredby_mediawiki_132x47.png [new file with mode: 0644]
resources/assets/poweredby_mediawiki_176x62.png [new file with mode: 0644]
resources/lib/jquery/jquery.qunit.css [deleted file]
resources/lib/jquery/jquery.qunit.js [deleted file]
resources/lib/oojs-ui/i18n/awa.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/bn.json
resources/lib/oojs-ui/i18n/ce.json
resources/lib/oojs-ui/i18n/eu.json
resources/lib/oojs-ui/i18n/ko.json
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 [deleted file]
resources/lib/oojs-ui/oojs-ui.js
resources/lib/oojs/oojs.jquery.js
resources/lib/qunitjs/qunit.css [new file with mode: 0644]
resources/lib/qunitjs/qunit.js [new file with mode: 0644]
resources/src/jquery/jquery.badge.js
resources/src/jquery/jquery.client.js
resources/src/jquery/jquery.confirmable.js
resources/src/jquery/jquery.confirmable.mediawiki.js
resources/src/jquery/jquery.getAttrs.js
resources/src/jquery/jquery.makeCollapsible.css
resources/src/jquery/jquery.mwExtension.js
resources/src/jquery/jquery.placeholder.js
resources/src/jquery/jquery.tablesorter.js
resources/src/jquery/jquery.textSelection.js
resources/src/mediawiki.action/mediawiki.action.edit.preview.js
resources/src/mediawiki.action/mediawiki.action.view.metadata.css
resources/src/mediawiki.action/mediawiki.action.view.postEdit.js
resources/src/mediawiki.api/mediawiki.api.login.js
resources/src/mediawiki.language/languages/fi.js
resources/src/mediawiki.language/languages/hsb.js
resources/src/mediawiki.language/languages/hy.js
resources/src/mediawiki.language/languages/os.js
resources/src/mediawiki.language/mediawiki.language.init.js
resources/src/mediawiki.language/mediawiki.language.js
resources/src/mediawiki.language/mediawiki.language.numbers.js
resources/src/mediawiki.legacy/ajax.js
resources/src/mediawiki.legacy/protect.js
resources/src/mediawiki.legacy/shared.css
resources/src/mediawiki.legacy/wikibits.js
resources/src/mediawiki.less/mediawiki.mixins.less
resources/src/mediawiki.less/mediawiki.ui/mixins.less
resources/src/mediawiki.page/mediawiki.page.gallery.js
resources/src/mediawiki.page/mediawiki.page.image.pagination.js
resources/src/mediawiki.skinning/content.css
resources/src/mediawiki.skinning/elements.css
resources/src/mediawiki.special/mediawiki.special.pageLanguage.js
resources/src/mediawiki.special/mediawiki.special.preferences.js
resources/src/mediawiki.special/mediawiki.special.upload.js
resources/src/mediawiki.special/mediawiki.special.userlogin.common.js
resources/src/mediawiki.ui/components/checkbox.less
resources/src/mediawiki.ui/components/inputs.less
resources/src/mediawiki/mediawiki.Title.js
resources/src/mediawiki/mediawiki.cookie.js
resources/src/mediawiki/mediawiki.inspect.js
resources/src/mediawiki/mediawiki.jqueryMsg.js
resources/src/mediawiki/mediawiki.js
resources/src/mediawiki/mediawiki.sectionAnchor.css [new file with mode: 0644]
resources/src/mediawiki/mediawiki.sectionAnchor.hide.css [new file with mode: 0644]
resources/src/mediawiki/mediawiki.startUp.js [new file with mode: 0644]
resources/src/mediawiki/mediawiki.user.js
resources/src/mediawiki/mediawiki.util.js
tests/parser/parserTests.txt
tests/phpunit/MediaWikiTestCase.php
tests/phpunit/bootstrap.php
tests/phpunit/data/normal/UTF-8-test.txt [new file with mode: 0644]
tests/phpunit/includes/GlobalFunctions/GlobalTest.php
tests/phpunit/includes/GlobalFunctions/wfThumbIsStandardTest.php [new file with mode: 0644]
tests/phpunit/includes/LinkerTest.php
tests/phpunit/includes/MovePageTest.php
tests/phpunit/includes/StatusTest.php
tests/phpunit/includes/TemplateParserTest.php [new file with mode: 0644]
tests/phpunit/includes/TitlePermissionTest.php
tests/phpunit/includes/api/ApiTestCaseUpload.php
tests/phpunit/includes/api/ApiUploadTest.php
tests/phpunit/includes/filebackend/FileBackendTest.php
tests/phpunit/includes/filerepo/StoreBatchTest.php
tests/phpunit/includes/libs/CSSMinTest.php
tests/phpunit/includes/libs/DeferredStringifierTest.php
tests/phpunit/includes/libs/ProcessCacheLRUTest.php
tests/phpunit/includes/libs/StringUtilsTest.php [new file with mode: 0644]
tests/phpunit/includes/libs/normal/CleanUpTest.php [new file with mode: 0644]
tests/phpunit/includes/libs/normal/Utf8Test.php [new file with mode: 0644]
tests/phpunit/includes/media/MediaHandlerTest.php
tests/phpunit/includes/normal/CleanUpTest.php [deleted file]
tests/phpunit/includes/parser/NewParserTest.php
tests/phpunit/includes/registration/ExtensionProcessorTest.php
tests/phpunit/includes/registration/ExtensionRegistryTest.php [new file with mode: 0644]
tests/phpunit/includes/upload/UploadBaseTest.php
tests/phpunit/includes/utils/StringUtilsTest.php [deleted file]
tests/phpunit/maintenance/backupTextPassTest.php
tests/phpunit/suite.xml
tests/qunit/QUnitTestResources.php
tests/qunit/suites/resources/jquery/jquery.accessKeyLabel.test.js
tests/qunit/suites/resources/jquery/jquery.placeholder.test.js
tests/qunit/suites/resources/jquery/jquery.tablesorter.parsers.test.js [new file with mode: 0644]
tests/qunit/suites/resources/jquery/jquery.tablesorter.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.Title.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.cookie.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.language.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.user.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.util.test.js
thumb.php

diff --git a/.jscsrc b/.jscsrc
index 2ebd40e..98b81db 100644 (file)
--- a/.jscsrc
+++ b/.jscsrc
@@ -1,8 +1,7 @@
 {
        "preset": "wikimedia",
 
-       "disallowKeywordsOnNewLine": null,
        "disallowQuotedKeysInObjects": null,
-       "requireSpacesInsideArrayBrackets": null,
-       "validateIndentation": null
+       "requireSpacesInsideParentheses": null,
+       "requireSpacesInsideArrayBrackets": null
 }
index 9cf89d0..e432279 100644 (file)
@@ -8,7 +8,10 @@ module.exports = function ( grunt ) {
        grunt.loadNpmTasks( 'grunt-karma' );
 
        var wgServer = process.env.MW_SERVER,
-               wgScriptPath = process.env.MW_SCRIPT_PATH;
+               wgScriptPath = process.env.MW_SCRIPT_PATH,
+               karmaProxy = {};
+
+       karmaProxy[wgScriptPath] = wgServer + wgScriptPath;
 
        grunt.initConfig( {
                pkg: grunt.file.readJSON( 'package.json' ),
@@ -18,7 +21,7 @@ module.exports = function ( grunt ) {
                        },
                        all: [
                                '*.js',
-                               '{includes,languages,resources,skins,tests}/**/*.js'
+                               '{includes,languages,resources,tests}/**/*.js'
                        ]
                },
                jscs: {
@@ -62,27 +65,7 @@ module.exports = function ( grunt ) {
                },
                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;
-                               }() ),
+                               proxies: karmaProxy,
                                files: [ {
                                        pattern: wgServer + wgScriptPath + '/index.php?title=Special:JavaScriptTest/qunit/export',
                                        watched: false,
index 76295a9..67a32ec 100644 (file)
@@ -36,6 +36,15 @@ production.
 * 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.
+* Default value of $wgSVGConverters['rsvg'] now uses the 'rsvg-convert' binary
+  rather than 'rsvg'.
+* Default value of $wgSVGConverters['ImageMagick'] now uses transparent
+  background with white fallback color, rather than just white background.
+ * MediaWikiBagOStuff class removed, make sure any object cache config
+   uses SqlBagOStuff instead.
+* The 'daemonized' flag must be set to true in $wgJobTypeConf for any redis
+  job queues. This means that mediawiki/services/jobrunner service has to
+  be installed and running for any such queues to work.
 
 === New features in 1.25 ===
 * (T64861) Updated plural rules to CLDR 26. Includes incompatible changes
@@ -77,9 +86,23 @@ production.
 * 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.
+  they will add the proper credits to the skins or extensions section. They
+  can also be accessed through the API via the new siprop=libraries to
+  ApiQuerySiteInfo.
 * Update QUnit from v1.14.0 to v1.16.0.
 * Update Moment.js from v2.8.3 to v2.8.4.
+* Special:Tags now allows for manipulating the list of user-modifiable change
+  tags. Actually modifying the tagging of a revision or log entry is not
+  implemented yet.
+* Added 'managetags' user right and 'ChangeTagCanCreate', 'ChangeTagCanDelete',
+  and 'ChangeTagCanCreate' hooks to allow for managing user-modifiable change
+  tags.
+* Added 'ChangeTagsListActive' hook, to separate the concepts of "defined" and
+  "active" formerly conflated by the 'ListDefinedTags' hook.
+* Added TemplateParser class that provides a server-side interface to cachable
+  dynamically-compiled Mustache templates (currently uses lightncandy library).
+* Clickable anchors for each section heading in the content are now generated
+  and appear in the gutter on hovering over the heading.
 
 ==== External libraries ====
 * MediaWiki now requires certain external libraries to be installed. In the past
@@ -93,7 +116,7 @@ production.
 * The following libraries are now required:
 ** 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 interally by the MWLogger class.
+   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
@@ -128,6 +151,13 @@ production.
   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
+* (T86974) Several Title methods now load from the database when necessary
+  (instead of returning incorrect results) even when the page ID is known.
+* (T74070) Duplicate search for archived files on file upload now omits the extension.
+  This requires the fa_sha1 field being populated.
 
 === Action API changes in 1.25 ===
 * (T67403) XML tag highlighting is now only performed for formats
@@ -181,6 +211,15 @@ production.
   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.
+* Added action=managetags to allow for managing the list of
+  user-modifiable change tags. Actually modifying the tagging of a revision or
+  log entry is not implemented yet.
+* list=tags has additional properties to indicate 'active' status and tag
+  sources.
+* siprop=libraries was added to ApiQuerySiteInfo to list installed external libraries.
+* (T88010) Added action=checktoken, to test a CSRF token's validity.
+* (T88010) Added intestactions to prop=info, to allow querying of
+  Title::userCan() via the API.
 
 === Action API internal changes in 1.25 ===
 * ApiHelp has been rewritten to support i18n and paginated HTML output.
@@ -247,7 +286,7 @@ 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' and 'wgFileExtensions' now only
+* Javascript variables '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.
@@ -316,6 +355,11 @@ changes to languages because of Bugzilla reports.
       $form->setDisplayFormat( 'vform' ); // throws exception
     Instead, do this:
       $form = HTMLForm::factory( 'vform', … );
+* Deprecated Revision methods getRawUser(), getRawUserText() and getRawComment().
+* BREAKING CHANGE: mediawiki.user.generateRandomSessionId:
+  The alphabet of the prior string returned was A-Za-z0-9 and now it is 0-9A-F
+* (T87504) Avoid serving SVG background-images in CSS for Opera 12, which
+  renders them incorrectly when combined with border-radius or background-size.
 
 == Compatibility ==
 
index 4b28966..4131c71 100644 (file)
@@ -18,6 +18,7 @@ $wgAutoloadLocalClasses = array(
        'AnsiTermColorer' => __DIR__ . '/maintenance/term/MWTerm.php',
        'ApiBase' => __DIR__ . '/includes/api/ApiBase.php',
        'ApiBlock' => __DIR__ . '/includes/api/ApiBlock.php',
+       'ApiCheckToken' => __DIR__ . '/includes/api/ApiCheckToken.php',
        'ApiClearHasMsg' => __DIR__ . '/includes/api/ApiClearHasMsg.php',
        'ApiComparePages' => __DIR__ . '/includes/api/ApiComparePages.php',
        'ApiCreateAccount' => __DIR__ . '/includes/api/ApiCreateAccount.php',
@@ -51,6 +52,7 @@ $wgAutoloadLocalClasses = array(
        'ApiLogin' => __DIR__ . '/includes/api/ApiLogin.php',
        'ApiLogout' => __DIR__ . '/includes/api/ApiLogout.php',
        'ApiMain' => __DIR__ . '/includes/api/ApiMain.php',
+       'ApiManageTags' => __DIR__ . '/includes/api/ApiManageTags.php',
        'ApiModuleManager' => __DIR__ . '/includes/api/ApiModuleManager.php',
        'ApiMove' => __DIR__ . '/includes/api/ApiMove.php',
        'ApiOpenSearch' => __DIR__ . '/includes/api/ApiOpenSearch.php',
@@ -332,7 +334,7 @@ $wgAutoloadLocalClasses = array(
        'DjVuImage' => __DIR__ . '/includes/media/DjVuImage.php',
        'DoubleRedirectJob' => __DIR__ . '/includes/jobqueue/jobs/DoubleRedirectJob.php',
        'DoubleRedirectsPage' => __DIR__ . '/includes/specials/SpecialDoubleRedirects.php',
-       'DoubleReplacer' => __DIR__ . '/includes/utils/StringUtils.php',
+       'DoubleReplacer' => __DIR__ . '/includes/libs/replacers/DoubleReplacer.php',
        'DummyLinker' => __DIR__ . '/includes/Linker.php',
        'DummyTermColorer' => __DIR__ . '/maintenance/term/MWTerm.php',
        'Dump7ZipOutput' => __DIR__ . '/includes/Export.php',
@@ -372,7 +374,7 @@ $wgAutoloadLocalClasses = array(
        'ErrorPageError' => __DIR__ . '/includes/exception/ErrorPageError.php',
        'Exif' => __DIR__ . '/includes/media/Exif.php',
        'ExifBitmapHandler' => __DIR__ . '/includes/media/ExifBitmap.php',
-       'ExplodeIterator' => __DIR__ . '/includes/utils/StringUtils.php',
+       'ExplodeIterator' => __DIR__ . '/includes/libs/ExplodeIterator.php',
        'ExportProgressFilter' => __DIR__ . '/maintenance/backup.inc',
        'ExtensionLanguages' => __DIR__ . '/maintenance/language/languages.inc',
        'ExtensionProcessor' => __DIR__ . '/includes/registration/ExtensionProcessor.php',
@@ -495,7 +497,7 @@ $wgAutoloadLocalClasses = array(
        'HashBagOStuff' => __DIR__ . '/includes/objectcache/HashBagOStuff.php',
        'HashConfig' => __DIR__ . '/includes/config/HashConfig.php',
        'HashRing' => __DIR__ . '/includes/libs/HashRing.php',
-       'HashtableReplacer' => __DIR__ . '/includes/utils/StringUtils.php',
+       'HashtableReplacer' => __DIR__ . '/includes/libs/replacers/HashtableReplacer.php',
        'HistoryAction' => __DIR__ . '/includes/actions/HistoryAction.php',
        'HistoryBlob' => __DIR__ . '/includes/HistoryBlob.php',
        'HistoryBlobCurStub' => __DIR__ . '/includes/HistoryBlob.php',
@@ -534,6 +536,7 @@ $wgAutoloadLocalClasses = array(
        'ImageQueryPage' => __DIR__ . '/includes/specialpage/ImageQueryPage.php',
        'ImportReporter' => __DIR__ . '/includes/specials/SpecialImport.php',
        'ImportSiteScripts' => __DIR__ . '/maintenance/importSiteScripts.php',
+       'ImportSource' => __DIR__ . '/includes/Import.php',
        'ImportStreamSource' => __DIR__ . '/includes/Import.php',
        'ImportStringSource' => __DIR__ . '/includes/Import.php',
        'ImportTitleFactory' => __DIR__ . '/includes/title/ImportTitleFactory.php',
@@ -690,6 +693,7 @@ $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',
@@ -697,6 +701,7 @@ $wgAutoloadLocalClasses = array(
        'MWLoggerMonologProcessor' => __DIR__ . '/includes/debug/logger/monolog/Processor.php',
        'MWLoggerMonologSamplingHandler' => __DIR__ . '/includes/debug/logger/monolog/SamplingHandler.php',
        'MWLoggerMonologSpi' => __DIR__ . '/includes/debug/logger/monolog/Spi.php',
+       'MWLoggerMonologSyslogHandler' => __DIR__ . '/includes/debug/logger/monolog/SyslogHandler.php',
        'MWLoggerNullSpi' => __DIR__ . '/includes/debug/logger/NullSpi.php',
        'MWLoggerSpi' => __DIR__ . '/includes/debug/logger/Spi.php',
        'MWMemcached' => __DIR__ . '/includes/objectcache/MemcachedClient.php',
@@ -723,9 +728,9 @@ $wgAutoloadLocalClasses = array(
        'MediaHandler' => __DIR__ . '/includes/media/MediaHandler.php',
        'MediaStatisticsPage' => __DIR__ . '/includes/specials/SpecialMediaStatistics.php',
        'MediaTransformError' => __DIR__ . '/includes/media/MediaTransformOutput.php',
+       'MediaTransformInvalidParametersException' => __DIR__ . '/includes/media/MediaTransformInvalidParametersException.php',
        'MediaTransformOutput' => __DIR__ . '/includes/media/MediaTransformOutput.php',
        'MediaWiki' => __DIR__ . '/includes/MediaWiki.php',
-       'MediaWikiBagOStuff' => __DIR__ . '/includes/objectcache/SqlBagOStuff.php',
        'MediaWikiI18N' => __DIR__ . '/includes/skins/MediaWikiI18N.php',
        'MediaWikiPageLinkRenderer' => __DIR__ . '/includes/title/MediaWikiPageLinkRenderer.php',
        'MediaWikiSite' => __DIR__ . '/includes/site/MediaWikiSite.php',
@@ -744,6 +749,7 @@ $wgAutoloadLocalClasses = array(
        'MessageBlobStore' => __DIR__ . '/includes/MessageBlobStore.php',
        'MessageCache' => __DIR__ . '/includes/cache/MessageCache.php',
        'MessageContent' => __DIR__ . '/includes/content/MessageContent.php',
+       'MessageSpecifier' => __DIR__ . '/includes/libs/MessageSpecifier.php',
        'MigrateUserGroup' => __DIR__ . '/maintenance/migrateUserGroup.php',
        'MimeMagic' => __DIR__ . '/includes/MimeMagic.php',
        'MinifyScript' => __DIR__ . '/maintenance/minify.php',
@@ -938,6 +944,7 @@ $wgAutoloadLocalClasses = array(
        'RebuildSitesCache' => __DIR__ . '/maintenance/rebuildSitesCache.php',
        'RebuildTextIndex' => __DIR__ . '/maintenance/rebuildtextindex.php',
        'RecentChange' => __DIR__ . '/includes/changes/RecentChange.php',
+       'RecentChangesUpdateJob' => __DIR__ . '/includes/jobqueue/jobs/RecentChangesUpdateJob.php',
        'RecompressTracked' => __DIR__ . '/maintenance/storage/recompressTracked.php',
        'RedirectSpecialArticle' => __DIR__ . '/includes/specialpage/RedirectSpecialPage.php',
        'RedirectSpecialPage' => __DIR__ . '/includes/specialpage/RedirectSpecialPage.php',
@@ -950,14 +957,13 @@ $wgAutoloadLocalClasses = array(
        'RefreshImageMetadata' => __DIR__ . '/maintenance/refreshImageMetadata.php',
        'RefreshLinks' => __DIR__ . '/maintenance/refreshLinks.php',
        'RefreshLinksJob' => __DIR__ . '/includes/jobqueue/jobs/RefreshLinksJob.php',
-       'RefreshLinksJob2' => __DIR__ . '/includes/jobqueue/jobs/RefreshLinksJob2.php',
-       'RegexlikeReplacer' => __DIR__ . '/includes/utils/StringUtils.php',
+       'RegexlikeReplacer' => __DIR__ . '/includes/libs/replacers/RegexlikeReplacer.php',
        'RemoveInvalidEmails' => __DIR__ . '/maintenance/removeInvalidEmails.php',
        'RemoveUnusedAccounts' => __DIR__ . '/maintenance/removeUnusedAccounts.php',
        'RenameDbPrefix' => __DIR__ . '/maintenance/renameDbPrefix.php',
        'RenderAction' => __DIR__ . '/includes/actions/RenderAction.php',
-       'ReplacementArray' => __DIR__ . '/includes/utils/StringUtils.php',
-       'Replacer' => __DIR__ . '/includes/utils/StringUtils.php',
+       'ReplacementArray' => __DIR__ . '/includes/libs/ReplacementArray.php',
+       'Replacer' => __DIR__ . '/includes/libs/replacers/Replacer.php',
        'RepoGroup' => __DIR__ . '/includes/filerepo/RepoGroup.php',
        'RequestContext' => __DIR__ . '/includes/context/RequestContext.php',
        'ResetUserTokens' => __DIR__ . '/maintenance/resetUserTokens.php',
@@ -1152,11 +1158,12 @@ $wgAutoloadLocalClasses = array(
        'StatCounter' => __DIR__ . '/includes/StatCounter.php',
        'StatsOutput' => __DIR__ . '/maintenance/language/StatOutputs.php',
        'Status' => __DIR__ . '/includes/Status.php',
+       'StatusValue' => __DIR__ . '/includes/libs/StatusValue.php',
        'StorageTypeStats' => __DIR__ . '/maintenance/storage/storageTypeStats.php',
        'StoreFileOp' => __DIR__ . '/includes/filebackend/FileOp.php',
        'StreamFile' => __DIR__ . '/includes/StreamFile.php',
        'StringPrefixSearch' => __DIR__ . '/includes/PrefixSearch.php',
-       'StringUtils' => __DIR__ . '/includes/utils/StringUtils.php',
+       'StringUtils' => __DIR__ . '/includes/libs/StringUtils.php',
        'StripState' => __DIR__ . '/includes/parser/StripState.php',
        'StubObject' => __DIR__ . '/includes/StubObject.php',
        'StubUserLang' => __DIR__ . '/includes/StubObject.php',
@@ -1176,6 +1183,7 @@ $wgAutoloadLocalClasses = array(
        'TablePager' => __DIR__ . '/includes/pager/TablePager.php',
        'TempFSFile' => __DIR__ . '/includes/filebackend/TempFSFile.php',
        'TempFileRepo' => __DIR__ . '/includes/filerepo/FileRepo.php',
+       'TemplateParser' => __DIR__ . '/includes/TemplateParser.php',
        'TestFileOpPerformance' => __DIR__ . '/maintenance/fileOpPerfTest.php',
        'TextContent' => __DIR__ . '/includes/content/TextContent.php',
        'TextContentHandler' => __DIR__ . '/includes/content/TextContentHandler.php',
@@ -1269,7 +1277,7 @@ $wgAutoloadLocalClasses = array(
        'UserloginTemplate' => __DIR__ . '/includes/templates/Userlogin.php',
        'UserrightsPage' => __DIR__ . '/includes/specials/SpecialUserrights.php',
        'UsersPager' => __DIR__ . '/includes/specials/SpecialListusers.php',
-       'UtfNormal' => __DIR__ . '/includes/normal/UtfNormal.php',
+       'UtfNormal' => __DIR__ . '/includes/libs/normal/UtfNormal.php',
        'UzConverter' => __DIR__ . '/languages/classes/LanguageUz.php',
        'VFormHTMLForm' => __DIR__ . '/includes/htmlform/VFormHTMLForm.php',
        'ValidateRegistrationFile' => __DIR__ . '/maintenance/validateRegistrationFile.php',
index bfa2ca9..75aed40 100644 (file)
@@ -9,7 +9,7 @@
                        "homepage": "https://www.mediawiki.org/wiki/Special:Version/Credits"
                }
        ],
-       "license": "GPL-2.0",
+       "license": "GPL-2.0+",
        "support": {
                "issues": "https://bugs.mediawiki.org/",
                "irc": "irc://irc.freenode.net/mediawiki",
        "require": {
                "cssjanus/cssjanus": "1.1.1",
                "leafo/lessphp": "0.5.0",
-               "oojs/oojs-ui": "0.6.3",
+               "oojs/oojs-ui": "0.8.0",
                "php": ">=5.3.3",
                "psr/log": "1.0.0",
                "wikimedia/cdb": "1.0.1",
-               "wikimedia/composer-merge-plugin": "0.5.0"
+               "wikimedia/composer-merge-plugin": "0.5.0",
+               "zordius/lightncandy": "0.18"
        },
        "require-dev": {
                "justinrainbow/json-schema": "~1.3",
-               "phpunit/phpunit": "*"
+               "phpunit/phpunit": "~4.5"
        },
        "suggest": {
                "ext-fileinfo": "*",
index 46f8623..33029bd 100644 (file)
@@ -7,10 +7,6 @@
                        "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.",
@@ -39,9 +35,6 @@
                        },
                        "additionalItems": false
                },
-               "path": {
-                       "type": "string"
-               },
                "version": {
                        "type": "string",
                        "description": "The version of this release of the extension."
                                "Unlicense"
                        ]
                },
+               "ResourceFileModulePaths": {
+                       "type": "object",
+                       "description": "Default paths to use for all ResourceLoader file modules",
+                       "additionalProperties": false,
+                       "properties": {
+                               "localBasePath": {
+                                       "type": "string",
+                                       "description": "Base path to prepend to all local paths, relative to current directory"
+                               },
+                               "remoteExtPath": {
+                                       "type": "string",
+                                       "description": "Base path to prepend to all remote paths, relative to $wgExtensionAssetsPath"
+                               },
+                               "remoteSkinPath": {
+                                       "type": "string",
+                                       "description": "Base path to prepend to all remote paths, relative to $wgStylePath"
+                               }
+                       }
+               },
                "ResourceLoaderModules": {
                        "type": "object",
                        "description": "ResourceLoader modules to register",
index 2de78dd..78ac2ff 100644 (file)
@@ -372,6 +372,17 @@ $editPage : the EditPage object
 $text : the new text of the article (has yet to be saved)
 &$resultArr : data in this array will be added to the API result
 
+'ApiFeedContributions::feedItem': Called to convert the result of ContribsPager
+into a FeedItem instance that ApiFeedContributions can consume. Implementors of
+this hook may cancel the hook to signal that the item is not viewable in the
+provided context.
+$row: A row of data from ContribsPager.  The set of data returned by ContribsPager
+ can be adjusted by handling the ContribsPager::reallyDoQuery hook.
+$context: An IContextSource implementation.
+&$feedItem: Set this to a FeedItem instance if the callback can handle the provided
+ row. This is provided to the hook as a null, if it is non null then another callback
+ has already handled the hook.
+
 'ApiFormatHighlight': Use to syntax-highlight API pretty-printed output. When
 highlighting, add output to $context->getOutput() and return false.
 $context: An IContextSource.
@@ -892,6 +903,38 @@ $name: name of the special page, e.g. 'Watchlist'
 &$join_conds: join conditions for the tables
 $opts: FormOptions for this request
 
+'ChangeTagAfterDelete': Called after a change tag has been deleted (that is,
+removed from all revisions and log entries to which it was applied). This gives
+extensions a chance to take it off their books.
+$tag: name of the tag
+&$status: Status object. Add warnings to this as required. There is no point
+  setting errors, as the deletion has already been partly carried out by this
+  point.
+
+'ChangeTagCanCreate': Tell whether a change tag should be able to be created
+from the UI (Special:Tags) or via the API. You could use this hook if you want
+to reserve a specific "namespace" of tags, or something similar.
+$tag: name of the tag
+$user: user initiating the action
+&$status: Status object. Add your errors using `$status->fatal()` or warnings
+  using `$status->warning()`. Errors and warnings will be relayed to the user.
+  If you set an error, the user will be unable to create the tag.
+
+'ChangeTagCanDelete': Tell whether a change tag should be able to be
+deleted from the UI (Special:Tags) or via the API. The default is that tags
+defined using the ListDefinedTags hook are not allowed to be deleted unless
+specifically allowed. If you wish to allow deletion of the tag, set
+`$status = Status::newGood()` to allow deletion, and then `return false` from
+the hook function. Ensure you consume the 'ChangeTagAfterDelete' hook to carry
+out custom deletion actions.
+$tag: name of the tag
+$user: user initiating the action
+&$status: Status object. See above.
+
+'ChangeTagsListActive': Allows you to nominate which of the tags your extension
+uses are in active use.
+&$tags: list of all active tags. Append to this array.
+
 'LoginUserMigrated': Called during login to allow extensions the opportunity to
 inform a user that their username doesn't exist for a specific reason, instead
 of letting the login form give the generic error message that the account does
@@ -1017,6 +1060,7 @@ $article: article (object) being viewed
 $oldid: oldid (int) being viewed
 
 'DoEditSectionLink': Override the HTML generated for section edit links
+* Deprecated in favour of SkinEditSectionLinks hook *
 $skin: Skin object rendering the UI
 $title: Title object for the title being linked to (may not be the same as
   the page title, if the section is included from a template)
@@ -2234,6 +2278,10 @@ configuration variables to JavaScript. Things that depend on the current page
 or request state must be added through MakeGlobalVariablesScript instead.
 &$vars: array( variable name => value )
 
+'ResourceLoaderGetLessVars': Called in ResourceLoader::getLessVars after variables
+from $wgResourceLoaderLESSVars are added. Can be used to add context-based variables.
+&$lessVars: array of variables already added
+
 'ResourceLoaderRegisterModules': Right before modules information is required,
 such as when responding to a resource
 loader request or generating HTML output.
@@ -2376,6 +2424,23 @@ $type: 'normal' or 'history' for old/diff views
 &$forContent: overridable flag if copyright footer is shown in content language.
   This parameter is deprecated.
 
+'SkinEditSectionLinks': Modify the section edit links
+$skin: Skin object rendering the UI
+$title: Title object for the title being linked to (may not be the same as
+  the page title, if the section is included from a template)
+$section: The designation of the section being pointed to, to be included in
+  the link, like "&section=$section"
+$tooltip: The default tooltip.  Escape before using.
+  By default, this is wrapped in the 'editsectionhint' message.
+&$result: Array containing all link detail arrays. Each link detail array should contain
+  the following keys:
+  * targetTitle - Target Title object
+  * text - String for the text
+  * attribs - Array of attributes
+  * query - Array of query parameters to add to the URL
+  * options - Array of options for Linker::link
+$lang: The language code to use for the link in the wfMessage function
+
 'SkinGetPoweredBy': TODO
 &$text: additional 'powered by' icons in HTML. Note: Modern skin does not use
 the MediaWiki icon but plain text instead.
index 31feec1..dadfb47 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..2091010
--- /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.icon
+mediawiki.ui.input
+mediawiki.ui.radio
+mediawiki.ui.text
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 51470b6..f44cac0 100644 (file)
@@ -201,7 +201,12 @@ function wfForbidden( $msg1, $msg2 ) {
        header( 'Cache-Control: no-cache' );
        header( 'Content-Type: text/html; charset=utf-8' );
        echo <<<ENDS
+<!DOCTYPE html>
 <html>
+<head>
+<meta charset="UTF-8" />
+<title>$msgHdr</title>
+</head>
 <body>
 <h1>$msgHdr</h1>
 <p>$detailMsg</p>
index c898ec9..6b86853 100644 (file)
@@ -387,16 +387,13 @@ class CategoryViewer extends ContextSource {
 
                if ( $rescnt > 0 ) {
                        # Showing subcategories
-                       $r .= Html::openElement( 'div', array( 'id' => 'mw-subcategories' ) );
-                       $r .= "\n";
-                       $r .= Html::element( 'h2', array(), $this->msg( 'subcategories' )->text() );
-                       $r .= "\n";
+                       $r .= "<div id=\"mw-subcategories\">\n";
+                       $r .= '<h2>' . $this->msg( 'subcategories' )->parse() . "</h2>\n";
                        $r .= $countmsg;
                        $r .= $this->getSectionPagingLinks( 'subcat' );
                        $r .= $this->formatList( $this->children, $this->children_start_char );
                        $r .= $this->getSectionPagingLinks( 'subcat' );
-                       $r .= "\n";
-                       $r .= Html::closeElement( 'div' );
+                       $r .= "\n</div>";
                }
                return $r;
        }
@@ -419,16 +416,13 @@ class CategoryViewer extends ContextSource {
                $countmsg = $this->getCountMessage( $rescnt, $dbcnt, 'article' );
 
                if ( $rescnt > 0 ) {
-                       $r .= Html::openElement( 'div', array( 'id' => 'mw-pages' ) );
-                       $r .= "\n";
-                       $r .= Html::element( 'h2', array(), $this->msg( 'category_header', $ti )->text() );
-                       $r .= "\n";
+                       $r = "<div id=\"mw-pages\">\n";
+                       $r .= '<h2>' . $this->msg( 'category_header', $ti )->parse() . "</h2>\n";
                        $r .= $countmsg;
                        $r .= $this->getSectionPagingLinks( 'page' );
                        $r .= $this->formatList( $this->articles, $this->articles_start_char );
                        $r .= $this->getSectionPagingLinks( 'page' );
-                       $r .= "\n";
-                       $r .= Html::closeElement( 'div' );
+                       $r .= "\n</div>";
                }
                return $r;
        }
index 9ee2460..d597d6d 100644 (file)
  */
 
 class ChangeTags {
+       /**
+        * Can't delete tags with more than this many uses. Similar in intent to
+        * the bigdelete user right
+        * @todo Use the job queue for tag deletion to avoid this restriction
+        */
+       const MAX_DELETE_USES = 5000;
+
        /**
         * Creates HTML for the given tags
         *
@@ -185,6 +192,7 @@ class ChangeTags {
 
                $dbw->insert( 'change_tag', $tagsRows, __METHOD__, array( 'IGNORE' ) );
 
+               self::purgeTagUsageCache();
                return true;
        }
 
@@ -293,19 +301,479 @@ class ChangeTags {
                return $html;
        }
 
+       /**
+        * Defines a tag in the valid_tag table, without checking that the tag name
+        * is valid.
+        * Extensions should NOT use this function; they can use the ListDefinedTags
+        * hook instead.
+        *
+        * @param string $tag Tag to create
+        * @since 1.25
+        */
+       public static function defineTag( $tag ) {
+               $dbw = wfGetDB( DB_MASTER );
+               $dbw->replace( 'valid_tag',
+                       array( 'vt_tag' ),
+                       array( 'vt_tag' => $tag ),
+                       __METHOD__ );
+
+               // clear the memcache of defined tags
+               self::purgeTagCacheAll();
+       }
+
+       /**
+        * Removes a tag from the valid_tag table. The tag may remain in use by
+        * extensions, and may still show up as 'defined' if an extension is setting
+        * it from the ListDefinedTags hook.
+        *
+        * @param string $tag Tag to remove
+        * @since 1.25
+        */
+       public static function undefineTag( $tag ) {
+               $dbw = wfGetDB( DB_MASTER );
+               $dbw->delete( 'valid_tag', array( 'vt_tag' => $tag ), __METHOD__ );
+
+               // clear the memcache of defined tags
+               self::purgeTagCacheAll();
+       }
+
+       /**
+        * Writes a tag action into the tag management log.
+        *
+        * @param string $action
+        * @param string $tag
+        * @param string $reason
+        * @param User $user Who to attribute the action to
+        * @param int $tagCount For deletion only, how many usages the tag had before
+        * it was deleted.
+        * @since 1.25
+        */
+       protected static function logTagAction( $action, $tag, $reason, User $user,
+               $tagCount = null ) {
+
+               $dbw = wfGetDB( DB_MASTER );
+
+               $logEntry = new ManualLogEntry( 'managetags', $action );
+               $logEntry->setPerformer( $user );
+               // target page is not relevant, but it has to be set, so we just put in
+               // the title of Special:Tags
+               $logEntry->setTarget( Title::newFromText( 'Special:Tags' ) );
+               $logEntry->setComment( $reason );
+
+               $params = array( '4::tag' => $tag );
+               if ( !is_null( $tagCount ) ) {
+                       $params['5:number:count'] = $tagCount;
+               }
+               $logEntry->setParameters( $params );
+               $logEntry->setRelations( array( 'Tag' => $tag ) );
+
+               $logId = $logEntry->insert( $dbw );
+               $logEntry->publish( $logId );
+               return $logId;
+       }
+
+       /**
+        * Is it OK to allow the user to activate this tag?
+        *
+        * @param string $tag Tag that you are interested in activating
+        * @param User|null $user User whose permission you wish to check, or null if
+        * you don't care (e.g. maintenance scripts)
+        * @return Status
+        * @since 1.25
+        */
+       public static function canActivateTag( $tag, User $user = null ) {
+               if ( !is_null( $user ) && !$user->isAllowed( 'managechangetags' ) ) {
+                       return Status::newFatal( 'tags-manage-no-permission' );
+               }
+
+               // non-existing tags cannot be activated
+               $tagUsage = self::tagUsageStatistics();
+               if ( !isset( $tagUsage[$tag] ) ) {
+                       return Status::newFatal( 'tags-activate-not-found', $tag );
+               }
+
+               // defined tags cannot be activated (a defined tag is either extension-
+               // defined, in which case the extension chooses whether or not to active it;
+               // or user-defined, in which case it is considered active)
+               $definedTags = self::listDefinedTags();
+               if ( in_array( $tag, $definedTags ) ) {
+                       return Status::newFatal( 'tags-activate-not-allowed', $tag );
+               }
+
+               return Status::newGood();
+       }
+
+       /**
+        * Activates a tag, checking whether it is allowed first, and adding a log
+        * entry afterwards.
+        *
+        * Includes a call to ChangeTag::canActivateTag(), so your code doesn't need
+        * to do that.
+        *
+        * @param string $tag
+        * @param string $reason
+        * @param User $user Who to give credit for the action
+        * @param bool $ignoreWarnings Can be used for API interaction, default false
+        * @return Status If successful, the Status contains the ID of the added log
+        * entry as its value
+        * @since 1.25
+        */
+       public static function activateTagWithChecks( $tag, $reason, User $user,
+               $ignoreWarnings = false ) {
+
+               // are we allowed to do this?
+               $result = self::canActivateTag( $tag, $user );
+               if ( $ignoreWarnings ? !$result->isOK() : !$result->isGood() ) {
+                       $result->value = null;
+                       return $result;
+               }
+
+               // do it!
+               self::defineTag( $tag );
+
+               // log it
+               $logId = self::logTagAction( 'activate', $tag, $reason, $user );
+               return Status::newGood( $logId );
+       }
+
+       /**
+        * Is it OK to allow the user to deactivate this tag?
+        *
+        * @param string $tag Tag that you are interested in deactivating
+        * @param User|null $user User whose permission you wish to check, or null if
+        * you don't care (e.g. maintenance scripts)
+        * @return Status
+        * @since 1.25
+        */
+       public static function canDeactivateTag( $tag, User $user = null ) {
+               if ( !is_null( $user ) && !$user->isAllowed( 'managechangetags' ) ) {
+                       return Status::newFatal( 'tags-manage-no-permission' );
+               }
+
+               // only explicitly-defined tags can be deactivated
+               $explicitlyDefinedTags = self::listExplicitlyDefinedTags();
+               if ( !in_array( $tag, $explicitlyDefinedTags ) ) {
+                       return Status::newFatal( 'tags-deactivate-not-allowed', $tag );
+               }
+               return Status::newGood();
+       }
+
+       /**
+        * Deactivates a tag, checking whether it is allowed first, and adding a log
+        * entry afterwards.
+        *
+        * Includes a call to ChangeTag::canDeactivateTag(), so your code doesn't need
+        * to do that.
+        *
+        * @param string $tag
+        * @param string $reason
+        * @param User $user Who to give credit for the action
+        * @param bool $ignoreWarnings Can be used for API interaction, default false
+        * @return Status If successful, the Status contains the ID of the added log
+        * entry as its value
+        * @since 1.25
+        */
+       public static function deactivateTagWithChecks( $tag, $reason, User $user,
+               $ignoreWarnings = false ) {
+
+               // are we allowed to do this?
+               $result = self::canDeactivateTag( $tag, $user );
+               if ( $ignoreWarnings ? !$result->isOK() : !$result->isGood() ) {
+                       $result->value = null;
+                       return $result;
+               }
+
+               // do it!
+               self::undefineTag( $tag );
+
+               // log it
+               $logId = self::logTagAction( 'deactivate', $tag, $reason, $user );
+               return Status::newGood( $logId );
+       }
+
+       /**
+        * Is it OK to allow the user to create this tag?
+        *
+        * @param string $tag Tag that you are interested in creating
+        * @param User|null $user User whose permission you wish to check, or null if
+        * you don't care (e.g. maintenance scripts)
+        * @return Status
+        * @since 1.25
+        */
+       public static function canCreateTag( $tag, User $user = null ) {
+               if ( !is_null( $user ) && !$user->isAllowed( 'managechangetags' ) ) {
+                       return Status::newFatal( 'tags-manage-no-permission' );
+               }
+
+               // no empty tags
+               if ( $tag === '' ) {
+                       return Status::newFatal( 'tags-create-no-name' );
+               }
+
+               // tags cannot contain commas (used as a delimiter in tag_summary table) or
+               // slashes (would break tag description messages in MediaWiki namespace)
+               if ( strpos( $tag, ',' ) !== false || strpos( $tag, '/' ) !== false ) {
+                       return Status::newFatal( 'tags-create-invalid-chars' );
+               }
+
+               // could the MediaWiki namespace description messages be created?
+               $title = Title::makeTitleSafe( NS_MEDIAWIKI, "Tag-$tag-description" );
+               if ( is_null( $title ) ) {
+                       return Status::newFatal( 'tags-create-invalid-title-chars' );
+               }
+
+               // does the tag already exist?
+               $tagUsage = self::tagUsageStatistics();
+               if ( isset( $tagUsage[$tag] ) ) {
+                       return Status::newFatal( 'tags-create-already-exists', $tag );
+               }
+
+               // check with hooks
+               $canCreateResult = Status::newGood();
+               Hooks::run( 'ChangeTagCanCreate', array( $tag, $user, &$canCreateResult ) );
+               return $canCreateResult;
+       }
+
+       /**
+        * Creates a tag by adding a row to the `valid_tag` table.
+        *
+        * Includes a call to ChangeTag::canDeleteTag(), so your code doesn't need to
+        * do that.
+        *
+        * @param string $tag
+        * @param string $reason
+        * @param User $user Who to give credit for the action
+        * @param bool $ignoreWarnings Can be used for API interaction, default false
+        * @return Status If successful, the Status contains the ID of the added log
+        * entry as its value
+        * @since 1.25
+        */
+       public static function createTagWithChecks( $tag, $reason, User $user,
+               $ignoreWarnings = false ) {
+
+               // are we allowed to do this?
+               $result = self::canCreateTag( $tag, $user );
+               if ( $ignoreWarnings ? !$result->isOK() : !$result->isGood() ) {
+                       $result->value = null;
+                       return $result;
+               }
+
+               // do it!
+               self::defineTag( $tag );
+
+               // log it
+               $logId = self::logTagAction( 'create', $tag, $reason, $user );
+               return Status::newGood( $logId );
+       }
+
+       /**
+        * Permanently removes all traces of a tag from the DB. Good for removing
+        * misspelt or temporary tags.
+        *
+        * This function should be directly called by maintenance scripts only, never
+        * by user-facing code. See deleteTagWithChecks() for functionality that can
+        * safely be exposed to users.
+        *
+        * @param string $tag Tag to remove
+        * @return Status The returned status will be good unless a hook changed it
+        * @since 1.25
+        */
+       public static function deleteTagEverywhere( $tag ) {
+               $dbw = wfGetDB( DB_MASTER );
+               $dbw->begin( __METHOD__ );
+
+               // delete from valid_tag
+               self::undefineTag( $tag );
+
+               // find out which revisions use this tag, so we can delete from tag_summary
+               $result = $dbw->select( 'change_tag',
+                       array( 'ct_rc_id', 'ct_log_id', 'ct_rev_id', 'ct_tag' ),
+                       array( 'ct_tag' => $tag ),
+                       __METHOD__ );
+               foreach ( $result as $row ) {
+                       if ( $row->ct_rev_id ) {
+                               $field = 'ts_rev_id';
+                               $fieldValue = $row->ct_rev_id;
+                       } elseif ( $row->ct_log_id ) {
+                               $field = 'ts_log_id';
+                               $fieldValue = $row->ct_log_id;
+                       } elseif ( $row->ct_rc_id ) {
+                               $field = 'ts_rc_id';
+                               $fieldValue = $row->ct_rc_id;
+                       } else {
+                               // don't know what's up; just skip it
+                               continue;
+                       }
+
+                       // remove the tag from the relevant row of tag_summary
+                       $tsResult = $dbw->selectField( 'tag_summary',
+                               'ts_tags',
+                               array( $field => $fieldValue ),
+                               __METHOD__ );
+                       $tsValues = explode( ',', $tsResult );
+                       $tsValues = array_values( array_diff( $tsValues, array( $tag ) ) );
+                       if ( !$tsValues ) {
+                               // no tags left, so delete the row altogether
+                               $dbw->delete( 'tag_summary',
+                                       array( $field => $fieldValue ),
+                                       __METHOD__ );
+                       } else {
+                               $dbw->update( 'tag_summary',
+                                       array( 'ts_tags' => implode( ',', $tsValues ) ),
+                                       array( $field => $fieldValue ),
+                                       __METHOD__ );
+                       }
+               }
+
+               // delete from change_tag
+               $dbw->delete( 'change_tag', array( 'ct_tag' => $tag ), __METHOD__ );
+
+               $dbw->commit( __METHOD__ );
+
+               // give extensions a chance
+               $status = Status::newGood();
+               Hooks::run( 'ChangeTagAfterDelete', array( $tag, &$status ) );
+               // let's not allow error results, as the actual tag deletion succeeded
+               if ( !$status->isOK() ) {
+                       wfDebug( 'ChangeTagAfterDelete error condition downgraded to warning' );
+                       $status->ok = true;
+               }
+
+               // clear the memcache of defined tags
+               self::purgeTagCacheAll();
+
+               return $status;
+       }
+
+       /**
+        * Is it OK to allow the user to delete this tag?
+        *
+        * @param string $tag Tag that you are interested in deleting
+        * @param User|null $user User whose permission you wish to check, or null if
+        * you don't care (e.g. maintenance scripts)
+        * @return Status
+        * @since 1.25
+        */
+       public static function canDeleteTag( $tag, User $user = null ) {
+               $tagUsage = self::tagUsageStatistics();
+
+               if ( !is_null( $user ) && !$user->isAllowed( 'managechangetags' ) ) {
+                       return Status::newFatal( 'tags-manage-no-permission' );
+               }
+
+               if ( !isset( $tagUsage[$tag] ) ) {
+                       return Status::newFatal( 'tags-delete-not-found', $tag );
+               }
+
+               if ( $tagUsage[$tag] > self::MAX_DELETE_USES ) {
+                       return Status::newFatal( 'tags-delete-too-many-uses', $tag, self::MAX_DELETE_USES );
+               }
+
+               $extensionDefined = self::listExtensionDefinedTags();
+               if ( in_array( $tag, $extensionDefined ) ) {
+                       // extension-defined tags can't be deleted unless the extension
+                       // specifically allows it
+                       $status = Status::newFatal( 'tags-delete-not-allowed' );
+               } else {
+                       // user-defined tags are deletable unless otherwise specified
+                       $status = Status::newGood();
+               }
+
+               Hooks::run( 'ChangeTagCanDelete', array( $tag, $user, &$status ) );
+               return $status;
+       }
+
+       /**
+        * Deletes a tag, checking whether it is allowed first, and adding a log entry
+        * afterwards.
+        *
+        * Includes a call to ChangeTag::canDeleteTag(), so your code doesn't need to
+        * do that.
+        *
+        * @param string $tag
+        * @param string $reason
+        * @param User $user Who to give credit for the action
+        * @param bool $ignoreWarnings Can be used for API interaction, default false
+        * @return Status If successful, the Status contains the ID of the added log
+        * entry as its value
+        * @since 1.25
+        */
+       public static function deleteTagWithChecks( $tag, $reason, User $user,
+               $ignoreWarnings = false ) {
+
+               // are we allowed to do this?
+               $result = self::canDeleteTag( $tag, $user );
+               if ( $ignoreWarnings ? !$result->isOK() : !$result->isGood() ) {
+                       $result->value = null;
+                       return $result;
+               }
+
+               // store the tag usage statistics
+               $tagUsage = self::tagUsageStatistics();
+
+               // do it!
+               $deleteResult = self::deleteTagEverywhere( $tag );
+               if ( !$deleteResult->isOK() ) {
+                       return $deleteResult;
+               }
+
+               // log it
+               $logId = self::logTagAction( 'delete', $tag, $reason, $user, $tagUsage[$tag] );
+               $deleteResult->value = $logId;
+               return $deleteResult;
+       }
+
+       /**
+        * Lists those tags which extensions report as being "active".
+        *
+        * @return array
+        * @since 1.25
+        */
+       public static function listExtensionActivatedTags() {
+               // Caching...
+               global $wgMemc;
+               $key = wfMemcKey( 'active-tags' );
+               $tags = $wgMemc->get( $key );
+               if ( $tags ) {
+                       return $tags;
+               }
+
+               // ask extensions which tags they consider active
+               $extensionActive = array();
+               Hooks::run( 'ChangeTagsListActive', array( &$extensionActive ) );
+
+               // Short-term caching.
+               $wgMemc->set( $key, $extensionActive, 300 );
+               return $extensionActive;
+       }
+
        /**
         * Basically lists defined tags which count even if they aren't applied to anything.
-        * Tags on items in table 'change_tag' which are not (or no longer) in table 'valid_tag'
-        * are not included.
+        * It returns a union of the results of listExplicitlyDefinedTags() and
+        * listExtensionDefinedTags().
+        *
+        * @return string[] Array of strings: tags
+        */
+       public static function listDefinedTags() {
+               $tags1 = self::listExplicitlyDefinedTags();
+               $tags2 = self::listExtensionDefinedTags();
+               return array_values( array_unique( array_merge( $tags1, $tags2 ) ) );
+       }
+
+       /**
+        * Lists tags explicitly defined in the `valid_tag` table of the database.
+        * Tags in table 'change_tag' which are not in table 'valid_tag' are not
+        * included.
         *
         * Tries memcached first.
         *
         * @return string[] Array of strings: tags
+        * @since 1.25
         */
-       public static function listDefinedTags() {
+       public static function listExplicitlyDefinedTags() {
                // Caching...
                global $wgMemc;
-               $key = wfMemcKey( 'valid-tags' );
+               $key = wfMemcKey( 'valid-tags-db' );
                $tags = $wgMemc->get( $key );
                if ( $tags ) {
                        return $tags;
@@ -320,8 +788,33 @@ class ChangeTags {
                        $emptyTags[] = $row->vt_tag;
                }
 
-               Hooks::run( 'ListDefinedTags', array( &$emptyTags ) );
+               $emptyTags = array_filter( array_unique( $emptyTags ) );
 
+               // Short-term caching.
+               $wgMemc->set( $key, $emptyTags, 300 );
+               return $emptyTags;
+       }
+
+       /**
+        * Lists tags defined by extensions using the ListDefinedTags hook.
+        * Extensions need only define those tags they deem to be in active use.
+        *
+        * Tries memcached first.
+        *
+        * @return string[] Array of strings: tags
+        * @since 1.25
+        */
+       public static function listExtensionDefinedTags() {
+               // Caching...
+               global $wgMemc;
+               $key = wfMemcKey( 'valid-tags-hook' );
+               $tags = $wgMemc->get( $key );
+               if ( $tags ) {
+                       return $tags;
+               }
+
+               $emptyTags = array();
+               Hooks::run( 'ListDefinedTags', array( &$emptyTags ) );
                $emptyTags = array_filter( array_unique( $emptyTags ) );
 
                // Short-term caching.
@@ -329,13 +822,46 @@ class ChangeTags {
                return $emptyTags;
        }
 
+       /**
+        * Invalidates the short-term cache of defined tags used by the
+        * list*DefinedTags functions, as well as the tag statistics cache.
+        * @since 1.25
+        */
+       public static function purgeTagCacheAll() {
+               global $wgMemc;
+               $wgMemc->delete( wfMemcKey( 'active-tags' ) );
+               $wgMemc->delete( wfMemcKey( 'valid-tags-db' ) );
+               $wgMemc->delete( wfMemcKey( 'valid-tags-hook' ) );
+               self::purgeTagUsageCache();
+       }
+
+       /**
+        * Invalidates the tag statistics cache only.
+        * @since 1.25
+        */
+       public static function purgeTagUsageCache() {
+               global $wgMemc;
+               $wgMemc->delete( wfMemcKey( 'change-tag-statistics' ) );
+       }
+
        /**
         * Returns a map of any tags used on the wiki to number of edits
         * tagged with them, ordered descending by the hitcount.
         *
+        * Keeps a short-term cache in memory, so calling this multiple times in the
+        * same request should be fine.
+        *
         * @return array Array of string => int
         */
        public static function tagUsageStatistics() {
+               // Caching...
+               global $wgMemc;
+               $key = wfMemcKey( 'change-tag-statistics' );
+               $stats = $wgMemc->get( $key );
+               if ( $stats ) {
+                       return $stats;
+               }
+
                $out = array();
 
                $dbr = wfGetDB( DB_SLAVE );
@@ -356,6 +882,8 @@ class ChangeTags {
                        }
                }
 
+               // Cache for a very short time
+               $wgMemc->set( $key, $out, 300 );
                return $out;
        }
 }
index ee462d8..bddccec 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.
@@ -941,12 +951,12 @@ $wgExiv2Command = '/usr/bin/exiv2';
  * are passed as parameters after $srcPath, $dstPath, $width, $height
  */
 $wgSVGConverters = array(
-       'ImageMagick' => '$path/convert -background white -thumbnail $widthx$height\! $input PNG:$output',
+       'ImageMagick' => '$path/convert -background "#ffffff00" -thumbnail $widthx$height\! $input PNG:$output',
        'sodipodi' => '$path/sodipodi -z -w $width -f $input -e $output',
        'inkscape' => '$path/inkscape -z -w $width -f $input -e $output',
        'batik' => 'java -Djava.awt.headless=true -jar $path/batik-rasterizer.jar -w $width -d '
                . '$output $input',
-       'rsvg' => '$path/rsvg -w $width -h $height $input $output',
+       'rsvg' => '$path/rsvg-convert -w $width -h $height -o $output $input',
        'imgserv' => '$path/imgserv-wrapper -i svg -o png -w$width $input $output',
        'ImagickExt' => array( 'SvgHandler::rasterizeImagickExt' ),
 );
@@ -1310,9 +1320,11 @@ $wgDirectoryMode = 0777;
  * Generate and use thumbnails suitable for screens with 1.5 and 2.0 pixel densities.
  *
  * This means a 320x240 use of an image on the wiki will also generate 480x360 and 640x480
- * thumbnails, output via data-src-1-5 and data-src-2-0. Runtime JavaScript switches the
- * images in after loading the original low-resolution versions depending on the reported
- * window.devicePixelRatio.
+ * thumbnails, output via the srcset attribute.
+ *
+ * On older browsers, a JavaScript polyfill switches the appropriate images in after loading
+ * the original low-resolution versions depending on the reported window.devicePixelRatio.
+ * The polyfill can be found in the jquery.hidpi module.
  */
 $wgResponsiveImages = true;
 
@@ -2101,17 +2113,17 @@ $wgLanguageConverterCacheType = CACHE_ANYTHING;
  */
 $wgObjectCaches = array(
        CACHE_NONE => array( 'class' => 'EmptyBagOStuff' ),
-       CACHE_DB => array( 'class' => 'SqlBagOStuff' ),
+       CACHE_DB => array( 'class' => 'SqlBagOStuff', 'loggroup' => 'SQLBagOStuff' ),
 
        CACHE_ANYTHING => array( 'factory' => 'ObjectCache::newAnything' ),
        CACHE_ACCEL => array( 'factory' => 'ObjectCache::newAccelerator' ),
-       CACHE_MEMCACHED => array( 'factory' => 'ObjectCache::newMemcached' ),
+       CACHE_MEMCACHED => array( 'factory' => 'ObjectCache::newMemcached', 'loggroup' => 'memcached' ),
 
        'apc' => array( 'class' => 'APCBagOStuff' ),
        'xcache' => array( 'class' => 'XCacheBagOStuff' ),
        'wincache' => array( 'class' => 'WinCacheBagOStuff' ),
-       'memcached-php' => array( 'class' => 'MemcachedPhpBagOStuff' ),
-       'memcached-pecl' => array( 'class' => 'MemcachedPeclBagOStuff' ),
+       'memcached-php' => array( 'class' => 'MemcachedPhpBagOStuff', 'loggroup' => 'memcached' ),
+       'memcached-pecl' => array( 'class' => 'MemcachedPeclBagOStuff', 'loggroup' => 'memcached' ),
        'hash' => array( 'class' => 'HashBagOStuff' ),
 );
 
@@ -3144,6 +3156,7 @@ $wgExperimentalHtmlIds = false;
  * for the icon, the following keys are used:
  * - src: An absolute url to the image to use for the icon, this is recommended
  *        but not required, however some skins will ignore icons without an image
+ * - srcset: optional additional-resolution images; see HTML5 specs
  * - url: The url to use in the a element around the text or icon, if not set an a element will
  *        not be outputted
  * - alt: This is the text form of the icon, it will be displayed without an image in
@@ -3160,7 +3173,9 @@ $wgFooterIcons = array(
        ),
        "poweredby" => array(
                "mediawiki" => array(
-                       "src" => null, // Defaults to "$wgResourceBasePath/resources/assets/poweredby_mediawiki_88x31.png"
+                       "src" => null, // Defaults to point at
+                                      // "$wgResourceBasePath/resources/assets/poweredby_mediawiki_88x31.png"
+                                      // plus srcset for 1.5x, 2x resolution variants.
                        "url" => "//www.mediawiki.org/",
                        "alt" => "Powered by MediaWiki",
                )
@@ -3528,6 +3543,9 @@ $wgResourceLoaderExperimentalAsyncLoading = false;
  *
  * Changes to LESS variables do not trigger cache invalidation.
  *
+ * If the LESS variables need to be dynamic, you can use the
+ * ResourceLoaderGetLessVars hook (since 1.25).
+ *
  * @par Example:
  * @code
  *   $wgResourceLoaderLESSVars = array(
@@ -3845,20 +3863,12 @@ $wgNamespacesWithSubpages = array(
  * A message with the suffix '-desc' should be added as a description message
  * to have extra information on Special:TrackingCategories.
  *
+ * @deprecated since 1.25 Extensions should now register tracking categories using
+ *                        the new extension registration system.
+ *
  * @since 1.23
  */
-$wgTrackingCategories = array(
-       'index-category',
-       'noindex-category',
-       'duplicate-args-category',
-       'expensive-parserfunction-category',
-       'post-expand-template-argument-category',
-       'post-expand-template-inclusion-category',
-       'hidden-category-category',
-       'broken-file-category',
-       'node-count-exceeded-category',
-       'expansion-depth-exceeded-category',
-);
+$wgTrackingCategories = array();
 
 /**
  * Array of namespaces which can be deemed to contain valid "content", as far
@@ -4617,6 +4627,7 @@ $wgGroupPermissions['sysop']['suppressredirect'] = true;
 #$wgGroupPermissions['sysop']['pagelang'] = true;
 #$wgGroupPermissions['sysop']['upload_by_url'] = true;
 $wgGroupPermissions['sysop']['mergehistory'] = true;
+$wgGroupPermissions['sysop']['managechangetags'] = true;
 
 // Permission to change users' group assignments
 $wgGroupPermissions['bureaucrat']['userrights'] = true;
@@ -5279,16 +5290,16 @@ $wgDebugDumpSqlLength = 500;
 $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
@@ -6316,7 +6327,7 @@ $wgAutoloadAttemptLowercase = true;
  *     'version' => '1.9.0',
  *     'url' => 'http://example.org/example-extension/',
  *     'descriptionmsg' => 'exampleextension-desc',
- *     'license-name' => 'GPL-2.0',
+ *     'license-name' => 'GPL-2.0+',
  * );
  * @endcode
  *
@@ -6350,7 +6361,7 @@ $wgAutoloadAttemptLowercase = true;
  *    localizable message (omit in favour of 'descriptionmsg').
  *
  * - license-name: Short name of the license (used as label for the link), such
- *   as "GPL-2.0" or "MIT" (https://spdx.org/licenses/ for a list of identifiers).
+ *   as "GPL-2.0+" or "MIT" (https://spdx.org/licenses/ for a list of identifiers).
  */
 $wgExtensionCredits = array();
 
@@ -6402,7 +6413,6 @@ $wgHooks = array();
  */
 $wgJobClasses = array(
        'refreshLinks' => 'RefreshLinksJob',
-       'refreshLinks2' => 'RefreshLinksJob2', // b/c
        'htmlCacheUpdate' => 'HTMLCacheUpdateJob',
        'sendMail' => 'EmaillingJob',
        'enotifNotify' => 'EnotifNotifyJob',
@@ -6411,6 +6421,8 @@ $wgJobClasses = array(
        'AssembleUploadChunks' => 'AssembleUploadChunksJob',
        'PublishStashedFile' => 'PublishStashedFileJob',
        'ThumbnailRender' => 'ThumbnailRenderJob',
+       'recentChangesUpdate' => 'RecentChangesUpdateJob',
+       'refreshLinksPrioritized' => 'RefreshLinksJob', // for cascading protection
        'null' => 'NullJob'
 );
 
@@ -6560,6 +6572,7 @@ $wgLogTypes = array(
        'patrol',
        'merge',
        'suppress',
+       'managetags',
 );
 
 /**
@@ -6688,6 +6701,10 @@ $wgLogActionsHandlers = array(
        'upload/overwrite' => 'LogFormatter',
        'upload/revert' => 'LogFormatter',
        'merge/merge' => 'MergeLogFormatter',
+       'managetags/create' => 'LogFormatter',
+       'managetags/delete' => 'LogFormatter',
+       'managetags/activate' => 'LogFormatter',
+       'managetags/deactivate' => 'LogFormatter',
 );
 
 /**
index d63d5ca..8456c5d 100644 (file)
@@ -203,7 +203,7 @@ define( 'LIST_OR', 4 );
 /**
  * Unicode and normalisation related
  */
-require_once __DIR__ . '/normal/UtfNormalDefines.php';
+require_once __DIR__ . '/libs/normal/UtfNormalDefines.php';
 
 /**@{
  * Hook support constants
index cb79fd1..f5d98a7 100644 (file)
@@ -504,7 +504,7 @@ class EditPage {
                        }
                }
 
-               $permErrors = $this->getEditPermissionErrors();
+               $permErrors = $this->getEditPermissionErrors( $this->save ? 'secure' : 'full' );
                if ( $permErrors ) {
                        wfDebug( __METHOD__ . ": User can't edit\n" );
                        // Auto-block user's IP if the account was "hard" blocked
@@ -559,15 +559,22 @@ class EditPage {
        }
 
        /**
+        * @param string $rigor Same format as Title::getUserPermissionErrors()
         * @return array
         */
-       protected function getEditPermissionErrors() {
+       protected function getEditPermissionErrors( $rigor = 'secure' ) {
                global $wgUser;
-               $permErrors = $this->mTitle->getUserPermissionsErrors( 'edit', $wgUser );
+
+               $permErrors = $this->mTitle->getUserPermissionsErrors( 'edit', $wgUser, $rigor );
                # Can this title be created?
                if ( !$this->mTitle->exists() ) {
-                       $permErrors = array_merge( $permErrors,
-                               wfArrayDiff2( $this->mTitle->getUserPermissionsErrors( 'create', $wgUser ), $permErrors ) );
+                       $permErrors = array_merge(
+                               $permErrors,
+                               wfArrayDiff2(
+                                       $this->mTitle->getUserPermissionsErrors( 'create', $wgUser, $rigor ),
+                                       $permErrors
+                               )
+                       );
                }
                # Ignore some permissions errors when a user is just previewing/viewing diffs
                $remove = array();
@@ -579,6 +586,7 @@ class EditPage {
                        }
                }
                $permErrors = wfArrayDiff2( $permErrors, $remove );
+
                return $permErrors;
        }
 
index 2fdfa42..9be3f57 100644 (file)
@@ -184,7 +184,8 @@ class FeedItem {
 }
 
 /**
- * @todo document (needs one-sentence top-level class description).
+ * Class to support the outputting of syndication feeds in Atom and RSS format.
+ *
  * @ingroup Feed
  */
 abstract class ChannelFeed extends FeedItem {
@@ -338,13 +339,14 @@ class RSSFeed extends ChannelFeed {
  */
 class AtomFeed extends ChannelFeed {
        /**
-        * @todo document
-        * @param string|int $ts
+        * Format a date given timestamp.
+        *
+        * @param string|int $timestamp
         * @return string
         */
-       function formatTime( $ts ) {
+       function formatTime( $timestamp ) {
                // need to use RFC 822 time format at least for rss2.0
-               return gmdate( 'Y-m-d\TH:i:s', wfTimestamp( TS_UNIX, $ts ) );
+               return gmdate( 'Y-m-d\TH:i:s', wfTimestamp( TS_UNIX, $timestamp ) );
        }
 
        /**
index 9518182..5232413 100644 (file)
@@ -1078,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 );
 }
 
@@ -1182,7 +1182,7 @@ function wfDebugLog(
                MWDebug::debugMsg( "[{$logGroup}] {$text}\n" );
        }
 
-       $logger = MWLogger::getInstance( $logGroup );
+       $logger = MWLoggerFactory::getInstance( $logGroup );
        $context['private'] = ( $dest === 'private' );
        $logger->info( $text, $context );
 }
@@ -1196,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 );
 }
 
@@ -1259,7 +1259,7 @@ function wfLogWarning( $msg, $callerOffset = 1, $level = E_USER_WARNING ) {
  */
 function wfErrorLog( $text, $file, array $context = array() ) {
        wfDeprecated( __METHOD__, '1.25' );
-       $logger = MWLogger::getInstance( 'wfErrorLog' );
+       $logger = MWLoggerFactory::getInstance( 'wfErrorLog' );
        $context['destination'] = $file;
        $logger->info( trim( $text ), $context );
 }
@@ -1334,7 +1334,7 @@ function wfLogProfilingData() {
 
        $ctx['output'] = $profiler->getOutput();
 
-       $log = MWLogger::getInstance( 'profileoutput' );
+       $log = MWLoggerFactory::getInstance( 'profileoutput' );
        $log->info( "Elapsed: {elapsed}; URL: <{url}>\n{output}", $ctx );
 }
 
@@ -4026,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 );
@@ -4198,3 +4198,91 @@ function wfIsConfiguredProxy( $ip ) {
        wfDeprecated( __METHOD__, '1.24' );
        return IP::isConfiguredProxy( $ip );
 }
+
+/**
+ * Returns true if these thumbnail parameters match one that MediaWiki
+ * requests from file description pages and/or parser output.
+ *
+ * $params is considered non-standard if they involve a non-standard
+ * width or any non-default parameters aside from width and page number.
+ * The number of possible files with standard parameters is far less than
+ * that of all combinations; rate-limiting for them can thus be more generious.
+ *
+ * @param File $file
+ * @param array $params
+ * @return bool
+ * @since 1.24 Moved from thumb.php to GlobalFunctions in 1.25
+ */
+function wfThumbIsStandard( File $file, array $params ) {
+       global $wgThumbLimits, $wgImageLimits, $wgResponsiveImages;
+
+       $multipliers = array( 1 );
+       if ( $wgResponsiveImages ) {
+               // These available sizes are hardcoded currently elsewhere in MediaWiki.
+               // @see Linker::processResponsiveImages
+               $multipliers[] = 1.5;
+               $multipliers[] = 2;
+       }
+
+       $handler = $file->getHandler();
+       if ( !$handler || !isset( $params['width'] ) ) {
+               return false;
+       }
+
+       $basicParams = array();
+       if ( isset( $params['page'] ) ) {
+               $basicParams['page'] = $params['page'];
+       }
+
+       $thumbLimits = array();
+       $imageLimits = array();
+       // Expand limits to account for multipliers
+       foreach ( $multipliers as $multiplier ) {
+               $thumbLimits = array_merge( $thumbLimits, array_map(
+                       function ( $width ) use ( $multiplier ) {
+                               return round( $width * $multiplier );
+                       }, $wgThumbLimits )
+               );
+               $imageLimits = array_merge( $imageLimits, array_map(
+                       function ( $pair ) use ( $multiplier ) {
+                               return array(
+                                       round( $pair[0] * $multiplier ),
+                                       round( $pair[1] * $multiplier ),
+                               );
+                       }, $wgImageLimits )
+               );
+       }
+
+       // Check if the width matches one of $wgThumbLimits
+       if ( in_array( $params['width'], $thumbLimits ) ) {
+               $normalParams = $basicParams + array( 'width' => $params['width'] );
+               // Append any default values to the map (e.g. "lossy", "lossless", ...)
+               $handler->normaliseParams( $file, $normalParams );
+       } else {
+               // If not, then check if the width matchs one of $wgImageLimits
+               $match = false;
+               foreach ( $imageLimits as $pair ) {
+                       $normalParams = $basicParams + array( 'width' => $pair[0], 'height' => $pair[1] );
+                       // Decide whether the thumbnail should be scaled on width or height.
+                       // Also append any default values to the map (e.g. "lossy", "lossless", ...)
+                       $handler->normaliseParams( $file, $normalParams );
+                       // Check if this standard thumbnail size maps to the given width
+                       if ( $normalParams['width'] == $params['width'] ) {
+                               $match = true;
+                               break;
+                       }
+               }
+               if ( !$match ) {
+                       return false; // not standard for description pages
+               }
+       }
+
+       // Check that the given values for non-page, non-width, params are just defaults
+       foreach ( $params as $key => $value ) {
+               if ( !isset( $normalParams[$key] ) || $normalParams[$key] != $value ) {
+                       return false;
+               }
+       }
+
+       return true;
+}
index 93a1a04..fe8f57e 100644 (file)
@@ -257,19 +257,11 @@ class Html {
         * @return string
         */
        public static function openElement( $element, $attribs = array() ) {
-               global $wgWellFormedXml;
                $attribs = (array)$attribs;
                // This is not required in HTML5, but let's do it anyway, for
                // consistency and better compression.
                $element = strtolower( $element );
 
-               // In text/html, initial <html> and <head> tags can be omitted under
-               // pretty much any sane circumstances, if they have no attributes.  See:
-               // <http://www.whatwg.org/html/syntax.html#optional-tags>
-               if ( !$wgWellFormedXml && !$attribs && in_array( $element, array( 'html', 'head' ) ) ) {
-                       return '';
-               }
-
                // Remove invalid input types
                if ( $element == 'input' ) {
                        $validTypes = array(
index c3caecc..eb2ca77 100644 (file)
@@ -42,13 +42,15 @@ class WikiImporter {
        private $config;
        /** @var ImportTitleFactory */
        private $importTitleFactory;
+       /** @var array */
+       private $countableCache = array();
 
        /**
         * Creates an ImportXMLReader drawing from the source provided
-        * @param ImportStreamSource $source
+        * @param ImportSource $source
         * @param Config $config
         */
-       function __construct( ImportStreamSource $source, Config $config = null ) {
+       function __construct( ImportSource $source, Config $config = null ) {
                $this->reader = new XMLReader();
                if ( !$config ) {
                        wfDeprecated( __METHOD__ . ' without a Config instance', '1.25' );
@@ -67,6 +69,7 @@ class WikiImporter {
                }
 
                // Default callbacks
+               $this->setPageCallback( array( $this, 'beforeImportPage' ) );
                $this->setRevisionCallback( array( $this, "importRevision" ) );
                $this->setUploadCallback( array( $this, 'importUpload' ) );
                $this->setLogItemCallback( array( $this, 'importLogItem' ) );
@@ -288,6 +291,19 @@ class WikiImporter {
                $this->mImportUploads = $import;
        }
 
+       /**
+        * Default per-page callback. Sets up some things related to site statistics
+        * @param array $titleAndForeignTitle Two-element array, with Title object at
+        * index 0 and ForeignTitle object at index 1
+        * @return bool
+        */
+       public function beforeImportPage( $titleAndForeignTitle ) {
+               $title = $titleAndForeignTitle[0];
+               $page = WikiPage::factory( $title );
+               $this->countableCache['title_' . $title->getPrefixedText()] = $page->isCountable();
+               return true;
+       }
+
        /**
         * Default per-revision callback, performs the import.
         * @param WikiRevision $revision
@@ -349,6 +365,26 @@ class WikiImporter {
         */
        public function finishImportPage( $title, $foreignTitle, $revCount,
                        $sRevCount, $pageInfo ) {
+
+               // Update article count statistics (T42009)
+               // The normal counting logic in WikiPage->doEditUpdates() is designed for
+               // one-revision-at-a-time editing, not bulk imports. In this situation it
+               // suffers from issues of slave lag. We let WikiPage handle the total page
+               // and revision count, and we implement our own custom logic for the
+               // article (content page) count.
+               $page = WikiPage::factory( $title );
+               $page->loadPageData( 'fromdbmaster' );
+               $content = $page->getContent();
+               $editInfo = $page->prepareContentForEdit( $content );
+
+               $countable = $page->isCountable( $editInfo );
+               $oldcountable = $this->countableCache['title_' . $title->getPrefixedText()];
+               if ( isset( $oldcountable ) && $countable != $oldcountable ) {
+                       DeferredUpdates::addUpdate( SiteStatsUpdate::factory( array(
+                               'articles' => ( (int)$countable - (int)$oldcountable )
+                       ) ) );
+               }
+
                $args = func_get_args();
                return Hooks::run( 'AfterImportPage', $args );
        }
@@ -497,36 +533,48 @@ class WikiImporter {
 
                $keepReading = $this->reader->read();
                $skip = false;
-               while ( $keepReading ) {
-                       $tag = $this->reader->name;
-                       $type = $this->reader->nodeType;
-
-                       if ( !Hooks::run( 'ImportHandleToplevelXMLTag', array( $this ) ) ) {
-                               // Do nothing
-                       } elseif ( $tag == 'mediawiki' && $type == XMLReader::END_ELEMENT ) {
-                               break;
-                       } elseif ( $tag == 'siteinfo' ) {
-                               $this->handleSiteInfo();
-                       } elseif ( $tag == 'page' ) {
-                               $this->handlePage();
-                       } elseif ( $tag == 'logitem' ) {
-                               $this->handleLogItem();
-                       } elseif ( $tag != '#text' ) {
-                               $this->warn( "Unhandled top-level XML tag $tag" );
-
-                               $skip = true;
-                       }
+               $rethrow = null;
+               try {
+                       while ( $keepReading ) {
+                               $tag = $this->reader->name;
+                               $type = $this->reader->nodeType;
+
+                               if ( !Hooks::run( 'ImportHandleToplevelXMLTag', array( $this ) ) ) {
+                                       // Do nothing
+                               } elseif ( $tag == 'mediawiki' && $type == XMLReader::END_ELEMENT ) {
+                                       break;
+                               } elseif ( $tag == 'siteinfo' ) {
+                                       $this->handleSiteInfo();
+                               } elseif ( $tag == 'page' ) {
+                                       $this->handlePage();
+                               } elseif ( $tag == 'logitem' ) {
+                                       $this->handleLogItem();
+                               } elseif ( $tag != '#text' ) {
+                                       $this->warn( "Unhandled top-level XML tag $tag" );
+
+                                       $skip = true;
+                               }
 
-                       if ( $skip ) {
-                               $keepReading = $this->reader->next();
-                               $skip = false;
-                               $this->debug( "Skip" );
-                       } else {
-                               $keepReading = $this->reader->read();
+                               if ( $skip ) {
+                                       $keepReading = $this->reader->next();
+                                       $skip = false;
+                                       $this->debug( "Skip" );
+                               } else {
+                                       $keepReading = $this->reader->read();
+                               }
                        }
+               } catch ( Exception $ex ) {
+                       $rethrow = $ex;
                }
 
+               // finally
                libxml_disable_entity_loader( $oldDisable );
+               $this->reader->close();
+
+               if ( $rethrow ) {
+                       throw $rethrow;
+               }
+
                return true;
        }
 
@@ -967,10 +1015,10 @@ class UploadSourceAdapter {
        private $mPosition;
 
        /**
-        * @param ImportStreamSource $source
+        * @param ImportSource $source
         * @return string
         */
-       static function registerSource( ImportStreamSource $source ) {
+       static function registerSource( ImportSource $source ) {
                $id = wfRandomString();
 
                self::$sourceRegistrations[$id] = $source;
@@ -1532,7 +1580,6 @@ class WikiRevision {
                                        $this->title->getPrefixedText() . "]], timestamp " . $this->timestamp . "\n" );
                                return false;
                        }
-                       $oldcountable = $page->isCountable();
                }
 
                # @todo FIXME: Use original rev_id optionally (better for backups)
@@ -1555,10 +1602,11 @@ class WikiRevision {
 
                if ( $changed !== false && !$this->mNoUpdates ) {
                        wfDebug( __METHOD__ . ": running updates\n" );
+                       // countable/oldcountable stuff is handled in WikiImporter::finishImportPage
                        $page->doEditUpdates(
                                $revision,
                                $userObj,
-                               array( 'created' => $created, 'oldcountable' => $oldcountable )
+                               array( 'created' => $created, 'oldcountable' => 'no-change' )
                        );
                }
 
@@ -1670,7 +1718,7 @@ class WikiRevision {
                        wfDebug( __METHOD__ . ": Successful\n" );
                        return true;
                } else {
-                       wfDebug( __METHOD__ . ': failed: ' . $status->getXml() . "\n" );
+                       wfDebug( __METHOD__ . ': failed: ' . $status->getHTML() . "\n" );
                        return false;
                }
        }
@@ -1708,6 +1756,30 @@ class WikiRevision {
 
 }
 
+/**
+ * Source interface for XML import.
+ */
+interface ImportSource {
+
+       /**
+        * Indicates whether the end of the input has been reached.
+        * Will return true after a finite number of calls to readChunk.
+        *
+        * @return bool true if there is no more input, false otherwise.
+        */
+       function atEnd();
+
+       /**
+        * Return a chunk of the input, as a (possibly empty) string.
+        * When the end of input is reached, readChunk() returns false.
+        * If atEnd() returns false, readChunk() will return a string.
+        * If atEnd() returns true, readChunk() will return false.
+        *
+        * @return bool|string
+        */
+       function readChunk();
+}
+
 /**
  * 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.
@@ -1715,7 +1787,7 @@ class WikiRevision {
  *
  * @ingroup SpecialPage
  */
-class ImportStringSource {
+class ImportStringSource implements ImportSource {
        function __construct( $string ) {
                $this->mString = $string;
                $this->mRead = false;
@@ -1744,7 +1816,7 @@ class ImportStringSource {
  * Imports a XML dump from a file (either from file upload, files on disk, or HTTP)
  * @ingroup SpecialPage
  */
-class ImportStreamSource {
+class ImportStreamSource implements ImportSource {
        function __construct( $handle ) {
                $this->mHandle = $handle;
        }
index 7840868..dd224ef 100644 (file)
@@ -1251,7 +1251,6 @@ class Linker {
                        $userId = $rev->getUser( Revision::FOR_THIS_USER );
                        $userText = $rev->getUserText( Revision::FOR_THIS_USER );
                        $link = self::userLink( $userId, $userText )
-                               . wfMessage( 'word-separator' )->escaped()
                                . self::userToolLinks( $userId, $userText );
                } else {
                        $link = wfMessage( 'rev-deleted-user' )->escaped();
@@ -1464,9 +1463,9 @@ class Linker {
 
                                                if ( $wikiId !== null ) {
                                                        $thelink = Linker::makeExternalLink(
-                                                               WikiMap::getForeignURL( $wikiId, $target->getPrefixedURL() ),
+                                                               WikiMap::getForeignURL( $wikiId, $target->getFullText() ),
                                                                $linkText . $inside,
-                                                               true
+                                                               /* escape = */ false // Already escaped
                                                        ) . $trail;
                                                } else {
                                                        $thelink = Linker::link(
@@ -1605,7 +1604,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 ) {
@@ -1751,6 +1750,14 @@ class Linker {
                $link, $legacyAnchor = false
        ) {
                $ret = "<h$level$attribs"
+                       . Html::element( 'a',
+                               array(
+                                       'href' => '#' . $anchor,
+                                       'class' => 'mw-headline-anchor',
+                                       'title' => wfMessage( 'headline-anchor-title' )->text()
+                               ),
+                               wfMessage( 'section-symbol' )->text()
+                       )
                        . "<span class=\"mw-headline\" id=\"$anchor\">$html</span>"
                        . $link
                        . "</h$level>";
@@ -1870,7 +1877,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
@@ -2043,14 +2050,14 @@ class Linker {
                                if ( $titleObj->quickUserCan( 'edit' ) ) {
                                        $editLink = self::link(
                                                $titleObj,
-                                               wfMessage( 'editlink' )->text(),
+                                               wfMessage( 'editlink' )->escaped(),
                                                array(),
                                                array( 'action' => 'edit' )
                                        );
                                } else {
                                        $editLink = self::link(
                                                $titleObj,
-                                               wfMessage( 'viewsourcelink' )->text(),
+                                               wfMessage( 'viewsourcelink' )->escaped(),
                                                array(),
                                                array( 'action' => 'edit' )
                                        );
index d94443b..c21f5e9 100644 (file)
@@ -393,7 +393,11 @@ class MediaWiki {
                if ( $action instanceof Action ) {
                        # Let Squid cache things if we can purge them.
                        if ( $this->config->get( 'UseSquid' ) &&
-                               in_array( $request->getFullRequestURL(), $requestTitle->getSquidURLs() )
+                               in_array(
+                                       // Use PROTO_INTERNAL because that's what getSquidURLs() uses
+                                       wfExpandUrl( $request->getRequestURL(), PROTO_INTERNAL ),
+                                       $requestTitle->getSquidURLs()
+                               )
                        ) {
                                $output->setSquidMaxage( $this->config->get( 'SquidMaxage' ) );
                        }
@@ -485,6 +489,17 @@ class MediaWiki {
                $action = $this->getAction();
                $wgTitle = $title;
 
+               // Aside from rollback, master queries should not happen on GET requests.
+               // Periodic or "in passing" updates on GET should use the job queue.
+               if ( !$request->wasPosted()
+                       && in_array( $action, array( 'view', 'edit', 'history' ) )
+               ) {
+                       $trxProfiler = Profiler::instance()->getTransactionProfiler();
+                       $trxProfiler->setExpectation( 'masterConns', 0, __METHOD__ );
+                       $trxProfiler->setExpectation( 'writes', 0, __METHOD__ );
+                       $trxProfiler->setExpectation( 'maxAffected', 500, __METHOD__ );
+               }
+
                // If the user has forceHTTPS set to true, or if the user
                // is in a group requiring HTTPS, or if they have the HTTPS
                // preference set, redirect them to HTTPS.
@@ -571,6 +586,10 @@ class MediaWiki {
         * Ends this task peacefully
         */
        public function restInPeace() {
+               // Ignore things like master queries/connections on GET requests
+               // as long as they are in deferred updates (which catch errors).
+               Profiler::instance()->getTransactionProfiler()->resetExpectations();
+
                // Do any deferred jobs
                DeferredUpdates::doUpdates( 'commit' );
 
@@ -608,9 +627,11 @@ class MediaWiki {
                        $n = intval( $jobRunRate );
                }
 
+               $runJobsLogger = MWLoggerFactory::getInstance( 'runJobs' );
+
                if ( !$this->config->get( 'RunJobsAsync' ) ) {
                        // Fall back to running the job here while the user waits
-                       $runner = new JobRunner();
+                       $runner = new JobRunner( $runJobsLogger );
                        $runner->run( array( 'maxJobs'  => $n ) );
                        return;
                }
@@ -643,9 +664,9 @@ class MediaWiki {
                );
                wfRestoreWarnings();
                if ( !$sock ) {
-                       wfDebugLog( 'runJobs', "Failed to start cron API (socket error $errno): $errstr\n" );
+                       $runJobsLogger->error( "Failed to start cron API (socket error $errno): $errstr" );
                        // Fall back to running the job here while the user waits
-                       $runner = new JobRunner();
+                       $runner = new JobRunner( $runJobsLogger );
                        $runner->run( array( 'maxJobs'  => $n ) );
                        return;
                }
@@ -653,19 +674,19 @@ class MediaWiki {
                $url = wfAppendQuery( wfScript( 'index' ), $query );
                $req = "POST $url HTTP/1.1\r\nHost: {$info['host']}\r\nConnection: Close\r\nContent-Length: 0\r\n\r\n";
 
-               wfDebugLog( 'runJobs', "Running $n job(s) via '$url'\n" );
+               $runJobsLogger->info( "Running $n job(s) via '$url'" );
                // Send a cron API request to be performed in the background.
                // Give up if this takes too long to send (which should be rare).
                stream_set_timeout( $sock, 1 );
                $bytes = fwrite( $sock, $req );
                if ( $bytes !== strlen( $req ) ) {
-                       wfDebugLog( 'runJobs', "Failed to start cron API (socket write error)\n" );
+                       $runJobsLogger->error( "Failed to start cron API (socket write error)" );
                } else {
                        // Do not wait for the response (the script should handle client aborts).
                        // Make sure that we don't close before that script reaches ignore_user_abort().
                        $status = fgets( $sock );
                        if ( !preg_match( '#^HTTP/\d\.\d 202 #', $status ) ) {
-                               wfDebugLog( 'runJobs', "Failed to start cron API: received '$status'\n" );
+                               $runJobsLogger->error( "Failed to start cron API: received '$status'" );
                        }
                }
                fclose( $sock );
index 93a37cb..49437f4 100644 (file)
  *
  * @since 1.17
  */
-class Message {
+class Message implements MessageSpecifier {
 
        /**
         * In which language to get this message. True, which is the default,
@@ -276,7 +276,7 @@ class Message {
         * Returns the message key.
         *
         * If a list of multiple possible keys was supplied to the constructor, this method may
-        * return any of these keys. After the message ahs been fetched, this method will return
+        * return any of these keys. After the message has been fetched, this method will return
         * the key that was actually used to fetch the message.
         *
         * @since 1.21
diff --git a/includes/NoLocalSettings.php b/includes/NoLocalSettings.php
new file mode 100644 (file)
index 0000000..6de9bfc
--- /dev/null
@@ -0,0 +1,63 @@
+<?php
+/**
+ * Display an error page when there is no LocalSettings.php file.
+ *
+ * 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
+ */
+
+# bug 30219 : can not use pathinfo() on URLs since slashes do not match
+$matches = array();
+$ext = 'php';
+$path = '/';
+foreach ( array_filter( explode( '/', $_SERVER['PHP_SELF'] ) ) as $part ) {
+       if ( !preg_match( '/\.(php5?)$/', $part, $matches ) ) {
+               $path .= "$part/";
+       } else {
+               $ext = $matches[1] == 'php5' ? 'php5' : 'php';
+               break;
+       }
+}
+
+# Check to see if the installer is running
+if ( !function_exists( 'session_name' ) ) {
+       $installerStarted = false;
+} else {
+       session_name( 'mw_installer_session' );
+       $oldReporting = error_reporting( E_ALL & ~E_NOTICE );
+       $success = session_start();
+       error_reporting( $oldReporting );
+       $installerStarted = ( $success && isset( $_SESSION['installData'] ) );
+}
+
+$templateParser = new TemplateParser();
+
+# Render error page if no LocalSettings file can be found
+try {
+       echo $templateParser->processTemplate(
+               'NoLocalSettings',
+               array(
+                       'wgVersion' => ( isset( $wgVersion ) ? $wgVersion : 'VERSION' ),
+                       'path' => $path,
+                       'ext' => $ext,
+                       'localSettingsExists' => file_exists( MW_CONFIG_FILE ),
+                       'installerStarted' => $installerStarted
+               )
+       );
+} catch ( Exception $e ) {
+       echo 'Error: ' . htmlspecialchars( $e->getMessage() );
+}
index a10946a..5c146e4 100644 (file)
@@ -3284,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
@@ -3878,4 +3885,16 @@ class OutputPage extends ContextSource {
        public function sectionEditLinksEnabled() {
                return $this->mEnableSectionEditLinks;
        }
+
+       /**
+        * Add ResourceLoader module styles for OOUI and set up the PHP implementation of it for use with
+        * MediaWiki and this OutputPage instance.
+        *
+        * @since 1.25
+        */
+       public function enableOOUI() {
+               OOUI\Theme::setSingleton( new OOUI\MediaWikiTheme() );
+               OOUI\Element::setDefaultDir( $this->getLanguage()->getDir() );
+               $this->addModuleStyles( 'oojs-ui.styles' );
+       }
 }
index 9e0a255..40c3a2b 100644 (file)
@@ -893,6 +893,9 @@ class Preferences {
                                'section' => 'rc/advancedrc',
                                'label-message' => 'tog-hidepatrolled',
                        );
+               }
+
+               if ( $user->useNPPatrol() ) {
                        $defaultPreferences['newpageshidepatrolled'] = array(
                                'type' => 'toggle',
                                'section' => 'rc/advancedrc',
@@ -919,6 +922,30 @@ class Preferences {
                $watchlistdaysMax = ceil( $config->get( 'RCMaxAge' ) / ( 3600 * 24 ) );
 
                ## Watchlist #####################################
+               if ( $user->isAllowed( 'editmywatchlist' ) ) {
+                       $editWatchlistLinks = array();
+                       $editWatchlistModes = array(
+                               'edit' => array( 'EditWatchlist', false ),
+                               'raw' => array( 'EditWatchlist', 'raw' ),
+                               'clear' => array( 'EditWatchlist', 'clear' ),
+                       );
+                       foreach ( $editWatchlistModes as $editWatchlistMode => $mode ) {
+                               // Messages: prefs-editwatchlist-edit, prefs-editwatchlist-raw, prefs-editwatchlist-clear
+                               $editWatchlistLinks[] = Linker::linkKnown(
+                                       SpecialPage::getTitleFor( $mode[0], $mode[1] ),
+                                       $context->msg( "prefs-editwatchlist-{$editWatchlistMode}" )->parse()
+                               );
+                       }
+
+                       $defaultPreferences['editwatchlist'] = array(
+                               'type' => 'info',
+                               'raw' => true,
+                               'default' => $context->getLanguage()->pipeList( $editWatchlistLinks ),
+                               'label-message' => 'prefs-editwatchlist-label',
+                               'section' => 'watchlist/editwatchlist',
+                       );
+               }
+
                $defaultPreferences['watchlistdays'] = array(
                        'type' => 'float',
                        'min' => 0,
@@ -967,7 +994,7 @@ class Preferences {
                        'label-message' => 'tog-watchlisthideliu',
                );
 
-               if ( $context->getConfig()->get( 'UseRCPatrol' ) ) {
+               if ( $user->useRCPatrol() ) {
                        $defaultPreferences['watchlisthidepatrolled'] = array(
                                'type' => 'toggle',
                                'section' => 'watchlist/advancedwatchlist',
index 76ad252..f777a37 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 ) {
@@ -411,11 +412,9 @@ class ProtectionForm {
                                } else {
                                        list( $show, $value ) = explode( ":", $option );
                                }
-                               $show = htmlspecialchars( $show );
-                               $value = htmlspecialchars( $value );
                                $expiryFormOptions .= Xml::option(
                                        $show,
-                                       $value,
+                                       htmlspecialchars( $value ),
                                        $this->mExpirySelection[$action] === $value
                                ) . "\n";
                        }
@@ -464,7 +463,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 +476,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 +520,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 +531,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 +544,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 +599,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 c8015e6..d535028 100644 (file)
@@ -121,7 +121,9 @@ class Revision implements IDBAccessObject {
                if ( $id ) {
                        // Use the specified ID
                        $conds['rev_id'] = $id;
-                       return self::newFromConds( $conds, (int)$flags );
+                       // This uses slave->master fallback with READ_NORMAL. Assuming revdelete,
+                       // moves, and merges are rare, callers can use this to reduce master queries.
+                       return self::newFromConds( $conds, $flags );
                } else {
                        // Use a join to get the latest revision
                        $conds[] = 'rev_id=page_latest';
@@ -148,11 +150,15 @@ class Revision implements IDBAccessObject {
                $conds = array( 'page_id' => $pageId );
                if ( $revId ) {
                        $conds['rev_id'] = $revId;
+                       // This uses slave->master fallback with READ_NORMAL. Assuming revdelete
+                       // and merges are rare, callers can use this to reduce master queries.
+                       return self::newFromConds( $conds, $flags );
                } else {
                        // Use a join to get the latest revision
                        $conds[] = 'rev_id = page_latest';
+                       $db = wfGetDB( ( $flags & self::READ_LATEST ) ? DB_MASTER : DB_SLAVE );
+                       return self::loadFromConds( $db, $conds, $flags );
                }
-               return self::newFromConds( $conds, (int)$flags );
        }
 
        /**
@@ -826,9 +832,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 );
        }
 
        /**
@@ -850,7 +858,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;
                }
        }
 
@@ -858,17 +874,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 );
        }
 
        /**
@@ -898,9 +908,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 );
        }
 
        /**
@@ -936,7 +948,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()
                        ),
index 6942ac0..f215f5f 100644 (file)
@@ -39,6 +39,12 @@ class Sanitizer {
                 |&\#[xX]([0-9A-Fa-f]+);
                 |(&)/x';
 
+       /**
+        * Acceptable tag name charset from HTML5 parsing spec
+        * http://www.w3.org/TR/html5/syntax.html#tag-open-state
+        */
+       const ELEMENT_BITS_REGEX = '!^(/?)([A-Za-z][^\t\n\v />\0]*+)([^>]*?)(/?>)([^<]*)$!';
+
        /**
         * Blacklist for evil uris like javascript:
         * WARNING: DO NOT use this in any place that actually requires blacklisting
@@ -355,7 +361,6 @@ class Sanitizer {
        /**
         * Cleans up HTML, removes dangerous tags and attributes, and
         * removes HTML comments
-        * @private
         * @param string $text
         * @param callable $processCallback Callback to do any variable or parameter
         *   replacements in HTML attribute values
@@ -364,7 +369,7 @@ class Sanitizer {
         * @param array $removetags For any tags (default or extra) to exclude
         * @return string
         */
-       static function removeHTMLtags( $text, $processCallback = null,
+       public static function removeHTMLtags( $text, $processCallback = null,
                $args = array(), $extratags = array(), $removetags = array()
        ) {
                global $wgUseTidy, $wgAllowMicrodataAttributes, $wgAllowImageTag;
@@ -445,7 +450,7 @@ class Sanitizer {
                                # $params: String between element name and >
                                # $brace: Ending '>' or '/>'
                                # $rest: Everything until the next element of $bits
-                               if ( preg_match( '!^(/?)([^\\s/>]+)([^>]*?)(/{0,1}>)([^<]*)$!', $x, $regs ) ) {
+                               if ( preg_match( self::ELEMENT_BITS_REGEX, $x, $regs ) ) {
                                        list( /* $qbar */, $slash, $t, $params, $brace, $rest ) = $regs;
                                } else {
                                        $slash = $t = $params = $brace = $rest = null;
@@ -568,11 +573,7 @@ class Sanitizer {
                } else {
                        # this might be possible using tidy itself
                        foreach ( $bits as $x ) {
-                               preg_match(
-                                       '/^(\\/?)(\\w+)([^>]*?)(\\/{0,1}>)([^<]*)$/',
-                                       $x,
-                                       $regs
-                               );
+                               preg_match( self::ELEMENT_BITS_REGEX, $x, $regs );
 
                                wfSuppressWarnings();
                                list( /* $qbar */, $slash, $t, $params, $brace, $rest ) = $regs;
@@ -607,11 +608,10 @@ class Sanitizer {
         * and followed by a newline (ignoring spaces), trim leading and
         * trailing spaces and one of the newlines.
         *
-        * @private
         * @param string $text
         * @return string
         */
-       static function removeHTMLcomments( $text ) {
+       public static function removeHTMLcomments( $text ) {
                while ( ( $start = strpos( $text, '<!--' ) ) !== false ) {
                        $end = strpos( $text, '-->', $start + 4 );
                        if ( $end === false ) {
index c75429e..6939f95 100644 (file)
@@ -140,6 +140,9 @@ if ( isset( $wgFooterIcons['poweredby'] )
 ) {
        $wgFooterIcons['poweredby']['mediawiki']['src'] =
                "$wgResourceBasePath/resources/assets/poweredby_mediawiki_88x31.png";
+       $wgFooterIcons['poweredby']['mediawiki']['srcset'] =
+               "$wgResourceBasePath/resources/assets/poweredby_mediawiki_132x47.png 1.5x, " .
+               "$wgResourceBasePath/resources/assets/poweredby_mediawiki_176x62.png 2x";
 }
 
 /**
@@ -476,8 +479,7 @@ if ( !class_exists( 'AutoLoader' ) ) {
 
 MWExceptionHandler::installHandler();
 
-require_once "$IP/includes/normal/UtfNormalUtil.php";
-require_once "$IP/includes/normal/UtfNormalDefines.php";
+require_once "$IP/includes/libs/normal/UtfNormalUtil.php";
 
 $ps_default2 = Profiler::instance()->scopedProfileIn( $fname . '-defaults2' );
 
index fb267bd..cd10258 100644 (file)
  * so that a lack of error-handling will be explicit.
  */
 class Status {
-       /** @var bool */
-       public $ok = true;
+       /** @var StatusValue */
+       protected $sv;
 
        /** @var mixed */
        public $value;
-
-       /** Counters for batch operations */
-       /** @var int */
+       /** @var array Map of (key => bool) to indicate success of each part of batch operations */
+       public $success = array();
+       /** @var int Counter for batch operations */
        public $successCount = 0;
-
-       /** @var int */
+       /** @var int Counter for batch operations */
        public $failCount = 0;
 
-       /** Array to indicate which items of the batch operations were successful */
-       /** @var array */
-       public $success = array();
-
-       /** @var array */
-       public $errors = array();
-
        /** @var callable */
        public $cleanCallback = false;
 
+       /**
+        * @param StatusValue $sv [optional]
+        */
+       public function __construct( StatusValue $sv = null ) {
+               $this->sv = ( $sv === null ) ? new StatusValue() : $sv;
+               // B/C field aliases
+               $this->value =& $this->sv->value;
+               $this->successCount =& $this->sv->successCount;
+               $this->failCount =& $this->sv->failCount;
+               $this->success =& $this->sv->success;
+       }
+
+       /**
+        * Succinct helper method to wrap a StatusValue
+        *
+        * This is is useful when formatting StatusValue objects:
+        * <code>
+        *     $this->getOutput()->addHtml( Status::wrap( $sv )->getHTML() );
+        * </code>
+        *
+        * @param StatusValue|Status $sv
+        * @return Status
+        */
+       public static function wrap( $sv ) {
+               return $sv instanceof Status ? $sv : new self( $sv );
+       }
+
        /**
         * Factory function for fatal errors
         *
         * @param string|Message $message Message name or object
         * @return Status
         */
-       static function newFatal( $message /*, parameters...*/ ) {
-               $params = func_get_args();
-               $result = new self;
-               call_user_func_array( array( &$result, 'error' ), $params );
-               $result->ok = false;
-               return $result;
+       public static function newFatal( $message /*, parameters...*/ ) {
+               return new self( call_user_func_array(
+                       array( 'StatusValue', 'newFatal' ), func_get_args()
+               ) );
        }
 
        /**
@@ -81,10 +98,11 @@ class Status {
         * @param mixed $value
         * @return Status
         */
-       static function newGood( $value = null ) {
-               $result = new self;
-               $result->value = $value;
-               return $result;
+       public static function newGood( $value = null ) {
+               $sv = new StatusValue();
+               $sv->value = $value;
+
+               return new self( $sv );
        }
 
        /**
@@ -94,8 +112,7 @@ class Status {
         * @param mixed $value
         */
        public function setResult( $ok, $value = null ) {
-               $this->ok = $ok;
-               $this->value = $value;
+               $this->sv->setResult( $ok, $value );
        }
 
        /**
@@ -105,7 +122,7 @@ class Status {
         * @return bool
         */
        public function isGood() {
-               return $this->ok && !$this->errors;
+               return $this->sv->isGood();
        }
 
        /**
@@ -114,7 +131,7 @@ class Status {
         * @return bool
         */
        public function isOK() {
-               return $this->ok;
+               return $this->sv->isOK();
        }
 
        /**
@@ -123,11 +140,7 @@ class Status {
         * @param string|Message $message Message name or object
         */
        public function warning( $message /*, parameters... */ ) {
-               $params = array_slice( func_get_args(), 1 );
-               $this->errors[] = array(
-                       'type' => 'warning',
-                       'message' => $message,
-                       'params' => $params );
+               call_user_func_array( array( $this->sv, 'warning' ), func_get_args() );
        }
 
        /**
@@ -137,11 +150,7 @@ class Status {
         * @param string|Message $message Message name or object
         */
        public function error( $message /*, parameters... */ ) {
-               $params = array_slice( func_get_args(), 1 );
-               $this->errors[] = array(
-                       'type' => 'error',
-                       'message' => $message,
-                       'params' => $params );
+               call_user_func_array( array( $this->sv, 'error' ), func_get_args() );
        }
 
        /**
@@ -151,35 +160,14 @@ class Status {
         * @param string|Message $message Message name or object
         */
        public function fatal( $message /*, parameters... */ ) {
-               $params = array_slice( func_get_args(), 1 );
-               $this->errors[] = array(
-                       'type' => 'error',
-                       'message' => $message,
-                       'params' => $params );
-               $this->ok = false;
-       }
-
-       /**
-        * Don't save the callback when serializing, because Closures can't be
-        * serialized and we're going to clear it in __wakeup anyway.
-        */
-       public function __sleep() {
-               $keys = array_keys( get_object_vars( $this ) );
-               return array_diff( $keys, array( 'cleanCallback' ) );
-       }
-
-       /**
-        * Sanitize the callback parameter on wakeup, to avoid arbitrary execution.
-        */
-       public function __wakeup() {
-               $this->cleanCallback = false;
+               call_user_func_array( array( $this->sv, 'fatal' ), func_get_args() );
        }
 
        /**
         * @param array $params
         * @return array
         */
-       protected function cleanParams( $params ) {
+       protected function cleanParams( array $params ) {
                if ( !$this->cleanCallback ) {
                        return $params;
                }
@@ -199,24 +187,26 @@ class Status {
         * @return string
         */
        public function getWikiText( $shortContext = false, $longContext = false ) {
-               if ( count( $this->errors ) == 0 ) {
-                       if ( $this->ok ) {
-                               $this->fatal( 'internalerror_info',
+               $rawErrors = $this->sv->getErrors();
+               if ( count( $rawErrors ) == 0 ) {
+                       if ( $this->sv->isOK() ) {
+                               $this->sv->fatal( 'internalerror_info',
                                        __METHOD__ . " called for a good result, this is incorrect\n" );
                        } else {
-                               $this->fatal( 'internalerror_info',
+                               $this->sv->fatal( 'internalerror_info',
                                        __METHOD__ . ": Invalid result object: no error text but not OK\n" );
                        }
+                       $rawErrors = $this->sv->getErrors(); // just added a fatal
                }
-               if ( count( $this->errors ) == 1 ) {
-                       $s = $this->getErrorMessage( $this->errors[0] )->plain();
+               if ( count( $rawErrors ) == 1 ) {
+                       $s = $this->getErrorMessage( $rawErrors[0] )->plain();
                        if ( $shortContext ) {
                                $s = wfMessage( $shortContext, $s )->plain();
                        } elseif ( $longContext ) {
                                $s = wfMessage( $longContext, "* $s\n" )->plain();
                        }
                } else {
-                       $errors = $this->getErrorMessageArray( $this->errors );
+                       $errors = $this->getErrorMessageArray( $rawErrors );
                        foreach ( $errors as &$error ) {
                                $error = $error->plain();
                        }
@@ -241,17 +231,19 @@ class Status {
         * @return Message
         */
        public function getMessage( $shortContext = false, $longContext = false ) {
-               if ( count( $this->errors ) == 0 ) {
-                       if ( $this->ok ) {
-                               $this->fatal( 'internalerror_info',
+               $rawErrors = $this->sv->getErrors();
+               if ( count( $rawErrors ) == 0 ) {
+                       if ( $this->sv->isOK() ) {
+                               $this->sv->fatal( 'internalerror_info',
                                        __METHOD__ . " called for a good result, this is incorrect\n" );
                        } else {
-                               $this->fatal( 'internalerror_info',
+                               $this->sv->fatal( 'internalerror_info',
                                        __METHOD__ . ": Invalid result object: no error text but not OK\n" );
                        }
+                       $rawErrors = $this->sv->getErrors(); // just added a fatal
                }
-               if ( count( $this->errors ) == 1 ) {
-                       $s = $this->getErrorMessage( $this->errors[0] );
+               if ( count( $rawErrors ) == 1 ) {
+                       $s = $this->getErrorMessage( $rawErrors[0] );
                        if ( $shortContext ) {
                                $s = wfMessage( $shortContext, $s );
                        } elseif ( $longContext ) {
@@ -260,7 +252,7 @@ class Status {
                                $s = wfMessage( $longContext, $wrapper );
                        }
                } else {
-                       $msgs = $this->getErrorMessageArray( $this->errors );
+                       $msgs = $this->getErrorMessageArray( $rawErrors );
                        $msgCount = count( $msgs );
 
                        if ( $shortContext ) {
@@ -339,13 +331,7 @@ class Status {
         * @param bool $overwriteValue Whether to override the "value" member
         */
        public function merge( $other, $overwriteValue = false ) {
-               $this->errors = array_merge( $this->errors, $other->errors );
-               $this->ok = $this->ok && $other->ok;
-               if ( $overwriteValue ) {
-                       $this->value = $other->value;
-               }
-               $this->successCount += $other->successCount;
-               $this->failCount += $other->failCount;
+               $this->sv->merge( $other->sv, $overwriteValue );
        }
 
        /**
@@ -353,9 +339,10 @@ class Status {
         *
         * @return array A list in which each entry is an array with a message key as its first element.
         *         The remaining array elements are the message parameters.
+        * @deprecated 1.25
         */
        public function getErrorsArray() {
-               return $this->getStatusArray( "error" );
+               return $this->getStatusArray( 'error' );
        }
 
        /**
@@ -363,21 +350,26 @@ class Status {
         *
         * @return array A list in which each entry is an array with a message key as its first element.
         *         The remaining array elements are the message parameters.
+        * @deprecated 1.25
         */
        public function getWarningsArray() {
-               return $this->getStatusArray( "warning" );
+               return $this->getStatusArray( 'warning' );
        }
 
        /**
         * Returns a list of status messages of the given type (or all if false)
+        *
+        * @note: this handles RawMessage poorly
+        *
         * @param string $type
         * @return array
         */
        protected function getStatusArray( $type = false ) {
                $result = array();
-               foreach ( $this->errors as $error ) {
+
+               foreach ( $this->sv->getErrors() as $error ) {
                        if ( $type === false || $error['type'] === $type ) {
-                               if ( $error['message'] instanceof Message ) {
+                               if ( $error['message'] instanceof MessageSpecifier ) {
                                        $result[] = array_merge(
                                                array( $error['message']->getKey() ),
                                                $error['message']->getParams()
@@ -402,13 +394,7 @@ class Status {
         * @return array
         */
        public function getErrorsByType( $type ) {
-               $result = array();
-               foreach ( $this->errors as $error ) {
-                       if ( $error['type'] === $type ) {
-                               $result[] = $error;
-                       }
-               }
-               return $result;
+               return $this->sv->getErrorsByType( $type );
        }
 
        /**
@@ -419,19 +405,7 @@ class Status {
         * @return bool
         */
        public function hasMessage( $message ) {
-               if ( $message instanceof Message ) {
-                       $message = $message->getKey();
-               }
-               foreach ( $this->errors as $error ) {
-                       if ( $error['message'] instanceof Message
-                               && $error['message']->getKey() === $message
-                       ) {
-                               return true;
-                       } elseif ( $error['message'] === $message ) {
-                               return true;
-                       }
-               }
-               return false;
+               return $this->sv->hasMessage( $message );
        }
 
        /**
@@ -446,61 +420,67 @@ class Status {
         * @return bool Return true if the replacement was done, false otherwise.
         */
        public function replaceMessage( $source, $dest ) {
-               $replaced = false;
-               foreach ( $this->errors as $index => $error ) {
-                       if ( $error['message'] === $source ) {
-                               $this->errors[$index]['message'] = $dest;
-                               $replaced = true;
-                       }
-               }
-               return $replaced;
+               return $this->sv->replaceMessage( $source, $dest );
        }
 
        /**
         * @return mixed
         */
        public function getValue() {
-               return $this->value;
+               return $this->sv->getValue();
        }
 
        /**
-        * @return string
+        * Backwards compatibility logic
+        *
+        * @param string $name
         */
-       public function __toString() {
-               $status = $this->isOK() ? "OK" : "Error";
-               if ( count( $this->errors ) ) {
-                       $errorcount = "collected " . ( count( $this->errors ) ) . " error(s) on the way";
-               } else {
-                       $errorcount = "no errors detected";
+       function __get( $name ) {
+               if ( $name === 'ok' ) {
+                       return $this->sv->isOK();
+               } elseif ( $name === 'errors' ) {
+                       return $this->sv->getErrors();
                }
-               if ( isset( $this->value ) ) {
-                       $valstr = gettype( $this->value ) . " value set";
-                       if ( is_object( $this->value ) ) {
-                               $valstr .= "\"" . get_class( $this->value ) . "\" instance";
-                       }
+               throw new Exception( "Cannot get '$name' property." );
+       }
+
+       /**
+        * Backwards compatibility logic
+        *
+        * @param string $name
+        * @param mixed $value
+        */
+       function __set( $name, $value ) {
+               if ( $name === 'ok' ) {
+                       $this->sv->setOK( $value );
+               } elseif ( !property_exists( $this, $name ) ) {
+                       // Caller is using undeclared ad-hoc properties
+                       $this->$name = $value;
                } else {
-                       $valstr = "no value set";
+                       throw new Exception( "Cannot set '$name' property." );
                }
-               $out = sprintf( "<%s, %s, %s>",
-                       $status,
-                       $errorcount,
-                       $valstr
-               );
-               if ( count( $this->errors ) > 0 ) {
-                       $hdr = sprintf( "+-%'-4s-+-%'-25s-+-%'-40s-+\n", "", "", "" );
-                       $i = 1;
-                       $out .= "\n";
-                       $out .= $hdr;
-                       foreach ( $this->getStatusArray() as $stat ) {
-                               $out .= sprintf( "| %4d | %-25.25s | %-40.40s |\n",
-                                       $i,
-                                       $stat[0],
-                                       implode( " ", array_slice( $stat, 1 ) )
-                               );
-                               $i += 1;
-                       }
-                       $out .= $hdr;
-               };
-               return $out;
+       }
+
+       /**
+        * @return string
+        */
+       public function __toString() {
+               return $this->sv->__toString();
+       }
+
+       /**
+        * Don't save the callback when serializing, because Closures can't be
+        * serialized and we're going to clear it in __wakeup anyway.
+        */
+       function __sleep() {
+               $keys = array_keys( get_object_vars( $this ) );
+               return array_diff( $keys, array( 'cleanCallback' ) );
+       }
+
+       /**
+        * Sanitize the callback parameter on wakeup, to avoid arbitrary execution.
+        */
+       function __wakeup() {
+               $this->cleanCallback = false;
        }
 }
diff --git a/includes/TemplateParser.php b/includes/TemplateParser.php
new file mode 100644 (file)
index 0000000..57fcc24
--- /dev/null
@@ -0,0 +1,175 @@
+<?php
+/**
+ * Handles compiling Mustache templates into PHP rendering functions
+ *
+ * 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 TemplateParser {
+       /**
+        * @var string The path to the Mustache templates
+        */
+       protected $templateDir;
+
+       /**
+        * @var callable[] Array of cached rendering functions
+        */
+       protected $renderers;
+
+       /**
+        * @var bool Always compile template files
+        */
+       protected $forceRecompile = false;
+
+       /**
+        * @param string $templateDir
+        * @param boolean $forceRecompile
+        */
+       public function __construct( $templateDir = null, $forceRecompile = false ) {
+               $this->templateDir = $templateDir ? $templateDir : __DIR__.'/templates';
+               $this->forceRecompile = $forceRecompile;
+       }
+
+       /**
+        * Constructs the location of the the source Mustache template
+        * @param string $templateName The name of the template
+        * @return string
+        * @throws Exception Disallows upwards directory traversal via $templateName
+        */
+       public function getTemplateFilename( $templateName ) {
+               // Prevent upwards directory traversal using same methods as Title::secureAndSplit
+               if (
+                       strpos( $templateName, '.' ) !== false &&
+                       (
+                               $templateName === '.' || $templateName === '..' ||
+                               strpos( $templateName, './' ) === 0 ||
+                               strpos( $templateName, '../' ) === 0 ||
+                               strpos( $templateName, '/./' ) !== false ||
+                               strpos( $templateName, '/../' ) !== false ||
+                               substr( $templateName, -2 ) === '/.' ||
+                               substr( $templateName, -3 ) === '/..'
+                       )
+               ) {
+                       throw new Exception( "Malformed \$templateName: $templateName" );
+               }
+
+               return "{$this->templateDir}/{$templateName}.mustache";
+       }
+
+       /**
+        * Returns a given template function if found, otherwise throws an exception.
+        * @param string $templateName The name of the template (without file suffix)
+        * @return Function
+        * @throws Exception
+        */
+       public function getTemplate( $templateName ) {
+               global $wgSecretKey;
+
+               // If a renderer has already been defined for this template, reuse it
+               if ( isset( $this->renderers[$templateName] ) ) {
+                       return $this->renderers[$templateName];
+               }
+
+               $filename = $this->getTemplateFilename( $templateName );
+
+               if ( !file_exists( $filename ) ) {
+                       throw new Exception( "Could not locate template: {$filename}" );
+               }
+
+               // Read the template file
+               $fileContents = file_get_contents( $filename );
+
+               // Generate a quick hash for cache invalidation
+               $fastHash = md5( $fileContents );
+
+               // See if the compiled PHP code is stored in cache.
+               // CACHE_ACCEL throws an exception if no suitable object cache is present, so fall
+               // back to CACHE_ANYTHING.
+               try {
+                       $cache = wfGetCache( CACHE_ACCEL );
+               } catch ( Exception $e ) {
+                       $cache = wfGetCache( CACHE_ANYTHING );
+               }
+               $key = wfMemcKey( 'template', $templateName, $fastHash );
+               $code = $this->forceRecompile ? null : $cache->get( $key );
+
+               if ( !$code ) {
+                       // Compile the template into PHP code
+                       $code = self::compile( $fileContents );
+
+                       if ( !$code ) {
+                               throw new Exception( "Could not compile template: {$filename}" );
+                       }
+
+                       // Strip the "<?php" added by lightncandy so that it can be eval()ed
+                       if ( substr( $code, 0, 5 ) === '<?php' ) {
+                               $code = substr( $code, 5 );
+                       }
+
+                       $renderer = eval( $code );
+
+                       // Prefix the code with a keyed hash (64 hex chars) as an integrity check
+                       $code = hash_hmac( 'sha256', $code, $wgSecretKey ) . $code;
+
+                       // Cache the compiled PHP code
+                       $cache->set( $key, $code );
+               } else {
+                       // Verify the integrity of the cached PHP code
+                       $keyedHash = substr( $code, 0, 64 );
+                       $code = substr( $code, 64 );
+                       if ( $keyedHash === hash_hmac( 'sha256', $code, $wgSecretKey ) ) {
+                               $renderer = eval( $code );
+                       } else {
+                               throw new Exception( "Template failed integrity check: {$filename}" );
+                       }
+               }
+
+               return $this->renderers[$templateName] = $renderer;
+       }
+
+       /**
+        * Compile the Mustache code into PHP code using LightnCandy
+        * @param string $code Mustache code
+        * @return string PHP code
+        * @throws Exception
+        */
+       public static function compile( $code ) {
+               if ( !class_exists( 'LightnCandy' ) ) {
+                       throw new Exception( 'LightnCandy class not defined' );
+               }
+               return LightnCandy::compile(
+                       $code,
+                       array(
+                               // Do not add more flags here without discussion.
+                               // If you do add more flags, be sure to update unit tests as well.
+                               'flags' => LightnCandy::FLAG_ERROR_EXCEPTION
+                       )
+               );
+       }
+
+       /**
+        * Returns HTML for a given template by calling the template function with the given args
+        * @param string $templateName The name of the template
+        * @param mixed $args
+        * @param array $scopes
+        * @return string
+        */
+       public function processTemplate( $templateName, $args, array $scopes = array() ) {
+               $template = $this->getTemplate( $templateName );
+               return call_user_func( $template, $args, $scopes );
+       }
+}
index bb4d04e..2ef4ee4 100644 (file)
@@ -942,9 +942,9 @@ class Title {
         * @return string Content model id
         */
        public function getContentModel( $flags = 0 ) {
-               # Calling getArticleID() loads the field from cache as needed
                if ( !$this->mContentModel && $this->getArticleID( $flags ) ) {
                        $linkCache = LinkCache::singleton();
+                       $linkCache->addLinkObj( $this ); # in case we already had an article ID
                        $this->mContentModel = $linkCache->getGoodLinkFieldObj( $this, 'model' );
                }
 
@@ -1888,18 +1888,16 @@ class Title {
         * @param string $action Action that permission needs to be checked for
         * @param User $user User to check (since 1.19); $wgUser will be used if not
         *   provided.
-        * @param bool $doExpensiveQueries Set this to false to avoid doing
-        *   unnecessary queries.
+        * @param string $rigor Same format as Title::getUserPermissionsErrors()
         * @return bool
         */
-       public function userCan( $action, $user = null, $doExpensiveQueries = true ) {
+       public function userCan( $action, $user = null, $rigor = 'secure' ) {
                if ( !$user instanceof User ) {
                        global $wgUser;
                        $user = $wgUser;
                }
 
-               return !count( $this->getUserPermissionsErrorsInternal(
-                       $action, $user, $doExpensiveQueries, true ) );
+               return !count( $this->getUserPermissionsErrorsInternal( $action, $user, $rigor, true ) );
        }
 
        /**
@@ -1909,16 +1907,19 @@ class Title {
         *
         * @param string $action Action that permission needs to be checked for
         * @param User $user User to check
-        * @param bool $doExpensiveQueries Set this to false to avoid doing unnecessary
-        *   queries by skipping checks for cascading protections and user blocks.
+        * @param string $rigor One of (quick,full,secure)
+        *   - quick  : does cheap permission checks from slaves (usable for GUI creation)
+        *   - full   : does cheap and expensive checks possibly from a slave
+        *   - secure : does cheap and expensive checks, using the master as needed
+        * @param bool $short Set this to true to stop after the first permission error.
         * @param array $ignoreErrors Array of Strings Set this to a list of message keys
         *   whose corresponding errors may be ignored.
         * @return array Array of arguments to wfMessage to explain permissions problems.
         */
-       public function getUserPermissionsErrors( $action, $user, $doExpensiveQueries = true,
-               $ignoreErrors = array()
+       public function getUserPermissionsErrors(
+               $action, $user, $rigor = 'secure', $ignoreErrors = array()
        ) {
-               $errors = $this->getUserPermissionsErrorsInternal( $action, $user, $doExpensiveQueries );
+               $errors = $this->getUserPermissionsErrorsInternal( $action, $user, $rigor );
 
                // Remove the errors being ignored.
                foreach ( $errors as $index => $error ) {
@@ -1938,16 +1939,14 @@ class Title {
         * @param string $action The action to check
         * @param User $user User to check
         * @param array $errors List of current errors
-        * @param bool $doExpensiveQueries Whether or not to perform expensive queries
+        * @param string $rigor Same format as Title::getUserPermissionsErrors()
         * @param bool $short Short circuit on first error
         *
         * @return array List of errors
         */
-       private function checkQuickPermissions( $action, $user, $errors,
-               $doExpensiveQueries, $short
-       ) {
+       private function checkQuickPermissions( $action, $user, $errors, $rigor, $short ) {
                if ( !Hooks::run( 'TitleQuickPermissions',
-                       array( $this, $user, $action, &$errors, $doExpensiveQueries, $short ) )
+                       array( $this, $user, $action, &$errors, ( $rigor !== 'quick' ), $short ) )
                ) {
                        return $errors;
                }
@@ -2038,12 +2037,12 @@ class Title {
         * @param string $action The action to check
         * @param User $user User to check
         * @param array $errors List of current errors
-        * @param bool $doExpensiveQueries Whether or not to perform expensive queries
+        * @param string $rigor Same format as Title::getUserPermissionsErrors()
         * @param bool $short Short circuit on first error
         *
         * @return array List of errors
         */
-       private function checkPermissionHooks( $action, $user, $errors, $doExpensiveQueries, $short ) {
+       private function checkPermissionHooks( $action, $user, $errors, $rigor, $short ) {
                // Use getUserPermissionsErrors instead
                $result = '';
                if ( !Hooks::run( 'userCan', array( &$this, &$user, $action, &$result ) ) ) {
@@ -2055,7 +2054,7 @@ class Title {
                }
                // Check getUserPermissionsErrorsExpensive hook
                if (
-                       $doExpensiveQueries
+                       $rigor !== 'quick'
                        && !( $short && count( $errors ) > 0 )
                        && !Hooks::run( 'getUserPermissionsErrorsExpensive', array( &$this, &$user, $action, &$result ) )
                ) {
@@ -2071,14 +2070,12 @@ class Title {
         * @param string $action The action to check
         * @param User $user User to check
         * @param array $errors List of current errors
-        * @param bool $doExpensiveQueries Whether or not to perform expensive queries
+        * @param string $rigor Same format as Title::getUserPermissionsErrors()
         * @param bool $short Short circuit on first error
         *
         * @return array List of errors
         */
-       private function checkSpecialsAndNSPermissions( $action, $user, $errors,
-               $doExpensiveQueries, $short
-       ) {
+       private function checkSpecialsAndNSPermissions( $action, $user, $errors, $rigor, $short ) {
                # Only 'createaccount' can be performed on special pages,
                # which don't actually exist in the DB.
                if ( NS_SPECIAL == $this->mNamespace && $action !== 'createaccount' ) {
@@ -2102,12 +2099,12 @@ class Title {
         * @param string $action The action to check
         * @param User $user User to check
         * @param array $errors List of current errors
-        * @param bool $doExpensiveQueries Whether or not to perform expensive queries
+        * @param string $rigor Same format as Title::getUserPermissionsErrors()
         * @param bool $short Short circuit on first error
         *
         * @return array List of errors
         */
-       private function checkCSSandJSPermissions( $action, $user, $errors, $doExpensiveQueries, $short ) {
+       private function checkCSSandJSPermissions( $action, $user, $errors, $rigor, $short ) {
                # Protect css/js subpages of user pages
                # XXX: this might be better using restrictions
                # XXX: right 'editusercssjs' is deprecated, for backward compatibility only
@@ -2138,12 +2135,12 @@ class Title {
         * @param string $action The action to check
         * @param User $user User to check
         * @param array $errors List of current errors
-        * @param bool $doExpensiveQueries Whether or not to perform expensive queries
+        * @param string $rigor Same format as Title::getUserPermissionsErrors()
         * @param bool $short Short circuit on first error
         *
         * @return array List of errors
         */
-       private function checkPageRestrictions( $action, $user, $errors, $doExpensiveQueries, $short ) {
+       private function checkPageRestrictions( $action, $user, $errors, $rigor, $short ) {
                foreach ( $this->getRestrictions( $action ) as $right ) {
                        // Backwards compatibility, rewrite sysop -> editprotected
                        if ( $right == 'sysop' ) {
@@ -2172,15 +2169,13 @@ class Title {
         * @param string $action The action to check
         * @param User $user User to check
         * @param array $errors List of current errors
-        * @param bool $doExpensiveQueries Whether or not to perform expensive queries
+        * @param string $rigor Same format as Title::getUserPermissionsErrors()
         * @param bool $short Short circuit on first error
         *
         * @return array List of errors
         */
-       private function checkCascadingSourcesRestrictions( $action, $user, $errors,
-               $doExpensiveQueries, $short
-       ) {
-               if ( $doExpensiveQueries && !$this->isCssJsSubpage() ) {
+       private function checkCascadingSourcesRestrictions( $action, $user, $errors, $rigor, $short ) {
+               if ( $rigor !== 'quick' && !$this->isCssJsSubpage() ) {
                        # We /could/ use the protection level on the source page, but it's
                        # fairly ugly as we have to establish a precedence hierarchy for pages
                        # included by multiple cascade-protected pages. So just restrict
@@ -2221,20 +2216,16 @@ class Title {
         * @param string $action The action to check
         * @param User $user User to check
         * @param array $errors List of current errors
-        * @param bool $doExpensiveQueries Whether or not to perform expensive queries
+        * @param string $rigor Same format as Title::getUserPermissionsErrors()
         * @param bool $short Short circuit on first error
         *
         * @return array List of errors
         */
-       private function checkActionPermissions( $action, $user, $errors,
-               $doExpensiveQueries, $short
-       ) {
+       private function checkActionPermissions( $action, $user, $errors, $rigor, $short ) {
                global $wgDeleteRevisionsLimit, $wgLang;
 
                if ( $action == 'protect' ) {
-                       if ( count( $this->getUserPermissionsErrorsInternal( 'edit',
-                               $user, $doExpensiveQueries, true ) )
-                       ) {
+                       if ( count( $this->getUserPermissionsErrorsInternal( 'edit', $user, $rigor, true ) ) ) {
                                // If they can't edit, they shouldn't protect.
                                $errors[] = array( 'protect-cantedit' );
                        }
@@ -2267,17 +2258,16 @@ class Title {
                                $errors[] = array( 'immobile-target-page' );
                        }
                } elseif ( $action == 'delete' ) {
-                       $tempErrors = $this->checkPageRestrictions( 'edit',
-                               $user, array(), $doExpensiveQueries, true );
+                       $tempErrors = $this->checkPageRestrictions( 'edit', $user, array(), $rigor, true );
                        if ( !$tempErrors ) {
                                $tempErrors = $this->checkCascadingSourcesRestrictions( 'edit',
-                                       $user, $tempErrors, $doExpensiveQueries, true );
+                                       $user, $tempErrors, $rigor, true );
                        }
                        if ( $tempErrors ) {
                                // If protection keeps them from editing, they shouldn't be able to delete.
                                $errors[] = array( 'deleteprotected' );
                        }
-                       if ( $doExpensiveQueries && $wgDeleteRevisionsLimit
+                       if ( $rigor !== 'quick' && $wgDeleteRevisionsLimit
                                && !$this->userCan( 'bigdelete', $user ) && $this->isBigDeletion()
                        ) {
                                $errors[] = array( 'delete-toobig', $wgLang->formatNum( $wgDeleteRevisionsLimit ) );
@@ -2292,15 +2282,15 @@ class Title {
         * @param string $action The action to check
         * @param User $user User to check
         * @param array $errors List of current errors
-        * @param bool $doExpensiveQueries Whether or not to perform expensive queries
+        * @param string $rigor Same format as Title::getUserPermissionsErrors()
         * @param bool $short Short circuit on first error
         *
         * @return array List of errors
         */
-       private function checkUserBlock( $action, $user, $errors, $doExpensiveQueries, $short ) {
+       private function checkUserBlock( $action, $user, $errors, $rigor, $short ) {
                // Account creation blocks handled at userlogin.
                // Unblocking handled in SpecialUnblock
-               if ( !$doExpensiveQueries || in_array( $action, array( 'createaccount', 'unblock' ) ) ) {
+               if ( $rigor === 'quick' || in_array( $action, array( 'createaccount', 'unblock' ) ) ) {
                        return $errors;
                }
 
@@ -2310,10 +2300,13 @@ class Title {
                        $errors[] = array( 'confirmedittext' );
                }
 
-               if ( ( $action == 'edit' || $action == 'create' ) && !$user->isBlockedFrom( $this ) ) {
+               $useSlave = ( $rigor !== 'secure' );
+               if ( ( $action == 'edit' || $action == 'create' )
+                       && !$user->isBlockedFrom( $this, $useSlave )
+               ) {
                        // Don't block the user from editing their own talk page unless they've been
                        // explicitly blocked from that too.
-               } elseif ( $user->isBlocked() && $user->mBlock->prevents( $action ) !== false ) {
+               } elseif ( $user->isBlocked() && $user->getBlock()->prevents( $action ) !== false ) {
                        // @todo FIXME: Pass the relevant context into this function.
                        $errors[] = $user->getBlock()->getPermissionsError( RequestContext::getMain() );
                }
@@ -2327,12 +2320,12 @@ class Title {
         * @param string $action The action to check
         * @param User $user User to check
         * @param array $errors List of current errors
-        * @param bool $doExpensiveQueries Whether or not to perform expensive queries
+        * @param string $rigor Same format as Title::getUserPermissionsErrors()
         * @param bool $short Short circuit on first error
         *
         * @return array List of errors
         */
-       private function checkReadPermissions( $action, $user, $errors, $doExpensiveQueries, $short ) {
+       private function checkReadPermissions( $action, $user, $errors, $rigor, $short ) {
                global $wgWhitelistRead, $wgWhitelistReadRegexp;
 
                $whitelisted = false;
@@ -2435,13 +2428,23 @@ class Title {
         *
         * @param string $action Action that permission needs to be checked for
         * @param User $user User to check
-        * @param bool $doExpensiveQueries Set this to false to avoid doing unnecessary queries.
+        * @param string $rigor One of (quick,full,secure)
+        *   - quick  : does cheap permission checks from slaves (usable for GUI creation)
+        *   - full   : does cheap and expensive checks possibly from a slave
+        *   - secure : does cheap and expensive checks, using the master as needed
         * @param bool $short Set this to true to stop after the first permission error.
         * @return array Array of arrays of the arguments to wfMessage to explain permissions problems.
         */
-       protected function getUserPermissionsErrorsInternal( $action, $user,
-               $doExpensiveQueries = true, $short = false
+       protected function getUserPermissionsErrorsInternal(
+               $action, $user, $rigor = 'secure', $short = false
        ) {
+               if ( $rigor === true ) {
+                       $rigor = 'secure'; // b/c
+               } elseif ( $rigor === false ) {
+                       $rigor = 'quick'; // b/c
+               } elseif ( !in_array( $rigor, array( 'quick', 'full', 'secure' ) ) ) {
+                       throw new Exception( "Invalid rigor parameter '$rigor'." );
+               }
 
                # Read has special handling
                if ( $action == 'read' ) {
@@ -2479,7 +2482,7 @@ class Title {
                while ( count( $checks ) > 0 &&
                                !( $short && count( $errors ) > 0 ) ) {
                        $method = array_shift( $checks );
-                       $errors = $this->$method( $action, $user, $errors, $doExpensiveQueries, $short );
+                       $errors = $this->$method( $action, $user, $errors, $rigor, $short );
                }
 
                return $errors;
@@ -2749,7 +2752,6 @@ class Title {
 
                $sources = $getPages ? array() : false;
                $now = wfTimestampNow();
-               $purgeExpired = false;
 
                foreach ( $res as $row ) {
                        $expiry = $wgContLang->formatExpiry( $row->pr_expiry, TS_MW );
@@ -2775,14 +2777,8 @@ class Title {
                                } else {
                                        $sources = true;
                                }
-                       } else {
-                               // Trigger lazy purge of expired restrictions from the db
-                               $purgeExpired = true;
                        }
                }
-               if ( $purgeExpired ) {
-                       Title::purgeExpiredRestrictions();
-               }
 
                if ( $getPages ) {
                        $this->mCascadeSources = $sources;
@@ -2933,7 +2929,6 @@ class Title {
                if ( count( $rows ) ) {
                        # Current system - load second to make them override.
                        $now = wfTimestampNow();
-                       $purgeExpired = false;
 
                        # Cycle through all the restrictions.
                        foreach ( $rows as $row ) {
@@ -2953,15 +2948,8 @@ class Title {
                                        $this->mRestrictions[$row->pr_type] = explode( ',', trim( $row->pr_level ) );
 
                                        $this->mCascadeRestriction |= $row->pr_cascade;
-                               } else {
-                                       // Trigger a lazy purge of expired restrictions
-                                       $purgeExpired = true;
                                }
                        }
-
-                       if ( $purgeExpired ) {
-                               Title::purgeExpiredRestrictions();
-                       }
                }
 
                $this->mRestrictionsLoaded = true;
@@ -2999,7 +2987,6 @@ class Title {
                                                $this->mRestrictionsExpiry['create'] = $expiry;
                                                $this->mRestrictions['create'] = explode( ',', trim( $title_protection['permission'] ) );
                                        } else { // Get rid of the old restrictions
-                                               Title::purgeExpiredRestrictions();
                                                $this->mTitleProtection = false;
                                        }
                                } else {
@@ -3185,13 +3172,13 @@ class Title {
                if ( !is_null( $this->mRedirect ) ) {
                        return $this->mRedirect;
                }
-               # Calling getArticleID() loads the field from cache as needed
                if ( !$this->getArticleID( $flags ) ) {
                        $this->mRedirect = false;
                        return $this->mRedirect;
                }
 
                $linkCache = LinkCache::singleton();
+               $linkCache->addLinkObj( $this ); # in case we already had an article ID
                $cached = $linkCache->getGoodLinkFieldObj( $this, 'redirect' );
                if ( $cached === null ) {
                        # Trust LinkCache's state over our own
@@ -3220,12 +3207,12 @@ class Title {
                if ( $this->mLength != -1 ) {
                        return $this->mLength;
                }
-               # Calling getArticleID() loads the field from cache as needed
                if ( !$this->getArticleID( $flags ) ) {
                        $this->mLength = 0;
                        return $this->mLength;
                }
                $linkCache = LinkCache::singleton();
+               $linkCache->addLinkObj( $this ); # in case we already had an article ID
                $cached = $linkCache->getGoodLinkFieldObj( $this, 'length' );
                if ( $cached === null ) {
                        # Trust LinkCache's state over our own, as for isRedirect()
@@ -3248,13 +3235,12 @@ class Title {
                if ( !( $flags & Title::GAID_FOR_UPDATE ) && $this->mLatestID !== false ) {
                        return intval( $this->mLatestID );
                }
-               # Calling getArticleID() loads the field from cache as needed
                if ( !$this->getArticleID( $flags ) ) {
                        $this->mLatestID = 0;
                        return $this->mLatestID;
                }
                $linkCache = LinkCache::singleton();
-               $linkCache->addLinkObj( $this );
+               $linkCache->addLinkObj( $this ); # in case we already had an article ID
                $cached = $linkCache->getGoodLinkFieldObj( $this, 'revision' );
                if ( $cached === null ) {
                        # Trust LinkCache's state over our own, as for isRedirect()
@@ -3608,7 +3594,7 @@ class Title {
         *
         * @deprecated since 1.25, use MovePage's methods instead
         * @param Title $nt The new title
-        * @param bool $auth Ignored
+        * @param bool $auth Whether to check user permissions (uses $wgUser)
         * @param string $reason Is the log summary of the move, used for spam checking
         * @return array|bool True on success, getUserPermissionsErrors()-like array on failure
         */
@@ -3622,10 +3608,13 @@ class Title {
                }
 
                $mp = new MovePage( $this, $nt );
-               $errors = wfMergeErrorArrays(
-                       $mp->isValidMove()->getErrorsArray(),
-                       $mp->checkPermissions( $wgUser, $reason )->getErrorsArray()
-               );
+               $errors = $mp->isValidMove()->getErrorsArray();
+               if ( $auth ) {
+                       $errors = wfMergeErrorArrays(
+                               $errors,
+                               $mp->checkPermissions( $wgUser, $reason )->getErrorsArray()
+                       );
+               }
 
                return $errors ? : true;
        }
@@ -4098,12 +4087,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__ );
                }
@@ -4154,17 +4142,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;
                }
index ad4ce60..ae8deb6 100644 (file)
@@ -134,6 +134,7 @@ class User implements IDBAccessObject {
                'import',
                'importupload',
                'ipblock-exempt',
+               'managechangetags',
                'markbotedits',
                'mergehistory',
                'minoredit',
@@ -3008,20 +3009,24 @@ class User implements IDBAccessObject {
         * Add the user to the given group.
         * This takes immediate effect.
         * @param string $group Name of the group to add
+        * @return bool
         */
        public function addGroup( $group ) {
-               if ( Hooks::run( 'UserAddGroup', array( $this, &$group ) ) ) {
-                       $dbw = wfGetDB( DB_MASTER );
-                       if ( $this->getId() ) {
-                               $dbw->insert( 'user_groups',
-                                       array(
-                                               'ug_user' => $this->getID(),
-                                               'ug_group' => $group,
-                                       ),
-                                       __METHOD__,
-                                       array( 'IGNORE' ) );
-                       }
+               if ( !Hooks::run( 'UserAddGroup', array( $this, &$group ) ) ) {
+                       return false;
+               }
+
+               $dbw = wfGetDB( DB_MASTER );
+               if ( $this->getId() ) {
+                       $dbw->insert( 'user_groups',
+                               array(
+                                       'ug_user' => $this->getID(),
+                                       'ug_group' => $group,
+                               ),
+                               __METHOD__,
+                               array( 'IGNORE' ) );
                }
+
                $this->loadGroups();
                $this->mGroups[] = $group;
                // In case loadGroups was not called before, we now have the right twice.
@@ -3034,31 +3039,39 @@ class User implements IDBAccessObject {
                $this->mRights = null;
 
                $this->invalidateCache();
+
+               return true;
        }
 
        /**
         * Remove the user from the given group.
         * This takes immediate effect.
         * @param string $group Name of the group to remove
+        * @return bool
         */
        public function removeGroup( $group ) {
                $this->load();
-               if ( Hooks::run( 'UserRemoveGroup', array( $this, &$group ) ) ) {
-                       $dbw = wfGetDB( DB_MASTER );
-                       $dbw->delete( 'user_groups',
-                               array(
-                                       'ug_user' => $this->getID(),
-                                       'ug_group' => $group,
-                               ), __METHOD__ );
-                       // Remember that the user was in this group
-                       $dbw->insert( 'user_former_groups',
-                               array(
-                                       'ufg_user' => $this->getID(),
-                                       'ufg_group' => $group,
-                               ),
-                               __METHOD__,
-                               array( 'IGNORE' ) );
+               if ( !Hooks::run( 'UserRemoveGroup', array( $this, &$group ) ) ) {
+                       return false;
                }
+
+               $dbw = wfGetDB( DB_MASTER );
+               $dbw->delete( 'user_groups',
+                       array(
+                               'ug_user' => $this->getID(),
+                               'ug_group' => $group,
+                       ), __METHOD__
+               );
+               // Remember that the user was in this group
+               $dbw->insert( 'user_former_groups',
+                       array(
+                               'ufg_user' => $this->getID(),
+                               'ufg_group' => $group,
+                       ),
+                       __METHOD__,
+                       array( 'IGNORE' )
+               );
+
                $this->loadGroups();
                $this->mGroups = array_diff( $this->mGroups, array( $group ) );
 
@@ -3068,6 +3081,8 @@ class User implements IDBAccessObject {
                $this->mRights = null;
 
                $this->invalidateCache();
+
+               return true;
        }
 
        /**
@@ -3922,6 +3937,20 @@ class User implements IDBAccessObject {
                return MWCryptRand::generateHex( 32 );
        }
 
+       /**
+        * Get the embedded timestamp from a token.
+        * @param string $val Input token
+        * @return int|null
+        */
+       public static function getEditTokenTimestamp( $val ) {
+               $suffixLen = strlen( self::EDIT_TOKEN_SUFFIX );
+               if ( strlen( $val ) <= 32 + $suffixLen ) {
+                       return null;
+               }
+
+               return hexdec( substr( $val, 32, -$suffixLen ) );
+       }
+
        /**
         * Check given value against the token value stored in the session.
         * A match should confirm that the form was submitted from the
@@ -3939,12 +3968,10 @@ class User implements IDBAccessObject {
                        return $val === self::EDIT_TOKEN_SUFFIX;
                }
 
-               $suffixLen = strlen( self::EDIT_TOKEN_SUFFIX );
-               if ( strlen( $val ) <= 32 + $suffixLen ) {
+               $timestamp = self::getEditTokenTimestamp( $val );
+               if ( $timestamp === null ) {
                        return false;
                }
-
-               $timestamp = hexdec( substr( $val, 32, -$suffixLen ) );
                if ( $maxage !== null && $timestamp < wfTimestamp() - $maxage ) {
                        // Expired token
                        return false;
index 53c69d8..3be5847 100644 (file)
@@ -211,6 +211,8 @@ class UserRightsProxy {
        /**
         * Replaces User::addUserGroup()
         * @param string $group
+        *
+        * @return bool
         */
        function addGroup( $group ) {
                $this->db->insert( 'user_groups',
@@ -220,11 +222,15 @@ class UserRightsProxy {
                        ),
                        __METHOD__,
                        array( 'IGNORE' ) );
+
+               return true;
        }
 
        /**
         * Replaces User::removeUserGroup()
         * @param string $group
+        *
+        * @return bool
         */
        function removeGroup( $group ) {
                $this->db->delete( 'user_groups',
@@ -233,6 +239,8 @@ class UserRightsProxy {
                                'ug_group' => $group,
                        ),
                        __METHOD__ );
+
+               return true;
        }
 
        /**
index 125e544..da4bc87 100644 (file)
@@ -98,7 +98,7 @@ if ( defined( 'MW_CONFIG_CALLBACK' ) ) {
        # the wiki installer needs to be launched or the generated file uploaded to
        # the root wiki directory. Give a hint, if it is not readable by the server.
        if ( !is_readable( MW_CONFIG_FILE ) ) {
-               require_once "$IP/includes/templates/NoLocalSettings.php";
+               require_once "$IP/includes/NoLocalSettings.php";
                die();
        }
 
index 1e2f889..7189372 100644 (file)
@@ -67,8 +67,7 @@ class HistoryAction extends FormlessAction {
        }
 
        /**
-        * Get the Article object we are working on.
-        * @return Page
+        * @return WikiPage|Article|ImagePage|CategoryPage|Page The Article object we are working on.
         */
        public function getArticle() {
                return $this->page;
@@ -896,4 +895,5 @@ class HistoryPager extends ReverseChronologicalPager {
        function getPreventClickjacking() {
                return $this->preventClickjacking;
        }
+
 }
index 9e4a150..ff31eb6 100644 (file)
@@ -276,7 +276,9 @@ class InfoAction extends FormlessAction {
                // Language in which the page content is (supposed to be) written
                $pageLang = $title->getPageLanguage()->getCode();
 
-               if ( $config->get( 'PageLanguageUseDB' ) && $this->getTitle()->userCan( 'pagelang' ) ) {
+               if ( $config->get( 'PageLanguageUseDB' )
+                       && $this->getTitle()->userCan( 'pagelang', $this->getUser() )
+               ) {
                        // Link to Special:PageLanguage with pre-filled page title if user has permissions
                        $titleObj = SpecialPage::getTitleFor( 'PageLanguage', $title->getPrefixedText() );
                        $langDisp = Linker::link(
@@ -295,7 +297,7 @@ class InfoAction extends FormlessAction {
                // Content model of the page
                $pageInfo['header-basic'][] = array(
                        $this->msg( 'pageinfo-content-model' ),
-                       ContentHandler::getLocalizedName( $title->getContentModel() )
+                       htmlspecialchars( ContentHandler::getLocalizedName( $title->getContentModel() ) )
                );
 
                // Search engine status
@@ -481,7 +483,7 @@ class InfoAction extends FormlessAction {
                                $this->msg( 'pageinfo-firsttime' ),
                                Linker::linkKnown(
                                        $title,
-                                       $lang->userTimeAndDate( $firstRev->getTimestamp(), $user ),
+                                       htmlspecialchars( $lang->userTimeAndDate( $firstRev->getTimestamp(), $user ) ),
                                        array(),
                                        array( 'oldid' => $firstRev->getId() )
                                )
@@ -500,7 +502,7 @@ class InfoAction extends FormlessAction {
                                $this->msg( 'pageinfo-lasttime' ),
                                Linker::linkKnown(
                                        $title,
-                                       $lang->userTimeAndDate( $this->page->getTimestamp(), $user ),
+                                       htmlspecialchars( $lang->userTimeAndDate( $this->page->getTimestamp(), $user ) ),
                                        array(),
                                        array( 'oldid' => $this->page->getLatest() )
                                )
diff --git a/includes/api/ApiCheckToken.php b/includes/api/ApiCheckToken.php
new file mode 100644 (file)
index 0000000..28c6ece
--- /dev/null
@@ -0,0 +1,81 @@
+<?php
+/**
+ * Created on Jan 29, 2015
+ *
+ * Copyright © 2015 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
+ */
+
+/**
+ * @since 1.25
+ * @ingroup API
+ */
+class ApiCheckToken extends ApiBase {
+
+       public function execute() {
+               $params = $this->extractRequestParams();
+               $token = $params['token'];
+               $maxage = $params['maxtokenage'];
+               $request = $this->getRequest();
+               $salts = ApiQueryTokens::getTokenTypeSalts();
+               $salt = $salts[$params['type']];
+
+               $res = array();
+
+               if ( $this->getUser()->matchEditToken( $token, $salt, $request, $maxage ) ) {
+                       $res['result'] = 'valid';
+               } elseif ( $maxage !== null && $this->getUser()->matchEditToken( $token, $salt, $request ) ) {
+                       $res['result'] = 'expired';
+               } else {
+                       $res['result'] = 'invalid';
+               }
+
+               $ts = User::getEditTokenTimestamp( $token );
+               if ( $ts !== null ) {
+                       $mwts = new MWTimestamp();
+                       $mwts->timestamp->setTimestamp( $ts );
+                       $res['generated'] = $mwts->getTimestamp( TS_ISO_8601 );
+               }
+
+               $this->getResult()->addValue( null, $this->getModuleName(), $res );
+       }
+
+       public function getAllowedParams() {
+               return array(
+                       'type' => array(
+                               ApiBase::PARAM_TYPE => array_keys( ApiQueryTokens::getTokenTypeSalts() ),
+                               ApiBase::PARAM_REQUIRED => true,
+                       ),
+                       'token' => array(
+                               ApiBase::PARAM_TYPE => 'string',
+                               ApiBase::PARAM_REQUIRED => true,
+                       ),
+                       'maxtokenage' => array(
+                               ApiBase::PARAM_TYPE => 'integer',
+                       ),
+               );
+       }
+
+       protected function getExamplesMessages() {
+               return array(
+                       'action=checktoken&type=csrf&token=123ABC'
+                               => 'apihelp-checktoken-example-simple',
+               );
+       }
+}
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 ced5f0c..edda672 100644 (file)
@@ -95,7 +95,10 @@ class ApiFeedContributions extends ApiBase {
                                if ( ++$count > $limit ) {
                                        break;
                                }
-                               $feedItems[] = $this->feedItem( $row );
+                               $item = $this->feedItem( $row );
+                               if ( $item !== null ) {
+                                       $feedItems[] = $item;
+                               }
                        }
                }
 
@@ -103,6 +106,23 @@ class ApiFeedContributions extends ApiBase {
        }
 
        protected function feedItem( $row ) {
+               // This hook is the api contributions equivalent to the
+               // ContributionsLineEnding hook. Hook implementers may cancel
+               // the hook to signal the user is not allowed to read this item.
+               $feedItem = null;
+               $hookResult = Hooks::run(
+                       'ApiFeedContributions::feedItem',
+                       array( $row, $this->getContext(), &$feedItem )
+               );
+               // Hook returned a valid feed item
+               if ( $feedItem instanceof FeedItem ) {
+                       return $feedItem;
+               // Hook was canceled and did not return a valid feed item
+               } elseif ( !$hookResult ) {
+                       return null;
+               }
+
+               // Hook completed and did not return a valid feed item
                $title = Title::makeTitle( intval( $row->page_namespace ), $row->page_title );
                if ( $title && $title->userCan( 'read', $this->getUser() ) ) {
                        $date = $row->rev_timestamp;
index 9a98054..34ed523 100644 (file)
@@ -64,6 +64,7 @@ class ApiMain extends ApiBase {
                'rsd' => 'ApiRsd',
                'compare' => 'ApiComparePages',
                'tokens' => 'ApiTokens',
+               'checktoken' => 'ApiCheckToken',
 
                // Write modules
                'purge' => 'ApiPurge',
@@ -87,6 +88,7 @@ class ApiMain extends ApiBase {
                'options' => 'ApiOptions',
                'imagerotate' => 'ApiImageRotate',
                'revisiondelete' => 'ApiRevisionDelete',
+               'managetags' => 'ApiManageTags',
        );
 
        /**
diff --git a/includes/api/ApiManageTags.php b/includes/api/ApiManageTags.php
new file mode 100644 (file)
index 0000000..b027f33
--- /dev/null
@@ -0,0 +1,107 @@
+<?php
+
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * @ingroup API
+ * @since 1.25
+ */
+class ApiManageTags extends ApiBase {
+
+       public function execute() {
+               $params = $this->extractRequestParams();
+
+               // make sure the user is allowed
+               if ( !$this->getUser()->isAllowed( 'managechangetags' ) ) {
+                       $this->dieUsage( "You don't have permission to manage change tags", 'permissiondenied' );
+               }
+
+               $result = $this->getResult();
+               $funcName = "{$params['operation']}TagWithChecks";
+               $status = ChangeTags::$funcName( $params['tag'], $params['reason'],
+                       $this->getUser(), $params['ignorewarnings'] );
+
+               if ( !$status->isOK() ) {
+                       $this->dieStatus( $status );
+               }
+
+               $ret = array(
+                       'operation' => $params['operation'],
+                       'tag' => $params['tag'],
+               );
+               if ( !$status->isGood() ) {
+                       $ret['warnings'] = $result->convertStatusToArray( $status, 'warning' );
+               }
+               if ( $status->value !== null ) {
+                       $ret['success'] = '';
+                       $ret['logid'] = $status->value;
+               }
+               $result->addValue( null, $this->getModuleName(), $ret );
+       }
+
+       public function mustBePosted() {
+               return true;
+       }
+
+       public function isWriteMode() {
+               return true;
+       }
+
+       public function getAllowedParams() {
+               return array(
+                       'operation' => array(
+                               ApiBase::PARAM_TYPE => array( 'create', 'delete', 'activate', 'deactivate' ),
+                               ApiBase::PARAM_REQUIRED => true,
+                       ),
+                       'tag' => array(
+                               ApiBase::PARAM_TYPE => 'string',
+                               ApiBase::PARAM_REQUIRED => true,
+                       ),
+                       'reason' => array(
+                               ApiBase::PARAM_TYPE => 'string',
+                       ),
+                       'ignorewarnings' => array(
+                               ApiBase::PARAM_TYPE => 'boolean',
+                               ApiBase::PARAM_DFLT => false,
+                       ),
+               );
+       }
+
+       public function needsToken() {
+               return 'csrf';
+       }
+
+       protected function getExamplesMessages() {
+               return array(
+                       'action=managetags&operation=create&tag=spam&reason=For+use+in+edit+patrolling&token=123ABC'
+                               => 'apihelp-managetags-example-create',
+                       'action=managetags&operation=delete&tag=vandlaism&reason=Misspelt&token=123ABC'
+                               => 'apihelp-managetags-example-delete',
+                       'action=managetags&operation=activate&tag=spam&reason=For+use+in+edit+patrolling&token=123ABC'
+                               => 'apihelp-managetags-example-activate',
+                       'action=managetags&operation=deactivate&tag=spam&reason=No+longer+required&token=123ABC'
+                               => 'apihelp-managetags-example-deactivate',
+               );
+       }
+
+       public function getHelpUrls() {
+               return 'https://www.mediawiki.org/wiki/API:Tag_management';
+       }
+}
index 981c119..e53e2b2 100644 (file)
@@ -315,6 +315,10 @@ class ApiPageSet extends ApiBase {
                        $pageFlds['page_is_redirect'] = null;
                }
 
+               if ( $this->getConfig()->get( 'ContentHandlerUseDB' ) ) {
+                       $pageFlds['page_content_model'] = null;
+               }
+
                // only store non-default fields
                $this->mRequestedPageFields = array_diff_key( $this->mRequestedPageFields, $pageFlds );
 
index b7779a7..f6bde41 100644 (file)
@@ -57,12 +57,11 @@ class ApiQueryBlocks extends ApiQueryBase {
                $result = $this->getResult();
 
                $this->addTables( 'ipblocks' );
-               $this->addFields( array( 'ipb_auto', 'ipb_id' ) );
+               $this->addFields( array( 'ipb_auto', 'ipb_id', 'ipb_timestamp' ) );
 
                $this->addFieldsIf( array( 'ipb_address', 'ipb_user' ), $fld_user || $fld_userid );
                $this->addFieldsIf( 'ipb_by_text', $fld_by );
                $this->addFieldsIf( 'ipb_by', $fld_byid );
-               $this->addFieldsIf( 'ipb_timestamp', $fld_timestamp );
                $this->addFieldsIf( 'ipb_expiry', $fld_expiry );
                $this->addFieldsIf( 'ipb_reason', $fld_reason );
                $this->addFieldsIf( array( 'ipb_range_start', 'ipb_range_end' ), $fld_range );
index 05a1a15..02c88c4 100644 (file)
@@ -48,6 +48,8 @@ class ApiQueryInfo extends ApiQueryBase {
 
        private $tokenFunctions;
 
+       private $countTestedActions = 0;
+
        public function __construct( ApiQuery $query, $moduleName ) {
                parent::__construct( $query, $moduleName, 'in' );
        }
@@ -357,7 +359,7 @@ class ApiQueryInfo extends ApiQueryBase {
                /** @var $title Title */
                foreach ( $this->everything as $pageid => $title ) {
                        $pageInfo = $this->extractPageInfo( $pageid, $title );
-                       $fit = $result->addValue( array(
+                       $fit = $pageInfo !== null && $result->addValue( array(
                                'query',
                                'pages'
                        ), $pageid, $pageInfo );
@@ -374,7 +376,7 @@ class ApiQueryInfo extends ApiQueryBase {
         * Get a result array with information about a title
         * @param int $pageid Page ID (negative for missing titles)
         * @param Title $title
-        * @return array
+        * @return array|null
         */
        private function extractPageInfo( $pageid, $title ) {
                $pageInfo = array();
@@ -484,6 +486,22 @@ class ApiQueryInfo extends ApiQueryBase {
                        }
                }
 
+               if ( $this->params['testactions'] ) {
+                       $limit = $this->getMain()->canApiHighLimits() ? self::LIMIT_SML1 : self::LIMIT_SML2;
+                       if ( $this->countTestedActions >= $limit ) {
+                               return null; // force a continuation
+                       }
+
+                       $user = $this->getUser();
+                       $pageInfo['actions'] = array();
+                       foreach ( $this->params['testactions'] as $action ) {
+                               $this->countTestedActions++;
+                               if ( $title->userCan( $action, $user ) ) {
+                                       $pageInfo['actions'][$action] = '';
+                               }
+                       }
+               }
+
                return $pageInfo;
        }
 
@@ -825,6 +843,10 @@ class ApiQueryInfo extends ApiQueryBase {
                                ),
                                ApiBase::PARAM_HELP_MSG_PER_VALUE => array(),
                        ),
+                       'testactions' => array(
+                               ApiBase::PARAM_TYPE => 'string',
+                               ApiBase::PARAM_ISMULTI => true,
+                       ),
                        'token' => array(
                                ApiBase::PARAM_DEPRECATED => true,
                                ApiBase::PARAM_DFLT => null,
index 7d79680..3cdc53c 100644 (file)
@@ -311,7 +311,8 @@ class ApiQueryLogEvents extends ApiQueryBase {
                                        break;
                                }
                                $vals2 = array();
-                               list( $vals2['duration'], $vals2['flags'] ) = $params;
+                               $vals2['duration'] = $params[0];
+                               $vals2['flags'] = isset( $params[1] ) ? $params[1] : '';
 
                                // Indefinite blocks have no expiry time
                                if ( SpecialBlock::parseExpiryInput( $params[0] ) !== wfGetDB( DB_SLAVE )->getInfinity() ) {
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 16a491e..e489b2f 100644 (file)
@@ -174,7 +174,7 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
                                }
                                if ( !is_null( $result->getRedirectTitle() ) ) {
                                        if ( isset( $prop['redirecttitle'] ) ) {
-                                               $vals['redirecttitle'] = $result->getRedirectTitle();
+                                               $vals['redirecttitle'] = $result->getRedirectTitle()->getPrefixedText();
                                        }
                                        if ( isset( $prop['redirectsnippet'] ) ) {
                                                $vals['redirectsnippet'] = $result->getRedirectSnippet();
index f373021..5ac1036 100644 (file)
@@ -69,6 +69,9 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                                case 'usergroups':
                                        $fit = $this->appendUserGroups( $p, $params['numberingroup'] );
                                        break;
+                               case 'libraries':
+                                       $fit = $this->appendInstalledLibraries( $p );
+                                       break;
                                case 'extensions':
                                        $fit = $this->appendExtensions( $p );
                                        break;
@@ -429,10 +432,10 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                        if ( substr( $row['iw_url'], 0, 2 ) == '//' ) {
                                $val['protorel'] = '';
                        }
-                       if ( isset( $row['iw_wikiid'] ) ) {
+                       if ( isset( $row['iw_wikiid'] ) && $row['iw_wikiid'] !== '' ) {
                                $val['wikiid'] = $row['iw_wikiid'];
                        }
-                       if ( isset( $row['iw_api'] ) ) {
+                       if ( isset( $row['iw_api'] ) && $row['iw_api'] !== '' ) {
                                $val['api'] = $row['iw_api'];
                        }
 
@@ -554,6 +557,36 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                return $this->getResult()->addValue( 'query', $property, $data );
        }
 
+       protected function appendInstalledLibraries( $property ) {
+               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 true;
+                       }
+               }
+
+               $data = array();
+               $lock = new ComposerLock( $path );
+               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;
+                       }
+                       $data[] = array(
+                               'name' => $name,
+                               'version' => $info['version'],
+                       );
+               }
+               $this->getResult()->setIndexedTagName( $data, 'library' );
+
+               return $this->getResult()->addValue( 'query', $property, $data );
+
+       }
+
        protected function appendExtensions( $property ) {
                $data = array();
                foreach ( $this->getConfig()->get( 'ExtensionCredits' ) as $type => $extensions ) {
@@ -810,6 +843,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                                        'dbrepllag',
                                        'statistics',
                                        'usergroups',
+                                       'libraries',
                                        'extensions',
                                        'fileextensions',
                                        'rightsinfo',
index 1debb2e..59fe8ad 100644 (file)
@@ -52,7 +52,7 @@ class ApiQueryStashImageInfo extends ApiQueryImageInfo {
                }
 
                try {
-                       $stash = RepoGroup::singleton()->getLocalRepo()->getUploadStash();
+                       $stash = RepoGroup::singleton()->getLocalRepo()->getUploadStash( $this->getUser() );
 
                        foreach ( $params['filekey'] as $filekey ) {
                                $file = $stash->getFile( $filekey );
index 7f2dc85..0e3307b 100644 (file)
@@ -44,11 +44,17 @@ class ApiQueryTags extends ApiQueryBase {
                $fld_description = isset( $prop['description'] );
                $fld_hitcount = isset( $prop['hitcount'] );
                $fld_defined = isset( $prop['defined'] );
+               $fld_source = isset( $prop['source'] );
+               $fld_active = isset( $prop['active'] );
 
                $limit = $params['limit'];
                $result = $this->getResult();
 
-               $definedTags = array_fill_keys( ChangeTags::listDefinedTags(), 0 );
+               $extensionDefinedTags = array_fill_keys( ChangeTags::listExtensionDefinedTags(), 0 );
+               $explicitlyDefinedTags = array_fill_keys( ChangeTags::listExplicitlyDefinedTags(), 0 );
+               $extensionActivatedTags = array_fill_keys( ChangeTags::listExtensionActivatedTags(), 0 );
+
+               $definedTags = array_merge( $extensionDefinedTags, $explicitlyDefinedTags );
 
                # Fetch defined tags that aren't past the continuation
                if ( $params['continue'] !== null ) {
@@ -99,10 +105,29 @@ class ApiQueryTags extends ApiQueryBase {
                                $tag['hitcount'] = $hitcount;
                        }
 
-                       if ( $fld_defined && isset( $definedTags[$tagName] ) ) {
+                       $isExtension = isset( $extensionDefinedTags[$tagName] );
+                       $isExplicit = isset( $explicitlyDefinedTags[$tagName] );
+
+                       if ( $fld_defined && ( $isExtension || $isExplicit ) ) {
                                $tag['defined'] = '';
                        }
 
+                       if ( $fld_source ) {
+                               $tag['source'] = array();
+                               if ( $isExtension ) {
+                                       $tag['source'][] = 'extension';
+                               }
+                               if ( $isExplicit ) {
+                                       $tag['source'][] = 'manual';
+                               }
+                       }
+
+                       if ( $fld_active &&
+                               ( $isExplicit || isset( $extensionActivatedTags[$tagName] ) )
+                       ) {
+                               $tag['active'] = '';
+                       }
+
                        $fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $tag );
                        if ( !$fit ) {
                                $this->setContinueEnumParameter( 'continue', $tagName );
@@ -137,6 +162,8 @@ class ApiQueryTags extends ApiQueryBase {
                                        'description',
                                        'hitcount',
                                        'defined',
+                                       'source',
+                                       'active',
                                ),
                                ApiBase::PARAM_ISMULTI => true
                        )
index fed5a33..7fc0ba8 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,12 +177,11 @@ 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 . '+';
                        } else {
-                               $vals['unreadcount'] = (int)$count;
+                               $vals['unreadcount'] = $count;
                        }
                }
 
index d6ad7f3..78a4971 100644 (file)
@@ -218,7 +218,11 @@ class ApiUpload extends ApiBase {
                        $status = $this->mUpload->addChunk(
                                $chunkPath, $chunkSize, $this->mParams['offset'] );
                        if ( !$status->isGood() ) {
-                               $this->dieUsage( $status->getWikiText(), 'stashfailed' );
+                               $extradata = array(
+                                       'offset' => $this->mUpload->getOffset(),
+                               );
+
+                               $this->dieUsage( $status->getWikiText(), 'stashfailed', 0, $extradata );
 
                                return array();
                        }
@@ -277,7 +281,7 @@ class ApiUpload extends ApiBase {
         */
        private function performStash() {
                try {
-                       $stashFile = $this->mUpload->stashFile();
+                       $stashFile = $this->mUpload->stashFile( $this->getUser() );
 
                        if ( !$stashFile ) {
                                throw new MWException( 'Invalid stashed file' );
index ce0943c..aa456f0 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "Meno25",
                        "أحمد المحمودي",
-                       "Khaled"
+                       "Khaled",
+                       "Fatz"
                ]
        },
        "apihelp-main-param-format": "صيغة الخرج.",
@@ -20,6 +21,8 @@
        "apihelp-delete-description": "حذف صفحة.",
        "apihelp-delete-param-unwatch": "أزل الصفحة من قائمة مراقبتك.",
        "apihelp-edit-description": "إنشاء وتعديل الصفحات.",
+       "apihelp-edit-param-watch": "أضف الصفحة إلى لائحة مراقبة المستعمل الحالي",
        "apihelp-emailuser-description": "مراسلة المستخدم",
+       "apihelp-patrol-example-rcid": "ابحث عن تغيير جديد",
        "apihelp-query+prefixsearch-param-offset": "عدد النتائج المراد تخطيها."
 }
diff --git a/includes/api/i18n/av.json b/includes/api/i18n/av.json
new file mode 100644 (file)
index 0000000..df85c0b
--- /dev/null
@@ -0,0 +1,8 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Аль-Гимравий"
+               ]
+       },
+       "apihelp-block-param-user": "Нужее блокалда лъезе бокьун вугев гІахьалчиясул цІар, IP-адрес яги IP-адресазул диапазон"
+}
diff --git a/includes/api/i18n/awa.json b/includes/api/i18n/awa.json
new file mode 100644 (file)
index 0000000..d094592
--- /dev/null
@@ -0,0 +1,11 @@
+{
+       "@metadata": {
+               "authors": [
+                       "1AnuraagPandey"
+               ]
+       },
+       "apihelp-block-description": "सदस्य कय अवरोधित करा जाय।",
+       "apihelp-block-param-reason": "ब्लाक करेकै कारण",
+       "apihelp-block-param-nocreate": "खाते बनावेकै रोका जाय",
+       "apihelp-edit-param-minor": "छोट संपादन"
+}
index d50831a..a09cb5a 100644 (file)
@@ -4,34 +4,34 @@
                        "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://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-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Дакумэнтацыя]]\n* [[mw:API:FAQ|Частыя пытаньні]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Сьпіс рассылкі]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API-аб’явы]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Памылкі і запыты]\n</div>\n<strong>Статус:</strong> усе магчымасьці на гэтай старонцы павінны працаваць, але API знаходзіцца ў актыўнай распрацоўцы і можа зьмяняцца ў любы момант. Падпісвайцеся на [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ рассылку mediawiki-api-announce] дзеля паведамленьняў пра абнаўленьні.\n\n<strong>Памылковыя запыты:</strong> калі да API дасылаюцца памылковыя запыты, HTTP-загаловак будзе дасланы з ключом «MediaWiki-API-Error», а потым значэньне загалоўку і код памылкі будуць выстаўленыя на аднолькавае значэньне. Дзеля дадатковай інфармацыі глядзіце [[mw:API:Errors_and_warnings|API: Памылкі і папярэджаньні]].",
        "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-maxlag": "Максымальная затрымка можа ўжывацца, калі MediaWiki ўсталяваная ў клястэр з рэплікаванай базай зьвестак. Дзеля захаваньня дзеяньняў, якія выклікаюць затрымку рэплікацыі, гэты парамэтар можа прымусіць кліента чакаць, пакуль затрымка рэплікацыі меншая за яго значэньне. У выпадку доўгай затрымкі, вяртаецца код памылкі <samp>maxlag</samp> з паведамленьнем кшталту <samp>Чаканьне $host: $lag сэкундаў затрымкі</samp>.<br />Глядзіце [[mw:Manual:Maxlag_parameter|Інструкцыя:Парамэтар maxlag]] дзеля дадатковай інфармацыі.",
+       "apihelp-main-param-smaxage": "Выстаўце загаловак <code>s-maxage</code> на зададзеную колькасьць сэкундаў. Памылкі ніколі не кэшуюцца.",
+       "apihelp-main-param-maxage": "Выстаўляе загаловак <code>max-age</code> на зададзеную колькасьць сэкундаў. Памылкі ніколі не кэшуюцца.",
+       "apihelp-main-param-assert": "Упэўніцеся, што ўдзельнік увайшоў у сыстэму, калі зададзена <kbd>user</kbd>, або мае правы робата, калі зададзена <kbd>bot</kbd>.",
        "apihelp-main-param-requestid": "Любое значэньне, пададзенае тут, будзе ўключанае ў адказ. Можа быць выкарыстанае для адрозьненьня запытаў.",
        "apihelp-main-param-servedby": "Уключае ў вынік назву сэрвэра, які апрацаваў запыт.",
        "apihelp-main-param-curtimestamp": "Уключае ў вынік пазнаку актуальнага часу.",
-       "apihelp-main-param-origin": "Пры звароце да API з дапамогай міждамэннага AJAX-запыту (CORS), выстаўце парамэтру значэньне зыходнага дамэну. Ён мусіць быць уключаны ў кожны папярэдні запыт і такім чынам мусіць быць часткай URI-запыту (ня цела POST). Ён мусіць супадаць з адной з крыніц у загалоўку Origin, павінна быць зададзена нешта кшталту http://en.wikipedia.org або https://meta.wikimedia.org. Калі парамэтар не супадае з загалоўкам Origin, будзе вернуты адказ з кодам памылкі 403. Калі парамэтар супадае з загалоўкам Origin і крыніца знаходзіцца ў белым сьпісе, будзе выстаўлены загаловак Access-Control-Allow-Origin.",
-       "apihelp-main-param-uselang": "Мова для выкарыстаньня ў перакладах паведамленьняў. Сьпіс кодаў можа быць атрыманы з [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]] з siprop=languages, або трэба вызначыць «user», каб ужываць наладкі мовы цяперашняга карыстальніка, або вызначыць «content», каб ужываць мову зьместу гэтай вікі.",
+       "apihelp-main-param-origin": "Пры звароце да API з дапамогай міждамэннага AJAX-запыту (CORS), выстаўце парамэтру значэньне зыходнага дамэну. Ён мусіць быць уключаны ў кожны папярэдні запыт і такім чынам мусіць быць часткай URI-запыту (ня цела POST). Ён мусіць супадаць з адной з крыніц у загалоўку <code>Origin</code>, павінна быць зададзена нешта кшталту <kbd>https://en.wikipedia.org</kbd> або <kbd>https://meta.wikimedia.org</kbd>. Калі парамэтар не супадае з загалоўкам <code>Origin</code>, будзе вернуты адказ з кодам памылкі 403. Калі парамэтар супадае з загалоўкам <code>Origin</code> і крыніца знаходзіцца ў белым сьпісе, будзе выстаўлены загаловак <code>Access-Control-Allow-Origin</code>.",
+       "apihelp-main-param-uselang": "Мова для выкарыстаньня ў перакладах паведамленьняў. Сьпіс кодаў можа быць атрыманы з <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> з <kbd>siprop=languages</kbd>, або трэба вызначыць <kbd>user</kbd>, каб ужываць наладкі мовы цяперашняга карыстальніка, або вызначыць <kbd>content</kbd>, каб ужываць мову зьместу гэтай вікі.",
        "apihelp-block-description": "Блякаваньне ўдзельніка.",
        "apihelp-block-param-user": "Імя ўдзельніка, IP-адрас або IP-дыяпазон, якія вы хочаце заблякаваць.",
-       "apihelp-block-param-expiry": "Час заканчэньня. Можа быць адносным (напрыклад, «5 months» або «2 weeks») ці аблсалютным (напрыклад, «2014-09-18T12:34:56Z»). Калі выстаўлены на «infinite», «indefinite» ці «never», блякаваньне будзе бестэрміновым.",
+       "apihelp-block-param-expiry": "Час заканчэньня. Можа быць адносным (напрыклад, <kbd>5 months</kbd> або <kbd>2 weeks</kbd>) ці абсалютным (напрыклад, <kbd>2014-09-18T12:34:56Z</kbd>). Калі выстаўлены на <kbd>infinite</kbd>, <kbd>indefinite</kbd> ці <kbd>never</kbd>, блякаваньне будзе бестэрміновым.",
        "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-noemail": "Забараняе ўдзельніку дасылаць лісты электроннай пошты празь вікі (трэба мець права <code>blockemail</code>).",
+       "apihelp-block-param-hidename": "Схаваць імя ўдзельніка з журналу блякаваньняў (патрабуе права <code>hideuser</code>).",
+       "apihelp-block-param-allowusertalk": "Дазволіць удзельніку рэдагаваць уласную старонку гутарак (залежыць ад <var>[[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>).",
        "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-block-example-ip-simple": "Заблякаваць IP-адрас <kbd>192.0.2.5</kbd> на тры дні з прычынай <kbd>First strike</kbd>.",
+       "apihelp-block-example-user-complex": "Заблякаваць удзельніка <kbd>Vandal</kbd> назаўсёды з прычынай <kbd>Vandalism</kbd>, а таксама забараніць стварэньне новых рахункаў і адсылку лістоў электроннай поштай.",
+       "apihelp-clearhasmsg-description": "Ачышчае сьцяг <code>hasmsg</code> для актуальнага карыстальніка.",
+       "apihelp-clearhasmsg-example-1": "Ачыстка сьцягу <code>hasmsg</code> для актуальнага карыстальніка",
        "apihelp-compare-description": "Атрымаць розьніцу паміж 2 старонкамі.\n\nВы мусіце перадаць нумар вэрсіі, назву або ID старонкі для абодвух «from» і «to».",
        "apihelp-compare-param-fromtitle": "Першая назва для параўнаньня.",
        "apihelp-compare-param-fromid": "ID першай старонкі для параўнаньня.",
        "apihelp-compare-example-1": "Паказвае розьніцу паміж вэрсіямі 1 і 2",
        "apihelp-createaccount-description": "Стварэньне новага рахунку ўдзельніка.",
        "apihelp-createaccount-param-name": "Імя ўдзельніка.",
-       "apihelp-createaccount-param-password": "Пароль (ігнаруецца, калі выстаўлена $1mailpassword).",
+       "apihelp-createaccount-param-password": "Пароль (ігнаруецца, калі выстаўлена <var>$1mailpassword</var>).",
        "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": "Моўны код, які будзе выстаўлены ўдзельніку па змоўчаньні (неабавязкова, па змоўчаньні мова зьместу)."
+       "apihelp-createaccount-param-language": "Моўны код, які будзе выстаўлены ўдзельніку па змоўчаньні (неабавязкова, па змоўчаньні мова зьместу).",
+       "apihelp-createaccount-example-pass": "Стварэньне ўдзельніка <kbd>testuser</kbd> з паролем <kbd>test123</kbd>.",
+       "apihelp-createaccount-example-mail": "Стварэньне ўдзельніка <kbd>testmailuser</kbd> і адпраўка выпадковага паролю электроннай поштай."
 }
diff --git a/includes/api/i18n/bn.json b/includes/api/i18n/bn.json
new file mode 100644 (file)
index 0000000..05407ff
--- /dev/null
@@ -0,0 +1,8 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Aftabuzzaman"
+               ]
+       },
+       "apihelp-login-example-login": "প্রবেশ"
+}
index a4fb770..e68f496 100644 (file)
@@ -1,15 +1,17 @@
 {
        "@metadata": {
                "authors": [
-                       "Toniher"
+                       "Toniher",
+                       "Macofe"
                ]
        },
        "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-createaccount-param-password": "Contrasenya (ignorada si es defineix <var>$1mailpassword</var>)",
        "apihelp-delete-description": "Suprimeix una pàgina.",
        "apihelp-edit-description": "Crea i edita pàgines.",
-       "apihelp-edit-param-text": "Contingut de la pàgina."
+       "apihelp-edit-param-text": "Contingut de la pàgina.",
+       "apihelp-login-example-login": "Inicia sessió."
 }
index 14fae0c..f3e3fcd 100644 (file)
@@ -3,15 +3,16 @@
                "authors": [
                        "Mormegil",
                        "YjM",
-                       "Juandev"
+                       "Juandev",
+                       "Aktron"
                ]
        },
        "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-main-param-smaxage": "Nastaví hlavičku s-maxage na uvedený počet sekund. Chyby se nekešují nikdy.",
-       "apihelp-main-param-maxage": "Nastaví hlavičku max-age na uvedený počet sekund. Chyby se nekešují nikdy.",
+       "apihelp-main-param-smaxage": "Nastaví hlavičku <code>s-maxage</code> na uvedený počet sekund. Chyby se nekešují nikdy.",
+       "apihelp-main-param-maxage": "Nastaví hlavičku <code>max-age</code> na uvedený počet sekund. Chyby se nekešují nikdy.",
        "apihelp-main-param-assert": "Ověřit, že je uživatel přihlášen, pokud je nastaveno na „user“, nebo že má uživatelské oprávnění bot, pokud je nastaveno na „bot“.",
        "apihelp-main-param-requestid": "Libovolná zde uvedená hodnota bude zahrnuta v odpovědi. Lze použít pro rozlišení požadavků.",
        "apihelp-main-param-servedby": "Zahrnout do odpovědi název hostitele, který požadavek obsloužil.",
@@ -25,9 +26,9 @@
        "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-allowusertalk": "Povolit uživateli editovat svou vlastní diskusní stránku (závisí na <var>[[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>).",
        "apihelp-block-param-reblock": "Pokud již uživatel blokován je, přepsat současný blok.",
-       "apihelp-block-param-watchuser": "Sledovat uživatelskou a diskusní stranu tohoto uživatele nebo adresy IP.",
+       "apihelp-block-param-watchuser": "Sledovat stránku uživatele nebo IP adresy a jejich diskuzní stránky.",
        "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-example-1": "Porovnat revize 1 a 2.",
        "apihelp-createaccount-description": "Vytvořit nový uživatelský účet.",
        "apihelp-createaccount-param-name": "Uživatelské jméno.",
-       "apihelp-createaccount-param-password": "Heslo (ignorováno, pokud je nastaveno $1mailpassword).",
+       "apihelp-createaccount-param-password": "Heslo (ignorováno, pokud je nastaveno <var>$1mailpassword</var>).",
        "apihelp-createaccount-param-email": "E-mailová adresa uživatele (nepovinné).",
        "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-createaccount-example-mail": "Vytvořit uživatele <kbd>testmailuser</kbd> a zaslat mu e-mail s náhodně vygenerovaným heslem.",
        "apihelp-delete-description": "Smazat stránku.",
+       "apihelp-disabled-description": "Tento modul byl deaktivován.",
+       "apihelp-edit-description": "Vytvářet a upravovat stránky.",
+       "apihelp-edit-param-sectiontitle": "Název nové sekce.",
+       "apihelp-edit-param-text": "Obsah stránky.",
        "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-edit-param-watchlist": "Bezpodmíněnečně přidat nebo odstranit stránku ze sledovaných stránek aktuálního uživatele, použít nastavení nebo neměnit sledování.",
+       "apihelp-edit-param-redirect": "Automaticky opravit přesměrování.",
+       "apihelp-edit-example-edit": "Upravit stránku.",
+       "apihelp-emailuser-description": "Poslat uživateli e-mail.",
+       "apihelp-emailuser-param-text": "Tělo zprávy.",
+       "apihelp-emailuser-param-ccme": "Odeslat mi kopii této zprávy.",
+       "apihelp-feedcontributions-param-year": "Od roku (a dříve).",
+       "apihelp-feedcontributions-param-month": "Od měsíce (a dříve)",
+       "apihelp-feedcontributions-param-deletedonly": "Zobrazit pouze smazané příspěvky.",
+       "apihelp-feedrecentchanges-param-hideminor": "Skrýt drobné změny.",
+       "apihelp-feedrecentchanges-param-hidebots": "Skrýt úpravy provedené roboty.",
+       "apihelp-feedrecentchanges-param-hideanons": "Skrýt změny provedené anonymními uživateli.",
+       "apihelp-feedrecentchanges-param-hideliu": "Skrýt změny provedené registrovanými uživateli.",
+       "apihelp-feedrecentchanges-param-hidepatrolled": "Skrýt prověřené změny.",
+       "apihelp-feedrecentchanges-param-hidemyself": "Skrýt změny aktuálního uživatele.",
+       "apihelp-feedrecentchanges-param-tagfilter": "Filtrovat podle značek.",
+       "apihelp-feedrecentchanges-param-target": "Zobrazit jen změny na stránkách odkazovaných z této stránky.",
+       "apihelp-feedrecentchanges-example-simple": "Zobrazit poslední změny.",
+       "apihelp-feedrecentchanges-example-30days": "Zobrazit poslední změny za 30 dní.",
+       "apihelp-filerevert-description": "Revertovat soubor na starší verzi.",
+       "apihelp-filerevert-param-filename": "Cílový název souboru, bez prefixu Soubor:",
+       "apihelp-filerevert-param-comment": "Vložit komentář.",
        "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.",
        "apihelp-help-example-recursive": "Veškerá nápověda na jedné stránce",
        "apihelp-help-example-help": "Nápověda k samotnému modulu nápovědy",
        "apihelp-help-example-query": "Nápověda pro dva podmoduly query",
+       "apihelp-imagerotate-description": "Otočit jeden nebo více obrázků.",
+       "apihelp-import-param-summary": "Import shrnutí.",
+       "apihelp-import-param-xml": "Nahraný XML soubor.",
+       "apihelp-import-param-rootpage": "Importovat jako podstránku k této stránce.",
+       "apihelp-login-param-name": "Uživatelské jméno.",
+       "apihelp-login-param-password": "Heslo.",
+       "apihelp-login-example-login": "Přihlášení",
+       "apihelp-logout-example-logout": "Odhlášení aktuálního uživatele.",
+       "apihelp-move-description": "Přesunout stránku.",
+       "apihelp-move-param-reason": "Důvod k přejmenování.",
+       "apihelp-move-param-movetalk": "Přejmenovat diskuzní stránku, pokud existuje.",
+       "apihelp-move-param-movesubpages": "Přejmenovat možné podstránky",
+       "apihelp-move-param-noredirect": "Nevytvářet přesměrování.",
+       "apihelp-move-param-watch": "Přidat stránku a přesměrování do sledovaných stránek aktuálního uživatele.",
+       "apihelp-move-param-unwatch": "Odstranit stránku a přesměrování ze sledovaných stránek současného uživatele.",
+       "apihelp-move-param-ignorewarnings": "Ignorovat všechna varování.",
+       "apihelp-opensearch-param-search": "Hledaný řetězec.",
+       "apihelp-opensearch-param-limit": "Maximální počet vrácených výsledků",
+       "apihelp-opensearch-param-namespace": "Jmenné prostory pro vyhledávání.",
+       "apihelp-opensearch-param-format": "Formát výstupu.",
+       "apihelp-opensearch-example-te": "Najít stránky začínající na „<kbd>Te</kbd>“.",
+       "apihelp-options-example-reset": "Vrátit všechna nastavení.",
+       "apihelp-parse-example-page": "Parsovat stránku.",
+       "apihelp-patrol-example-revid": "Prověřit revizi.",
+       "apihelp-protect-description": "Změnit úroveň zamčení stránky.",
+       "apihelp-protect-param-reason": "Důvod pro odemčení.",
+       "apihelp-protect-example-protect": "Zamknout stránku.",
+       "apihelp-query+alldeletedrevisions-example-user": "Seznam posledních 50 smazaných editací uživatele <kbd>Příklad<kbd>.",
+       "apihelp-query+alldeletedrevisions-example-ns-main": "Seznam prvních 50 smazaných revizí v hlavním jmenném prostoru.",
+       "apihelp-query+allfileusages-description": "Zobrazit seznam všech použití souboru, včetně neexistujících.",
+       "apihelp-query+alllinks-example-generator": "Získat stránky obsahující odkazy.",
+       "apihelp-query+allpages-param-filterredir": "Které stránky uvést na seznam.",
+       "apihelp-query+allpages-param-minsize": "Omezit na stránky s určitým počtem bajtů.",
+       "apihelp-query+allpages-param-prtype": "Omezit jen na zamčené stránky.",
+       "apihelp-query+allpages-example-B": "Zobrazit seznam stránek začínajících na písmeno <kbd>B</kbd>.",
+       "apihelp-query+allredirects-description": "Seznam všech přesměrování pro jmenný prostor.",
+       "apihelp-query+allredirects-example-unique": "Seznam unikátních cílových stránek.",
+       "apihelp-query+allredirects-example-generator": "Získat stránky obsahující přesměrování.",
+       "apihelp-query+alltransclusions-example-unique": "Seznam unikátně vložených titulů.",
+       "apihelp-query+backlinks-example-simple": "Zobrazit odkazy na <kbd>Hlavní stránka</kbd>",
+       "apihelp-query+categorymembers-description": "Seznam všech stránek v dané kategorii.",
+       "apihelp-query+deletedrevisions-param-limit": "Maximální počet revizí pro zobrazení v seznamu.",
+       "apihelp-query+embeddedin-example-simple": "Zobrazit stránky, které obahují <kbd>Template:Stub</kbd>.",
+       "apihelp-query+filearchive-example-simple": "Zobrazit seznam všech smazaných souborů.",
+       "apihelp-query+filerepoinfo-example-simple": "Získat informace o souborových repozitářích.",
+       "apihelp-query+linkshere-example-generator": "Získat informace o stránkách, které odkazují na [[Hlavní Stránka|Hlavní stránku]].",
+       "apihelp-query+recentchanges-example-simple": "Seznam posledních změn.",
+       "apihelp-query+tags-example-simple": "Získat seznam dostupných tagů.",
+       "apihelp-query+usercontribs-example-user": "Zobrazit příspěvky uživatele <kbd>Příklad</kbd>",
+       "apihelp-query+watchlistraw-description": "Získat všechny stránky, které jsou aktuálním uživatelem sledovány.",
+       "apihelp-query+watchlistraw-example-simple": "Seznam sledovaných stránek uživatele.",
+       "apihelp-unblock-param-user": "Uživatel, IP adresa nebo záběr IP adres k odblokování. Nelze použít dohromady s <var>$1id</var>.",
+       "apihelp-watch-example-watch": "Sledovat stránku <kbd>Hlavní stránka</kbd>.",
+       "apihelp-watch-example-generator": "Zobrazit prvních několik stránek z hlavního jmenného prostoru.",
        "apihelp-format-example-generic": "Výsledek dotazu vypsat ve formátu $1.",
        "apihelp-dbg-description": "Vypisuje data ve formátu funkce var_export() z PHP.",
        "apihelp-dbgfm-description": "Vypisuje data ve formátu funkce var_export() z PHP (v čitelné HTML podobě).",
index 5e2aad9..c00acb4 100644 (file)
@@ -6,38 +6,40 @@
                        "Metalhead64",
                        "Inkowik",
                        "Umherirrender",
-                       "Giftpflanze"
+                       "Giftpflanze",
+                       "Macofe",
+                       "Se4598"
                ]
        },
-       "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-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page/de|Dokumentation]]\n* [[mw: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 [[mw:API:Errors_and_warnings|API: Fehler und Warnungen]].",
        "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": "Sicherstellen, dass der Benutzer eingeloggt ist, wenn auf „user“ gesetzt, oder Bot ist, wenn auf „bot“ gesetzt.",
+       "apihelp-main-param-maxlag": "maxlag kann verwendet werden, wenn MediaWiki auf einem datenbankreplizierten Cluster installiert ist. Um weitere Replikationsrückstände zu verhindern, lässt dieser Parameter den Client warten, bis der Replikationsrückstand kleiner als der angegebene Wert (in Sekunden) ist. Bei einem größerem Rückstand wird der Fehlercode <samp>maxlag</samp> zurückgegeben mit einer Nachricht wie <samp>Waiting for $host: $lag seconds lagged</samp>.<br />Siehe [[mw:Manual:Maxlag_parameter|Handbuch: Maxlag parameter]] für weitere Informationen.",
+       "apihelp-main-param-smaxage": "Den <code>s-maxage</code>-Header auf diese Anzahl Sekunden festlegen. Fehler werden niemals gecacht.",
+       "apihelp-main-param-maxage": "Den <code>max-age</code>-Header auf diese Anzahl Sekunden festlegen. Fehler werden niemals gecacht.",
+       "apihelp-main-param-assert": "Sicherstellen, dass der Benutzer eingeloggt ist, wenn auf <kbd>user</kbd> gesetzt, oder Bot ist, wenn auf <kbd>bot</kbd> gesetzt.",
        "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-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 <code>Origin</code>-Header entsprechen, d.&nbsp;h. er muss auf etwas wie <kbd>https://de.wikipedia.org</kbd> oder <kbd>https://meta.wikimedia.org</kbd> gesetzt werden. Falls dieser Parameter nicht mit dem <code>Origin</code>-Header übereinstimmt, wird eine 403-Antwort zurückgegeben. Falls dieser Parameter dem <code>Origin</code>-Header entspricht und die Domain auf der Whitelist ist, wird ein <code>Access-Control-Allow-Origin</code>-Header gesetzt.",
+       "apihelp-main-param-uselang": "Zu verwendende Sprache für Nachrichtenübersetzungen. Eine Liste der Codes kann von <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> mit <kbd>siprop=languages</kbd> abgerufen werden. Gib <kbd>user</kbd> zum Verwenden der aktuellen Benutzerspracheinstellung oder <kbd>content</kbd> an, um die Inhaltssprache des Wikis zu verwenden.",
        "apihelp-block-description": "Einen Benutzer sperren.",
        "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-expiry": "Sperrdauer. Kann relativ (z.&nbsp;B. <kbd>5 months</kbd> oder <kbd>2 weeks</kbd>) oder absolut (z.&nbsp;B. <kbd>2014-09-18T12:34:56Z</kbd>) sein. Wenn auf <kbd>infinite</kbd>, <kbd>indefinite</kbd> oder <kbd>never</kbd> 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-noemail": "Benutzer davon abhalten, E-Mails auf dem Wiki zu versenden (erfordert das blockemail-Recht).",
-       "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-noemail": "Benutzer davon abhalten, E-Mails auf dem Wiki zu versenden (erfordert das <code>blockemail</code>-Recht).",
+       "apihelp-block-param-hidename": "Den Benutzernamen im Sperr-Logbuch verstecken (erfordert das <code>hideuser</code>-Recht).",
+       "apihelp-block-param-allowusertalk": "Dem Benutzer erlauben, seine eigene Diskussionsseite zu bearbeiten (abhängig von <var>[[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>).",
        "apihelp-block-param-reblock": "Falls der Benutzer bereits gesperrt ist, die vorhandene Sperre überschreiben.",
-       "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-block-param-watchuser": "Benutzer- und Diskussionsseiten des Benutzers oder der IP-Adresse beobachten.",
+       "apihelp-block-example-ip-simple": "IP <kbd>192.0.2.5</kbd> für drei Tage mit der Begründung „First strike“ (erste Verwarnung) sperren",
+       "apihelp-block-example-user-complex": "Benutzer <kbd>Vandal</kbd> unbeschränkt sperren mit der Begründung „Vandalism“ (Vandalismus), Erstellung neuer Benutzerkonten sowie Versand von E-Mails verhindern.",
+       "apihelp-clearhasmsg-description": "Löschen des <code>hasmsg</code>-Flags („hat Nachrichten“-Flag) für den aktuellen Benutzer.",
+       "apihelp-clearhasmsg-example-1": "<code>hasmsg</code>-Flags für den aktuellen Benutzer löschen",
+       "apihelp-compare-description": "Abrufen des Unterschieds zwischen zwei 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 Seitennummer.",
        "apihelp-compare-param-fromrev": "Erste zu vergleichende Version.",
@@ -47,7 +49,7 @@
        "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 (wird ignoriert, wenn $1mailpassword angegeben ist).",
+       "apihelp-createaccount-param-password": "Passwort (wird ignoriert, wenn <var>$1mailpassword</var> 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-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": "Benutzer „testuser“ mit dem Passwort „test123“ erstellen",
-       "apihelp-createaccount-example-mail": "Benutzer „testmailuser“ erstellen und zufällig generiertes Passwort per E-Mail verschicken",
+       "apihelp-createaccount-example-pass": "Benutzer <kbd>testuser</kbd> mit dem Passwort <kbd>test123</kbd> erstellen.",
+       "apihelp-createaccount-example-mail": "Benutzer <kbd>testmailuser</kbd> 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-title": "Titel der Seite, die gelöscht werden soll. Kann nicht zusammen mit <var>$1pageid</var> verwendet werden.",
+       "apihelp-delete-param-pageid": "Seitennummer der Seite, die gelöscht werden soll. Kann nicht zusammen mit <var>$1title</var> 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-watch": "Seite auf die Beobachtungsliste des aktuellen Benutzers setzen.",
+       "apihelp-delete-param-watchlist": "Seite zur Beobachtungsliste des aktuellen Benutzers hinzufügen oder von ihr entfernen, die Standardeinstellungen verwenden oder die 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-delete-example-simple": "<kbd>Hauptseite</kbd> löschen.",
+       "apihelp-delete-example-reason": "<kbd>Hauptseite</kbd> löschen mit der Begründung <kbd>Vorbereitung für Verschiebung</kbd>.",
        "apihelp-disabled-description": "Dieses Modul wurde deaktiviert.",
        "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": "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-title": "Titel der Seite, die bearbeitet werden soll. Kann nicht zusammen mit <var>$1pageid</var> verwendet werden.",
+       "apihelp-edit-param-pageid": "Seitennummer der Seite, die bearbeitet werden soll. Kann nicht zusammen mit <var>$1title</var> verwendet werden.",
+       "apihelp-edit-param-section": "Abschnittsnummer. <kbd>0</kbd> für die Einleitung, <kbd>new</kbd> 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 Abschnittsüberschrift, wenn $1section=new und $1sectiontitle nicht festgelegt ist.",
        "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 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-starttimestamp": "Zeitstempel, an dem der Bearbeitungsprozess begonnen wurde. Er wird zum Aufspüren von Bearbeitungskonflikten verwendet. Ein geeigneter Wert kann mithilfe von <var>[[Special:ApiHelp/main|curtimestamp]]</var> beim Beginn des Bearbeitungsprozesses (z.&nbsp;B. beim Laden des Seiteninhalts zum Bearbeiten) abgerufen werden.",
        "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": "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-watchlist": "Die Seite zur Beobachtungsliste des aktuellen Benutzers hinzufügen oder von ihr entfernen, die Standardeinstellungen verwenden oder die Beobachtung nicht ändern.",
        "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-contentmodel": "Inhaltsmodell des neuen Inhalts.",
        "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-prepend": "<kbd>_&#95;NOTOC_&#95;</kbd> 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": "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-emailuser-example-email": "Eine E-Mail an den Benutzer <kbd>WikiSysop</kbd> mit dem Text <kbd>Inhalt</kbd> senden.",
        "apihelp-expandtemplates-description": "Alle Vorlagen im Wikitext expandieren.",
        "apihelp-expandtemplates-param-title": "Titel der Seite.",
        "apihelp-expandtemplates-param-text": "Zu konvertierender Wikitext.",
+       "apihelp-expandtemplates-param-revid": "Versionsnummer, die für die Anzeige von <nowiki>{{REVISIONID}}</nowiki> und ähnlichen Variablen verwendet wird.",
        "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": "Den Wikitext „<nowiki>{{Project:Spielwiese}}</nowiki>“ expandieren",
+       "apihelp-expandtemplates-example-simple": "Den Wikitext <kbd><nowiki>{{Project:Spielwiese}}</nowiki></kbd> 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-toponly": "Nur aktuelle Versionen anzeigen.",
        "apihelp-feedcontributions-param-newonly": "Nur Seitenerstellungen anzeigen.",
        "apihelp-feedcontributions-param-showsizediff": "Zeigt den Größenunterschied zwischen Versionen an.",
-       "apihelp-feedcontributions-example-simple": "Beiträge für [[Benutzer:Beispiel]] zurückgeben",
+       "apihelp-feedcontributions-example-simple": "Beiträge für die Benutzer <kbd>Beispiel<kbd> zurückgeben",
        "apihelp-feedrecentchanges-description": "Gibt einen Letzte-Änderungen-Feed zurück.",
        "apihelp-feedrecentchanges-param-feedformat": "Das Format des Feeds.",
        "apihelp-feedrecentchanges-param-namespace": "Namensraum, auf den die Ergebnisse beschränkt werden sollen.",
        "apihelp-feedrecentchanges-param-hideanons": "Änderungen von anonymen Benutzern ausblenden.",
        "apihelp-feedrecentchanges-param-hideliu": "Änderungen von registrierten Benutzern ausblenden.",
        "apihelp-feedrecentchanges-param-hidepatrolled": "Kontrollierte Änderungen ausblenden.",
-       "apihelp-feedrecentchanges-param-hidemyself": "Eigene Änderungen ausblenden.",
+       "apihelp-feedrecentchanges-param-hidemyself": "Änderungen des aktuellen Benutzers 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-filerevert-param-filename": "Ziel-Datei, ohne das Datei:-Präfix.",
        "apihelp-filerevert-param-comment": "Hochladekommentar.",
        "apihelp-filerevert-param-archivename": "Archivname der Version, auf die die Datei zurückgesetzt werden soll.",
-       "apihelp-filerevert-example-revert": "Wiki.png auf die Version vom 2011-03-05T15:27:40Z zurücksetzen",
+       "apihelp-filerevert-example-revert": "<kbd>Wiki.png</kbd> auf die Version vom <kbd>2011-03-05T15:27:40Z</kbd> zurücksetzen",
        "apihelp-help-description": "Hilfe für die angegebenen Module anzeigen.",
-       "apihelp-help-param-modules": "Module, zu denen eine Hilfe angezeigt werden soll (Werte der Parameter action= und format= oder „main“). Kann Submodule mit einem „+“ angeben.",
+       "apihelp-help-param-modules": "Module, zu denen eine Hilfe angezeigt werden soll (Werte der Parameter <var>action</var> und <var>format</var> oder <kbd>main</kbd>). Kann Submodule mit einem <kbd>+</kbd> angeben.",
        "apihelp-help-param-submodules": "Hilfe für Submodule des benannten Moduls einschließen.",
        "apihelp-help-param-recursivesubmodules": "Hilfe für Submodule rekursiv einschließen.",
        "apihelp-help-param-helpformat": "Format der Hilfe-Ausgabe.",
        "apihelp-help-example-query": "Hilfe für zwei Abfrage-Submodule",
        "apihelp-imagerotate-description": "Ein oder mehrere Bilder drehen.",
        "apihelp-imagerotate-param-rotation": "Anzahl der Grad, um die das Bild im Uhrzeigersinn gedreht werden soll.",
-       "apihelp-imagerotate-example-simple": "[[:Datei:Example.png]] um 90 Grad drehen",
-       "apihelp-imagerotate-example-generator": "Alle Bilder in der [[:Kategorie:Flip]] um 180 Grad drehen",
+       "apihelp-imagerotate-example-simple": "<kbd>Datei:Beispiel.png</kbd> um <kbd>90</kbd> Grad drehen.",
+       "apihelp-imagerotate-example-generator": "Alle Bilder in der <kbd>Kategorie:Flip</kbd> um <kbd>180</kbd> Grad drehen.",
+       "apihelp-import-description": "Importiert eine Seite von einem anderen Wiki oder einer XML-Datei.\n\nBitte beachte, dass der HTTP-POST-Vorgang als Dateiupload ausgeführt werden muss (z.B. durch multipart/form-data), um eine Datei über den <var>xml</var>-Parameter zu senden.",
        "apihelp-import-param-summary": "Import-Zusammenfassung.",
        "apihelp-import-param-xml": "Hochgeladene XML-Datei.",
        "apihelp-import-param-interwikisource": "Für Interwiki-Importe: Wiki, von dem importiert werden soll.",
        "apihelp-import-param-namespace": "Für Interwiki-Importe: importiere in diesen Namensraum.",
        "apihelp-import-param-rootpage": "Als Unterseite dieser Seite importieren.",
        "apihelp-import-example-import": "Importiere [[meta:Help:Parserfunctions]] mit der kompletten Versionsgeschichte in den Namensraum 100.",
+       "apihelp-login-description": "Anmelden und Authentifizierungs-Cookies beziehen.\n\nFalls das Anmelden erfolgreich war, werden die benötigten Cookies im Header der HTTP-Antwort des Servers übermittelt. Bei fehlgeschlagenen Anmeldeversuchen können weitere Versuche gedrosselt werden, um automatische Passwortermittlungsattacken zu verhinden.",
        "apihelp-login-param-name": "Benutzername.",
        "apihelp-login-param-password": "Passwort.",
        "apihelp-login-param-domain": "Domain (optional).",
        "apihelp-login-example-login": "Anmelden",
        "apihelp-logout-description": "Abmelden und alle Sitzungsdaten löschen.",
        "apihelp-logout-example-logout": "Meldet den aktuellen Benutzer ab",
+       "apihelp-managetags-description": "Ermöglicht Verwaltungsaufgaben zu Änderungsmarkierungen.",
+       "apihelp-managetags-param-reason": "optionale Begründung für das Erstellen, Löschen, Aktivieren oder Deaktivieren der Markierung.",
+       "apihelp-managetags-param-ignorewarnings": "Warnungen während des Vorgangs ignorieren.",
+       "apihelp-managetags-example-create": "Erstellt eine Markierung namens <kbd>spam</kbd> mit der Begründung <kbd>For use in edit patrolling</kbd> (für die Eingangskontrolle).",
+       "apihelp-managetags-example-delete": "Löscht die <kbd>vandlaism</kbd>-Markierung mit der Begründung <kbd>Misspelt</kbd>.",
+       "apihelp-managetags-example-activate": "Aktiviert eine Markierung namens <kbd>spam</kbd> mit der Begründung <kbd>For use in edit patrolling</kbd> (für die Eingangskontrolle).",
+       "apihelp-managetags-example-deactivate": "Deaktiviert eine Markierung namens <kbd>spam</kbd> mit der Begründung <kbd>No longer required</kbd> (nicht mehr benötigt).",
        "apihelp-move-description": "Eine Seite verschieben.",
-       "apihelp-move-param-from": "Titel der Seite, die du verschieben möchtest. Kann nicht zusammen mit $1fromid verwendet werden.",
-       "apihelp-move-param-fromid": "Seitenkennung der Seite, die du verschieben möchtest. Kann nicht zusammen mit $1from verwendet werden.",
+       "apihelp-move-param-from": "Titel der zu verschiebenden Seite. Kann nicht zusammen mit <var>$1fromid</var> verwendet werden.",
+       "apihelp-move-param-fromid": "Seitenkennung der zu verschiebenden Seite. Kann nicht zusammen mit <var>$1from</var> verwendet werden.",
        "apihelp-move-param-to": "Titel, zu dem die Seite umbenannt werden soll.",
-       "apihelp-move-param-reason": "Grund für die Verschiebung.",
+       "apihelp-move-param-reason": "Grund für die Umbenennung.",
        "apihelp-move-param-movetalk": "Verschiebt die Diskussionsseite, falls vorhanden.",
-       "apihelp-move-param-movesubpages": "Unterseiten verschieben, falls zutreffend.",
+       "apihelp-move-param-movesubpages": "Unterseiten verschieben, falls möglich.",
        "apihelp-move-param-noredirect": "Keine Weiterleitung erstellen.",
+       "apihelp-move-param-watch": "Die Seite und die entstandene Weiterleitung zur Beobachtungsliste hinzufügen.",
+       "apihelp-move-param-unwatch": "Die Seite und die entstandene Weiterleitung von der Beobachtungsliste entfernen.",
+       "apihelp-move-param-watchlist": "Die Seite in jedem Fall zur Beobachtungsliste hinzufügen oder davon entfernen, die Voreinstellungen dafür nutzen oder den Beobachtungsstatus nicht ändern.",
        "apihelp-move-param-ignorewarnings": "Alle Warnungen ignorieren.",
-       "apihelp-move-example-move": "„Schlechter Titel“ nach „Guter Titel“ verschieben, ohne eine Weiterleitung zu erstellen",
+       "apihelp-move-example-move": "<kbd>Schlechter Titel</kbd> nach <kbd>Guter Titel</kbd> verschieben, ohne eine Weiterleitung zu erstellen.",
        "apihelp-opensearch-description": "Das Wiki mithilfe des OpenSearch-Protokolls durchsuchen.",
        "apihelp-opensearch-param-search": "Such-Zeichenfolge.",
        "apihelp-opensearch-param-limit": "Maximale Anzahl zurückzugebender Ergebnisse.",
        "apihelp-opensearch-param-namespace": "Zu durchsuchende Namensräume.",
-       "apihelp-opensearch-param-suggest": "Nichts unternehmen, falls [https://www.mediawiki.org/wiki/Manual:$wgEnableOpenSearchSuggest $wgEnableOpenSearchSuggest] falsch ist.",
+       "apihelp-opensearch-param-suggest": "Nichts unternehmen, falls <var>[[mw:Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> falsch ist.",
        "apihelp-opensearch-param-format": "Das Format der Ausgabe.",
-       "apihelp-opensearch-example-te": "Seiten finden, die mit „Te“ beginnen",
+       "apihelp-opensearch-example-te": "Seiten finden, die mit <kbd>Te</kbd> beginnen.",
        "apihelp-options-param-reset": "Setzt die Einstellungen auf Websitestandards zurück.",
        "apihelp-options-example-reset": "Alle Einstellungen zurücksetzen",
-       "apihelp-options-example-change": "Ändert die Einstellungen „skin“ und „hideminor“",
-       "apihelp-options-example-complex": "Setzt alle Einstellungen zurück, dann „skin“ und „nickname“ festlegen",
+       "apihelp-options-example-change": "Ändert die Einstellungen <kbd>skin</kbd> und <kbd>hideminor</kbd>.",
+       "apihelp-options-example-complex": "Setzt alle Einstellungen zurück, dann <kbd>skin</kbd> und <kbd>nickname</kbd> festlegen.",
        "apihelp-paraminfo-description": "Ruft Informationen über API-Module ab.",
        "apihelp-paraminfo-param-helpformat": "Format der Hilfe-Zeichenfolgen.",
+       "apihelp-parse-param-summary": "Zu parsende Zusammenfassung.",
+       "apihelp-parse-param-disableeditsection": "Deaktiviert Abschnittsbearbeitungslinks in der Parserausgabe.",
        "apihelp-parse-param-preview": "Im Vorschaumodus parsen.",
+       "apihelp-parse-param-disabletoc": "Inhaltsverzeichnis in der Ausgabe deaktivieren.",
        "apihelp-parse-example-page": "Eine Seite parsen.",
        "apihelp-parse-example-text": "Wikitext parsen.",
        "apihelp-patrol-description": "Kontrolliert eine Seite oder Version.",
        "apihelp-protect-description": "Ändert den Schutzstatus einer Seite.",
        "apihelp-protect-param-title": "Titel der Seite, die du (ent-)sperren möchtest. Kann nicht zusammen mit $1pageid verwendet werden.",
        "apihelp-protect-param-pageid": "Seitenkennung der Seite, die du (ent-)sperren möchtest. Kann nicht zusammen mit $1title verwendet werden.",
-       "apihelp-protect-param-protections": "Liste der Schutzebenen nach dem Format Aktion=Ebene (z.B. edit=sysop).\n\n'''HINWEIS:''' Wenn eine Aktion nicht angegeben wird, wird deren Schutz entfernt.",
-       "apihelp-protect-param-expiry": "Zeitstempel des Schutzablaufs. Wenn nur ein Zeitstempel übergeben wird, ist dieser für alle Seitenschutze gültig. Um eine unendliche Schutzdauer festzulegen, kannst du die Werte „infinite“, „indefinite“, „infinity“ oder „never“ übergeben.",
+       "apihelp-protect-param-protections": "Liste der Schutzebenen nach dem Format <kbd>Aktion=Ebene</kbd> (z.B. <kbd>edit=sysop</kbd>).\n\n<strong>HINWEIS:</strong> Wenn eine Aktion nicht angegeben wird, wird deren Schutz entfernt.",
+       "apihelp-protect-param-expiry": "Zeitstempel des Schutzablaufs. Wenn nur ein Zeitstempel übergeben wird, ist dieser für alle Seitenschutze gültig. Um eine unendliche Schutzdauer festzulegen, kannst du die Werte <kbd>infinite</kbd>, <kbd>indefinite</kbd>, <kbd>infinity</kbd> oder <kbd>never</kbd> übergeben.",
        "apihelp-protect-param-reason": "Grund für den Seitenschutz oder dessen Aufhebung.",
        "apihelp-protect-param-cascade": "Aktiviert den Kaskadenschutz (alle eingebundenen Seiten werden ebenfalls geschützt). Wenn die übergebenen Schutzebenen keinen Kaskadenschutz unterstützen, wird dieser Parameter ignoriert.",
-       "apihelp-protect-param-watch": "Wenn vorhanden, fügt dieser Parameter die zu (ent-)sperrende Seite der Beobachtungsliste hinzu.",
-       "apihelp-protect-param-watchlist": "Die Seite bedingungslos zu deiner Beobachtungsliste hinzufügen oder von ihr entfernen, Einstellungen verwenden oder Beobachtung nicht ändern.",
+       "apihelp-protect-param-watch": "Wenn vorhanden, fügt dieser Parameter die zu (ent-)sperrende Seite der Beobachtungsliste des aktuellen Benutzers hinzu.",
+       "apihelp-protect-param-watchlist": "Die Seite bedingungslos zur Beobachtungsliste des aktuellen Benutzers hinzufügen oder von ihr entfernen, Einstellungen verwenden oder Beobachtung nicht ändern.",
        "apihelp-protect-example-protect": "Schützt eine Seite",
-       "apihelp-protect-example-unprotect": "Eine Seite entsperren, indem die Einschränkungen durch den Schutz auf „all“ gestellt werden.",
+       "apihelp-protect-example-unprotect": "Eine Seite entsperren, indem die Einschränkungen durch den Schutz auf <kbd>all</kbd> gestellt werden.",
        "apihelp-protect-example-unprotect2": "Eine Seite entsperren, indem keine Einschränkungen übergeben werden",
        "apihelp-purge-param-forcelinkupdate": "Aktualisiert die Linktabellen.",
        "apihelp-query-param-list": "Welche Listen abgerufen werden sollen.",
        "apihelp-query+allcategories-description": "Alle Kategorien aufzählen.",
        "apihelp-query+allcategories-param-limit": "Wie viele Kategorien zurückgegeben werden sollen.",
-       "apihelp-query+alldeletedrevisions-paraminfo-useronly": "Darf nur mit $3user verwendet werden.",
+       "apihelp-query+alldeletedrevisions-paraminfo-useronly": "Darf nur mit <var>$3user</var> verwendet werden.",
        "apihelp-query+alldeletedrevisions-param-user": "Nur Versionen von diesem Benutzer auflisten.",
        "apihelp-query+alldeletedrevisions-param-namespace": "Nur Seiten in diesem Namensraum auflisten.",
        "apihelp-query+allfileusages-param-limit": "Wie viele Gesamtobjekte zurückgegeben werden sollen.",
        "apihelp-query+allimages-param-sha1": "SHA1-Hash des Bildes. Überschreibt $1sha1base36.",
        "apihelp-query+allimages-param-sha1base36": "SHA1-Hash des Bildes (Basis 36; verwendet in MediaWiki).",
        "apihelp-query+allimages-param-limit": "Wie viele Gesamtbilder zurückgegeben werden sollen.",
+       "apihelp-query+allimages-example-recent": "Zeigt eine Liste von kürzlich hochgeladenen Dateien ähnlich zu [[Special:NewFiles]].",
        "apihelp-query+alllinks-example-unique": "Einheitlich verlinkte Titel auflisten",
        "apihelp-query+allpages-param-filterredir": "Welche Seiten aufgelistet werden sollen.",
        "apihelp-query+allredirects-example-unique": "Einheitliche Zielseiten auflisten",
        "apihelp-query+alltransclusions-param-namespace": "Der aufzulistende Namensraum.",
        "apihelp-query+alltransclusions-example-unique": "Einheitlich eingebundene Titel auflisten",
        "apihelp-query+allusers-param-limit": "Wie viele Benutzernamen insgesamt zurückgegeben werden sollen.",
-       "apihelp-query+allusers-example-Y": "Benutzer ab Y auflisten",
+       "apihelp-query+allusers-example-Y": "Benutzer ab <kbd>Y</kbd> auflisten.",
        "apihelp-query+backlinks-description": "Alle Seiten finden, die auf die angegebene Seite verlinken.",
-       "apihelp-query+backlinks-example-simple": "Links auf [[Hauptseite]] anzeigen",
+       "apihelp-query+backlinks-example-simple": "Links auf <kbd>Hauptseite</kbd> anzeigen.",
        "apihelp-query+blocks-example-simple": "Sperren auflisten",
        "apihelp-query+categorymembers-param-startsortkey": "Stattdessen $1starthexsortkey verwenden.",
        "apihelp-query+categorymembers-param-endsortkey": "Stattdessen $1endhexsortkey verwenden.",
        "apihelp-query+info-description": "Ruft Basisinformationen über die Seite ab.",
        "apihelp-query+iwbacklinks-param-prefix": "Präfix für das Interwiki.",
        "apihelp-query+langbacklinks-param-limit": "Wie viele Gesamtseiten zurückgegeben werden sollen.",
-       "apihelp-query+links-example-simple": "Links von der [[Hauptseite]] abrufen",
+       "apihelp-query+links-example-simple": "Links von der <kbd>Hauptseite</kbd> abrufen",
        "apihelp-query+linkshere-description": "Alle Seiten finden, die auf die angegebenen Seiten verlinken.",
        "apihelp-query+logevents-description": "Ereignisse von den Logbüchern abrufen.",
        "apihelp-query+prefixsearch-param-search": "Such-Zeichenfolge.",
-       "apihelp-query+search-example-simple": "Nach „meaning“ suchen",
-       "apihelp-query+search-example-text": "Texte nach „meaning“ durchsuchen",
+       "apihelp-query+search-example-simple": "Nach <kbd>meaning</kbd> suchen.",
+       "apihelp-query+search-example-text": "Texte nach <kbd>meaning</kbd> durchsuchen.",
        "apihelp-query+siteinfo-example-simple": "Websiteinformationen abrufen",
        "apihelp-query+tags-description": "Änderungs-Tags auflisten.",
        "apihelp-query+tags-example-simple": "Verfügbare Tags auflisten",
        "apihelp-setnotificationtimestamp-param-entirewatchlist": "An allen beobachteten Seiten arbeiten.",
        "apihelp-unblock-description": "Einen Benutzer freigeben.",
        "apihelp-unblock-param-reason": "Grund für die Freigabe.",
-       "apihelp-unblock-example-id": "Sperrkennung #105 freigeben",
+       "apihelp-unblock-example-id": "Sperrkennung #<kbd>105</kbd> freigeben.",
        "apihelp-undelete-param-reason": "Grund für die Wiederherstellung.",
        "apihelp-upload-param-filename": "Ziel-Dateiname.",
        "apihelp-upload-param-watch": "Die Seite beobachten.",
        "apihelp-upload-example-url": "Von einer URL hochladen",
        "apihelp-userrights-param-user": "Benutzername.",
        "apihelp-userrights-param-userid": "Benutzerkennung.",
-       "apihelp-watch-example-watch": "Die Seite „Hauptseite“ beobachten",
+       "apihelp-watch-example-watch": "Die Seite <kbd>Hauptseite</kbd> beobachten.",
        "apihelp-format-example-generic": "Das Abfrageergebnis im $1-Format formatieren",
-       "apihelp-dbg-description": "Daten im PHP-var_export()-Format ausgeben.",
-       "apihelp-dbgfm-description": "Daten im PHP-var_export()-Format ausgeben (schöngedruckt in HTML).",
-       "apihelp-dump-description": "Daten im PHP-var_dump()-Format ausgeben.",
-       "apihelp-dumpfm-description": "Daten im PHP-var_dump()-Format ausgeben (schöngedruckt in HTML).",
+       "apihelp-dbg-description": "Daten im PHP-<code>var_export()</code>-Format ausgeben.",
+       "apihelp-dbgfm-description": "Daten im PHP-<code>var_export()</code>-Format ausgeben (schöngedruckt in HTML).",
+       "apihelp-dump-description": "Daten im PHP-<code>var_dump()</code>-Format ausgeben.",
+       "apihelp-dumpfm-description": "Daten im PHP-<code>var_dump()</code>-Format ausgeben (schöngedruckt in HTML).",
        "apihelp-json-description": "Daten im JSON-Format ausgeben.",
        "apihelp-json-param-callback": "Falls angegeben, wird die Ausgabe in einen angegebenen Funktionsaufruf eingeschlossen. Aus Sicherheitsgründen sind benutzerspezifische Daten beschränkt.",
        "apihelp-json-param-utf8": "Falls angegeben, kodiert die meisten (aber nicht alle) Nicht-ASCII-Zeichen als UTF-8 anstatt sie mit hexadezimalen Escape-Sequenzen zu ersetzen.",
        "apihelp-php-description": "Daten im serialisierten PHP-Format ausgeben.",
        "apihelp-phpfm-description": "Daten im serialisierten PHP-Format ausgeben (schöngedruckt in HTML).",
        "apihelp-rawfm-description": "Daten mit den Fehlerbehebungselementen im JSON-Format ausgeben (schöngedruckt in HTML).",
-       "apihelp-txt-description": "Daten im PHP-print_r()-Format ausgeben.",
-       "apihelp-txtfm-description": "Daten im PHP-print_r()-Format ausgeben (schöngedruckt in HTML).",
+       "apihelp-txt-description": "Daten im PHP-<code>print_r()</code>-Format ausgeben.",
+       "apihelp-txtfm-description": "Daten im PHP-<code>print_r()</code>-Format ausgeben (schöngedruckt in HTML).",
        "apihelp-wddx-description": "Daten im WDDX-Format ausgeben.",
        "apihelp-wddxfm-description": "Daten im WDDX-Format ausgeben (schöngedruckt in HTML).",
        "apihelp-xml-description": "Daten im XML-Format ausgeben.",
-       "apihelp-xml-param-xslt": "Falls angegeben, ergänzt &lt;xslt&gt; als Stylesheet. Dies sollte eine Wikiseite im MediaWiki-Namensraum sein, dessen Seitenname mit „.xsl“ endet.",
+       "apihelp-xml-param-xslt": "Falls angegeben, fügt die benannte Seite als XSL-Stylesheet hinzu. Der Wert muss ein Titel im Namensraum „{{ns:mediawiki}}“ sein und mit <code>.xsl</code> enden.",
        "apihelp-xml-param-includexmlnamespace": "Falls angegeben, ergänzt einen XML-Namensraum.",
        "apihelp-xmlfm-description": "Daten im XML-Format ausgeben (schöngedruckt in HTML).",
        "apihelp-yaml-description": "Daten im YAML-Format ausgeben.",
        "apihelp-yamlfm-description": "Daten im YAML-Format ausgeben (schöngedruckt in HTML).",
        "api-format-title": "MediaWiki-API-Ergebnis",
-       "api-format-prettyprint-header": "Du suchst nach der HTML-Repräsentation des $1-Formats. HTML ist zur Fehlerbehebung gut, aber unpassend für den Anwendungsgebrauch.\n\nGib den Formatparameter an, um das Ausgabeformat zu ändern. Um die Nicht-HTML-Repräsentation des $1-Formats anzusehen, lege format=$2 fest.\n\nSiehe die [https://www.mediawiki.org/wiki/API/de vollständige Dokumentation] oder die [[Special:ApiHelp/main|API-Hilfe]] für weitere Informationen.",
+       "api-format-prettyprint-header": "Dies ist die HTML-Repräsentation des $1-Formats. HTML ist zur Fehlerbehebung gut, aber unpassend für den Anwendungsgebrauch.\n\nGib den Parameter <var>Format</var> an, um das Ausgabeformat zu ändern. Um die Nicht-HTML-Repräsentation des $1-Formats anzusehen, lege <kbd>format=$2</kbd> fest.\n\nSiehe die [[mw:API|vollständige Dokumentation]] oder die [[Special:ApiHelp/main|API-Hilfe]] für weitere Informationen.",
        "api-orm-param-props": "Felder an die Anfrage.",
        "api-orm-param-limit": "Maximale Anzahl zurückgegebender Zeilen.",
        "api-pageset-param-titles": "Eine Liste der Titel, an denen gearbeitet werden soll.",
        "api-help-parameters": "{{PLURAL:$1|Parameter}}:",
        "api-help-param-deprecated": "Veraltet.",
        "api-help-param-required": "Dieser Parameter ist erforderlich.",
-       "api-help-param-list": "{{PLURAL:$1|1=Ein Wert|2=Werte (mit „{{!}}“ trennen)}}: $2",
+       "api-help-param-list": "{{PLURAL:$1|1=Ein Wert|2=Werte (mit <kbd>{{!}}</kbd> trennen)}}: $2",
        "api-help-param-list-can-be-empty": "{{PLURAL:$1|0=Muss leer sein|Kann leer sein oder $2}}",
        "api-help-param-limit": "Nicht mehr als $1 erlaubt.",
        "api-help-param-limit2": "Nicht mehr als $1 ($2 für Bots) erlaubt.",
        "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 eines multipart/form-data-Formular bereitgestellt werden.",
-       "api-help-param-multi-separate": "Werte mit „|“ trennen.",
+       "api-help-param-multi-separate": "Werte mit <kbd>|</kbd> 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>",
index e2206f9..929ec7e 100644 (file)
 {
        "@metadata": {
                "authors": [
-                       "Reedy"
+                       "Reedy",
+                       "Chase me ladies, I'm the Cavalry"
                ]
        },
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Documentation]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Mailing list]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API Announcements]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bugs & requests]\n</div>\n<strong>Status:</strong> All features shown on this page should be working, but the API is still in active development, and may change at any time. Subscribe to [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ the mediawiki-api-announce mailing list] for notice of updates.\n\n<strong>Erroneous requests:</strong> When erroneous requests are sent to the API, an HTTP header will be sent with the key \"MediaWiki-API-Error\" and then both the value of the header and the error code sent back will be set to the same value. For more information see [[mw:API:Errors_and_warnings|API: Errors and warnings]].",
+       "apihelp-main-param-maxage": "Set the <code>max-age</code> header to this many seconds. Errors are never cached.",
+       "apihelp-main-param-assert": "Verify the user is logged in if set to <kbd>user</kbd>, or has the bot userright if <kbd>bot</kbd>.",
+       "apihelp-block-param-user": "Username, IP address, or IP range to block.",
+       "apihelp-block-param-allowusertalk": "Allow the user to edit their own talk page (depends on <var>[[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>).",
+       "apihelp-block-param-watchuser": "Watch the user and talk pages of the user or IP address.",
+       "apihelp-block-example-ip-simple": "Block IP address <kbd>192.0.2.5</kbd> for three days with reason <kbd>First strike</kbd>.",
+       "apihelp-clearhasmsg-description": "Clears the <code>hasmsg</code> flag for the current user.",
+       "apihelp-compare-description": "Get the difference between 2 pages.\n\nA revision number, a page title, or a page ID for both \"from\" and \"to\" must be passed.",
+       "apihelp-createaccount-param-password": "Password (ignored if <var>$1mailpassword</var> is set).",
+       "apihelp-delete-param-title": "Title of the page to delete. Cannot be used together with <var>$1pageid</var>.",
+       "apihelp-delete-param-watch": "Add the page to the current user's watchlist.",
+       "apihelp-delete-example-simple": "Delete <kbd>Main Page</kbd>.",
+       "apihelp-delete-example-reason": "Delete <kbd>Main Page</kbd> with the reason <kbd>Preparing for move</kbd>.",
+       "apihelp-edit-param-title": "Title of the page to edit. Cannot be used together with <var>$1pageid</var>.",
+       "apihelp-edit-param-watch": "Add the page to the current user's watchlist.",
+       "apihelp-edit-param-watchlist": "Unconditionally add or remove the page from the current user's watchlist, use preferences or do not change watch.",
        "apihelp-edit-param-contentformat": "Content serialisation format used for the input text.",
+       "apihelp-edit-example-prepend": "Prepend <kbd>_&#95;NOTOC_&#95;</kbd> to a page.",
+       "apihelp-expandtemplates-example-simple": "Expand the wikitext <kbd><nowiki>{{Project:Sandbox}}</nowiki></kbd>.",
+       "apihelp-feedrecentchanges-param-hidemyself": "Hide changes made by the current user.",
+       "apihelp-filerevert-example-revert": "Revert <kbd>Wiki.png</kbd> to the version of <kbd>2011-03-05T15:27:40Z</kbd>.",
+       "apihelp-help-example-main": "Help for the main module.",
+       "apihelp-help-example-query": "Help for two query submodules.",
+       "apihelp-import-description": "Import a page from another wiki, or an XML file.\n\nNote that the HTTP POST must be done as a file upload (i.e. using multipart/form-data) when sending a file for the <var>xml</var> parameter.",
+       "apihelp-login-example-gettoken": "Retrieve a login token.",
+       "apihelp-logout-example-logout": "Log the current user out.",
+       "apihelp-move-param-to": "Title to rename the page to.",
+       "apihelp-move-param-reason": "Reason for the rename.",
+       "apihelp-move-example-move": "Move <kbd>Badtitle</kbd> to <kbd>Goodtitle</kbd> without leaving a redirect.",
+       "apihelp-opensearch-example-te": "Find pages beginning with <kbd>Te</kbd>.",
+       "apihelp-options-param-resetkinds": "List of types of options to reset when the <var>$1reset</var> option is set.",
+       "apihelp-options-param-optionvalue": "A value of the option specified by <var>$1optionname</var>, can contain pipe characters.",
+       "apihelp-options-example-change": "Change <kbd>skin</kbd> and <kbd>hideminor</kbd> preferences.",
+       "apihelp-options-example-complex": "Reset all preferences, then set <kbd>skin</kbd> and <kbd>nickname</kbd>.",
+       "apihelp-paraminfo-param-querymodules": "List of query module names (value of <var>prop</var>, <var>meta</var> or <var>list</var> parameter). Use <kbd>$1modules=query+foo</kbd> instead of <kbd>$1querymodules=foo</kbd>.",
+       "apihelp-parse-param-pageid": "Parse the content of this page. Overrides <var>$1page</var>.",
        "apihelp-parse-param-contentformat": "Content serialisation format used for the input text. Only valid when used with $1text.",
-       "apihelp-query+revisions+base-param-contentformat": "Serialisation format used for $1difftotext and expected for output of content.",
+       "apihelp-patrol-example-rcid": "Patrol a recent change.",
+       "apihelp-patrol-example-revid": "Patrol a revision.",
+       "apihelp-protect-param-protections": "List of protection levels, formatted <kbd>action=level</kbd> (e.g. <kbd>edit=sysop</kbd>).\n\n<strong>Note:</strong> Any actions not listed will have restrictions removed.",
+       "apihelp-protect-param-expiry": "Expiry timestamps. If only one timestamp is set, it will be used for all protections. Use <kbd>infinite</kbd>, <kbd>indefinite</kbd>, <kbd>infinity</kbd>, or <kbd>never</kbd>, for a never-expiring protection.",
+       "apihelp-protect-param-watchlist": "Unconditionally add or remove the page from the current user's watchlist, use preferences or do not change watch.",
+       "apihelp-protect-example-unprotect2": "Unprotect a page by setting no restrictions.",
+       "apihelp-purge-example-simple": "Purge the <kbd>Main Page</kbd> and the <kbd>API</kbd> page.",
+       "apihelp-query-example-allpages": "Fetch revisions of pages beginning with <kbd>API/</kbd>.",
+       "apihelp-query+allcategories-example-generator": "Retrieve information about the category page for categories beginning <kbd>List</kbd>.",
+       "apihelp-query+allfileusages-example-unique-generator": "Gets all file titles, marking the missing ones.",
+       "apihelp-query+alllinks-param-unique": "Only show distinct linked titles. Cannot be used with <kbd>$1prop=ids</kbd>.\nWhen used as a generator, yields target pages instead of source pages.",
+       "apihelp-query+alllinks-example-B": "List linked titles, including missing ones, with page IDs they are from, starting at <kbd>B</kbd>.",
+       "apihelp-query+alllinks-example-unique": "List unique linked titles.",
+       "apihelp-query+allmessages-example-ipb": "Show messages starting with <kbd>ipb-</kbd>.",
+       "apihelp-query+allmessages-example-de": "Show messages <kbd>august</kbd> and <kbd>mainpage</kbd> in German.",
+       "apihelp-query+allpages-example-B": "Show a list of pages starting at the letter <kbd>B</kbd>.",
+       "apihelp-query+allredirects-example-B": "List target pages, including missing ones, with page IDs they are from, starting at <kbd>B</kbd>.",
+       "apihelp-query+allredirects-example-generator": "Gets pages containing the redirects.",
+       "apihelp-query+alltransclusions-example-unique": "List unique transcluded titles.",
+       "apihelp-query+alltransclusions-example-generator": "Gets pages containing the transclusions.",
+       "apihelp-query+backlinks-param-pageid": "Page ID to search. Cannot be used together with <var>$1title</var>.",
+       "apihelp-query+backlinks-param-limit": "How many total pages to return. If <var>$1redirect</var> is enabled, limit applies to each level separately (which means up to 2 * <var>$1limit</var> results may be returned).",
+       "apihelp-query+backlinks-example-generator": "Get information about pages linking to <kbd>Main page<kbd>.",
+       "apihelp-query+blocks-param-ip": "Get all blocks applying to this IP or CIDR range, including range blocks.\nThis cannot be used together with <var>$3users</var>. CIDR ranges broader than IPv4/$1 or IPv6/$2 will not be not accepted.",
+       "apihelp-query+blocks-example-simple": "List blocks.",
+       "apihelp-query+blocks-example-users": "List blocks of users <kbd>Alice</kbd> and <kbd>Bob</kbd>.",
+       "apihelp-query+categoryinfo-example-simple": "Get information about <kbd>Category:Foo</kbd> and <kbd>Category:Bar</kbd>.",
+       "apihelp-query+categorymembers-param-pageid": "Page ID of the category to enumerate. Cannot be used together with <var>$1title</var>.",
+       "apihelp-query+categorymembers-param-endhexsortkey": "Sortkey to end listing from, as returned by <kbd>$1prop=sortkey</kbd>. Can only be used with <kbd>$1sort=sortkey</kbd>.",
+       "apihelp-query+deletedrevs-example-mode2": "List the last 50 deleted contributions by <kbd>Bob</kbd> (mode 2).",
+       "apihelp-query+deletedrevs-example-mode3-main": "List the first 50 deleted revisions in the main namespace (mode 3).",
+       "apihelp-query+deletedrevs-example-mode3-talk": "List the first 50 deleted pages in the {{ns:talk}} namespace (mode 3).",
+       "apihelp-query+duplicatefiles-example-simple": "Look for duplicates of [[:File:Albert Einstein Head.jpg]].",
+       "apihelp-query+duplicatefiles-example-generated": "Look for duplicates of all files.",
+       "apihelp-query+extlinks-example-simple": "Get a list of external links on <kbd>Main Page<kbd>.",
+       "apihelp-query+exturlusage-param-protocol": "Protocol of the URL. If empty and <var>$1query</var> set, the protocol is <kbd>http</kbd>. Leave both this and <var>$1query</var> empty to list all external links.",
+       "apihelp-query+filerepoinfo-example-simple": "Get information about file repositories.",
+       "apihelp-query+imageinfo-param-metadataversion": "Version of metadata to use. If <kbd>latest</kbd> is specified, use latest version. Defaults to <kbd>1</kbd> for backwards compatibility.",
+       "apihelp-query+imageinfo-example-simple": "Fetch information about the current version of [[:File:Albert Einstein Head.jpg]].",
+       "apihelp-query+images-example-simple": "Get a list of files used in the [[Main Page]].",
+       "apihelp-query+imageusage-example-simple": "Show pages using [[:File:Albert Einstein Head.jpg]].",
+       "apihelp-query+imageusage-example-generator": "Get information about pages using [[:File:Albert Einstein Head.jpg]].",
+       "apihelp-query+info-example-protection": "Get general and protection information about the page <kbd>Main Page</kbd>.",
+       "apihelp-query+iwbacklinks-example-simple": "Get pages linking to [[wikibooks:Test]].",
+       "apihelp-query+iwlinks-param-title": "Interwiki link to search for. Must be used with <var>$1prefix</var>.",
+       "apihelp-query+langbacklinks-example-simple": "Get pages linking to [[:fr:Test]].",
+       "apihelp-query+langbacklinks-example-generator": "Get information about pages linking to [[:fr:Test]].",
+       "apihelp-query+langlinks-param-title": "Link to search for. Must be used with <var>$1lang</var>.",
+       "apihelp-query+links-example-simple": "Get links from the page <kbd>Main Page</kbd>",
+       "apihelp-query+links-example-namespaces": "Get links from the page <kbd>Main Page</kbd> in the {{ns:user}} and {{ns:template}} namespaces.",
+       "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+logevents-example-simple": "List recent log events.",
+       "apihelp-query+pagepropnames-description": "List all page property names in use on the wiki.",
+       "apihelp-query+pageswithprop-description": "List all pages using a given page property.",
+       "apihelp-query+pageswithprop-example-generator": "Get page information about the first 10 pages using <code>_&#95;NOTOC_&#95;</code>.",
+       "apihelp-query+protectedtitles-example-generator": "Find links to protected titles in the main namespace.",
+       "apihelp-query+random-example-simple": "Return two random pages from the main namespace.",
+       "apihelp-query+random-example-generator": "Return page info about two random pages from the main namespace.",
+       "apihelp-query+recentchanges-example-simple": "List recent changes.",
+       "apihelp-query+redirects-example-generator": "Get information about all redirects to the [[Main Page]].",
+       "apihelp-query+revisions-example-first5-not-localhost": "Get first 5 revisions of the <kbd>Main Page</kbd> that were not made by anonymous user <kbd>127.0.0.1</kbd>.",
+       "apihelp-query+revisions+base-param-difftotext": "Text to diff each revision to. Only diffs a limited number of revisions. Overrides <var>$1diffto</var>. If <var>$1section</var> is set, only that section will be diffed against this text",
+       "apihelp-query+revisions+base-param-contentformat": "Serialisation format used for <var>$1difftotext</var> and expected for output of content.",
+       "apihelp-query+search-example-text": "Search texts for <kbd>meaning</kbd>.",
+       "apihelp-query+search-example-generator": "Get page information about the pages returned for a search for <kbd>meaning</kbd>.",
+       "apihelp-query+siteinfo-example-simple": "Fetch site information.",
+       "apihelp-query+siteinfo-example-replag": "Check the current replication lag.",
+       "apihelp-query+stashimageinfo-example-simple": "Returns information for a stashed file.",
+       "apihelp-query+tags-example-simple": "List available tags.",
+       "apihelp-query+templates-example-simple": "Get the templates used on the page <kbd>Main Page</kbd>.",
+       "apihelp-query+templates-example-generator": "Get information about the template pages used on <kbd>Main Page</kbd>.",
+       "apihelp-query+tokens-example-simple": "Retrieve a csrf token (the default).",
+       "apihelp-query+tokens-example-types": "Retrieve a watch token and a patrol token.",
+       "apihelp-query+transcludedin-example-simple": "Get a list of pages transcluding <kbd>Main Page</kbd>.",
+       "apihelp-query+transcludedin-example-generator": "Get information about pages transcluding <kbd>Main Page</kbd>.",
+       "apihelp-query+usercontribs-example-user": "Show contributions of user <kbd>Example</kbd>.",
+       "apihelp-query+userinfo-example-simple": "Get information about the current user.",
+       "apihelp-query+watchlist-example-simple": "List the top revision for recently changed pages on the watchlist of the current user.",
+       "apihelp-query+watchlist-example-generator": "Fetch page info for recently changed pages on the current user's watchlist.",
+       "apihelp-query+watchlistraw-description": "Get all pages on the current user's watchlist.",
+       "apihelp-query+watchlistraw-example-simple": "List pages on the watchlist of the current user.",
+       "apihelp-query+watchlistraw-example-generator": "Fetch page info for pages on the current user's watchlist.",
+       "apihelp-revisiondelete-example-revision": "Hide content for revision <kbd>12345</kbd> on the page <kbd>Main Page</kbd>.",
+       "apihelp-rollback-param-watchlist": "Unconditionally add or remove the page from the current user's watchlist, use preferences or do not change watch.",
+       "apihelp-rollback-example-simple": "Roll back the last edits to page <kbd>Main Page</kbd> by user <kbd>Example</kbd>.",
+       "apihelp-setnotificationtimestamp-example-allpages": "Reset the notification status for pages in the <kbd>{{ns:user}}</kbd> namespace.",
+       "apihelp-unblock-param-id": "ID of the block to unblock (obtained through <kbd>list=blocks</kbd>). Cannot be used together with <var>$1user</var>.",
+       "apihelp-undelete-param-timestamps": "Timestamps of the revisions to restore. If both <var>$1timestamps</var> and <var>$1fileids</var> are empty, all will be restored.",
+       "apihelp-undelete-param-watchlist": "Unconditionally add or remove the page from the current user's watchlist, use preferences or do not change watch.",
+       "apihelp-undelete-example-page": "Undelete page <kbd>Main Page</kbd>.",
+       "apihelp-undelete-example-revisions": "Undelete two revisions of page <kbd>Main Page</kbd>.",
+       "apihelp-upload-param-comment": "Upload comment. Also used as the initial page text for new files if <var>$1text</var> is not specified.",
+       "apihelp-upload-example-url": "Upload from a URL.",
+       "apihelp-upload-example-filekey": "Complete an upload that failed due to warnings.",
+       "apihelp-userrights-example-userid": "Add the user with ID <kbd>123</kbd> to group <kbd>bot</kbd>, and remove from groups <kbd>sysop</kbd> and <kbd>bureaucrat</kbd>.",
+       "apihelp-watch-param-title": "The page to (un)watch. Use <var>$1titles</var> instead.",
+       "apihelp-watch-example-unwatch": "Unwatch the page <kbd>Main Page</kbd>.",
+       "apihelp-dbg-description": "Output data in PHP's <code>var_export()</code> format.",
+       "apihelp-dbgfm-description": "Output data in PHP's <code>var_export()</code> format (pretty-print in HTML).",
+       "apihelp-dump-description": "Output data in PHP's <code>var_dump()</code> format.",
        "apihelp-php-description": "Output data in serialised PHP format.",
-       "apihelp-phpfm-description": "Output data in serialised PHP format (pretty-print in HTML)."
+       "apihelp-phpfm-description": "Output data in serialised PHP format (pretty-print in HTML).",
+       "apihelp-txt-description": "Output data in PHP's <code>print_r()</code> format.",
+       "apihelp-txtfm-description": "Output data in PHP's <code>print_r()</code> format (pretty-print in HTML).",
+       "api-pageset-param-redirects-generator": "Automatically resolve redirects in <var>$1titles</var>, <var>$1pageids</var>, and <var>$1revids</var>, and in pages returned by <var>$1generator</var>.",
+       "api-pageset-param-redirects-nogenerator": "Automatically resolve redirects in <var>$1titles</var>, <var>$1pageids</var>, and <var>$1revids</var>.",
+       "api-help-param-multi-separate": "Separate values with <kbd>|</kbd>.",
+       "api-help-param-disabled-in-miser-mode": "Disabled due to [[mw:Manual:$wgMiserMode|miser mode]].",
+       "api-help-param-limited-in-miser-mode": "<strong>Note:</strong> Due to [[mw:Manual:$wgMiserMode|miser mode]], using this may result in fewer than <var>$1limit</var> results returned before continuing; in extreme cases, zero results may be returned."
 }
index c83058d..4237ff8 100644 (file)
@@ -1,53 +1,60 @@
 {
        "@metadata": {
                "authors": [
-                       "Anomie"
+                       "Anomie",
+                       "Siebrand"
                ]
        },
 
-       "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-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Documentation]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Mailing list]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API Announcements]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bugs & requests]\n</div>\n<strong>Status:</strong> All features shown on this page should be working, but the API is still in active development, and may change at any time. Subscribe to [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ the mediawiki-api-announce mailing list] for notice of updates.\n\n<strong>Erroneous requests:</strong> When erroneous requests are sent to the API, an HTTP header will be sent with the key \"MediaWiki-API-Error\" and then both the value of the header and the error code sent back will be set to the same value. For more information see [[mw:API:Errors_and_warnings|API: Errors and warnings]].",
        "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.",
-       "apihelp-main-param-smaxage": "Set the s-maxage header to this many seconds. Errors are never cached.",
-       "apihelp-main-param-maxage": "Set the max-age header to this many seconds. Errors are never cached.",
-       "apihelp-main-param-assert": "Verify the user is logged in if set to \"user\", or has the bot userright if \"bot\".",
+       "apihelp-main-param-maxlag": "Maximum lag can be used when MediaWiki is installed on a database replicated cluster. To save actions causing any more site replication lag, this parameter can make the client wait until the replication lag is less than the specified value. In case of excessive lag, error code <samp>maxlag</samp> is returned with a message like <samp>Waiting for $host: $lag seconds lagged</samp>.<br />See [[mw:Manual:Maxlag_parameter|Manual: Maxlag parameter]] for more information.",
+       "apihelp-main-param-smaxage": "Set the <code>s-maxage</code> header to this many seconds. Errors are never cached.",
+       "apihelp-main-param-maxage": "Set the <code>max-age</code> header to this many seconds. Errors are never cached.",
+       "apihelp-main-param-assert": "Verify the user is logged in if set to <kbd>user</kbd>, or has the bot userright if <kbd>bot</kbd>.",
        "apihelp-main-param-requestid": "Any value given here will be included in the response. May be used to distinguish requests.",
        "apihelp-main-param-servedby": "Include the hostname that served the request in the results.",
        "apihelp-main-param-curtimestamp": "Include the current timestamp in the result.",
-       "apihelp-main-param-origin": "When accessing the API using a cross-domain AJAX request (CORS), set this to the originating domain. This must be included in any pre-flight request, and therefore must be part of the request URI (not the POST body). This must match one of the origins in the Origin: header exactly, so it has to be set to something like http://en.wikipedia.org or https://meta.wikimedia.org. If this parameter does not match the Origin: header, a 403 response will be returned. If this parameter matches the Origin: header and the origin is whitelisted, an Access-Control-Allow-Origin header will be set.",
-       "apihelp-main-param-uselang": "Language to use for message translations. A list of codes may be fetched from [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]] with siprop=languages, or specify \"user\" to use the current user's language preference, or specify \"content\" to use this wiki's content language.",
+       "apihelp-main-param-origin": "When accessing the API using a cross-domain AJAX request (CORS), set this to the originating domain. This must be included in any pre-flight request, and therefore must be part of the request URI (not the POST body). This must match one of the origins in the <code>Origin</code> header exactly, so it has to be set to something like <kbd>https://en.wikipedia.org</kbd> or <kbd>https://meta.wikimedia.org</kbd>. If this parameter does not match the <code>Origin</code> header, a 403 response will be returned. If this parameter matches the <code>Origin</code> header and the origin is whitelisted, an <code>Access-Control-Allow-Origin</code> header will be set.",
+       "apihelp-main-param-uselang": "Language to use for message translations. A list of codes may be fetched from <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> with <kbd>siprop=languages</kbd>, or specify <kbd>user</kbd> to use the current user's language preference, or specify <kbd>content</kbd> to use this wiki's content language.",
 
        "apihelp-block-description": "Block a user.",
-       "apihelp-block-param-user": "Username, IP address or IP range you want to block.",
-       "apihelp-block-param-expiry": "Expiry time. May be relative (e.g. \"5 months\" or \"2 weeks\") or absolute (e.g. \"2014-09-18T12:34:56Z\"). If set to \"infinite\", \"indefinite\" or \"never\", the block will never expire.",
+       "apihelp-block-param-user": "Username, IP address, or IP range to block.",
+       "apihelp-block-param-expiry": "Expiry time. May be relative (e.g. <kbd>5 months</kbd> or <kbd>2 weeks</kbd>) or absolute (e.g. <kbd>2014-09-18T12:34:56Z</kbd>). If set to <kbd>infinite</kbd>, <kbd>indefinite</kbd>, or <kbd>never</kbd>, the block will never expire.",
        "apihelp-block-param-reason": "Reason for block.",
-       "apihelp-block-param-anononly": "Block anonymous users only (i.e. disable anonymous edits for this IP).",
+       "apihelp-block-param-anononly": "Block anonymous users only (i.e. disable anonymous edits for this IP address).",
        "apihelp-block-param-nocreate": "Prevent account creation.",
        "apihelp-block-param-autoblock": "Automatically block the last used IP address, and any subsequent IP addresses they try to login from.",
-       "apihelp-block-param-noemail": "Prevent user from sending email through the wiki. (Requires the \"blockemail\" right).",
-       "apihelp-block-param-hidename": "Hide the username from the block log. (Requires the \"hideuser\" right).",
-       "apihelp-block-param-allowusertalk": "Allow the user to edit their own talk page (depends on $wgBlockAllowsUTEdit).",
+       "apihelp-block-param-noemail": "Prevent user from sending email through the wiki. (Requires the <code>blockemail</code> right).",
+       "apihelp-block-param-hidename": "Hide the username from the block log. (Requires the <code>hideuser</code> right).",
+       "apihelp-block-param-allowusertalk": "Allow the user to edit their own talk page (depends on <var>[[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>).",
        "apihelp-block-param-reblock": "If the user is already blocked, overwrite the existing block.",
-       "apihelp-block-param-watchuser": "Watch the user's or IP's user and talk pages.",
-       "apihelp-block-example-ip-simple": "Block IP 192.0.2.5 for three days with reason \"First strike\"",
-       "apihelp-block-example-user-complex": "Block user Vandal indefinitely with reason \"Vandalism\", and prevent new account creation and email",
+       "apihelp-block-param-watchuser": "Watch the user's or IP address's user and talk pages.",
+       "apihelp-block-example-ip-simple": "Block IP address <kbd>192.0.2.5</kbd> for three days with reason <kbd>First strike</kbd>.",
+       "apihelp-block-example-user-complex": "Block user <kbd>Vandal</kbd> indefinitely with reason <kbd>Vandalism</kbd>, and prevent new account creation and email sending.",
 
-       "apihelp-clearhasmsg-description": "Clears the hasmsg flag for current user.",
-       "apihelp-clearhasmsg-example-1": "Clear the hasmsg flag for current user",
+       "apihelp-checktoken-description": "Check the validity of a token from <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.",
+       "apihelp-checktoken-param-type": "Type of token being tested.",
+       "apihelp-checktoken-param-token": "Token to test.",
+       "apihelp-checktoken-param-maxtokenage": "Maximum allowed age of the token, in seconds.",
+       "apihelp-checktoken-example-simple": "Test the validity of a <kbd>csrf</kbd> token.",
 
-       "apihelp-compare-description": "Get the difference between 2 pages.\n\nYou must pass a revision number, a page title, or a page ID for both \"from\" and \"to\".",
+       "apihelp-clearhasmsg-description": "Clears the <code>hasmsg</code> flag for the current user.",
+       "apihelp-clearhasmsg-example-1": "Clear the <code>hasmsg</code> flag for the current user.",
+
+       "apihelp-compare-description": "Get the difference between 2 pages.\n\nA revision number, a page title, or a page ID for both \"from\" and \"to\" must be passed.",
        "apihelp-compare-param-fromtitle": "First title to compare.",
        "apihelp-compare-param-fromid": "First page ID to compare.",
        "apihelp-compare-param-fromrev": "First revision to compare.",
        "apihelp-compare-param-totitle": "Second title to compare.",
        "apihelp-compare-param-toid": "Second page ID to compare.",
        "apihelp-compare-param-torev": "Second revision to compare.",
-       "apihelp-compare-example-1": "Create a diff between revision 1 and 2",
+       "apihelp-compare-example-1": "Create a diff between revision 1 and 2.",
 
        "apihelp-createaccount-description": "Create a new user account.",
        "apihelp-createaccount-param-name": "Username.",
-       "apihelp-createaccount-param-password": "Password (ignored if $1mailpassword is set).",
+       "apihelp-createaccount-param-password": "Password (ignored if <var>$1mailpassword</var> is set).",
        "apihelp-createaccount-param-domain": "Domain for external authentication (optional).",
        "apihelp-createaccount-param-token": "Account creation token obtained in first request.",
        "apihelp-createaccount-param-email": "Email address of user (optional).",
        "apihelp-createaccount-param-mailpassword": "If set to any value, a random password will be emailed to the user.",
        "apihelp-createaccount-param-reason": "Optional reason for creating the account to be put in the logs.",
        "apihelp-createaccount-param-language": "Language code to set as default for the user (optional, defaults to content language).",
-       "apihelp-createaccount-example-pass": "Create user \"testuser\" with password \"test123\"",
-       "apihelp-createaccount-example-mail": "Create user \"testmailuser\" and email a randomly-generated password",
+       "apihelp-createaccount-example-pass": "Create user <kbd>testuser</kbd> with password <kbd>test123</kbd>.",
+       "apihelp-createaccount-example-mail": "Create user <kbd>testmailuser</kbd> and email a randomly-generated password.",
 
        "apihelp-delete-description": "Delete a page.",
-       "apihelp-delete-param-title": "Title of the page you want to delete. Cannot be used together with $1pageid.",
-       "apihelp-delete-param-pageid": "Page ID of the page you want to delete. Cannot be used together with $1title.",
+       "apihelp-delete-param-title": "Title of the page to delete. Cannot be used together with <var>$1pageid</var>.",
+       "apihelp-delete-param-pageid": "Page ID of the page to delete. Cannot be used together with <var>$1title</var>.",
        "apihelp-delete-param-reason": "Reason for the deletion. If not set, an automatically generated reason will be used.",
-       "apihelp-delete-param-watch": "Add the page to your watchlist.",
-       "apihelp-delete-param-watchlist": "Unconditionally add or remove the page from your watchlist, use preferences or do not change watch.",
-       "apihelp-delete-param-unwatch": "Remove the page from your watchlist.",
+       "apihelp-delete-param-watch": "Add the page to the current user's watchlist.",
+       "apihelp-delete-param-watchlist": "Unconditionally add or remove the page from the current user's watchlist, use preferences or do not change watch.",
+       "apihelp-delete-param-unwatch": "Remove the page from the current user's watchlist.",
        "apihelp-delete-param-oldimage": "The name of the old image to delete as provided by [[Special:ApiHelp/query+imageinfo|action=query&prop=imageinfo&iiprop=archivename]].",
-       "apihelp-delete-example-simple": "Delete the Main Page",
-       "apihelp-delete-example-reason": "Delete the Main Page with the reason \"Preparing for move\"",
+       "apihelp-delete-example-simple": "Delete <kbd>Main Page</kbd>.",
+       "apihelp-delete-example-reason": "Delete <kbd>Main Page</kbd> with the reason <kbd>Preparing for move</kbd>.",
 
        "apihelp-disabled-description": "This module has been disabled.",
 
        "apihelp-edit-description": "Create and edit pages.",
-       "apihelp-edit-param-title": "Title of the page you want to edit. Cannot be used together with $1pageid.",
-       "apihelp-edit-param-pageid": "Page ID of the page you want to edit. Cannot be used together with $1title.",
-       "apihelp-edit-param-section": "Section number. 0 for the top section, \"new\" for a new section.",
+       "apihelp-edit-param-title": "Title of the page to edit. Cannot be used together with <var>$1pageid</var>.",
+       "apihelp-edit-param-pageid": "Page ID of the page to edit. Cannot be used together with <var>$1title</var>.",
+       "apihelp-edit-param-section": "Section number. <kbd>0</kbd> for the top section, <kbd>new</kbd> for a new section.",
        "apihelp-edit-param-sectiontitle": "The title for a new section.",
        "apihelp-edit-param-text": "Page content.",
        "apihelp-edit-param-summary": "Edit summary. Also section title when $1section=new and $1sectiontitle is not set.",
        "apihelp-edit-param-notminor": "Non-minor edit.",
        "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-starttimestamp": "Timestamp when the editing process began, used to detect edit conflicts. An appropriate value may be obtained using <var>[[Special:ApiHelp/main|curtimestamp]]</var> when beginning the edit process (e.g. when loading the page content to edit).",
        "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-edit-param-unwatch": "Remove the page from your watchlist.",
-       "apihelp-edit-param-watchlist": "Unconditionally add or remove the page from your watchlist, use preferences or do not change watch.",
+       "apihelp-edit-param-watch": "Add the page to the current user's watchlist.",
+       "apihelp-edit-param-unwatch": "Remove the page from the current user's watchlist.",
+       "apihelp-edit-param-watchlist": "Unconditionally add or remove the page from the current user's watchlist, use preferences or do not change watch.",
        "apihelp-edit-param-md5": "The MD5 hash of the $1text parameter, or the $1prependtext and $1appendtext parameters concatenated. If set, the edit won't be done unless the hash is correct.",
        "apihelp-edit-param-prependtext": "Add this text to the beginning of the page. Overrides $1text.",
        "apihelp-edit-param-appendtext": "Add this text to the end of the page. Overrides $1text.\n\nUse $1section=new to append a new section, rather than this parameter.",
        "apihelp-edit-param-contentformat": "Content serialization format used for the input text.",
        "apihelp-edit-param-contentmodel": "Content model of the new content.",
        "apihelp-edit-param-token": "The token should always be sent as the last parameter, or at least after the $1text parameter.",
-       "apihelp-edit-example-edit": "Edit a page",
-       "apihelp-edit-example-prepend": "Prepend _&#95;NOTOC_&#95; to a page",
-       "apihelp-edit-example-undo": "Undo revisions 13579 through 13585 with autosummary",
+       "apihelp-edit-example-edit": "Edit a page.",
+       "apihelp-edit-example-prepend": "Prepend <kbd>_&#95;NOTOC_&#95;</kbd> to a page.",
+       "apihelp-edit-example-undo": "Undo revisions 13579 through 13585 with autosummary.",
 
        "apihelp-emailuser-description": "Email a user.",
        "apihelp-emailuser-param-target": "User to send email to.",
        "apihelp-emailuser-param-subject": "Subject header.",
        "apihelp-emailuser-param-text": "Mail body.",
        "apihelp-emailuser-param-ccme": "Send a copy of this mail to me.",
-       "apihelp-emailuser-example-email": "Send an email to the User \"WikiSysop\" with the text \"Content\"",
+       "apihelp-emailuser-example-email": "Send an email to the User <kbd>WikiSysop</kbd> with the text <kbd>Content</kbd>.",
 
        "apihelp-expandtemplates-description": "Expands all templates in wikitext.",
        "apihelp-expandtemplates-param-title": "Title of page.",
        "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-expandtemplates-example-simple": "Expand the wikitext <kbd><nowiki>{{Project:Sandbox}}</nowiki></kbd>.",
 
        "apihelp-feedcontributions-description": "Returns a user contributions feed.",
        "apihelp-feedcontributions-param-feedformat": "The format of the feed.",
        "apihelp-feedcontributions-param-toponly": "Only show edits that are latest revisions.",
        "apihelp-feedcontributions-param-newonly": "Only show edits that are page creations.",
        "apihelp-feedcontributions-param-showsizediff": "Show the size difference between revisions.",
-       "apihelp-feedcontributions-example-simple": "Return contributions for [[User:Example]]",
+       "apihelp-feedcontributions-example-simple": "Return contributions for user <kbd>Example</kbd>.",
 
        "apihelp-feedrecentchanges-description": "Returns a recent changes feed.",
        "apihelp-feedrecentchanges-param-feedformat": "The format of the feed.",
        "apihelp-feedrecentchanges-param-hideanons": "Hide changes made by anonymous users.",
        "apihelp-feedrecentchanges-param-hideliu": "Hide changes made by registered users.",
        "apihelp-feedrecentchanges-param-hidepatrolled": "Hide patrolled changes.",
-       "apihelp-feedrecentchanges-param-hidemyself": "Hide changes made by yourself.",
+       "apihelp-feedrecentchanges-param-hidemyself": "Hide changes made by the current user.",
        "apihelp-feedrecentchanges-param-tagfilter": "Filter by tag.",
        "apihelp-feedrecentchanges-param-target": "Show only changes on pages linked from this page.",
        "apihelp-feedrecentchanges-param-showlinkedto": "Show changes on pages linked to the selected page instead.",
-       "apihelp-feedrecentchanges-example-simple": "Show recent changes",
-       "apihelp-feedrecentchanges-example-30days": "Show recent changes for 30 days",
+       "apihelp-feedrecentchanges-example-simple": "Show recent changes.",
+       "apihelp-feedrecentchanges-example-30days": "Show recent changes for 30 days.",
 
        "apihelp-feedwatchlist-description": "Returns a watchlist feed.",
        "apihelp-feedwatchlist-param-feedformat": "The format of the feed.",
        "apihelp-feedwatchlist-param-hours": "List pages modified within this many hours from now.",
        "apihelp-feedwatchlist-param-linktosections": "Link directly to changed sections if possible.",
-       "apihelp-feedwatchlist-example-default": "Show the watchlist feed",
-       "apihelp-feedwatchlist-example-all6hrs": "Show all changes to watched pages in the past 6 hours",
+       "apihelp-feedwatchlist-example-default": "Show the watchlist feed.",
+       "apihelp-feedwatchlist-example-all6hrs": "Show all changes to watched pages in the past 6 hours.",
 
        "apihelp-filerevert-description": "Revert a file to an old version.",
        "apihelp-filerevert-param-filename": "Target filename, without the File: prefix.",
        "apihelp-filerevert-param-comment": "Upload comment.",
        "apihelp-filerevert-param-archivename": "Archive name of the revision to revert to.",
-       "apihelp-filerevert-example-revert": "Revert Wiki.png to the version of 2011-03-05T15:27:40Z",
+       "apihelp-filerevert-example-revert": "Revert <kbd>Wiki.png</kbd> to the version of <kbd>2011-03-05T15:27:40Z</kbd>.",
 
        "apihelp-help-description": "Display help for the specified modules.",
-       "apihelp-help-param-modules": "Modules to display help for (values of the action= and format= parameters, or \"main\"). Can specify submodules with a \"+\".",
+       "apihelp-help-param-modules": "Modules to display help for (values of the <var>action</var> and <var>format</var> parameters, or <kbd>main</kbd>). Can specify submodules with a <kbd>+</kbd>.",
        "apihelp-help-param-submodules": "Include help for submodules of the named module.",
        "apihelp-help-param-recursivesubmodules": "Include help for submodules recursively.",
        "apihelp-help-param-helpformat": "Format of the help output.",
        "apihelp-help-param-wrap": "Wrap the output in a standard API response structure.",
        "apihelp-help-param-toc": "Include a table of contents in the HTML output.",
-       "apihelp-help-example-main": "Help for the main module",
-       "apihelp-help-example-recursive": "All help in one page",
-       "apihelp-help-example-help": "Help for the help module itself",
-       "apihelp-help-example-query": "Help for two query submodules",
+       "apihelp-help-example-main": "Help for the main module.",
+       "apihelp-help-example-recursive": "All help in one page.",
+       "apihelp-help-example-help": "Help for the help module itself.",
+       "apihelp-help-example-query": "Help for two query submodules.",
 
        "apihelp-imagerotate-description": "Rotate one or more images.",
        "apihelp-imagerotate-param-rotation": "Degrees to rotate image clockwise.",
-       "apihelp-imagerotate-example-simple": "Rotate [[:File:Example.png]] by 90 degrees",
-       "apihelp-imagerotate-example-generator": "Rotate all images in [[:Category:Flip]] by 180 degrees",
+       "apihelp-imagerotate-example-simple": "Rotate <kbd>File:Example.png</kbd> by <kbd>90</kbd> degrees.",
+       "apihelp-imagerotate-example-generator": "Rotate all images in <kbd>Category:Flip</kbd> by <kbd>180</kbd> degrees.",
 
-       "apihelp-import-description": "Import a page from another wiki, or an XML file.\n\nNote that the HTTP POST must be done as a file upload (i.e. using multipart/form-data) when sending a file for the \"xml\" parameter.",
+       "apihelp-import-description": "Import a page from another wiki, or an XML file.\n\nNote that the HTTP POST must be done as a file upload (i.e. using multipart/form-data) when sending a file for the <var>xml</var> parameter.",
        "apihelp-import-param-summary": "Import summary.",
        "apihelp-import-param-xml": "Uploaded XML file.",
        "apihelp-import-param-interwikisource": "For interwiki imports: wiki to import from.",
        "apihelp-login-param-password": "Password.",
        "apihelp-login-param-domain": "Domain (optional).",
        "apihelp-login-param-token": "Login token obtained in first request.",
-       "apihelp-login-example-gettoken": "Retrieve a login token",
-       "apihelp-login-example-login": "Log in",
+       "apihelp-login-example-gettoken": "Retrieve a login token.",
+       "apihelp-login-example-login": "Log in.",
 
        "apihelp-logout-description": "Log out and clear session data.",
-       "apihelp-logout-example-logout": "Log the current user out",
+       "apihelp-logout-example-logout": "Log the current user out.",
+
+       "apihelp-managetags-description": "Perform management tasks relating to change tags.",
+       "apihelp-managetags-param-operation": "Which operation to perform:\n;create:Create a new change tag for manual use.\n;delete:Remove a change tag from the database, including removing the tag from all revisions, recent change entries and log entries on which it is used.\n;activate:Activate a change tag, allowing users to apply it manually.\n;deactivate:Deactivate a change tag, preventing users from applying it manually.",
+       "apihelp-managetags-param-tag": "Tag to create, delete, activate or deactivate. For tag creation, the tag must not exist. For tag deletion, the tag must exist. For tag activation, the tag must exist and not be in use by an extension. For tag deactivation, the tag must be currently active and manually defined.",
+       "apihelp-managetags-param-reason": "An optional reason for creating, deleting, activating or deactivating the tag.",
+       "apihelp-managetags-param-ignorewarnings": "Whether to ignore any warnings that are issued during the operation.",
+       "apihelp-managetags-example-create": "Create a tag named <kbd>spam</kbd> with the reason <kbd>For use in edit patrolling</kbd>",
+       "apihelp-managetags-example-delete": "Delete the <kbd>vandlaism</kbd> tag with the reason <kbd>Misspelt</kbd>",
+       "apihelp-managetags-example-activate": "Activate a tag named <kbd>spam</kbd> with the reason <kbd>For use in edit patrolling</kbd>",
+       "apihelp-managetags-example-deactivate": "Deactivate a tag named <kbd>spam</kbd> with the reason <kbd>No longer required</kbd>",
 
        "apihelp-move-description": "Move a page.",
-       "apihelp-move-param-from": "Title of the page you want to move. Cannot be used together with $1fromid.",
-       "apihelp-move-param-fromid": "Page ID of the page you want to move. Cannot be used together with $1from.",
-       "apihelp-move-param-to": "Title you want to rename the page to.",
-       "apihelp-move-param-reason": "Reason for the move.",
-       "apihelp-move-param-movetalk": "Move the talk page, if it exists.",
-       "apihelp-move-param-movesubpages": "Move subpages, if applicable.",
+       "apihelp-move-param-from": "Title of the page to rename. Cannot be used together with <var>$1fromid</var>.",
+       "apihelp-move-param-fromid": "Page ID of the page to rename. Cannot be used together with <var>$1from</var>.",
+       "apihelp-move-param-to": "Title to rename the page to.",
+       "apihelp-move-param-reason": "Reason for the rename.",
+       "apihelp-move-param-movetalk": "Rename the talk page, if it exists.",
+       "apihelp-move-param-movesubpages": "Rename subpages, if applicable.",
        "apihelp-move-param-noredirect": "Don't create a redirect.",
-       "apihelp-move-param-watch": "Add the page and the redirect to your watchlist.",
-       "apihelp-move-param-unwatch": "Remove the page and the redirect from your watchlist.",
-       "apihelp-move-param-watchlist": "Unconditionally add or remove the page from your watchlist, use preferences or do not change watch.",
+       "apihelp-move-param-watch": "Add the page and the redirect to the current user's watchlist.",
+       "apihelp-move-param-unwatch": "Remove the page and the redirect from the current user's watchlist.",
+       "apihelp-move-param-watchlist": "Unconditionally add or remove the page from the current user's watchlist, use preferences or do not change watch.",
        "apihelp-move-param-ignorewarnings": "Ignore any warnings.",
-       "apihelp-move-example-move": "Move \"Badtitle\" to \"Goodtitle\" without leaving a redirect",
+       "apihelp-move-example-move": "Move <kbd>Badtitle</kbd> to <kbd>Goodtitle</kbd> without leaving a redirect.",
 
        "apihelp-opensearch-description": "Search the wiki using the OpenSearch protocol.",
        "apihelp-opensearch-param-search": "Search string.",
        "apihelp-opensearch-param-limit": "Maximum number of results to return.",
        "apihelp-opensearch-param-namespace": "Namespaces to search.",
-       "apihelp-opensearch-param-suggest": "Do nothing if [https://www.mediawiki.org/wiki/Manual:$wgEnableOpenSearchSuggest $wgEnableOpenSearchSuggest] is false.",
+       "apihelp-opensearch-param-suggest": "Do nothing if <var>[[mw:Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> is false.",
        "apihelp-opensearch-param-redirects": "How to handle redirects:\n;return:Return the redirect itself.\n;resolve:Return the target page. May return fewer than $1limit results.\nFor historical reasons, the default is \"return\" for $1format=json and \"resolve\" for other formats.",
        "apihelp-opensearch-param-format": "The format of the output.",
-       "apihelp-opensearch-example-te": "Find pages beginning with \"Te\"",
+       "apihelp-opensearch-example-te": "Find pages beginning with <kbd>Te</kbd>.",
 
        "apihelp-options-description": "Change preferences of the current user.\n\nOnly options which are registered in core or in one of installed extensions, or options with keys prefixed with \"userjs-\" (intended to be used by user scripts), can be set.",
        "apihelp-options-param-reset": "Resets preferences to the site defaults.",
-       "apihelp-options-param-resetkinds": "List of types of options to reset when the \"$1reset\" option is set.",
+       "apihelp-options-param-resetkinds": "List of types of options to reset when the <var>$1reset</var> option is set.",
        "apihelp-options-param-change": "List of changes, formatted name=value (e.g. skin=vector). Value cannot contain pipe characters. If no value is given (not even an equals sign), e.g., optionname|otheroption|..., the option will be reset to its default value.",
-       "apihelp-options-param-optionname": "A name of a option which should be set to the value given by \"$1optionvalue\".",
-       "apihelp-options-param-optionvalue": "A value of the option specified by \"$1optionname\", can contain pipe characters.",
-       "apihelp-options-example-reset": "Reset all preferences",
-       "apihelp-options-example-change": "Change \"skin\" and \"hideminor\" preferences",
-       "apihelp-options-example-complex": "Reset all preferences, then set \"skin\" and \"nickname\"",
+       "apihelp-options-param-optionname": "A name of a option which should be set to the value given by <var>$1optionvalue</var>.",
+       "apihelp-options-param-optionvalue": "A value of the option specified by <var>$1optionname</var>, can contain pipe characters.",
+       "apihelp-options-example-reset": "Reset all preferences.",
+       "apihelp-options-example-change": "Change <kbd>skin</kbd> and <kbd>hideminor</kbd> preferences.",
+       "apihelp-options-example-complex": "Reset all preferences, then set <kbd>skin</kbd> and <kbd>nickname</kbd>.",
 
        "apihelp-paraminfo-description": "Obtain information about API modules.",
-       "apihelp-paraminfo-param-modules": "List of module names (values of the action= and format= parameters, or \"main\"). Can specify submodules with a \"+\".",
+       "apihelp-paraminfo-param-modules": "List of module names (values of the <var>action</var> and <var>format</var> parameters, or <kbd>main</kbd>). Can specify submodules with a <kbd>+</kbd>.",
        "apihelp-paraminfo-param-helpformat": "Format of help strings.",
-       "apihelp-paraminfo-param-querymodules": "List of query module names (value of prop=, meta= or list= parameter). Use \"$1modules=query+foo\" instead of \"$1querymodules=foo\".",
-       "apihelp-paraminfo-param-mainmodule": "Get information about the main (top-level) module as well. Use \"$1modules=main\" instead.",
+       "apihelp-paraminfo-param-querymodules": "List of query module names (value of <var>prop</var>, <var>meta</var> or <var>list</var> parameter). Use <kbd>$1modules=query+foo</kbd> instead of <kbd>$1querymodules=foo</kbd>.",
+       "apihelp-paraminfo-param-mainmodule": "Get information about the main (top-level) module as well. Use <kbd>$1modules=main</kbd> instead.",
        "apihelp-paraminfo-param-pagesetmodule": "Get information about the pageset module (providing titles= and friends) as well.",
-       "apihelp-paraminfo-param-formatmodules": "List of format module names (value of format= parameter). Use \"$1modules\" instead.",
-       "apihelp-paraminfo-example-1": "Show info for [[Special:ApiHelp/parse|action=parse]], [[Special:ApiHelp/jsonfm|format=jsonfm]], [[Special:ApiHelp/query+allpages|action=query&list=allpages]], and [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]",
+       "apihelp-paraminfo-param-formatmodules": "List of format module names (value of <var>format</var> parameter). Use <var>$1modules</kbd> instead.",
+       "apihelp-paraminfo-example-1": "Show info for <kbd>[[Special:ApiHelp/parse|action=parse]]</kbd>, <kbd>[[Special:ApiHelp/jsonfm|format=jsonfm]]</kbd>, <kbd>[[Special:ApiHelp/query+allpages|action=query&list=allpages]]</kbd>, and <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd>.",
 
-       "apihelp-parse-description": "Parses content and returns parser output.\n\nSee the various prop-modules of [[Special:ApiHelp/query|action=query]] to get information from the current version of a page.\n\nThere are several ways to specify the text to parse:\n# Specify a page or revision, using $1page, $1pageid, or $1oldid.\n# Specify content explicitly, using $1text, $1title, and $1contentmodel.\n# Specify only a summary to parse. $1prop should be given an empty value.",
-       "apihelp-parse-param-title": "Title of page the text belongs to. If omitted, $1contentmodel must be specified, and \"[[API]]\" will be used as the title.",
-       "apihelp-parse-param-text": "Text to parse. Use $1title or $1contentmodel to control the content model.",
+       "apihelp-parse-description": "Parses content and returns parser output.\n\nSee the various prop-modules of <kbd>[[Special:ApiHelp/query|action=query]]</kbd> to get information from the current version of a page.\n\nThere are several ways to specify the text to parse:\n# Specify a page or revision, using <var>$1page</var>, <var>$1pageid</var>, or <var>$1oldid</var>.\n# Specify content explicitly, using <var>$1text</var>, <var>$1title</var>, and <var>$1contentmodel</var>.\n# Specify only a summary to parse. <var>$1prop</var> should be given an empty value.",
+       "apihelp-parse-param-title": "Title of page the text belongs to. If omitted, <var>$1contentmodel</var> must be specified, and [[API]] will be used as the title.",
+       "apihelp-parse-param-text": "Text to parse. Use <var>$1title</var> or <var>$1contentmodel</var> to control the content model.",
        "apihelp-parse-param-summary": "Summary to parse.",
-       "apihelp-parse-param-page": "Parse the content of this page. Cannot be used together with $1text and $1title.",
-       "apihelp-parse-param-pageid": "Parse the content of this page. Overrides $1page.",
-       "apihelp-parse-param-redirects": "If the $1page or the $1pageid parameter is set to a redirect, resolve it.",
-       "apihelp-parse-param-oldid": "Parse the content of this revision. Overrides $1page and $1pageid.",
+       "apihelp-parse-param-page": "Parse the content of this page. Cannot be used together with <var>$1text</var> and <var>$1title</var>.",
+       "apihelp-parse-param-pageid": "Parse the content of this page. Overrides <var>$1page</var>.",
+       "apihelp-parse-param-redirects": "If <var>$1page</var> or <var>$1pageid</var> is set to a redirect, resolve it.",
+       "apihelp-parse-param-oldid": "Parse the content of this revision. Overrides <var>$1page</var> and <var>$1pageid</var>.",
        "apihelp-parse-param-prop": "Which pieces of information to get:\n;text:Gives the parsed text of the wikitext.\n;langlinks:Gives the language links in the parsed wikitext.\n;categories:Gives the categories in the parsed wikitext.\n;categorieshtml:Gives the HTML version of the categories.\n;links:Gives the internal links in the parsed wikitext.\n;templates:Gives the templates in the parsed wikitext.\n;images:Gives the images in the parsed wikitext.\n;externallinks:Gives the external links in the parsed wikitext.\n;sections:Gives the sections in the parsed wikitext.\n;revid:Adds the revision ID of the parsed page.\n;displaytitle:Adds the title of the parsed wikitext.\n;headitems:Gives items to put in the &lt;head&gt; of the page.\n;headhtml:Gives parsed &lt;head&gt; of the page.\n;modules:Gives the ResourceLoader modules used on the page.\n;indicators:Gives the HTML of page status indicators used on the page.\n;iwlinks:Gives interwiki links in the parsed wikitext.\n;wikitext:Gives the original wikitext that was parsed.\n;properties:Gives various properties defined in the parsed wikitext.\n;limitreportdata:Gives the limit report in a structured way. Gives no data, when $1disablepp is set.\n;limitreporthtml:Gives the HTML version of the limit report. Gives no data, when $1disablepp is set.",
        "apihelp-parse-param-pst": "Do a pre-save transform on the input before parsing it. Only valid when used with text.",
-       "apihelp-parse-param-onlypst": "Do a pre-save transform (PST) on the input, but don't parse it Returns the same wikitext, after a PST has been applied. Only valid when used with $1text.",
-       "apihelp-parse-param-effectivelanglinks": "Includes language links supplied by extensions (for use with $1prop=langlinks).",
+       "apihelp-parse-param-onlypst": "Do a pre-save transform (PST) on the input, but don't parse it. Returns the same wikitext, after a PST has been applied. Only valid when used with <var>$1text</var>.",
+       "apihelp-parse-param-effectivelanglinks": "Includes language links supplied by extensions (for use with <kbd>$1prop=langlinks</kbd>).",
        "apihelp-parse-param-section": "Only retrieve the content of this section number.",
        "apihelp-parse-param-disablepp": "Disable the PP Report from the parser output.",
        "apihelp-parse-param-disableeditsection": "Disable edit section links from the parser output.",
-       "apihelp-parse-param-generatexml": "Generate XML parse tree (requires content model \"$1\").",
+       "apihelp-parse-param-generatexml": "Generate XML parse tree (requires content model <code>$1</code>).",
        "apihelp-parse-param-preview": "Parse in preview mode.",
        "apihelp-parse-param-sectionpreview": "Parse in section preview mode (enables preview mode too).",
        "apihelp-parse-param-disabletoc": "Disable table of contents in output.",
        "apihelp-patrol-description": "Patrol a page or revision.",
        "apihelp-patrol-param-rcid": "Recentchanges ID to patrol.",
        "apihelp-patrol-param-revid": "Revision ID to patrol.",
-       "apihelp-patrol-example-rcid": "Patrol a recent change",
-       "apihelp-patrol-example-revid": "Patrol a revision",
+       "apihelp-patrol-example-rcid": "Patrol a recent change.",
+       "apihelp-patrol-example-revid": "Patrol a revision.",
 
        "apihelp-protect-description": "Change the protection level of a page.",
        "apihelp-protect-param-title": "Title of the page to (un)protect. Cannot be used together with $1pageid.",
        "apihelp-protect-param-pageid": "ID of the page to (un)protect. Cannot be used together with $1title.",
-       "apihelp-protect-param-protections": "List of protection levels, formatted action=level (e.g. edit=sysop).\n\n'''NOTE:''' Any actions not listed will have restrictions removed.",
-       "apihelp-protect-param-expiry": "Expiry timestamps. If only one timestamp is set, it'll be used for all protections. Use \"infinite\", \"indefinite\", \"infinity\" or \"never\", for a never-expiring protection.",
+       "apihelp-protect-param-protections": "List of protection levels, formatted <kbd>action=level</kbd> (e.g. <kbd>edit=sysop</kbd>).\n\n<strong>Note:</strong> Any actions not listed will have restrictions removed.",
+       "apihelp-protect-param-expiry": "Expiry timestamps. If only one timestamp is set, it'll be used for all protections. Use <kbd>infinite</kbd>, <kbd>indefinite</kbd>, <kbd>infinity</kbd>, or <kbd>never</kbd>, for a never-expiring protection.",
        "apihelp-protect-param-reason": "Reason for (un)protecting.",
        "apihelp-protect-param-cascade": "Enable cascading protection (i.e. protect pages included in this page). Ignored if all protection levels given do not support cascading.",
-       "apihelp-protect-param-watch": "If set, add the page being (un)protected to your watchlist.",
-       "apihelp-protect-param-watchlist": "Unconditionally add or remove the page from your watchlist, use preferences or do not change watch.",
-       "apihelp-protect-example-protect": "Protect a page",
-       "apihelp-protect-example-unprotect": "Unprotect a page by setting restrictions to \"all\"",
-       "apihelp-protect-example-unprotect2": "Unprotect a page by setting no restrictions",
+       "apihelp-protect-param-watch": "If set, add the page being (un)protected to the current user's watchlist.",
+       "apihelp-protect-param-watchlist": "Unconditionally add or remove the page from the current user's watchlist, use preferences or do not change watch.",
+       "apihelp-protect-example-protect": "Protect a page.",
+       "apihelp-protect-example-unprotect": "Unprotect a page by setting restrictions to <kbd>all</kbd>.",
+       "apihelp-protect-example-unprotect2": "Unprotect a page by setting no restrictions.",
 
        "apihelp-purge-description": "Purge the cache for the given titles.\n\nRequires a POST request if the user is not logged in.",
        "apihelp-purge-param-forcelinkupdate": "Update the links tables.",
        "apihelp-purge-param-forcerecursivelinkupdate": "Update the links table, and update the links tables for any page that uses this page as a template.",
-       "apihelp-purge-example-simple": "Purge the \"Main Page\" and the \"API\" page",
-       "apihelp-purge-example-generator": "Purge the first 10 pages in the main namespace",
+       "apihelp-purge-example-simple": "Purge the <kbd>Main Page</kbd> and the <kbd>API</kbd> page.",
+       "apihelp-purge-example-generator": "Purge the first 10 pages in the main namespace.",
 
        "apihelp-query-description": "Fetch data from and about MediaWiki.\n\nAll data modifications will first have to use query to acquire a token to prevent abuse from malicious sites.",
        "apihelp-query-param-prop": "Which properties to get for the queried pages.",
        "apihelp-query-param-exportnowrap": "Return the export XML without wrapping it in an XML result (same format as [[Special:Export]]). Can only be used with $1export.",
        "apihelp-query-param-iwurl": "Whether to get the full URL if the title is an interwiki link.",
        "apihelp-query-param-continue": "When present, formats query-continue as key-value pairs that should simply be merged into the original request. This parameter must be set to an empty string in the initial query.\n\nThis parameter is recommended for all new development, and will be made default in the next API version.",
-       "apihelp-query-param-rawcontinue": "Currently ignored. In the future, \"$1continue=\" will become the default and this will be needed to receive the raw query-continue data.",
-       "apihelp-query-example-revisions": "Fetch [[Special:ApiHelp/query+siteinfo|site info]] and [[Special:ApiHelp/query+revisions|revisions]] of the Main Page",
-       "apihelp-query-example-allpages": "Fetch revisions of pages beginning with \"API/\"",
+       "apihelp-query-param-rawcontinue": "Currently ignored. In the future, <var>$1continue</var> will become the default and this will be needed to receive the raw <samp>query-continue</samp> data.",
+       "apihelp-query-example-revisions": "Fetch [[Special:ApiHelp/query+siteinfo|site info]] and [[Special:ApiHelp/query+revisions|revisions]] of <kbd>Main Page</kbd>.",
+       "apihelp-query-example-allpages": "Fetch revisions of pages beginning with <kbd>API/</kbd>.",
 
        "apihelp-query+allcategories-description": "Enumerate all categories.",
        "apihelp-query+allcategories-param-from": "The category to start enumerating from.",
        "apihelp-query+allcategories-param-max": "Only return categories with at most this many members.",
        "apihelp-query+allcategories-param-limit": "How many categories to return.",
        "apihelp-query+allcategories-param-prop": "Which properties to get:\n;size:Adds number of pages in the category.\n;hidden:Tags categories that are hidden with _&#95;HIDDENCAT_&#95;.",
-       "apihelp-query+allcategories-example-size": "List categories with information on the number of pages in each",
-       "apihelp-query+allcategories-example-generator": "Retrieve info about the category page itself for categories beginning \"List\"",
+       "apihelp-query+allcategories-example-size": "List categories with information on the number of pages in each.",
+       "apihelp-query+allcategories-example-generator": "Retrieve info about the category page itself for categories beginning <kbd>List</kbd>.",
 
        "apihelp-query+alldeletedrevisions-description": "List all deleted revisions by a user or in a namespace.",
-       "apihelp-query+alldeletedrevisions-paraminfo-useronly": "May only be used with $3user.",
-       "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "Cannot be used with $3user.",
+       "apihelp-query+alldeletedrevisions-paraminfo-useronly": "May only be used with <var>$3user</var>.",
+       "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "Cannot be used with <var>$3user</var>.",
        "apihelp-query+alldeletedrevisions-param-start": "The timestamp to start enumerating from.",
        "apihelp-query+alldeletedrevisions-param-end": "The timestamp to stop enumerating at.",
        "apihelp-query+alldeletedrevisions-param-from": "Start listing at this title.",
        "apihelp-query+alldeletedrevisions-param-user": "Only list revisions by this user.",
        "apihelp-query+alldeletedrevisions-param-excludeuser": "Don't list revisions by this user.",
        "apihelp-query+alldeletedrevisions-param-namespace": "Only list pages in this namespace.",
-       "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "'''NOTE:''' Due to [https://www.mediawiki.org/wiki/Manual:$wgMiserMode miser mode], using $1user and $1namespace together may result in fewer than \"$1limit\" results returned before continuing; in extreme cases, zero results may be returned.",
+       "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "<strong>Note:</strong> Due to [[mw:Manual:$wgMiserMode|miser mode]], using <var>$1user</var> and <var>$1namespace</var> together may result in fewer than <var>$1limit</var> results returned before continuing; in extreme cases, zero results may be returned.",
        "apihelp-query+alldeletedrevisions-param-generatetitles": "When being used as a generator, generate titles rather than revision IDs.",
-       "apihelp-query+alldeletedrevisions-example-user": "List the last 50 deleted contributions by User:Example",
-       "apihelp-query+alldeletedrevisions-example-ns-main": "List the first 50 deleted revisions in the main namespace",
+       "apihelp-query+alldeletedrevisions-example-user": "List the last 50 deleted contributions by user <kbd>Example<kbd>.",
+       "apihelp-query+alldeletedrevisions-example-ns-main": "List the first 50 deleted revisions in the main namespace.",
 
        "apihelp-query+allfileusages-description": "List all file usages, including non-existing.",
        "apihelp-query+allfileusages-param-from": "The title of the file to start enumerating from.",
        "apihelp-query+allfileusages-param-prop": "Which pieces of information to include:\n;ids:Adds the page ID of the using page (cannot be used with $1unique).\n;title:Adds the title of the file.",
        "apihelp-query+allfileusages-param-limit": "How many total items to return.",
        "apihelp-query+allfileusages-param-dir": "The direction in which to list.",
-       "apihelp-query+allfileusages-example-B": "List file titles, including missing ones, with page IDs they are from, starting at B",
-       "apihelp-query+allfileusages-example-unique": "List unique file titles",
-       "apihelp-query+allfileusages-example-unique-generator": "Gets all file titles, marking the missing ones",
-       "apihelp-query+allfileusages-example-generator": "Gets pages containing the files",
+       "apihelp-query+allfileusages-example-B": "List file titles, including missing ones, with page IDs they are from, starting at <kbd>B</kbd>.",
+       "apihelp-query+allfileusages-example-unique": "List unique file titles.",
+       "apihelp-query+allfileusages-example-unique-generator": "Gets all file titles, marking the missing ones.",
+       "apihelp-query+allfileusages-example-generator": "Gets pages containing the files.",
 
        "apihelp-query+allimages-description": "Enumerate all images sequentially.",
        "apihelp-query+allimages-param-sort": "Property to sort by.",
        "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 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-B": "Show a list of files starting at the letter <kbd>B</kbd>.",
+       "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+allimages-example-generator": "Show info about 4 files starting at the letter <kbd>T</kbd>.",
 
        "apihelp-query+alllinks-description": "Enumerate all links that point to a given namespace.",
        "apihelp-query+alllinks-param-from": "The title of the link to start enumerating from.",
        "apihelp-query+alllinks-param-to": "The title of the link to stop enumerating at.",
        "apihelp-query+alllinks-param-prefix": "Search for all linked titles that begin with this value.",
-       "apihelp-query+alllinks-param-unique": "Only show distinct linked titles. Cannot be used with $1prop=ids.\nWhen used as a generator, yields target pages instead of source pages.",
-       "apihelp-query+alllinks-param-prop": "Which pieces of information to include:\n;ids:Adds the page ID of the linking page (cannot be used with $1unique).\n;title:Adds the title of the link.",
+       "apihelp-query+alllinks-param-unique": "Only show distinct linked titles. Cannot be used with <kbd>$1prop=ids</kbd>.\nWhen used as a generator, yields target pages instead of source pages.",
+       "apihelp-query+alllinks-param-prop": "Which pieces of information to include:\n;ids:Adds the page ID of the linking page (cannot be used with <var>$1unique</var>).\n;title:Adds the title of the link.",
        "apihelp-query+alllinks-param-namespace": "The namespace to enumerate.",
        "apihelp-query+alllinks-param-limit": "How many total items to return.",
        "apihelp-query+alllinks-param-dir": "The direction in which to list.",
-       "apihelp-query+alllinks-example-B": "List linked titles, including missing ones, with page IDs they are from, starting at B",
-       "apihelp-query+alllinks-example-unique": "List unique linked titles",
-       "apihelp-query+alllinks-example-unique-generator": "Gets all linked titles, marking the missing ones",
-       "apihelp-query+alllinks-example-generator": "Gets pages containing the links",
+       "apihelp-query+alllinks-example-B": "List linked titles, including missing ones, with page IDs they are from, starting at <kbd>B</kbd>.",
+       "apihelp-query+alllinks-example-unique": "List unique linked titles.",
+       "apihelp-query+alllinks-example-unique-generator": "Gets all linked titles, marking the missing ones.",
+       "apihelp-query+alllinks-example-generator": "Gets pages containing the links.",
 
        "apihelp-query+allmessages-description": "Return messages from this site.",
-       "apihelp-query+allmessages-param-messages": "Which messages to output. \"*\" (default) means all messages.",
+       "apihelp-query+allmessages-param-messages": "Which messages to output. <kbd>*</kbd> (default) means all messages.",
        "apihelp-query+allmessages-param-prop": "Which properties to get.",
        "apihelp-query+allmessages-param-enableparser": "Set to enable parser, will preprocess the wikitext of message (substitute magic words, handle templates, etc.).",
        "apihelp-query+allmessages-param-nocontent": "If set, do not include the content of the messages in the output.",
        "apihelp-query+allmessages-param-to": "Return messages ending at this message.",
        "apihelp-query+allmessages-param-title": "Page name to use as context when parsing message (for $1enableparser option).",
        "apihelp-query+allmessages-param-prefix": "Return messages with this prefix.",
-       "apihelp-query+allmessages-example-ipb": "Show messages starting with \"ipb-\"",
-       "apihelp-query+allmessages-example-de": "Show messages \"august\" and \"mainpage\" in German",
+       "apihelp-query+allmessages-example-ipb": "Show messages starting with <kbd>ipb-</kbd>.",
+       "apihelp-query+allmessages-example-de": "Show messages <kbd>august</kbd> and <kbd>mainpage</kbd> in German.",
 
        "apihelp-query+allpages-description": "Enumerate all pages sequentially in a given namespace.",
        "apihelp-query+allpages-param-from": "The page title to start enumerating from.",
        "apihelp-query+allpages-param-dir": "The direction in which to list.",
        "apihelp-query+allpages-param-filterlanglinks": "Filter based on whether a page has langlinks. Note that this may not consider langlinks added by extensions.",
        "apihelp-query+allpages-param-prexpiry": "Which protection expiry to filter the page on:\n;indefinite:Get only pages with indefinite protection expiry.\n;definite:Get only pages with a definite (specific) protection expiry.\n;all:Get pages with any protections expiry.",
-       "apihelp-query+allpages-example-B": "Show a list of pages starting at the letter \"B\"",
-       "apihelp-query+allpages-example-generator": "Show info about 4 pages starting at the letter \"T\"",
-       "apihelp-query+allpages-example-generator-revisions": "Show content of first 2 non-redirect pages beginning at \"Re\"",
+       "apihelp-query+allpages-example-B": "Show a list of pages starting at the letter <kbd>B</kbd>.",
+       "apihelp-query+allpages-example-generator": "Show info about 4 pages starting at the letter <kbd>T</kbd>.",
+       "apihelp-query+allpages-example-generator-revisions": "Show content of first 2 non-redirect pages beginning at <kbd>Re</kbd>.",
 
        "apihelp-query+allredirects-description": "List all redirects to a namespace.",
        "apihelp-query+allredirects-param-from": "The title of the redirect to start enumerating from.",
        "apihelp-query+allredirects-param-to": "The title of the redirect to stop enumerating at.",
        "apihelp-query+allredirects-param-prefix": "Search for all target pages that begin with this value.",
        "apihelp-query+allredirects-param-unique": "Only show distinct target pages. Cannot be used with $1prop=ids|fragment|interwiki.\nWhen used as a generator, yields target pages instead of source pages.",
-       "apihelp-query+allredirects-param-prop": "Which pieces of information to include:\n;ids:Adds the page ID of the redirecting page (cannot be used with $1unique).\n;title:Adds the title of the redirect.\n;fragment:Adds the fragment from the redirect, if any (cannot be used with $1unique).\n;interwiki:Adds the interwiki prefix from the redirect, if any (cannot be used with $1unique).",
+       "apihelp-query+allredirects-param-prop": "Which pieces of information to include:\n;ids:Adds the page ID of the redirecting page (cannot be used with <var>$1unique</var>).\n;title:Adds the title of the redirect.\n;fragment:Adds the fragment from the redirect, if any (cannot be used with <var>$1unique</var>).\n;interwiki:Adds the interwiki prefix from the redirect, if any (cannot be used with <var>$1unique</var>).",
        "apihelp-query+allredirects-param-namespace": "The namespace to enumerate.",
        "apihelp-query+allredirects-param-limit": "How many total items to return.",
        "apihelp-query+allredirects-param-dir": "The direction in which to list.",
-       "apihelp-query+allredirects-example-B": "List target pages, including missing ones, with page IDs they are from, starting at B",
-       "apihelp-query+allredirects-example-unique": "List unique target pages",
-       "apihelp-query+allredirects-example-unique-generator": "Gets all target pages, marking the missing ones",
-       "apihelp-query+allredirects-example-generator": "Gets pages containing the redirects",
+       "apihelp-query+allredirects-example-B": "List target pages, including missing ones, with page IDs they are from, starting at <kbd>B</kbd>.",
+       "apihelp-query+allredirects-example-unique": "List unique target pages.",
+       "apihelp-query+allredirects-example-unique-generator": "Gets all target pages, marking the missing ones.",
+       "apihelp-query+allredirects-example-generator": "Gets pages containing the redirects.",
 
        "apihelp-query+alltransclusions-description": "List all transclusions (pages embedded using &#123;&#123;x&#125;&#125;), including non-existing.",
        "apihelp-query+alltransclusions-param-from": "The title of the transclusion to start enumerating from.",
        "apihelp-query+alltransclusions-param-namespace": "The namespace to enumerate.",
        "apihelp-query+alltransclusions-param-limit": "How many total items to return.",
        "apihelp-query+alltransclusions-param-dir": "The direction in which to list.",
-       "apihelp-query+alltransclusions-example-B": "List transcluded titles, including missing ones, with page IDs they are from, starting at B",
-       "apihelp-query+alltransclusions-example-unique": "List unique transcluded titles",
-       "apihelp-query+alltransclusions-example-unique-generator": "Gets all transcluded titles, marking the missing ones",
-       "apihelp-query+alltransclusions-example-generator": "Gets pages containing the transclusions",
+       "apihelp-query+alltransclusions-example-B": "List transcluded titles, including missing ones, with page IDs they are from, starting at <kbd>B</kbd>.",
+       "apihelp-query+alltransclusions-example-unique": "List unique transcluded titles.",
+       "apihelp-query+alltransclusions-example-unique-generator": "Gets all transcluded titles, marking the missing ones.",
+       "apihelp-query+alltransclusions-example-generator": "Gets pages containing the transclusions.",
 
        "apihelp-query+allusers-description": "Enumerate all registered users.",
        "apihelp-query+allusers-param-from": "The user name to start enumerating from.",
        "apihelp-query+allusers-param-limit": "How many total user names to return.",
        "apihelp-query+allusers-param-witheditsonly": "Only list users who have made edits.",
        "apihelp-query+allusers-param-activeusers": "Only list users active in the last $1 {{PLURAL:$1|day|days}}.",
-       "apihelp-query+allusers-example-Y": "List users starting at Y",
+       "apihelp-query+allusers-example-Y": "List users starting at <kbd>Y</kbd>.",
 
        "apihelp-query+backlinks-description": "Find all pages that link to the given page.",
-       "apihelp-query+backlinks-param-title": "Title to search. Cannot be used together with $1pageid.",
-       "apihelp-query+backlinks-param-pageid": "Page ID to search. Cannot be used together with $1title.",
+       "apihelp-query+backlinks-param-title": "Title to search. Cannot be used together with <var>$1pageid</var>.",
+       "apihelp-query+backlinks-param-pageid": "Page ID to search. Cannot be used together with <var>$1title</var>.",
        "apihelp-query+backlinks-param-namespace": "The namespace to enumerate.",
        "apihelp-query+backlinks-param-dir": "The direction in which to list.",
-       "apihelp-query+backlinks-param-filterredir": "How to filter for redirects. If set to nonredirects when $1redirect is enabled, this is only applied to the second level.",
-       "apihelp-query+backlinks-param-limit": "How many total pages to return. If $1redirect is enabled, limit applies to each level separately (which means you may get up to 2 * limit results).",
+       "apihelp-query+backlinks-param-filterredir": "How to filter for redirects. If set to <kbd>nonredirects</kbd> when <var>$1redirect</var> is enabled, this is only applied to the second level.",
+       "apihelp-query+backlinks-param-limit": "How many total pages to return. If <var>$1redirect</var> is enabled, limit applies to each level separately (which means up to 2 * <var>$1limit</var> results may be returned).",
        "apihelp-query+backlinks-param-redirect": "If linking page is a redirect, find all pages that link to that redirect as well. Maximum limit is halved.",
-       "apihelp-query+backlinks-example-simple": "Show links to [[Main page]]",
-       "apihelp-query+backlinks-example-generator": "Get information about pages linking to [[Main page]]",
+       "apihelp-query+backlinks-example-simple": "Show links to <kbd>Main page<kbd>.",
+       "apihelp-query+backlinks-example-generator": "Get information about pages linking to <kbd>Main page<kbd>.",
 
        "apihelp-query+blocks-description": "List all blocked users and IP addresses.",
        "apihelp-query+blocks-param-start": "The timestamp to start enumerating from.",
        "apihelp-query+blocks-param-end": "The timestamp to stop enumerating at.",
        "apihelp-query+blocks-param-ids": "List of block IDs to list (optional).",
        "apihelp-query+blocks-param-users": "List of users to search for (optional).",
-       "apihelp-query+blocks-param-ip": "Get all blocks applying to this IP or CIDR range, including range blocks.\nCannot be used together with $3users. CIDR ranges broader than IPv4/$1 or IPv6/$2 are not accepted.",
+       "apihelp-query+blocks-param-ip": "Get all blocks applying to this IP or CIDR range, including range blocks.\nCannot be used together with <var>$3users</var>. CIDR ranges broader than IPv4/$1 or IPv6/$2 are not accepted.",
        "apihelp-query+blocks-param-limit": "The maximum number of blocks to list.",
-       "apihelp-query+blocks-param-prop": "Which properties to get:\n;id:Adds the ID of the block.\n;user:Adds the username of the blocked user.\n;userid:Adds the user ID of the blocked user.\n;by:Adds the username of the blocking user.\n;byid:Adds the user ID of the blocking user.\n;timestamp:Adds the timestamp of when the block was given.\n;expiry:Adds the timestamp of when the block expires.\n;reason:Adds the reason given for the block.\n;range:Adds the range of IPs affected by the block.\n;flags:Tags the ban with (autoblock, anononly, etc.).",
-       "apihelp-query+blocks-param-show": "Show only items that meet these criteria.\nFor example, to see only indefinite blocks on IPs, set $1show=ip|!temp.",
-       "apihelp-query+blocks-example-simple": "List blocks",
-       "apihelp-query+blocks-example-users": "List blocks of users Alice and Bob",
+       "apihelp-query+blocks-param-prop": "Which properties to get:\n;id:Adds the ID of the block.\n;user:Adds the username of the blocked user.\n;userid:Adds the user ID of the blocked user.\n;by:Adds the username of the blocking user.\n;byid:Adds the user ID of the blocking user.\n;timestamp:Adds the timestamp of when the block was given.\n;expiry:Adds the timestamp of when the block expires.\n;reason:Adds the reason given for the block.\n;range:Adds the range of IP addresses affected by the block.\n;flags:Tags the ban with (autoblock, anononly, etc.).",
+       "apihelp-query+blocks-param-show": "Show only items that meet these criteria.\nFor example, to see only indefinite blocks on IP addresses, set <kbd>$1show=ip|!temp</kbd>.",
+       "apihelp-query+blocks-example-simple": "List blocks.",
+       "apihelp-query+blocks-example-users": "List blocks of users <kbd>Alice</kbd> and <kbd>Bob</kbd>.",
 
        "apihelp-query+categories-description": "List all categories the pages belong to.",
        "apihelp-query+categories-param-prop": "Which additional properties to get for each category:\n;sortkey:Adds the sortkey (hexadecimal string) and sortkey prefix (human-readable part) for the category.\n;timestamp:Adds timestamp of when the category was added.\n;hidden:Tags categories that are hidden with _&#95;HIDDENCAT_&#95;.",
        "apihelp-query+categories-param-limit": "How many categories to return.",
        "apihelp-query+categories-param-categories": "Only list these categories. Useful for checking whether a certain page is in a certain category.",
        "apihelp-query+categories-param-dir": "The direction in which to list.",
-       "apihelp-query+categories-example-simple": "Get a list of categories [[Albert Einstein]] belongs to",
-       "apihelp-query+categories-example-generator": "Get information about all categories used in the [[Albert Einstein]]",
+       "apihelp-query+categories-example-simple": "Get a list of categories the page <kbd>Albert Einstein</kbd> belongs to.",
+       "apihelp-query+categories-example-generator": "Get information about all categories used in the page <kbd>Albert Einstein</kbd>.",
 
        "apihelp-query+categoryinfo-description": "Returns information about the given categories.",
-       "apihelp-query+categoryinfo-example-simple": "Get information about [[:Category:Foo]] and [[:Category:Bar]]",
+       "apihelp-query+categoryinfo-example-simple": "Get information about <kbd>Category:Foo</kbd> and <kbd>Category:Bar</kbd>.",
 
        "apihelp-query+categorymembers-description": "List all pages in a given category.",
-       "apihelp-query+categorymembers-param-title": "Which category to enumerate (required). Must include the \"Category:\" prefix. Cannot be used together with $1pageid.",
-       "apihelp-query+categorymembers-param-pageid": "Page ID of the category to enumerate. Cannot be used together with $1title.",
+       "apihelp-query+categorymembers-param-title": "Which category to enumerate (required). Must include the <kbd>{{ns:category}}:</kbd> prefix. Cannot be used together with <var>$1pageid</var>.",
+       "apihelp-query+categorymembers-param-pageid": "Page ID of the category to enumerate. Cannot be used together with <var>$1title</var>.",
        "apihelp-query+categorymembers-param-prop": "Which pieces of information to include:\n;ids:Adds the page ID.\n;title:Adds the title and namespace ID of the page.\n;sortkey:Adds the sortkey used for sorting in the category (hexadecimal string).\n;sortkeyprefix:Adds the sortkey prefix used for sorting in the category (human-readable part of the sortkey).\n;type:Adds the type that the page has been categorised as (page, subcat or file).\n;timestamp:Adds the timestamp of when the page was included.",
-       "apihelp-query+categorymembers-param-namespace": "Only include pages in these namespaces. Note that $1type=subcat or $1type=file may be used instead of $1namespace=14 or 6.",
-       "apihelp-query+categorymembers-param-type": "Which type of category members to include. Ignored when $1sort=timestamp is set.",
+       "apihelp-query+categorymembers-param-namespace": "Only include pages in these namespaces. Note that <kbd>$1type=subcat</kbd> or <kbd>$1type=file</kbd> may be used instead of <kbd>$1namespace=14</kbd> or <kbd>6</kbd>.",
+       "apihelp-query+categorymembers-param-type": "Which type of category members to include. Ignored when <kbd>$1sort=timestamp</kbd> is set.",
        "apihelp-query+categorymembers-param-limit": "The maximum number of pages to return.",
        "apihelp-query+categorymembers-param-sort": "Property to sort by.",
        "apihelp-query+categorymembers-param-dir": "In which direction to sort.",
-       "apihelp-query+categorymembers-param-start": "Timestamp to start listing from. Can only be used with $1sort=timestamp.",
-       "apihelp-query+categorymembers-param-end": "Timestamp to end listing at. Can only be used with $1sort=timestamp.",
-       "apihelp-query+categorymembers-param-starthexsortkey": "Sortkey to start listing from, as returned by $1prop=sortkey. Can only be used with $1sort=sortkey.",
-       "apihelp-query+categorymembers-param-endhexsortkey": "Sortkey to end listing from, as returned by $1prop=sortkey. Can only be used with $1sort=sortkey.",
-       "apihelp-query+categorymembers-param-startsortkeyprefix": "Sortkey prefix to start listing from. Can only be used with $1sort=sortkey. Overrides $1starthexsortkey.",
+       "apihelp-query+categorymembers-param-start": "Timestamp to start listing from. Can only be used with <kbd>$1sort=timestamp</kbd>.",
+       "apihelp-query+categorymembers-param-end": "Timestamp to end listing at. Can only be used with <kbd>$1sort=timestamp</kbd>.",
+       "apihelp-query+categorymembers-param-starthexsortkey": "Sortkey to start listing from, as returned by <kbd>$1prop=sortkey</kbd>. Can only be used with <kbd>$1sort=sortkey</kbd>.",
+       "apihelp-query+categorymembers-param-endhexsortkey": "Sortkey to end listing from, as returned by <kbd>$1prop=sortkey</kbd>. Can only be used with <kbd>$1sort=sortkey</kbd>.",
+       "apihelp-query+categorymembers-param-startsortkeyprefix": "Sortkey prefix to start listing from. Can only be used with <kbd>$1sort=sortkey</kbd>. Overrides <var>$1starthexsortkey</var>.",
        "apihelp-query+categorymembers-param-endsortkeyprefix": "Sortkey prefix to end listing BEFORE (not at, if this value occurs it will not be included!). Can only be used with $1sort=sortkey. Overrides $1endhexsortkey.",
        "apihelp-query+categorymembers-param-startsortkey": "Use $1starthexsortkey instead.",
        "apihelp-query+categorymembers-param-endsortkey": "Use $1endhexsortkey instead.",
-       "apihelp-query+categorymembers-example-simple": "Get first 10 pages in [[:Category:Physics]]",
-       "apihelp-query+categorymembers-example-generator": "Get page info about first 10 pages in [[:Category:Physics]]",
+       "apihelp-query+categorymembers-example-simple": "Get first 10 pages in <kbd>Category:Physics</kbd>.",
+       "apihelp-query+categorymembers-example-generator": "Get page info about first 10 pages in <kbd>Category:Physics</kbd>.",
 
        "apihelp-query+contributors-description": "Get the list of logged-in contributors and the count of anonymous contributors to a page.",
        "apihelp-query+contributors-param-group": "Only include users in the given groups. Does not include implicit or auto-promoted groups like *, user, or autoconfirmed.",
        "apihelp-query+contributors-param-rights": "Only include users having the given rights. Does not include rights granted by implicit or auto-promoted groups like *, user, or autoconfirmed.",
        "apihelp-query+contributors-param-excluderights": "Exclude users having the given rights. Does not include rights granted by implicit or auto-promoted groups like *, user, or autoconfirmed.",
        "apihelp-query+contributors-param-limit": "How many contributors to return.",
-       "apihelp-query+contributors-example-simple": "Show contributors to the [[Main Page]]",
+       "apihelp-query+contributors-example-simple": "Show contributors to the page <kbd>Main Page</kbd>.",
 
        "apihelp-query+deletedrevisions-description": "Get deleted revision information.\n\nMay be used in several ways:\n# Get deleted revisions for a set of pages, by setting titles or pageids. Ordered by title and timestamp.\n# Get data about a set of deleted revisions by setting their IDs with revids. Ordered by revision ID.",
        "apihelp-query+deletedrevisions-param-start": "The timestamp to start enumerating from. Ignored when processing a list of revision IDs.",
        "apihelp-query+deletedrevisions-param-excludeuser": "Don't list revisions by this user.",
        "apihelp-query+deletedrevisions-param-limit": "The maximum amount of revisions to list.",
        "apihelp-query+deletedrevisions-param-prop": "Which properties to get:\n;revid:Adds the revision ID of the deleted revision.\n;parentid:Adds the revision ID of the previous revision to the page.\n;user:Adds the user who made the revision.\n;userid:Adds the user ID who made the revision.\n;comment:Adds the comment of the revision.\n;parsedcomment:Adds the parsed comment of the revision.\n;minor:Tags if the revision is minor.\n;len:Adds the length (bytes) of the revision.\n;sha1:Adds the SHA-1 (base 16) of the revision.\n;content:Adds the content of the revision.\n;tags:Tags for the revision.",
-       "apihelp-query+deletedrevisions-example-titles": "List the deleted revisions of [[Main Page]] and [[Talk:Main Page]], with content",
-       "apihelp-query+deletedrevisions-example-revids": "List the information for deleted revision 123456",
+       "apihelp-query+deletedrevisions-example-titles": "List the deleted revisions of the pages <kbd>Main Page</kbd> and <kbd>Talk:Main Page</kbd>, with content.",
+       "apihelp-query+deletedrevisions-example-revids": "List the information for deleted revision <kbd>123456</kbd>.",
 
        "apihelp-query+deletedrevs-description": "List deleted revisions.\n\nOperates in three modes:\n# List deleted revisions for the given titles, sorted by timestamp.\n# List deleted contributions for the given user, sorted by timestamp (no titles specified).\n# List all deleted revisions in the given namespace, sorted by title and timestamp (no titles specified, $1user not set).\n\nCertain parameters only apply to some modes and are ignored in others.",
        "apihelp-query+deletedrevs-paraminfo-modes": "{{PLURAL:$1|Mode|Modes}}: $2",
        "apihelp-query+deletedrevs-param-namespace": "Only list pages in this namespace.",
        "apihelp-query+deletedrevs-param-limit": "The maximum amount of revisions to list.",
        "apihelp-query+deletedrevs-param-prop": "Which properties to get:\n;revid:Adds the revision ID of the deleted revision.\n;parentid:Adds the revision ID of the previous revision to the page.\n;user:Adds the user who made the revision.\n;userid:Adds the user ID whom made the revision.\n;comment:Adds the comment of the revision.\n;parsedcomment:Adds the parsed comment of the revision.\n;minor:Tags if the revision is minor.\n;len:Adds the length (bytes) of the revision.\n;sha1:Adds the SHA-1 (base 16) of the revision.\n;content:Adds the content of the revision.\n;token:<span class=\"apihelp-deprecated\">Deprecated.</span> Gives the edit token.\n;tags:Tags for the revision.",
-       "apihelp-query+deletedrevs-example-mode1": "List the last deleted revisions of Main Page and Talk:Main Page, with content (mode 1)",
-       "apihelp-query+deletedrevs-example-mode2": "List the last 50 deleted contributions by Bob (mode 2)",
-       "apihelp-query+deletedrevs-example-mode3-main": "List the first 50 deleted revisions in the main namespace (mode 3)",
-       "apihelp-query+deletedrevs-example-mode3-talk": "List the first 50 deleted pages in the Talk namespace (mode 3):",
+       "apihelp-query+deletedrevs-example-mode1": "List the last deleted revisions of the pages <kbd>Main Page</kbd> and <kbd>Talk:Main Page</kbd>, with content (mode 1).",
+       "apihelp-query+deletedrevs-example-mode2": "List the last 50 deleted contributions by <kbd>Bob</kbd> (mode 2).",
+       "apihelp-query+deletedrevs-example-mode3-main": "List the first 50 deleted revisions in the main namespace (mode 3).",
+       "apihelp-query+deletedrevs-example-mode3-talk": "List the first 50 deleted pages in the {{ns:talk}} namespace (mode 3).",
 
        "apihelp-query+disabled-description": "This query module has been disabled.",
 
        "apihelp-query+duplicatefiles-param-limit": "How many duplicate files to return.",
        "apihelp-query+duplicatefiles-param-dir": "The direction in which to list.",
        "apihelp-query+duplicatefiles-param-localonly": "Look only for files in the local repository.",
-       "apihelp-query+duplicatefiles-example-simple": "Look for duplicates of [[:File:Albert Einstein Head.jpg]]",
-       "apihelp-query+duplicatefiles-example-generated": "Look for duplicates of all files",
+       "apihelp-query+duplicatefiles-example-simple": "Look for duplicates of [[:File:Albert Einstein Head.jpg]].",
+       "apihelp-query+duplicatefiles-example-generated": "Look for duplicates of all files.",
 
        "apihelp-query+embeddedin-description": "Find all pages that embed (transclude) the given title.",
        "apihelp-query+embeddedin-param-title": "Title to search. Cannot be used together with $1pageid.",
        "apihelp-query+embeddedin-param-dir": "The direction in which to list.",
        "apihelp-query+embeddedin-param-filterredir": "How to filter for redirects.",
        "apihelp-query+embeddedin-param-limit": "How many total pages to return.",
-       "apihelp-query+embeddedin-example-simple": "Show pages transcluding [[Template:Stub]]",
-       "apihelp-query+embeddedin-example-generator": "Get information about pages transcluding [[Template:Stub]]",
+       "apihelp-query+embeddedin-example-simple": "Show pages transcluding <kbd>Template:Stub</kbd>.",
+       "apihelp-query+embeddedin-example-generator": "Get information about pages transcluding <kbd>Template:Stub</kbd>.",
 
        "apihelp-query+extlinks-description": "Returns all external URLs (not interwikis) from the given pages.",
        "apihelp-query+extlinks-param-limit": "How many links to return.",
-       "apihelp-query+extlinks-param-protocol": "Protocol of the URL. If empty and $1query is set, the protocol is \"http\". Leave both this and $1query empty to list all external links.",
+       "apihelp-query+extlinks-param-protocol": "Protocol of the URL. If empty and <var>$1query</var> is set, the protocol is <kbd>http</kbd>. Leave both this and <var>$1query</var> empty to list all external links.",
        "apihelp-query+extlinks-param-query": "Search string without protocol. Useful for checking whether a certain page contains a certain external url.",
        "apihelp-query+extlinks-param-expandurl": "Expand protocol-relative URLs with the canonical protocol.",
-       "apihelp-query+extlinks-example-simple": "Get a list of external links on the [[Main Page]]",
+       "apihelp-query+extlinks-example-simple": "Get a list of external links on <kbd>Main Page<kbd>.",
 
        "apihelp-query+exturlusage-description": "Enumerate pages that contain a given URL.",
        "apihelp-query+exturlusage-param-prop": "Which pieces of information to include:\n;ids:Adds the ID of page.\n;title:Adds the title and namespace ID of the page.\n;url:Adds the URL used in the page.",
-       "apihelp-query+exturlusage-param-protocol": "Protocol of the URL. If empty and $1query set, the protocol is \"http\". Leave both this and $1query empty to list all external links.",
+       "apihelp-query+exturlusage-param-protocol": "Protocol of the URL. If empty and <var>$1query</var> set, the protocol is <kbd>http</kbd>. Leave both this and <var>$1query</var> empty to list all external links.",
        "apihelp-query+exturlusage-param-query": "Search string without protocol. See [[Special:LinkSearch]]. Leave empty to list all external links.",
        "apihelp-query+exturlusage-param-namespace": "The page namespaces to enumerate.",
        "apihelp-query+exturlusage-param-limit": "How many pages to return.",
        "apihelp-query+exturlusage-param-expandurl": "Expand protocol-relative URLs with the canonical protocol.",
-       "apihelp-query+exturlusage-example-simple": "Show pages linking to http://www.mediawiki.org",
+       "apihelp-query+exturlusage-example-simple": "Show pages linking to <kbd>http://www.mediawiki.org</kbd>.",
 
        "apihelp-query+filearchive-description": "Enumerate all deleted files sequentially.",
        "apihelp-query+filearchive-param-from": "The image title to start enumerating from.",
        "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 filename of the archive version for non-latest versions.",
-       "apihelp-query+filearchive-example-simple": "Show a list of all deleted files",
+       "apihelp-query+filearchive-example-simple": "Show a list of all deleted files.",
 
        "apihelp-query+filerepoinfo-description": "Return meta information about image repositories configured on the wiki.",
-       "apihelp-query+filerepoinfo-param-prop": "Which repository properties to get (there may be more available on some wikis):\n;apiurl:URL to the repository API - helpful for getting image info from the host.\n;name:The key of the repository - used in e.g. $wgForeignFileRepos and imageinfo return values.\n;displayname:The human-readable name of the repository wiki.\n;rooturl:Root URL for image paths.\n;local:Whether that repository is the local one or not.",
-       "apihelp-query+filerepoinfo-example-simple": "Get information about file repositories",
+       "apihelp-query+filerepoinfo-param-prop": "Which repository properties to get (there may be more available on some wikis):\n;apiurl:URL to the repository API - helpful for getting image info from the host.\n;name:The key of the repository - used in e.g. <var>[[mw:Manual:$wgForeignFileRepos|$wgForeignFileRepos]]</var> and [[Special:ApiHelp/query+imageinfo|imageinfo]] return values.\n;displayname:The human-readable name of the repository wiki.\n;rooturl:Root URL for image paths.\n;local:Whether that repository is the local one or not.",
+       "apihelp-query+filerepoinfo-example-simple": "Get information about file repositories.",
 
        "apihelp-query+fileusage-description": "Find all pages that use the given files.",
        "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;!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+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:",
        "apihelp-query+imageinfo-param-end": "Timestamp to stop listing at.",
        "apihelp-query+imageinfo-param-urlwidth": "If $2prop=url is set, a URL to an image scaled to this width will be returned.\nFor performance reasons if this option is used, no more than $1 scaled images will be returned.",
        "apihelp-query+imageinfo-param-urlheight": "Similar to $1urlwidth.",
-       "apihelp-query+imageinfo-param-metadataversion": "Version of metadata to use. if \"latest\" is specified, use latest version. Defaults to \"1\" for backwards compatibility.",
+       "apihelp-query+imageinfo-param-metadataversion": "Version of metadata to use. If <kbd>latest</kbd> is specified, use latest version. Defaults to <kbd>1</kbd> for backwards compatibility.",
        "apihelp-query+imageinfo-param-extmetadatalanguage": "What language to fetch extmetadata in. This affects both which translation to fetch, if multiple are available, as well as how things like numbers and various values are formatted.",
        "apihelp-query+imageinfo-param-extmetadatamultilang": "If translations for extmetadata property are available, fetch all of them.",
        "apihelp-query+imageinfo-param-extmetadatafilter": "If specified and non-empty, only these keys will be returned for $1prop=extmetadata.",
-       "apihelp-query+imageinfo-param-urlparam": "A handler specific parameter string. For example, pdfs might use \"page15-100px\". $1urlwidth must be used and be consistent with $1urlparam.",
+       "apihelp-query+imageinfo-param-urlparam": "A handler specific parameter string. For example, PDFs might use <kbd>page15-100px</kbd>. <var>$1urlwidth</var> must be used and be consistent with <var>$1urlparam</var>.",
        "apihelp-query+imageinfo-param-localonly": "Look only for files in the local repository.",
-       "apihelp-query+imageinfo-example-simple": "Fetch information about the current version of [[:File:Albert Einstein Head.jpg]]",
-       "apihelp-query+imageinfo-example-dated": "Fetch information about versions of [[:File:Test.jpg]] from 2008 and later",
+       "apihelp-query+imageinfo-example-simple": "Fetch information about the current version of [[:File:Albert Einstein Head.jpg]].",
+       "apihelp-query+imageinfo-example-dated": "Fetch information about versions of [[:File:Test.jpg]] from 2008 and later.",
 
        "apihelp-query+images-description": "Returns all files contained on the given pages.",
        "apihelp-query+images-param-limit": "How many files to return.",
        "apihelp-query+images-param-images": "Only list these files. Useful for checking whether a certain page has a certain file.",
        "apihelp-query+images-param-dir": "The direction in which to list.",
-       "apihelp-query+images-example-simple": "Get a list of files used in the [[Main Page]]",
-       "apihelp-query+images-example-generator": "Get information about all files used in the [[Main Page]]",
+       "apihelp-query+images-example-simple": "Get a list of files used in the [[Main Page]].",
+       "apihelp-query+images-example-generator": "Get information about all files used in the [[Main Page]].",
 
        "apihelp-query+imageusage-description": "Find all pages that use the given image title.",
        "apihelp-query+imageusage-param-title": "Title to search. Cannot be used together with $1pageid.",
        "apihelp-query+imageusage-param-namespace": "The namespace to enumerate.",
        "apihelp-query+imageusage-param-dir": "The direction in which to list.",
        "apihelp-query+imageusage-param-filterredir": "How to filter for redirects. If set to nonredirects when $1redirect is enabled, this is only applied to the second level.",
-       "apihelp-query+imageusage-param-limit": "How many total pages to return. If $1redirect is enabled, limit applies to each level separately (which means you may get up to 2 * limit results).",
+       "apihelp-query+imageusage-param-limit": "How many total pages to return. If <var>$1redirect</var> is enabled, the limit applies to each level separately (which means up to 2 * <var>$1limit</var> results may be returned).",
        "apihelp-query+imageusage-param-redirect": "If linking page is a redirect, find all pages that link to that redirect as well. Maximum limit is halved.",
-       "apihelp-query+imageusage-example-simple": "Show pages using [[:File:Albert Einstein Head.jpg]]",
-       "apihelp-query+imageusage-example-generator": "Get information about pages using [[:File:Albert Einstein Head.jpg]]",
+       "apihelp-query+imageusage-example-simple": "Show pages using [[:File:Albert Einstein Head.jpg]].",
+       "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:",
        "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-testactions": "Test whether the current user can perform certain actions on the page.",
        "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+info-example-simple": "Get information about the page <kbd>Main Page</kbd>.",
+       "apihelp-query+info-example-protection": "Get general and protection information about the page <kbd>Main Page</kbd>.",
 
        "apihelp-query+iwbacklinks-description": "Find all pages that link to the given interwiki link.\n\nCan be used to find all links with a prefix, or all links to a title (with a given prefix). Using neither parameter is effectively \"all interwiki links\".",
        "apihelp-query+iwbacklinks-param-prefix": "Prefix for the interwiki.",
-       "apihelp-query+iwbacklinks-param-title": "Interwiki link to search for. Must be used with $1blprefix.",
+       "apihelp-query+iwbacklinks-param-title": "Interwiki link to search for. Must be used with <var>$1blprefix</var>.",
        "apihelp-query+iwbacklinks-param-limit": "How many total pages to return.",
        "apihelp-query+iwbacklinks-param-prop": "Which properties to get:\n;iwprefix:Adds the prefix of the interwiki.\n;iwtitle:Adds the title of the interwiki.",
        "apihelp-query+iwbacklinks-param-dir": "The direction in which to list.",
-       "apihelp-query+iwbacklinks-example-simple": "Get pages linking to [[wikibooks:Test]]",
-       "apihelp-query+iwbacklinks-example-generator": "Get information about pages linking to [[wikibooks:Test]]",
+       "apihelp-query+iwbacklinks-example-simple": "Get pages linking to [[wikibooks:Test]].",
+       "apihelp-query+iwbacklinks-example-generator": "Get information about pages linking to [[wikibooks:Test]].",
 
        "apihelp-query+iwlinks-description": "Returns all interwiki links from the given pages.",
        "apihelp-query+iwlinks-param-url": "Whether to get the full URL (cannot be used with $1prop).",
        "apihelp-query+iwlinks-param-prop": "Which additional properties to get for each interlanguage link:\n;url:Adds the full URL.",
        "apihelp-query+iwlinks-param-limit": "How many interwiki links to return.",
        "apihelp-query+iwlinks-param-prefix": "Only return interwiki links with this prefix.",
-       "apihelp-query+iwlinks-param-title": "Interwiki link to search for. Must be used with $1prefix.",
+       "apihelp-query+iwlinks-param-title": "Interwiki link to search for. Must be used with <var>$1prefix</var>.",
        "apihelp-query+iwlinks-param-dir": "The direction in which to list.",
-       "apihelp-query+iwlinks-example-simple": "Get interwiki links from the [[Main Page]]",
+       "apihelp-query+iwlinks-example-simple": "Get interwiki links from the page <kbd>Main Page</kbd>.",
 
        "apihelp-query+langbacklinks-description": "Find all pages that link to the given language link.\n\nCan be used to find all links with a language code, or all links to a title (with a given language). Using neither parameter is effectively \"all language links\".\n\nNote that this may not consider language links added by extensions.",
        "apihelp-query+langbacklinks-param-lang": "Language for the language link.",
        "apihelp-query+langbacklinks-param-limit": "How many total pages to return.",
        "apihelp-query+langbacklinks-param-prop": "Which properties to get:\n;lllang:Adds the language code of the language link.\n;lltitle:Adds the title of the language link.",
        "apihelp-query+langbacklinks-param-dir": "The direction in which to list.",
-       "apihelp-query+langbacklinks-example-simple": "Get pages linking to [[:fr:Test]]",
-       "apihelp-query+langbacklinks-example-generator": "Get information about pages linking to [[:fr:Test]]",
+       "apihelp-query+langbacklinks-example-simple": "Get pages linking to [[:fr:Test]].",
+       "apihelp-query+langbacklinks-example-generator": "Get information about pages linking to [[:fr:Test]].",
 
        "apihelp-query+langlinks-description": "Returns all interlanguage links from the given pages.",
        "apihelp-query+langlinks-param-limit": "How many langlinks to return.",
-       "apihelp-query+langlinks-param-url": "Whether to get the full URL (cannot be used with $1prop).",
-       "apihelp-query+langlinks-param-prop": "Which additional properties to get for each interlanguage link:\n;url:Adds the full URL.\n;langname:Adds the localised language name (best effort). Use $1inlanguagecode to control the language.\n;autonym:Adds the native language name.",
+       "apihelp-query+langlinks-param-url": "Whether to get the full URL (cannot be used with <var>$1prop</var>).",
+       "apihelp-query+langlinks-param-prop": "Which additional properties to get for each interlanguage link:\n;url:Adds the full URL.\n;langname:Adds the localised language name (best effort). Use <var>$1inlanguagecode</var> to control the language.\n;autonym:Adds the native language name.",
        "apihelp-query+langlinks-param-lang": "Only return language links with this language code.",
-       "apihelp-query+langlinks-param-title": "Link to search for. Must be used with $1lang.",
+       "apihelp-query+langlinks-param-title": "Link to search for. Must be used with <var>$1lang</var>.",
        "apihelp-query+langlinks-param-dir": "The direction in which to list.",
        "apihelp-query+langlinks-param-inlanguagecode": "Language code for localised language names.",
-       "apihelp-query+langlinks-example-simple": "Get interlanguage links from the [[Main Page]]",
+       "apihelp-query+langlinks-example-simple": "Get interlanguage links from the page <kbd>Main Page</kbd>.",
 
        "apihelp-query+links-description": "Returns all links from the given pages.",
        "apihelp-query+links-param-namespace": "Show links in these namespaces only.",
        "apihelp-query+links-param-limit": "How many links to return.",
        "apihelp-query+links-param-titles": "Only list links to these titles. Useful for checking whether a certain page links to a certain title.",
        "apihelp-query+links-param-dir": "The direction in which to list.",
-       "apihelp-query+links-example-simple": "Get links from the [[Main Page]]",
-       "apihelp-query+links-example-generator": "Get information about the link pages in the [[Main Page]]",
-       "apihelp-query+links-example-namespaces": "Get links from the [[Main Page]] in the User and Template namespaces",
+       "apihelp-query+links-example-simple": "Get links from the page <kbd>Main Page</kbd>",
+       "apihelp-query+links-example-generator": "Get information about the link pages in the page <kbd>Main Page</kbd>.",
+       "apihelp-query+links-example-namespaces": "Get links from the page <kbd>Main Page</kbd> in the {{ns:user}} and {{ns:template}} namespaces.",
 
        "apihelp-query+linkshere-description": "Find all pages that link to the given pages.",
        "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;!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+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+logevents-description": "Get events from logs.",
        "apihelp-query+logevents-param-prop": "Which properties to get:\n;ids:Adds the ID of the log event.\n;title:Adds the title of the page for the log event.\n;type:Adds the type of log event.\n;user:Adds the user responsible for the log event.\n;userid:Adds the user ID who was responsible for the log event.\n;timestamp:Adds the timestamp for the event.\n;comment:Adds the comment of the event.\n;parsedcomment:Adds the parsed comment of the event.\n;details:Lists additional details about the event.\n;tags:Lists tags for the event.",
        "apihelp-query+logevents-param-type": "Filter log entries to only this type.",
-       "apihelp-query+logevents-param-action": "Filter log actions to only this action. Overrides $1type. Wildcard actions like \"action/*\" allows to specify any string for the asterisk.",
+       "apihelp-query+logevents-param-action": "Filter log actions to only this action. Overrides <var>$1type</var>. Wildcard actions like <kbd>action/*</kbd> allows to specify any string for the asterisk.",
        "apihelp-query+logevents-param-start": "The timestamp to start enumerating from.",
        "apihelp-query+logevents-param-end": "The timestamp to end enumerating.",
        "apihelp-query+logevents-param-user": "Filter entries to those made by the given user.",
        "apihelp-query+logevents-param-prefix": "Filter entries that start with this prefix.",
        "apihelp-query+logevents-param-tag": "Only list event entries tagged with this tag.",
        "apihelp-query+logevents-param-limit": "How many total event entries to return.",
-       "apihelp-query+logevents-example-simple": "List recent log events",
+       "apihelp-query+logevents-example-simple": "List recent log events.",
 
-       "apihelp-query+pagepropnames-description": "List all page prop names in use on the wiki.",
+       "apihelp-query+pagepropnames-description": "List all page property names in use on the wiki.",
        "apihelp-query+pagepropnames-param-limit": "The maximum number of names to return.",
-       "apihelp-query+pagepropnames-example-simple": "Get first 10 prop names",
+       "apihelp-query+pagepropnames-example-simple": "Get first 10 property names.",
 
        "apihelp-query+pageprops-description": "Get various properties defined in the page content.",
        "apihelp-query+pageprops-param-prop": "Only list these props. Useful for checking whether a certain page uses a certain page prop.",
-       "apihelp-query+pageprops-example-simple": "Get properties for [[:Category:Foo]]",
+       "apihelp-query+pageprops-example-simple": "Get properties for <kbd>Category:Foo</kbd>.",
 
-       "apihelp-query+pageswithprop-description": "List all pages using a given page prop.",
+       "apihelp-query+pageswithprop-description": "List all pages using a given page property.",
        "apihelp-query+pageswithprop-param-propname": "Page prop for which to enumerate pages.",
        "apihelp-query+pageswithprop-param-prop": "Which pieces of information to include:\n;ids:Adds the page ID.\n;title:Adds the title and namespace ID of the page.\n;value:Adds the value of the page prop.",
        "apihelp-query+pageswithprop-param-limit": "The maximum number of pages to return.",
        "apihelp-query+pageswithprop-param-dir": "In which direction to sort.",
-       "apihelp-query+pageswithprop-example-simple": "List the first 10 pages using &#123;&#123;DISPLAYTITLE:&#125;&#125;",
-       "apihelp-query+pageswithprop-example-generator": "Get page info about first 10 pages using _&#95;NOTOC_&#95;",
+       "apihelp-query+pageswithprop-example-simple": "List the first 10 pages using <code>&#123;&#123;DISPLAYTITLE:&#125;&#125;</code>.",
+       "apihelp-query+pageswithprop-example-generator": "Get page info about first 10 pages using <code>_&#95;NOTOC_&#95;</code>.",
 
        "apihelp-query+prefixsearch-description": "Perform a prefix search for page titles.",
        "apihelp-query+prefixsearch-param-search": "Search string.",
        "apihelp-query+prefixsearch-param-namespace": "Namespaces to search.",
        "apihelp-query+prefixsearch-param-limit": "Maximum number of results to return.",
        "apihelp-query+prefixsearch-param-offset": "Number of results to skip.",
-       "apihelp-query+prefixsearch-example-simple": "Search for page titles beginning with \"meaning\"",
-
+       "apihelp-query+prefixsearch-example-simple": "Search for page titles beginning with <kbd>meaning</kbd>.",
        "apihelp-query+protectedtitles-description": "List all titles protected from creation.",
        "apihelp-query+protectedtitles-param-namespace": "Only list titles in these namespaces.",
        "apihelp-query+protectedtitles-param-level": "Only list titles with these protection levels.",
        "apihelp-query+protectedtitles-param-start": "Start listing at this protection timestamp.",
        "apihelp-query+protectedtitles-param-end": "Stop listing at this protection timestamp.",
        "apihelp-query+protectedtitles-param-prop": "Which properties to get:\n;timestamp:Adds the timestamp of when protection was added.\n;user:Adds the user that added the protection.\n;userid:Adds the user ID that added the protection.\n;comment:Adds the comment for the protection.\n;parsedcomment:Adds the parsed comment for the protection.\n;expiry:Adds the timestamp of when the protection will be lifted.\n;level:Adds the protection level.",
-       "apihelp-query+protectedtitles-example-simple": "List protected titles",
-       "apihelp-query+protectedtitles-example-generator": "Find links to protected titles in the main namespace",
+       "apihelp-query+protectedtitles-example-simple": "List protected titles.",
+       "apihelp-query+protectedtitles-example-generator": "Find links to protected titles in the main namespace.",
 
        "apihelp-query+querypage-description": "Get a list provided by a QueryPage-based special page.",
        "apihelp-query+querypage-param-page": "The name of the special page. Note, this is case sensitive.",
        "apihelp-query+querypage-param-limit": "Number of results to return.",
        "apihelp-query+querypage-example-ancientpages": "Return results from [[Special:Ancientpages]].",
 
-       "apihelp-query+random-description": "Get a set of random pages.\n\nPages are listed in a fixed sequence, only the starting point is random. This means that if, for example, \"Main Page\" is the first random page on your list, \"List of fictional monkeys\" will *always* be second, \"List of people on stamps of Vanuatu\" third, etc.\n\nIf the number of pages in the namespace is lower than $1limit, you will get fewer pages. You will not get the same page twice.",
+       "apihelp-query+random-description": "Get a set of random pages.\n\nPages are listed in a fixed sequence, only the starting point is random. This means that if, for example, <samp>Main Page</samp> is the first random page in the list, <samp>List of fictional monkeys</samp> will <em>always</em> be second, <samp>List of people on stamps of Vanuatu</samp> third, etc.\n\nIf the number of pages in the namespace is lower than <var>$1limit</var>, fewer pages will be returned. The same page will not be returned twice.",
        "apihelp-query+random-param-namespace": "Return pages in these namespaces only.",
        "apihelp-query+random-param-limit": "Limit how many random pages will be returned.",
        "apihelp-query+random-param-redirect": "Load a random redirect instead of a random page.",
-       "apihelp-query+random-example-simple": "Return two random pages from the main namespace",
-       "apihelp-query+random-example-generator": "Return page info about two random pages from the main namespace",
+       "apihelp-query+random-example-simple": "Return two random pages from the main namespace.",
+       "apihelp-query+random-example-generator": "Return page info about two random pages from the main namespace.",
 
        "apihelp-query+recentchanges-description": "Enumerate recent changes.",
        "apihelp-query+recentchanges-param-start": "The timestamp to start enumerating from.",
        "apihelp-query+recentchanges-param-excludeuser": "Don't list changes by this user.",
        "apihelp-query+recentchanges-param-tag": "Only list changes tagged with this tag.",
        "apihelp-query+recentchanges-param-prop": "Include additional pieces of information:\n;user:Adds the user responsible for the edit and tags if they are an IP.\n;userid:Adds the user ID responsible for the edit.\n;comment:Adds the comment for the edit.\n;parsedcomment:Adds the parsed comment for the edit.\n;flags:Adds flags for the edit.\n;timestamp:Adds timestamp of the edit.\n;title:Adds the page title of the edit.\n;ids:Adds the page ID, recent changes ID and the new and old revision ID.\n;sizes:Adds the new and old page length in bytes.\n;redirect:Tags edit if page is a redirect.\n;patrolled:Tags patrollable edits as being patrolled or unpatrolled.\n;loginfo:Adds log information (log ID, log type, etc) to log entries.\n;tags:Lists tags for the entry.\n;sha1:Adds the content checksum for entries associated with a revision.",
-       "apihelp-query+recentchanges-param-token": "Use [[Special:ApiHelp/query+tokens|action=query&meta=tokens]] instead.",
+       "apihelp-query+recentchanges-param-token": "Use <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd> instead.",
        "apihelp-query+recentchanges-param-show": "Show only items that meet these criteria. For example, to see only minor edits done by logged-in users, set $1show=minor|!anon.",
        "apihelp-query+recentchanges-param-limit": "How many total changes to return.",
        "apihelp-query+recentchanges-param-type": "Which types of changes to show.",
        "apihelp-query+recentchanges-param-toponly": "Only list changes which are the latest revision.",
-       "apihelp-query+recentchanges-example-simple": "List recent changes",
-       "apihelp-query+recentchanges-example-generator": "Get page info about recent unpatrolled changes",
+       "apihelp-query+recentchanges-example-simple": "List recent changes.",
+       "apihelp-query+recentchanges-example-generator": "Get page info about recent unpatrolled changes.",
 
        "apihelp-query+redirects-description": "Returns all redirects to the given pages.",
        "apihelp-query+redirects-param-prop": "Which properties to get:\n;pageid:Page ID of each redirect.\n;title:Title of each redirect.\n;fragment:Fragment of each redirect, if any.",
        "apihelp-query+redirects-param-namespace": "Only include pages in these namespaces.",
        "apihelp-query+redirects-param-limit": "How many redirects to return.",
        "apihelp-query+redirects-param-show": "Show only items that meet these criteria:\n;fragment:Only show redirects with a fragment.\n;!fragment:Only show redirects without a fragment.",
-       "apihelp-query+redirects-example-simple": "Get a list of redirects to the [[Main Page]]",
-       "apihelp-query+redirects-example-generator": "Get information about all redirects to the [[Main Page]]",
+       "apihelp-query+redirects-example-simple": "Get a list of redirects to the [[Main Page]].",
+       "apihelp-query+redirects-example-generator": "Get information about all redirects to the [[Main Page]].",
 
        "apihelp-query+revisions-description": "Get revision information.\n\nMay be used in several ways:\n# Get data about a set of pages (last revision), by setting titles or pageids.\n# Get revisions for one given page, by using titles or pageids with start, end, or limit.\n# Get data about a set of revisions by setting their IDs with revids.",
        "apihelp-query+revisions-paraminfo-singlepageonly": "May only be used with a single page (mode #2).",
        "apihelp-query+revisions-param-excludeuser": "Exclude revisions made by user.",
        "apihelp-query+revisions-param-tag": "Only list revisions tagged with this tag.",
        "apihelp-query+revisions-param-token": "Which tokens to obtain for each revision.",
-       "apihelp-query+revisions-example-content": "Get data with content for the last revision of titles \"API\" and \"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 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-example-content": "Get data with content for the last revision of titles <kbd>API</kbd> and <kbd>Main Page</kbd>.",
+       "apihelp-query+revisions-example-last5": "Get last 5 revisions of the <kbd>Main Page</kbd>.",
+       "apihelp-query+revisions-example-first5": "Get first 5 revisions of the <kbd>Main Page</kbd>.",
+       "apihelp-query+revisions-example-first5-after": "Get first 5 revisions of the <kbd>Main Page</kbd> made after 2006-05-01.",
+       "apihelp-query+revisions-example-first5-not-localhost": "Get first 5 revisions of the <kbd>Main Page</kbd> that were not made by anonymous user <kbd>127.0.0.1</kbd>.",
+       "apihelp-query+revisions-example-first5-user": "Get first 5 revisions of the <kbd>Main Page</kbd> that were made by the user <kbd>MediaWiki default</kbd>.",
        "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+revisions+base-param-limit": "Limit how many revisions will be returned.",
        "apihelp-query+revisions+base-param-expandtemplates": "Expand templates in revision content (requires $1prop=content).",
        "apihelp-query+revisions+base-param-generatexml": "Generate XML parse tree for revision content (requires $1prop=content).",
        "apihelp-query+revisions+base-param-parse": "Parse revision content (requires $1prop=content). For performance reasons, if this option is used, $1limit is enforced to 1.",
        "apihelp-query+revisions+base-param-section": "Only retrieve the content of this section number.",
-       "apihelp-query+revisions+base-param-diffto": "Revision ID to diff each revision to. Use \"prev\", \"next\" and \"cur\" for the previous, next and current revision respectively.",
-       "apihelp-query+revisions+base-param-difftotext": "Text to diff each revision to. Only diffs a limited number of revisions. Overrides $1diffto. If $1section is set, only that section will be diffed against this text",
-       "apihelp-query+revisions+base-param-contentformat": "Serialization format used for $1difftotext and expected for output of content.",
+       "apihelp-query+revisions+base-param-diffto": "Revision ID to diff each revision to. Use <kbd>prev</kbd>, <kbd>next</kbd> and <kbd>cur</kbd> for the previous, next and current revision respectively.",
+       "apihelp-query+revisions+base-param-difftotext": "Text to diff each revision to. Only diffs a limited number of revisions. Overrides <var>$1diffto</var>. If <var>$1section</var> is set, only that section will be diffed against this text",
+       "apihelp-query+revisions+base-param-contentformat": "Serialization format used for <var>$1difftotext</var> and expected for output of content.",
 
        "apihelp-query+search-description": "Perform a full text search.",
        "apihelp-query+search-param-search": "Search for all page titles (or content) that have this value.",
        "apihelp-query+search-param-limit": "How many total pages to return.",
        "apihelp-query+search-param-interwiki": "Include interwiki results in the search, if available.",
        "apihelp-query+search-param-backend": "Which search backend to use, if not the default.",
-       "apihelp-query+search-example-simple": "Search for \"meaning\"",
-       "apihelp-query+search-example-text": "Search texts for \"meaning\"",
-       "apihelp-query+search-example-generator": "Ger page info about the pages returned for a search for \"meaning\"",
+       "apihelp-query+search-example-simple": "Search for <kbd>meaning</kbd>.",
+       "apihelp-query+search-example-text": "Search texts for <kbd>meaning</kbd>.",
+       "apihelp-query+search-example-generator": "Ger page info about the pages returned for a search for <kbd>meaning</kbd>.",
 
        "apihelp-query+siteinfo-description": "Return general information about the site.",
-       "apihelp-query+siteinfo-param-prop": "Which information to get:\n;general:Overall system information.\n;namespaces:List of registered namespaces and their canonical names.\n;namespacealiases:List of registered namespace aliases.\n;specialpagealiases:List of special page aliases.\n;magicwords:List of magic words and their aliases.\n;statistics:Returns site statistics.\n;interwikimap:Returns interwiki map (optionally filtered, (optionally localised by using $1inlanguagecode)).\n;dbrepllag:Returns database server with the highest replication lag.\n;usergroups:Returns user groups and the associated permissions.\n;extensions:Returns extensions installed on the wiki.\n;fileextensions:Returns list of file extensions allowed to be uploaded.\n;rightsinfo:Returns wiki rights (license) information if available.\n;restrictions:Returns information on available restriction (protection) types.\n;languages:Returns a list of languages MediaWiki supports (optionally localised by using $1inlanguagecode).\n;skins:Returns a list of all enabled skins (optionally localised by using $1inlanguagecode, otherwise in content language).\n;extensiontags:Returns a list of parser extension tags.\n;functionhooks:Returns a list of parser function hooks.\n;showhooks:Returns a list of all subscribed hooks (contents of $wgHooks).\n;variables:Returns a list of variable IDs.\n;protocols:Returns a list of protocols that are allowed in external links.\n;defaultoptions:Returns the default values for user preferences.",
+       "apihelp-query+siteinfo-param-prop": "Which information to get:\n;general:Overall system information.\n;namespaces:List of registered namespaces and their canonical names.\n;namespacealiases:List of registered namespace aliases.\n;specialpagealiases:List of special page aliases.\n;magicwords:List of magic words and their aliases.\n;statistics:Returns site statistics.\n;interwikimap:Returns interwiki map (optionally filtered, optionally localised by using <var>$1inlanguagecode</var>).\n;dbrepllag:Returns database server with the highest replication lag.\n;usergroups:Returns user groups and the associated permissions.\n;libraries:Returns libraries installed on the wiki.\n;extensions:Returns extensions installed on the wiki.\n;fileextensions:Returns list of file extensions allowed to be uploaded.\n;rightsinfo:Returns wiki rights (license) information if available.\n;restrictions:Returns information on available restriction (protection) types.\n;languages:Returns a list of languages MediaWiki supports (optionally localised by using <var>$1inlanguagecode</var>).\n;skins:Returns a list of all enabled skins (optionally localised by using <var>$1inlanguagecode</var>, otherwise in the content language).\n;extensiontags:Returns a list of parser extension tags.\n;functionhooks:Returns a list of parser function hooks.\n;showhooks:Returns a list of all subscribed hooks (contents of <var>[[mw:Manual:$wgHooks|$wgHooks]]</var>).\n;variables:Returns a list of variable IDs.\n;protocols:Returns a list of protocols that are allowed in external links.\n;defaultoptions:Returns the default values for user preferences.",
        "apihelp-query+siteinfo-param-filteriw": "Return only local or only nonlocal entries of the interwiki map.",
        "apihelp-query+siteinfo-param-showalldb": "List all database servers, not just the one lagging the most.",
        "apihelp-query+siteinfo-param-numberingroup": "Lists the number of users in user groups.",
        "apihelp-query+siteinfo-param-inlanguagecode": "Language code for localised language names (best effort) and skin names.",
-       "apihelp-query+siteinfo-example-simple": "Fetch site information",
-       "apihelp-query+siteinfo-example-interwiki": "Fetch a list of local interwiki prefixes",
-       "apihelp-query+siteinfo-example-replag": "Check the current replication lag",
+       "apihelp-query+siteinfo-example-simple": "Fetch site information.",
+       "apihelp-query+siteinfo-example-interwiki": "Fetch a list of local interwiki prefixes.",
+       "apihelp-query+siteinfo-example-replag": "Check the current replication lag.",
 
        "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-example-simple": "Returns information for a stashed file",
-       "apihelp-query+stashimageinfo-example-params": "Returns thumbnails for two stashed files",
+       "apihelp-query+stashimageinfo-example-simple": "Returns information for a stashed file.",
+       "apihelp-query+stashimageinfo-example-params": "Returns thumbnails for two stashed files.",
 
        "apihelp-query+tags-description": "List change tags.",
        "apihelp-query+tags-param-limit": "The maximum number of tags to list.",
-       "apihelp-query+tags-param-prop": "Which properties to get:\n;name:Adds name of tag.\n;displayname:Adds system message for the tag.\n;description:Adds description of the tag.\n;hitcount:Adds the amount of revisions that have this tag.\n;defined:Indicate whether the tag is defined.",
-       "apihelp-query+tags-example-simple": "List available tags",
+       "apihelp-query+tags-param-prop": "Which properties to get:\n;name:Adds name of tag.\n;displayname:Adds system message for the tag.\n;description:Adds description of the tag.\n;hitcount:Adds the number of revisions and log entries that have this tag.\n;defined:Indicate whether the tag is defined.\n;source:Gets the sources of the tag, which may include <samp>extension</samp> for extension-defined tags and <samp>manual</samp> for tags that may be applied manually by users.\n;active:Whether the tag is still being applied.",
+       "apihelp-query+tags-example-simple": "List available tags.",
 
        "apihelp-query+templates-description": "Returns all pages transcluded on the given pages.",
        "apihelp-query+templates-param-namespace": "Show templates in this namespaces only.",
        "apihelp-query+templates-param-limit": "How many templates to return.",
        "apihelp-query+templates-param-templates": "Only list these templates. Useful for checking whether a certain page uses a certain template.",
        "apihelp-query+templates-param-dir": "The direction in which to list.",
-       "apihelp-query+templates-example-simple": "Get templates from the [[Main Page]]",
-       "apihelp-query+templates-example-generator": "Get information about the template pages in the [[Main Page]]",
-       "apihelp-query+templates-example-namespaces": "Get templates from the [[Main Page]] in the User and Template namespaces",
+       "apihelp-query+templates-example-simple": "Get the templates used on the page <kbd>Main Page</kbd>.",
+       "apihelp-query+templates-example-generator": "Get information about the template pages used on <kbd>Main Page</kbd>.",
+       "apihelp-query+templates-example-namespaces": "Get pages in the {{ns:user}} and {{ns:template}} namespaces that are transcluded on the page <kbd>Main Page</kbd>.",
 
        "apihelp-query+tokens-description": "Gets tokens for data-modifying actions.",
        "apihelp-query+tokens-param-type": "Types of token to request.",
-       "apihelp-query+tokens-example-simple": "Retrieve a csrf token (the default)",
-       "apihelp-query+tokens-example-types": "Retrieve a watch token and a patrol token",
+       "apihelp-query+tokens-example-simple": "Retrieve a csrf token (the default).",
+       "apihelp-query+tokens-example-types": "Retrieve a watch token and a patrol token.",
 
        "apihelp-query+transcludedin-description": "Find all pages that transclude the given pages.",
        "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;!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+transcludedin-example-simple": "Get a list of pages transcluding <kbd>Main Page</kbd>.",
+       "apihelp-query+transcludedin-example-generator": "Get information about pages transcluding <kbd>Main Page</kbd>.",
 
        "apihelp-query+usercontribs-description": "Get all edits by a user.",
        "apihelp-query+usercontribs-param-limit": "The maximum number of contributions to return.",
        "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 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-show": "Show only items that meet these criteria, e.g. non minor edits only: <kbd>$2show=!minor</kbd>.\n\nIf <kbd>$2show=patrolled</kbd> or <kbd>$2show=!patrolled</kbd> is set, revisions older than <var>[[mw:Manual:$wgRCMaxAge|$wgRCMaxAge]]</var> ($1 {{PLURAL:$1|second|seconds}}) won't be shown.",
        "apihelp-query+usercontribs-param-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]]",
-       "apihelp-query+usercontribs-example-ipprefix": "Show contributions from all IPs with prefix \"192.0.2.\"",
+       "apihelp-query+usercontribs-example-user": "Show contributions of user <kbd>Example</kbd>.",
+       "apihelp-query+usercontribs-example-ipprefix": "Show contributions from all IP addresses with prefix <kbd>192.0.2.</kbd>.",
 
        "apihelp-query+userinfo-description": "Get information about the current user.",
-       "apihelp-query+userinfo-param-prop": "Which pieces of information to include:\n;blockinfo:Tags if the current user is blocked, by whom, and for what reason.\n;hasmsg:Adds a tag \"message\" if the current user has pending messages.\n;groups:Lists all the groups the current user belongs to.\n;implicitgroups:Lists all the groups the current user is automatically a member of.\n;rights:Lists all the rights the current user has.\n;changeablegroups:Lists the groups the current user can add to and remove from.\n;options:Lists all preferences the current user has set.\n;preferencestoken:DEPRECATED! Get a token to change current user's preferences.\n;editcount:Adds the current user's edit count.\n;ratelimits:Lists all rate limits applying to the current user.\n;realname:Adds the user's real name.\n;email:Adds the user's email address and email authentication date.\n;acceptlang:Echoes the Accept-Language header sent by the client in a structured format.\n;registrationdate:Adds the user's registration date.\n;unreadcount:Adds the count of unread pages on the user's watchlist (maximum $1; returns \"$2\" if more).",
-       "apihelp-query+userinfo-example-simple": "Get information about the current user",
-       "apihelp-query+userinfo-example-data": "Get additional information about the current user",
+       "apihelp-query+userinfo-param-prop": "Which pieces of information to include:\n;blockinfo:Tags if the current user is blocked, by whom, and for what reason.\n;hasmsg:Adds a tag <samp>message</samp> if the current user has pending messages.\n;groups:Lists all the groups the current user belongs to.\n;implicitgroups:Lists all the groups the current user is automatically a member of.\n;rights:Lists all the rights the current user has.\n;changeablegroups:Lists the groups the current user can add to and remove from.\n;options:Lists all preferences the current user has set.\n;preferencestoken:<span class=\"apihelp-deprecated\">Deprecated.</span> Get a token to change current user's preferences.\n;editcount:Adds the current user's edit count.\n;ratelimits:Lists all rate limits applying to the current user.\n;realname:Adds the user's real name.\n;email:Adds the user's email address and email authentication date.\n;acceptlang:Echoes the <code>Accept-Language</code> header sent by the client in a structured format.\n;registrationdate:Adds the user's registration date.\n;unreadcount:Adds the count of unread pages on the user's watchlist (maximum $1; returns <samp>$2</samp> if more).",
+       "apihelp-query+userinfo-example-simple": "Get information about the current user.",
+       "apihelp-query+userinfo-example-data": "Get additional information about the current user.",
 
        "apihelp-query+users-description": "Get information about a list of users.",
        "apihelp-query+users-param-prop": "Which pieces of information to include:\n;blockinfo:Tags if the user is blocked, by whom, and for what reason.\n;groups:Lists all the groups each user belongs to.\n;implicitgroups:Lists all the groups a user is automatically a member of.\n;rights:Lists all the rights each user has.\n;editcount:Adds the user's edit count.\n;registration:Adds the user's registration timestamp.\n;emailable:Tags if the user can and wants to receive email through [[Special:Emailuser]].\n;gender:Tags the gender of the user. Returns \"male\", \"female\", or \"unknown\".",
        "apihelp-query+users-param-users": "A list of users to obtain information for.",
-       "apihelp-query+users-param-token": "Use [[Special:ApiHelp/query+tokens|action=query&meta=tokens]] instead.",
-       "apihelp-query+users-example-simple": "Return information for [[User:Example]]",
+       "apihelp-query+users-param-token": "Use <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd> instead.",
+       "apihelp-query+users-example-simple": "Return information for user <kbd>Example</kbd>.",
 
-       "apihelp-query+watchlist-description": "Get recent changes to pages in the logged in user's watchlist.",
+       "apihelp-query+watchlist-description": "Get recent changes to pages in the current user's watchlist.",
        "apihelp-query+watchlist-param-allrev": "Include multiple revisions of the same page within given timeframe.",
        "apihelp-query+watchlist-param-start": "The timestamp to start enumerating from.",
        "apihelp-query+watchlist-param-end": "The timestamp to end enumerating.",
        "apihelp-query+watchlist-param-type": "Which types of changes to show:\n;edit:Regular page edits.\n;external:External changes.\n;new:Page creations.\n;log:Log entries.",
        "apihelp-query+watchlist-param-owner": "Used along with $1token to access a different user's watchlist.",
        "apihelp-query+watchlist-param-token": "A security token (available in the user's [[Special:Preferences#mw-prefsection-watchlist|preferences]]) to allow access to another user's watchlist.",
-       "apihelp-query+watchlist-example-simple": "List the top revision for recently changed pages on the current user's watchlist",
-       "apihelp-query+watchlist-example-props": "Fetch additional information about the top revision for recently changed pages on the current user's watchlist",
-       "apihelp-query+watchlist-example-allrev": "Fetch information about all recent changes to pages on the current user's watchlist",
-       "apihelp-query+watchlist-example-generator": "Fetch page info for recently changed pages on the current user's watchlist",
-       "apihelp-query+watchlist-example-generator-rev": "Fetch revision info for recent changes to pages on the current user's watchlist",
-       "apihelp-query+watchlist-example-wlowner": "List the top revision for recently changed pages on [[User:Example]]'s watchlist",
-
-       "apihelp-query+watchlistraw-description": "Get all pages on the logged in user's watchlist.",
+       "apihelp-query+watchlist-example-simple": "List the top revision for recently changed pages on the current user's watchlist.",
+       "apihelp-query+watchlist-example-props": "Fetch additional information about the top revision for recently changed pages on the current user's watchlist.",
+       "apihelp-query+watchlist-example-allrev": "Fetch information about all recent changes to pages on the current user's watchlist.",
+       "apihelp-query+watchlist-example-generator": "Fetch page info for recently changed pages on the current user's watchlist.",
+       "apihelp-query+watchlist-example-generator-rev": "Fetch revision info for recent changes to pages on the current user's watchlist.",
+       "apihelp-query+watchlist-example-wlowner": "List the top revision for recently changed pages on the watchlist of user <kbd>Example</kbd>.",
+
+       "apihelp-query+watchlistraw-description": "Get all pages on the current user's watchlist.",
        "apihelp-query+watchlistraw-param-namespace": "Only list pages in the given namespaces.",
        "apihelp-query+watchlistraw-param-limit": "How many total results to return per request.",
        "apihelp-query+watchlistraw-param-prop": "Which additional properties to get:\n;changed:Adds timestamp of when the user was last notified about the edit.",
        "apihelp-query+watchlistraw-param-show": "Only list items that meet these criteria.",
        "apihelp-query+watchlistraw-param-owner": "Used along with $1token to access a different user's watchlist.",
        "apihelp-query+watchlistraw-param-token": "A security token (available in the user's [[Special:Preferences#mw-prefsection-watchlist|preferences]]) to allow access to another user's watchlist.",
-       "apihelp-query+watchlistraw-example-simple": "List pages on the current user's watchlist",
-       "apihelp-query+watchlistraw-example-generator": "Fetch page info for pages on the current user's watchlist",
+       "apihelp-query+watchlistraw-example-simple": "List pages on the current user's watchlist.",
+       "apihelp-query+watchlistraw-example-generator": "Fetch page info for pages on the current user's watchlist.",
 
        "apihelp-revisiondelete-description": "Delete and undelete revisions.",
        "apihelp-revisiondelete-param-type": "Type of revision deletion being performed.",
        "apihelp-revisiondelete-param-show": "What to unhide for each revision.",
        "apihelp-revisiondelete-param-suppress": "Whether to suppress data from administrators as well as others.",
        "apihelp-revisiondelete-param-reason": "Reason for the deletion or undeletion.",
-       "apihelp-revisiondelete-example-revision": "Hide content for revision 12345 on the Main Page",
-       "apihelp-revisiondelete-example-log": "Hide all data on log entry 67890 with the reason \"BLP violation\"",
+       "apihelp-revisiondelete-example-revision": "Hide content for revision <kbd>12345</kbd> on the page <kbd>Main Page</kbd>.",
+       "apihelp-revisiondelete-example-log": "Hide all data on log entry <kbd>67890</kbd> with the reason <kbd>BLP violation</kbd>.",
 
        "apihelp-rollback-description": "Undo the last edit to the page.\n\nIf the last user who edited the page made multiple edits in a row, they will all be rolled back.",
-       "apihelp-rollback-param-title": "Title of the page you want to roll back. Cannot be used together with $1pageid.",
-       "apihelp-rollback-param-pageid": "Page ID of the page you want to roll back. Cannot be used together with $1title.",
+       "apihelp-rollback-param-title": "Title of the page to roll back. Cannot be used together with <var>$1pageid</var>.",
+       "apihelp-rollback-param-pageid": "Page ID of the page to roll back. Cannot be used together with <var>$1title</var>.",
        "apihelp-rollback-param-user": "Name of the user whose edits are to be rolled back.",
        "apihelp-rollback-param-summary": "Custom edit summary. If empty, default summary will be used.",
        "apihelp-rollback-param-markbot": "Mark the reverted edits and the revert as bot edits.",
-       "apihelp-rollback-param-watchlist": "Unconditionally add or remove the page from your watchlist, use preferences or do not change watch.",
-       "apihelp-rollback-example-simple": "Roll back the last edits to [[Main Page]] by user Example",
-       "apihelp-rollback-example-summary": "Roll back the last edits to [[Main Page]] by IP user 192.0.2.5 with summary \"Reverting vandalism\", and mark those edits and the revert as \"bot\"",
+       "apihelp-rollback-param-watchlist": "Unconditionally add or remove the page from the current user's watchlist, use preferences or do not change watch.",
+       "apihelp-rollback-example-simple": "Roll back the last edits to page <kbd>Main Page</kbd> by user <kbd>Example</kbd>.",
+       "apihelp-rollback-example-summary": "Roll back the last edits to page <kbd>Main Page</kbd> by IP user <kbd>192.0.2.5</kbd> with summary <kbd>Reverting vandalism</kbd>, and mark those edits and the revert as bot edits.",
 
        "apihelp-rsd-description": "Export an RSD (Really Simple Discovery) schema.",
-       "apihelp-rsd-example-simple": "Export the RSD schema",
+       "apihelp-rsd-example-simple": "Export the RSD schema.",
 
        "apihelp-setnotificationtimestamp-description": "Update the notification timestamp for watched pages.\n\nThis affects the highlighting of changed pages in the watchlist and history, and the sending of email when the \"Email me when a page on my watchlist is changed\" preference is enabled.",
        "apihelp-setnotificationtimestamp-param-entirewatchlist": "Work on all watched pages.",
        "apihelp-setnotificationtimestamp-param-timestamp": "Timestamp to which to set the notification timestamp.",
        "apihelp-setnotificationtimestamp-param-torevid": "Revision to set the notification timestamp to (one page only).",
        "apihelp-setnotificationtimestamp-param-newerthanrevid": "Revision to set the notification timestamp newer than (one page only).",
-       "apihelp-setnotificationtimestamp-example-all": "Reset the notification status for the entire watchlist",
-       "apihelp-setnotificationtimestamp-example-page": "Reset the notification status for \"Main page\"",
-       "apihelp-setnotificationtimestamp-example-pagetimestamp": "Set the notification timestamp for \"Main page\" so all edits since 1 January 2012 are unviewed",
-       "apihelp-setnotificationtimestamp-example-allpages": "Reset the notification status for pages in the User namespace",
+       "apihelp-setnotificationtimestamp-example-all": "Reset the notification status for the entire watchlist.",
+       "apihelp-setnotificationtimestamp-example-page": "Reset the notification status for <kbd>Main page</kbd>.",
+       "apihelp-setnotificationtimestamp-example-pagetimestamp": "Set the notification timestamp for <kbd>Main page</kbd> so all edits since 1 January 2012 are unviewed.",
+       "apihelp-setnotificationtimestamp-example-allpages": "Reset the notification status for pages in the <kbd>{{ns:user}}</kbd> namespace.",
 
        "apihelp-tokens-description": "Get tokens for data-modifying actions.\n\nThis module is deprecated in favor of [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].",
        "apihelp-tokens-param-type": "Types of token to request.",
        "apihelp-tokens-example-emailmove": "Retrieve an email token and a move token.",
 
        "apihelp-unblock-description": "Unblock a user.",
-       "apihelp-unblock-param-id": "ID of the block to unblock (obtained through list=blocks). Cannot be used together with $1user.",
-       "apihelp-unblock-param-user": "Username, IP address or IP range to unblock. Cannot be used together with $1id.",
+       "apihelp-unblock-param-id": "ID of the block to unblock (obtained through <kbd>list=blocks</kbd>). Cannot be used together with <var>$1user</var>.",
+       "apihelp-unblock-param-user": "Username, IP address or IP range to unblock. Cannot be used together with <var>$1id</var>.",
        "apihelp-unblock-param-reason": "Reason for unblock.",
-       "apihelp-unblock-example-id": "Unblock block ID #105",
-       "apihelp-unblock-example-user": "Unblock user Bob with reason \"Sorry Bob\"",
+       "apihelp-unblock-example-id": "Unblock block ID #<kbd>105</kbd>.",
+       "apihelp-unblock-example-user": "Unblock user <kbd>Bob</kbd> with reason <kbd>Sorry Bob</kbd>.",
 
        "apihelp-undelete-description": "Restore revisions of a deleted page.\n\nA list of deleted revisions (including timestamps) can be retrieved through [[Special:ApiHelp/query+deletedrevs|list=deletedrevs]], and a list of deleted file IDs can be retrieved through [[Special:ApiHelp/query+filearchive|list=filearchive]].",
        "apihelp-undelete-param-title": "Title of the page to restore.",
        "apihelp-undelete-param-reason": "Reason for restoring.",
-       "apihelp-undelete-param-timestamps": "Timestamps of the revisions to restore. If both $1timestamps and $1fileids are empty, all will be restored.",
-       "apihelp-undelete-param-fileids": "IDs of the file revisions to restore. If both $1timestamps and $1fileids are empty, all will be restored.",
-       "apihelp-undelete-param-watchlist": "Unconditionally add or remove the page from your watchlist, use preferences or do not change watch.",
-       "apihelp-undelete-example-page": "Undelete [[Main Page]]",
-       "apihelp-undelete-example-revisions": "Undelete two revisions of [[Main Page]]",
+       "apihelp-undelete-param-timestamps": "Timestamps of the revisions to restore. If both <var>$1timestamps</var> and <var>$1fileids</var> are empty, all will be restored.",
+       "apihelp-undelete-param-fileids": "IDs of the file revisions to restore. If both <var>$1timestamps</var> and <var>$1fileids</var> are empty, all will be restored.",
+       "apihelp-undelete-param-watchlist": "Unconditionally add or remove the page from the current user's watchlist, use preferences or do not change watch.",
+       "apihelp-undelete-example-page": "Undelete page <kbd>Main Page</kbd>.",
+       "apihelp-undelete-example-revisions": "Undelete two revisions of page <kbd>Main Page</kbd>.",
 
-       "apihelp-upload-description": "Upload a file, or get the status of pending uploads.\n\nSeveral methods are available:\n* Upload file contents directly, using the \"$1file\" parameter.\n* Upload the file in pieces, using the \"$1filesize\", \"$1chunk\" and \"$1offset\" parameters.* Have the MediaWiki server fetch a file from a URL, using the \"$1url\" parameter.\n* Complete an earlier upload that failed due to warnings, using the \"$1filekey\" parameter.\nNote that the HTTP POST must be done as a file upload (i.e. using multipart/form-data) when sending the \"$1file\".",
+       "apihelp-upload-description": "Upload a file, or get the status of pending uploads.\n\nSeveral methods are available:\n* Upload file contents directly, using the <var>$1file</var> parameter.\n* Upload the file in pieces, using the <var>$1filesize</var>, <var>$1chunk</var>, and <var>$1offset</var> parameters.* Have the MediaWiki server fetch a file from a URL, using the <var>$1url</var> parameter.\n* Complete an earlier upload that failed due to warnings, using the <var>$1filekey</var> parameter.\nNote that the HTTP POST must be done as a file upload (i.e. using <code>multipart/form-data</code>) when sending the <var>$1file</var>.",
        "apihelp-upload-param-filename": "Target filename.",
-       "apihelp-upload-param-comment": "Upload comment. Also used as the initial page text for new files if \"$1text\" is not specified.",
+       "apihelp-upload-param-comment": "Upload comment. Also used as the initial page text for new files if <var>$1text</var> is not specified.",
        "apihelp-upload-param-text": "Initial page text for new files.",
        "apihelp-upload-param-watch": "Watch the page.",
-       "apihelp-upload-param-watchlist": "Unconditionally add or remove the page from your watchlist, use preferences or do not change watch.",
+       "apihelp-upload-param-watchlist": "Unconditionally add or remove the page from the current user's watchlist, use preferences or do not change watch.",
        "apihelp-upload-param-ignorewarnings": "Ignore any warnings.",
        "apihelp-upload-param-file": "File contents.",
        "apihelp-upload-param-url": "URL to fetch the file from.",
        "apihelp-upload-param-leavemessage": "If asyncdownload is used, leave a message on the user talk page if finished.",
        "apihelp-upload-param-statuskey": "Fetch the upload status for this file key (upload by URL).",
        "apihelp-upload-param-checkstatus": "Only fetch the upload status for the given file key.",
-       "apihelp-upload-example-url": "Upload from a URL",
-       "apihelp-upload-example-filekey": "Complete an upload that failed due to warnings",
+       "apihelp-upload-example-url": "Upload from a URL.",
+       "apihelp-upload-example-filekey": "Complete an upload that failed due to warnings.",
 
        "apihelp-userrights-description": "Change a user's group membership.",
        "apihelp-userrights-param-user": "User name.",
        "apihelp-userrights-param-add": "Add the user to these groups.",
        "apihelp-userrights-param-remove": "Remove the user from these groups.",
        "apihelp-userrights-param-reason": "Reason for the change.",
-       "apihelp-userrights-example-user": "Add user FooBot to group \"bot\", and remove from groups \"sysop\" and \"bureaucrat\"",
-       "apihelp-userrights-example-userid": "Add the user with ID 123 to group \"bot\", and remove from groups \"sysop\" and \"bureaucrat\"",
+       "apihelp-userrights-example-user": "Add user <kbd>FooBot</kbd> to group <kbd>bot</kbd>, and remove from groups <kbd>sysop</kbd> and <kbd>bureaucrat</kbd>.",
+       "apihelp-userrights-example-userid": "Add the user with ID <kbd>123</kbd> to group <kbd>bot</kbd>, and remove from groups <kbd>sysop</kbd> and <kbd>bureaucrat</kbd>.",
 
        "apihelp-watch-description": "Add or remove pages from the current user's watchlist.",
-       "apihelp-watch-param-title": "The page to (un)watch. Use $1titles instead.",
+       "apihelp-watch-param-title": "The page to (un)watch. Use <var>$1titles</var> instead.",
        "apihelp-watch-param-unwatch": "If set the page will be unwatched rather than watched.",
-       "apihelp-watch-example-watch": "Watch the page \"Main Page\"",
-       "apihelp-watch-example-unwatch": "Unwatch the page \"Main Page\"",
-       "apihelp-watch-example-generator": "Watch the first few pages in the main namespace",
-
-       "apihelp-format-example-generic": "Format the query result in the $1 format",
-       "apihelp-dbg-description": "Output data in PHP's var_export() format.",
-       "apihelp-dbgfm-description": "Output data in PHP's var_export() format (pretty-print in HTML).",
-       "apihelp-dump-description": "Output data in PHP's var_dump() format.",
-       "apihelp-dumpfm-description": "Output data in PHP's var_dump() format (pretty-print in HTML).",
+       "apihelp-watch-example-watch": "Watch the page <kbd>Main Page</kbd>.",
+       "apihelp-watch-example-unwatch": "Unwatch the page <kbd>Main Page</kbd>.",
+       "apihelp-watch-example-generator": "Watch the first few pages in the main namespace.",
+
+       "apihelp-format-example-generic": "Format the query result in the $1 format.",
+       "apihelp-dbg-description": "Output data in PHP's <code>var_export()</code> format.",
+       "apihelp-dbgfm-description": "Output data in PHP's <code>var_export()</code> format (pretty-print in HTML).",
+       "apihelp-dump-description": "Output data in PHP's <code>var_dump()</code> format.",
+       "apihelp-dumpfm-description": "Output data in PHP's <code>var_dump()</code> format (pretty-print in HTML).",
        "apihelp-json-description": "Output data in JSON format.",
        "apihelp-json-param-callback": "If specified, wraps the output into a given function call. For safety, all user-specific data will be restricted.",
        "apihelp-json-param-utf8": "If specified, encodes most (but not all) non-ASCII characters as UTF-8 instead of replacing them with hexadecimal escape sequences.",
        "apihelp-php-description": "Output data in serialized PHP format.",
        "apihelp-phpfm-description": "Output data in serialized PHP format (pretty-print in HTML).",
        "apihelp-rawfm-description": "Output data with the debugging elements in JSON format (pretty-print in HTML).",
-       "apihelp-txt-description": "Output data in PHP's print_r() format.",
-       "apihelp-txtfm-description": "Output data in PHP's print_r() format (pretty-print in HTML).",
+       "apihelp-txt-description": "Output data in PHP's <code>print_r()</code> format.",
+       "apihelp-txtfm-description": "Output data in PHP's <code>print_r()</code> format (pretty-print in HTML).",
        "apihelp-wddx-description": "Output data in WDDX format.",
        "apihelp-wddxfm-description": "Output data in WDDX format (pretty-print in HTML).",
        "apihelp-xml-description": "Output data in XML format.",
-       "apihelp-xml-param-xslt": "If specified, adds &lt;xslt&gt; as stylesheet. This should be a wiki page in the MediaWiki namespace whose page name ends with \".xsl\".",
+       "apihelp-xml-param-xslt": "If specified, adds the named page as an XSL stylesheet. The value must be a title in the {{ns:mediawiki}} namespace ending in <code>.xsl</code>.",
        "apihelp-xml-param-includexmlnamespace": "If specified, adds an XML namespace.",
        "apihelp-xmlfm-description": "Output data in XML format (pretty-print in HTML).",
        "apihelp-yaml-description": "Output data in YAML format.",
        "apihelp-yamlfm-description": "Output data in YAML format (pretty-print in HTML).",
 
        "api-format-title": "MediaWiki API result",
-       "api-format-prettyprint-header": "You are looking at the HTML representation of the $1 format. HTML is good for debugging, but is unsuitable for application use.\n\nSpecify the format parameter to change the output format. To see the non-HTML representation of the $1 format, set format=$2.\n\nSee the [https://www.mediawiki.org/wiki/API complete documentation], or [[Special:ApiHelp/main|API help]] for more information.",
+       "api-format-prettyprint-header": "This is the HTML representation of the $1 format. HTML is good for debugging, but is unsuitable for application use.\n\nSpecify the <var>format</var> parameter to change the output format. To see the non-HTML representation of the $1 format, set <kbd>format=$2</kbd>.\n\nSee the [[mw:API|complete documentation]], or the [[Special:ApiHelp/main|API help]] for more information.",
 
        "api-orm-param-props": "Fields to query.",
        "api-orm-param-limit": "Max amount of rows to return.",
        "api-pageset-param-titles": "A list of titles to work on.",
        "api-pageset-param-pageids": "A list of page IDs to work on.",
        "api-pageset-param-revids": "A list of revision IDs to work on.",
-       "api-pageset-param-generator": "Get the list of pages to work on by executing the specified query module.\n\n'''NOTE:''' generator parameter names must be prefixed with a \"g\", see examples.",
-       "api-pageset-param-redirects-generator": "Automatically resolve redirects in $1titles, $1pageids, and $1revids, and in pages returned by $1generator.",
-       "api-pageset-param-redirects-nogenerator": "Automatically resolve redirects in $1titles, $1pageids, and $1revids.",
+       "api-pageset-param-generator": "Get the list of pages to work on by executing the specified query module.\n\n<strong>Note:</strong> Generator parameter names must be prefixed with a \"g\", see examples.",
+       "api-pageset-param-redirects-generator": "Automatically resolve redirects in <var>$1titles</var>, <var>$1pageids</var>, and <var>$1revids</var>, and in pages returned by <var>$1generator</var>.",
+       "api-pageset-param-redirects-nogenerator": "Automatically resolve redirects in <var>$1titles</var>, <var>$1pageids</var>, and <var>$1revids</var>.",
        "api-pageset-param-converttitles": "Convert titles to other variants if necessary. Only works if the wiki's content language supports variant conversion. Languages that support variant conversion include $1.",
 
        "api-help-title": "MediaWiki API help",
        "api-help-parameters": "{{PLURAL:$1|Parameter|Parameters}}:",
        "api-help-param-deprecated": "Deprecated.",
        "api-help-param-required": "This parameter is required.",
-       "api-help-param-list": "{{PLURAL:$1|1=One value|2=Values (separate with \"{{!}}\")}}: $2",
+       "api-help-param-list": "{{PLURAL:$1|1=One value|2=Values (separate with <kbd>{{!}}</kbd>)}}: $2",
        "api-help-param-list-can-be-empty": "{{PLURAL:$1|0=Must be empty|Can be empty, or $2}}",
        "api-help-param-limit": "No more than $1 allowed.",
        "api-help-param-limit2": "No more than $1 ($2 for bots) allowed.",
        "api-help-param-integer-max": "The {{PLURAL:$1|1=value|2=values}} must be no greater than $3.",
        "api-help-param-integer-minmax": "The {{PLURAL:$1|1=value|2=values}} must be between $2 and $3.",
        "api-help-param-upload": "Must be posted as a file upload using multipart/form-data.",
-       "api-help-param-multi-separate": "Separate values with \"|\".",
+       "api-help-param-multi-separate": "Separate values with <kbd>|</kbd>.",
        "api-help-param-multi-max": "Maximum number of values is {{PLURAL:$1|$1}} ({{PLURAL:$2|$2}} for bots).",
        "api-help-param-default": "Default: $1",
        "api-help-param-default-empty": "Default: <span class=\"apihelp-empty\">(empty)</span>",
        "api-help-param-token": "A \"$1\" token retrieved from [[Special:ApiHelp/query+tokens|action=query&meta=tokens]]",
        "api-help-param-token-webui": "For compatibility, the token used in the web UI is also accepted.",
-       "api-help-param-disabled-in-miser-mode": "Disabled due to [https://www.mediawiki.org/wiki/Manual:$wgMiserMode miser mode].",
-       "api-help-param-limited-in-miser-mode": "'''NOTE:''' Due to [https://www.mediawiki.org/wiki/Manual:$wgMiserMode miser mode], using this may result in fewer than \"$1limit\" results returned before continuing; in extreme cases, zero results may be returned.",
+       "api-help-param-disabled-in-miser-mode": "Disabled due to [[mw:Manual:$wgMiserMode|miser mode]].",
+       "api-help-param-limited-in-miser-mode": "<strong>Note:</strong> Due to [[mw:Manual:$wgMiserMode|miser mode]], using this may result in fewer than <var>$1limit</var> results returned before continuing; in extreme cases, zero results may be returned.",
        "api-help-param-direction": "In which direction to enumerate:\n;newer:List oldest first. Note: $1start has to be before $1end.\n;older:List newest first (default). Note: $1start has to be later than $1end.",
        "api-help-param-continue": "When more results are available, use this to continue.",
        "api-help-param-no-description": "<span class=\"apihelp-empty\">(no description)</span>",
index 7964b15..1b17871 100644 (file)
@@ -4,7 +4,9 @@
                        "Macofe",
                        "Effy",
                        "Alan",
-                       "Fitoschido"
+                       "Fitoschido",
+                       "JasterTDC",
+                       "Edslov"
                ]
        },
        "apihelp-main-param-action": "Qué acción se realizará.",
        "apihelp-block-description": "Bloquear usuario",
        "apihelp-block-param-user": "El nombre de usuario, dirección IP o intervalo de IP que quieres bloquear.",
        "apihelp-block-param-reason": "Razón para el bloqueo.",
-       "apihelp-block-param-anononly": "Bloquear solo usuarios anónimos (es decir, desactivar ediciones anónimas de esta IP).",
+       "apihelp-block-param-anononly": "Bloquear solo usuarios anónimos (es decir, desactivar ediciones anónimas de esta dirección IP).",
        "apihelp-block-param-nocreate": "Prevenir la creación de cuentas.",
+       "apihelp-block-param-reblock": "Si la cuenta ya está bloqueada, sobrescribir el bloqueo existente.",
+       "apihelp-block-param-watchuser": "Vigilar las páginas de usuario y de discusión del usuario o de la dirección IP.",
        "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-createaccount-example-pass": "Crear usuario <kbd>testuser</kbd> con la contraseña <kbd>test123</kbd>.",
        "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-delete-example-simple": "Borrar la Página Principal",
+       "apihelp-delete-param-watch": "Añadir esta página a la lista de seguimiento del usuario actual.",
+       "apihelp-delete-param-unwatch": "Quitar la página de la lista de seguimiento del usuario actual.",
+       "apihelp-delete-example-simple": "Borrar la <kbd>Página principal</kbd>",
        "apihelp-disabled-description": "Se desactivó este módulo.",
        "apihelp-edit-description": "Crear y editar páginas.",
        "apihelp-edit-param-sectiontitle": "El título de una sección nueva.",
        "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-param-watch": "Añadir la página a la lista de seguimiento del usuario actual.",
+       "apihelp-edit-param-unwatch": "Quitar la página de la lista de seguimiento del usuario actual.",
        "apihelp-edit-example-edit": "Editar una página",
-       "apihelp-edit-example-prepend": "Anteponer _&#95;NOTOC_&#95; a una página",
+       "apihelp-edit-example-prepend": "Anteponer <kbd>_&#95;NOTOC_&#95;</kbd> 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.",
@@ -58,7 +62,7 @@
        "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-hidemyself": "Ocultar los cambios realizados por el usuario actual.",
        "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.",
@@ -66,6 +70,7 @@
        "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-feedwatchlist-example-all6hrs": "Mostrar todos los cambios en páginas vigiladas en las últimas 6 horas.",
        "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-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-managetags-param-reason": "Un motivo opcional para crear, eliminar, activar o desactivar la etiqueta.",
        "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-reason": "Motivo del cambio de nombre.",
+       "apihelp-move-param-movetalk": "Renombrar la página de discusión si existe.",
+       "apihelp-move-param-movesubpages": "Renombrar 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-watch": "Añadir la página y su redirección a la lista de seguimiento del usuario actual.",
+       "apihelp-move-param-unwatch": "Eliminar la página y la redirección de la lista de seguimiento del usuario.",
        "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-paraminfo-description": "Obtener información acerca de los módulos de la API.",
+       "apihelp-paraminfo-param-helpformat": "Formato de las cadenas de ayuda.",
        "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+alldeletedrevisions-paraminfo-nonuseronly": "No puede ser utilizado con <var>$3user</var>.",
        "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+alllinks-example-unique-generator": "Obtiene todos los títulos enlazados, marcando los que falten.",
+       "apihelp-query+allpages-example-B": "Mostrar una lista de páginas que empiecen con la letra <kbd>B</kbd>.",
        "apihelp-query+allusers-param-activeusers": "Solo listar usuarios activos en {{PLURAL:$1|el último día|los $1 últimos días}}.",
+       "apihelp-query+backlinks-param-pageid": "Identificador de página que buscar. No puede usarse junto con <var>$1title</var>",
+       "apihelp-query+backlinks-example-simple": "Mostrar enlaces a la <kbd>Portada<kbd>.",
+       "apihelp-query+blocks-example-simple": "Listar bloques.",
+       "apihelp-query+categoryinfo-example-simple": "Obtener información acerca de <kbd>Category:Foo</kbd> y <kbd>Category:Bar</kbd>",
+       "apihelp-query+categorymembers-example-generator": "Obtener información sobre las primeras 10 páginas de la <kbd>Categoría:Física</kbd>",
+       "apihelp-query+deletedrevs-example-mode3-talk": "Listar las primeras 50 páginas en el espacio de nombres {{ns:talk}} (modo 3).",
+       "apihelp-query+duplicatefiles-example-simple": "Buscar duplicados de [[:File:Alber Einstein Head.jpg]].",
+       "apihelp-query+duplicatefiles-example-generated": "Buscar duplicados en todos los ficheros.",
+       "apihelp-query+exturlusage-example-simple": "Mostrar páginas que enlacen con <kbd>http://www.mediawiki.org</kbd>.",
+       "apihelp-query+filerepoinfo-example-simple": "Obtener información acerca de los repositorios de archivos.",
        "apihelp-query+images-description": "Devuelve todos los archivos contenidos en las páginas dadas.",
+       "apihelp-query+images-example-simple": "Obtener una lista de los archivos usados en la [[Main Page|Portada]].",
+       "apihelp-query+imageusage-example-simple": "Mostrar las páginas que usan [[:File:Albert Einstein Head.jpg]].",
+       "apihelp-query+imageusage-example-generator": "Obtener información sobre las páginas que empleen [[:File:Albert Einstein Head.jpg]].",
+       "apihelp-query+info-example-protection": "Obtén información general y protección acerca de la página <kb>Página principal</kbd>.",
+       "apihelp-query+iwbacklinks-example-simple": "Obtener las páginas enlazadas a [[wikibooks:Test]]",
+       "apihelp-query+langbacklinks-example-simple": "Obtener las páginas enlazadas a [[:fr:Test]]",
+       "apihelp-query+linkshere-example-generator": "Obtener información acerca de las páginas enlazadas a la [[Main Page|Portada]].",
+       "apihelp-query+protectedtitles-example-generator": "Encuentra enlaces a títulos protegidos en el espacio de nombres principal.",
+       "apihelp-query+recentchanges-example-simple": "Lista de cambios recientes.",
+       "apihelp-query+redirects-example-simple": "Mostrar una lista de las redirecciones a la [[Main Page|Portada]]",
+       "apihelp-query+revisions-example-last5": "Mostrar las últimas 5 revisiones de la <kbd>Portada</kbd>.",
        "apihelp-query+search-param-info": "Qué metadatos devolver.",
+       "apihelp-query+search-example-text": "Buscar <kbd>meaning</kbd> en los textos.",
+       "apihelp-query+siteinfo-example-simple": "Obtener información del sitio.",
+       "apihelp-query+usercontribs-example-user": "Mostrar contribuciones del usuario <kbd>Ejemplo</kbd>.",
+       "apihelp-query+usercontribs-example-ipprefix": "Mostrar las contribuciones de todas las direcciones IP con el prefijo <kbd>192.0.2.</kbd>.",
        "apihelp-query+userinfo-description": "Obtener información sobre el usuario actual.",
        "apihelp-query+watchlist-param-excludeuser": "No listar cambios de este usuario.",
        "apihelp-query+watchlistraw-param-show": "Sólo listar los elementos que cumplen estos criterios.",
+       "apihelp-query+watchlistraw-example-simple": "Listar las páginas de la lista de seguimiento del usuario actual.",
+       "apihelp-unblock-example-user": "Desbloquear al usuario <kbd>Bob</kbd> con el motivo <kbd>Lo siento, Bob</kbd>",
+       "apihelp-undelete-example-revisions": "Restaurar dos revisiones de la página <kbd>Portada</kbd>.",
+       "apihelp-upload-example-url": "Subir desde una URL.",
+       "apihelp-userrights-example-user": "Agregar al usuario <kbd>FooBot</kbd> al grupo <kbd>bot</kbd> y eliminarlo de los grupos <kbd>sysop</kbd> y <kbd>burócrata</kbd>.",
+       "apihelp-watch-example-watch": "Vigilar la página <kbd>Portada</kbd>.",
+       "apihelp-watch-example-unwatch": "Dejar de vigilar la <kbd>Portada</kbd>.",
        "api-help-parameters": "{{PLURAL:$1|Parámetro|Parámetros}}:",
+       "api-help-param-multi-separate": "Separar los valores con <kbd>|</kbd>.",
        "api-help-examples": "{{PLURAL:$1|Ejemplo|Ejemplos}}:"
 }
index ca6f4c8..574bd2f 100644 (file)
@@ -5,21 +5,53 @@
                ]
        },
        "apihelp-block-description": "Blokeatu erabiltzaile bat.",
+       "apihelp-createaccount-description": "Erabiltzaile kontu berria sortu.",
+       "apihelp-createaccount-param-email": "Erabiltzailearen helbide elektronikoa (aukerakoa).",
+       "apihelp-createaccount-param-realname": "Erabiltzailearen benetako izena (aukerakoa).",
+       "apihelp-delete-description": "Orrialde bat ezabatu.",
+       "apihelp-edit-description": "Orrialdeak sortu eta aldatu.",
        "apihelp-edit-param-minor": "Aldaketa txikia.",
+       "apihelp-edit-example-edit": "Orrialde bat aldatu",
        "apihelp-expandtemplates-param-title": "Orrialdearen izenburua.",
+       "apihelp-feedcontributions-param-year": "Urtetik aurrera (eta lehenagotik)",
+       "apihelp-feedcontributions-param-month": "Hilabetetik aurrera (eta lehenagotik)",
+       "apihelp-feedrecentchanges-param-hideminor": "Ezkutatu aldaketa txikiak.",
+       "apihelp-feedrecentchanges-param-hidebots": "Ezkutatu botek egindako aldaketak.",
+       "apihelp-feedrecentchanges-param-hideanons": "Ezkutatu erabiltzaile anonimoek egindako aldaketak.",
+       "apihelp-feedrecentchanges-param-hideliu": "Ezkutatu izena emandako erabiltzaileek egindako aldaketak.",
+       "apihelp-feedrecentchanges-param-hidepatrolled": "Ezkutatu zainpeko aldaketak.",
+       "apihelp-feedrecentchanges-param-hidemyself": "Ezkutatu zuk egindako aldaketak.",
+       "apihelp-feedrecentchanges-param-tagfilter": "Iragazi etiketen arabera.",
+       "apihelp-feedrecentchanges-example-simple": "Erakutsi aldaketa berriak",
+       "apihelp-feedrecentchanges-example-30days": "Erakutsi aldaketa berriak 30 egunez",
        "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",
+       "apihelp-query+allusers-param-witheditsonly": "Bakarrik zerrendatu aldaketak egin dituzten erabiltzaileak.",
+       "apihelp-query+allusers-param-activeusers": "Bakarrik zerrendatu azken {{PLURAL:$1|eguneko|$1 egunetako}} erabiltzaile aktiboak.",
+       "apihelp-query+imageinfo-param-urlheight": "$1urlwidth-en antzekoa.",
+       "apihelp-query+imageusage-example-simple": "Erakutsi [[:File:Albert Einstein Head.jpg]] darabilten orriak",
+       "apihelp-query+prefixsearch-param-search": "Bilatu katea.",
+       "apihelp-query+protectedtitles-example-simple": "Zerrendatu babestutako izenburuak",
+       "apihelp-query+recentchanges-example-simple": "Zerrendatu aldaketa berriak.",
+       "apihelp-upload-example-url": "Igo URL batetik.",
+       "apihelp-userrights-param-reason": "Aldaketarako arrazoia.",
        "api-help-main-header": "Modulu nagusia",
        "api-help-flag-deprecated": "Modulu hau zaharkitua dago.",
+       "api-help-parameters": "{{PLURAL:$1|Parametroa|Parametroak}}:",
        "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-limit": "Ez dira $1 baino gehiago onartzen.",
+       "api-help-param-limit2": "Ez dira $1 ($2 botentzat) baino gehiago onartzen.",
+       "api-help-param-default": "Lehenetsia: $1",
+       "api-help-param-default-empty": "Lehenetsia: <span class=\"apihelp-empty\">(hutsik)</span>",
        "api-help-param-no-description": "<span class=\"apihelp-empty\">(deskribapenik gabe)</span>",
        "api-help-examples": "{{PLURAL:$1|Adibidea|Adibideak}}:",
+       "api-help-permissions": "{{PLURAL:$1|Baimena|Baimenak}}:",
        "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 c8a49ba..7a0c773 100644 (file)
        "apihelp-block-param-autoblock": "به طور خودکار آخرین نشانی آی‌پی استفاده‌شده، و هر نشانی پس از آن که سعی می‌کند از آن داخل شود را ببند.",
        "apihelp-block-param-noemail": "از کاربر در برابر ارسال پست الکترونیکی از طریق ویکی جلوگیری شود. (نیازمند دسترسی «blockemail» است).",
        "apihelp-block-param-hidename": "نام کاربری را از سیاههٔ بستن پنهان کن. (نیازمند دسترسی «hideuser» است).",
-       "apihelp-block-param-allowusertalk": "به کاربر برای ویرایش صفحه بحث‌شان اجازه دهید (بسته به $wgBlockAllowsUTEdit).",
+       "apihelp-block-param-allowusertalk": "به کاربر برای ویرایش صفحه بحث‌شان اجازه دهید (بسته به <var>[[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>).",
        "apihelp-block-param-reblock": "اگر کاربر پیش از این مسدود شده‌است، مسدود موجود را بازنویسی کن.",
        "apihelp-block-param-watchuser": "صفحه‌های کاربر و بحث کاربر نشانی آی‌پی یا کاربر را پی‌گیری کنید.",
        "apihelp-block-example-ip-simple": "آی‌پی ۱۹۲.۰.۲.۵ را برای سه روز همراه دلیل «نخستین برخورد» ببندید",
-       "apihelp-clearhasmsg-description": "پرچم hasmsg را برای کاربر جاری پاک کن.",
-       "apihelp-clearhasmsg-example-1": "پاک‌کردن پرچم hasmsg برای کاربر جاری",
+       "apihelp-clearhasmsg-description": "پرچم <code>hasmsg</code> را برای کاربر جاری پاک کن.",
+       "apihelp-clearhasmsg-example-1": "پاک‌کردن پرچم <code>hasmsg</code> برای کاربر جاری",
        "apihelp-compare-description": "تفاوت بین ۲ صفحه را بیابید.\n\nشما باید یک شماره بازبینی، یک عنوان صفحه، یا یک شناسه صفحه برای هر دو «از» و «به» مشخص کنید.",
        "apihelp-compare-param-fromtitle": "عنوان اول برای مقایسه.",
        "apihelp-compare-param-fromid": "شناسه صفحه اول برای مقایسه.",
@@ -36,7 +36,7 @@
        "apihelp-compare-example-1": "ایجاد تفاوت بین نسخه 1 و 2",
        "apihelp-createaccount-description": "ایجاد حساب کاربری",
        "apihelp-createaccount-param-name": "نام کاربری.",
-       "apihelp-createaccount-param-password": "رمز عبور (نادیده گرفته می‌شود اگر $1mailpassword تنظیم شده‌باشد).",
+       "apihelp-createaccount-param-password": "رمز عبور (نادیده گرفته می‌شود اگر <var>$1mailpassword</var> تنظیم شده‌باشد).",
        "apihelp-createaccount-param-domain": "دامنه برای احراز هویت خارجی (اختیاری).",
        "apihelp-createaccount-param-email": "رایانامه کاربر (اختیاری)",
        "apihelp-createaccount-param-realname": "نام واقعی کاربر (اختیاری).",
        "apihelp-filerevert-param-filename": "نام پروندهٔ مقصد، بدون پیشوند پرونده:.",
        "apihelp-filerevert-param-comment": "ارسال دیدگاه.",
        "apihelp-filerevert-param-archivename": "نام بایگانی بازبینی برای برگرداندن.",
-       "apihelp-filerevert-example-revert": "برگرداندن Wiki.png به نسخهٔ 2011-03-05T15:27:40Z",
+       "apihelp-filerevert-example-revert": "برگرداندن <kbd>Wiki.png</kbd> به نسخهٔ <kbd>2011-03-05T15:27:40Z</kbd>",
        "apihelp-help-description": "راهنما برای پودمان‌های مشخص‌شده را نمایش دهید.",
        "apihelp-help-param-helpformat": "قالب‌بندی خروجی راهنما.",
        "apihelp-help-example-main": "راهنما برای پودمان اصلی",
index 53840a6..6f7ccf3 100644 (file)
@@ -4,37 +4,40 @@
                        "Gomoko",
                        "Windes",
                        "Orlodrim",
-                       "McDutchie"
+                       "McDutchie",
+                       "Element303",
+                       "Macofe",
+                       "Linedwell"
                ]
        },
-       "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-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Documentation]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Liste de diffusion]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Annonces de l’API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bogues et demandes]\n</div>\n<strong>État :</strong> Toutes les fonctionnalités affichées sur cette page devraient fonctionner, mais l’API est encore en cours de développement et peut changer à tout moment. Inscrivez-vous à [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ la liste de diffusion mediawiki-api-announce] pour être informé des mises à jour.\n\n<strong>Requêtes erronées :</strong> Si des requêtes erronées sont envoyées à l’API, un en-tête HTTP sera renvoyé avec la clé « MediaWiki-API-Error ». La valeur de cet en-tête et le code d’erreur renvoyé prendront la même valeur. Pour plus d’information, voyez [[mw:API:Errors_and_warnings|API: Errors and warnings]].",
        "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.",
-       "apihelp-main-param-smaxage": "Fixer l’entête s-maxage à ce nombre de secondes. Les erreurs ne sont jamais mises en cache.",
-       "apihelp-main-param-maxage": "Fixer l’entête max-age à ce nombre de secondes. Les erreurs ne sont jamais mises en cache.",
-       "apihelp-main-param-assert": "Vérifier si l’utilisateur est connecté si positionné à « user », ou a le droit utilisateur robot si positionné à « bot ».",
+       "apihelp-main-param-maxlag": "La latence maximale peut être utilisée quand MédiaWiki est installé sur un cluster de base de données répliqué. Pour éviter des actions provoquant un supplément de latence de réplication de site, ce paramètre peut faire attendre le client jusqu’à ce que la latence de réplication soit inférieure à une valeur spécifiée. En cas de latence excessive, le code d’erreur <samp>maxlag</samp> est renvoyé avec un message tel que <samp>Attente de $host : $lag secondes de délai</samp>.<br />Voyez [[mw:Manual:Maxlag_parameter|Manuel: Maxlag parameter]] pour plus d’information.",
+       "apihelp-main-param-smaxage": "Fixer l’entête <code>s-maxage</code> à ce nombre de secondes. Les erreurs ne sont jamais mises en cache.",
+       "apihelp-main-param-maxage": "Fixer l’entête <code>max-age</code> à ce nombre de secondes. Les erreurs ne sont jamais mises en cache.",
+       "apihelp-main-param-assert": "Vérifier si l’utilisateur est connecté si positionné à <kbd>user</kbd>, ou a le droit utilisateur robot si positionné à <kbd>bot</kbd>.",
        "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 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-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 <code>Origin</code> header, donc il doit être fixé avec quelque chose comme <kbd>https://en.wikipedia.org</kbd> ou <kbd>https://meta.wikimedia.org</kbd>. Si ce paramètre ne correspond pas à l’entête <code>Origin</code>, une réponse 403 sera renvoyée. Si ce paramètre correspond à l’entête <code>Origin</code> et que l’origine est en liste blanche, un entête <code>Access-Control-Allow-Origin</code> sera positionné.",
+       "apihelp-main-param-uselang": "Langue à utiliser pour les traductions de message. Une liste de codes peut être analysée depuis <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> avec <kbd>siprop=languages</kbd>, ou en spécifiant <kbd>user</kbd> pour utiliser la préférence de langue de l’utilisateur actuel, ou en spécifiant <kbd>content</kbd> 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-block-param-expiry": "Durée d’expiration. Peut être relative (par ex. « 5 mois » ou « 2 semaines ») ou absolue (par ex. « 2014-09-18T12:34:56Z »). Si elle est mise à « infinite », « indefinite » ou « never », le blocage n’expirera jamais.",
+       "apihelp-block-param-expiry": "Durée d’expiration. Peut être relative (par ex. <kbd>5 months</kbd> ou <kbd>2 weeks</kbd>) ou absolue (par ex. <kbd>2014-09-18T12:34:56Z</kbd>). Si elle est mise à <kbd>infinite</kbd>, <kbd>indefinite</kbd> ou <kbd>never</kbd>, le blocage n’expirera jamais.",
        "apihelp-block-param-reason": "Motif du blocage.",
        "apihelp-block-param-anononly": "Bloquer uniquement les utilisateurs anonymes (c’est-à-dire désactiver les modifications anonymes pour cette adresse IP).",
        "apihelp-block-param-nocreate": "Empêcher la création de compte.",
        "apihelp-block-param-autoblock": "Bloquer automatiquement la dernière adresse IP utilisée, et toute les adresses IP subséquentes depuis lesquelles ils ont essayé de se connecter.",
-       "apihelp-block-param-noemail": "Empêcher l’utilisateur d’envoyer des courriels via le wiki (nécessite le doit « blockemail »).",
-       "apihelp-block-param-hidename": "Masque le nom de l’utilisateur dans le journal des blocages (nécessite le droit « hideuser »).",
-       "apihelp-block-param-allowusertalk": "Autoriser les utilisateurs à modifier leur propre page de discussion (dépend de $wgBlockAllowsUTEdit).",
+       "apihelp-block-param-noemail": "Empêcher l’utilisateur d’envoyer des courriels via le wiki (nécessite le doit <code>blockemail</code>).",
+       "apihelp-block-param-hidename": "Masque le nom de l’utilisateur dans le journal des blocages (nécessite le droit <code>hideuser</code>).",
+       "apihelp-block-param-allowusertalk": "Autoriser les utilisateurs à modifier leur propre page de discussion (dépend de <var>[[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>).",
        "apihelp-block-param-reblock": "Si l’utilisateur est déjà bloqué, écraser le blocage existant.",
        "apihelp-block-param-watchuser": "Surveiller les pages utilisateur et de discussion de l’utilisateur ou de l’adresse IP.",
-       "apihelp-block-example-ip-simple": "Bloquer l’adresse IP 192.0.2.5 pour trois jours avec le motif « Premier avertissement ».",
-       "apihelp-block-example-user-complex": "Bloquer indéfiniment l’utilisateur Vandale avec le motif « Vandalisme », et empêcher la création de nouveau compte et de courriel",
-       "apihelp-clearhasmsg-description": "Efface le drapeau hasmsg pour l’utilisateur courant.",
-       "apihelp-clearhasmsg-example-1": "Effacer le drapeau hasmsg pour l’utilisateur courant",
+       "apihelp-block-example-ip-simple": "Bloquer l’adresse IP <kbd>192.0.2.5</kbd> pour trois jours avec le motif <kbd>Premier avertissement</kbd>.",
+       "apihelp-block-example-user-complex": "Bloquer indéfiniment l’utilisateur <kbd>Vandale</kbd> avec le motif <kbd>Vandalisme</kbd>, et empêcher la création de nouveau compte et l'envoi de courriel.",
+       "apihelp-clearhasmsg-description": "Efface le drapeau <code>hasmsg</code> pour l’utilisateur courant.",
+       "apihelp-clearhasmsg-example-1": "Effacer le drapeau <code>hasmsg</code> pour l’utilisateur courant",
        "apihelp-compare-description": "Obtenir la différence entre 2 pages.\n\nVous devez passer un numéro de révision, un titre de page, ou un ID de page, à la fois pour « from » et « to ».",
        "apihelp-compare-param-fromtitle": "Premier titre à comparer.",
        "apihelp-compare-param-fromid": "ID de la première page à comparer.",
@@ -45,7 +48,7 @@
        "apihelp-compare-example-1": "Créer une différence entre les révisions 1 et 2",
        "apihelp-createaccount-description": "Créer un nouveau compte utilisateur.",
        "apihelp-createaccount-param-name": "Nom d’utilisateur.",
-       "apihelp-createaccount-param-password": "Mot de passe (ignoré si $1mailpassword est défini).",
+       "apihelp-createaccount-param-password": "Mot de passe (ignoré si <var>$1mailpassword</var> est défini).",
        "apihelp-createaccount-param-domain": "Domaine pour l’authentification externe (facultatif).",
        "apihelp-createaccount-param-token": "Jeton de création de compte obtenu à la première requête.",
        "apihelp-createaccount-param-email": "Adresse de courriel de l’utilisateur (facultatif).",
        "apihelp-createaccount-param-mailpassword": "S’il est fixé à une valeur quelconque, un mot de passe aléatoire sera envoyé par courriel à l’utilisateur.",
        "apihelp-createaccount-param-reason": "Motif facultatif de création du compte à mettre dans les journaux.",
        "apihelp-createaccount-param-language": "Code de langue à mettre par défaut pour l’utilisateur (facultatif, par défaut langue du contenu).",
-       "apihelp-createaccount-example-pass": "Créer l’utilisateur « testuser » avec le mot de passe « test123 »",
-       "apihelp-createaccount-example-mail": "Créer l’utilisateur « testmailuser » et envoyer par courriel un mot de passe généré aléatoirement",
+       "apihelp-createaccount-example-pass": "Créer l’utilisateur <kbd>testuser</kbd> avec le mot de passe <kbd>test123</kbd>.",
+       "apihelp-createaccount-example-mail": "Créer l’utilisateur <kbd>testmailuser</kbd> et envoyer par courriel un mot de passe généré aléatoirement.",
        "apihelp-delete-description": "Supprimer une page.",
-       "apihelp-delete-param-title": "Titre de la page que vous voulez supprimer. Impossible de l’utiliser avec $1pageid.",
-       "apihelp-delete-param-pageid": "ID de la page que vous voulez supprimer. Impossible à utiliser avec $1title.",
+       "apihelp-delete-param-title": "Titre de la page que vous voulez supprimer. Impossible de l’utiliser avec <var>$1pageid</var>.",
+       "apihelp-delete-param-pageid": "ID de la page que vous voulez supprimer. Impossible à utiliser avec <var>$1title</var>.",
        "apihelp-delete-param-reason": "Motif de suppression. Si non défini, un motif généré automatiquement sera utilisé.",
-       "apihelp-delete-param-watch": "Ajouter la page à votre liste de suivi.",
+       "apihelp-delete-param-watch": "Ajouter la page à la liste de suivi de l’utilisateur actuel.",
        "apihelp-delete-param-watchlist": "Ajouter ou supprimer sans condition la page de votre liste de suivi, utiliser les préférences ou ne pas modifier le suivi.",
-       "apihelp-delete-param-unwatch": "Supprimer la page de votre liste de suivi.",
+       "apihelp-delete-param-unwatch": "Supprimer la page de la liste de suivi de l'utilisateur actuel.",
        "apihelp-delete-param-oldimage": "Le nom de l’ancienne image à supprimer tel que fourni par [[Special:ApiHelp/query+imageinfo|action=query&prop=imageinfo&iiprop=archivename]].",
-       "apihelp-delete-example-simple": "Supprimer la Page principale",
-       "apihelp-delete-example-reason": "Supprimer la Page principale avec le motif « Préparation au déplacement »",
+       "apihelp-delete-example-simple": "Supprimer <kbd>Page principale</kbd>.",
+       "apihelp-delete-example-reason": "Supprimer <kbd>Page principale</kbd> avec le motif <kbd>Préparation au déplacement</kbd>",
        "apihelp-disabled-description": "Ce module a été désactivé.",
        "apihelp-edit-description": "Créer et modifier les pages.",
-       "apihelp-edit-param-title": "Titre de la page que vous voulez modifier. Impossible de l’utiliser avec $1pageid.",
-       "apihelp-edit-param-pageid": "ID de la page que vous voulez modifier. Impossible à utiliser avec $1title.",
-       "apihelp-edit-param-section": "Numéro de section. 0 pour la section de tête, « new » pour une nouvelle section.",
+       "apihelp-edit-param-title": "Titre de la page que vous voulez modifier. Impossible de l’utiliser avec <var>$1pageid</var>.",
+       "apihelp-edit-param-pageid": "ID de la page que vous voulez modifier. Impossible à utiliser avec <var>$1title</var>.",
+       "apihelp-edit-param-section": "Numéro de section. <kbd>0</kbd> pour la section de tête, <kbd>new</kbd> pour une nouvelle section.",
        "apihelp-edit-param-sectiontitle": "Le titre pour une nouvelle section.",
        "apihelp-edit-param-text": "Contenu de la page.",
        "apihelp-edit-param-summary": "Modifier le résumé. Également le titre de la section quand $1section=new et $1sectiontitle n’est pas défini.",
@@ -81,8 +84,8 @@
        "apihelp-edit-param-recreate": "Écraser toutes les erreurs sur l’article ayant été supprimé pendant ce temps.",
        "apihelp-edit-param-createonly": "Ne pas modifier la page si elle existe déjà.",
        "apihelp-edit-param-nocreate": "Lever une erreur si la page n’existe pas.",
-       "apihelp-edit-param-watch": "Ajouter la page à votre liste de suivi.",
-       "apihelp-edit-param-unwatch": "Supprimer la page de votre liste de suivi.",
+       "apihelp-edit-param-watch": "Ajouter la page à la liste de suivi de l'utilisateur actuel.",
+       "apihelp-edit-param-unwatch": "Supprimer la page de la liste de suivi de l'utilisateur actuel.",
        "apihelp-edit-param-watchlist": "Ajouter ou supprimer sans condition la page de votre liste de suivi, utiliser les préférences ou ne pas changer le suivi.",
        "apihelp-edit-param-md5": "Le hachage MD5 du paramètre $1text, ou les paramètres $1prependtext et $1appendtext concaténés. Si défini, la modification ne sera pas effectuée à moins que le hachage ne soit correct.",
        "apihelp-edit-param-prependtext": "Ajouter ce texte au début de la page. Écrase $1text.",
        "apihelp-edit-param-contentmodel": "Modèle de contenu du nouveau contenu.",
        "apihelp-edit-param-token": "Le jeton doit toujours être envoyé en tant que dernier paramètre, ou au moins après le paramètre $1text.",
        "apihelp-edit-example-edit": "Modifier une page",
-       "apihelp-edit-example-prepend": "Préfixer une page par _&#95;NOTOC_&#95;",
+       "apihelp-edit-example-prepend": "Préfixer une page par <kbd>_&#95;NOTOC_&#95;</kbd>",
        "apihelp-edit-example-undo": "Annuler les révisions 13579 à 13585 avec résumé automatique",
        "apihelp-emailuser-description": "Envoyer un courriel à un utilisateur.",
        "apihelp-emailuser-param-target": "Utilisateur à qui envoyer le courriel.",
        "apihelp-emailuser-param-subject": "Entête du sujet.",
        "apihelp-emailuser-param-text": "Corps du courriel.",
        "apihelp-emailuser-param-ccme": "M’envoyer une copie de ce courriel.",
-       "apihelp-emailuser-example-email": "Envoyer un courriel à l’utilisateur « WikiSysop » avec le texte « Contenu »",
+       "apihelp-emailuser-example-email": "Envoyer un courriel à l’utilisateur <kbd>WikiSysop</kbd> avec le texte <kbd>Contenu</kbd>.",
        "apihelp-expandtemplates-description": "Développe tous les modèles en wikitexte.",
        "apihelp-expandtemplates-param-title": "Titre de la page.",
        "apihelp-expandtemplates-param-text": "Wikitexte à convertir.",
        "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-expandtemplates-example-simple": "Développe le wikitexte <kbd><nowiki>{{Project:Sandbox}}</nowiki></kbd>.",
        "apihelp-feedcontributions-description": "Renvoie le fil des contributions d’un utilisateur.",
        "apihelp-feedcontributions-param-feedformat": "Le format du flux.",
        "apihelp-feedcontributions-param-user": "Pour quels utilisateurs récupérer les contributions.",
        "apihelp-feedcontributions-param-toponly": "Afficher uniquement les modifications qui sont les dernières révisions.",
        "apihelp-feedcontributions-param-newonly": "Afficher uniquement les modifications qui sont des créations de page.",
        "apihelp-feedcontributions-param-showsizediff": "Afficher la différence de taille entre les révisions.",
-       "apihelp-feedcontributions-example-simple": "Renvoyer les contributions de [[User:Example]]",
+       "apihelp-feedcontributions-example-simple": "Renvoyer les contributions de l'utilisateur <kbd>Exemple</kbd>.",
        "apihelp-feedrecentchanges-description": "Renvoie un fil de modifications récentes.",
        "apihelp-feedrecentchanges-param-feedformat": "Le format du flux.",
        "apihelp-feedrecentchanges-param-namespace": "Espace de noms auquel limiter les résultats.",
        "apihelp-feedrecentchanges-param-hideanons": "Masquer les modifications faites par des utilisateurs anonymes.",
        "apihelp-feedrecentchanges-param-hideliu": "Masquer les modifications faites par des utilisateurs enregistrés.",
        "apihelp-feedrecentchanges-param-hidepatrolled": "Masquer les modifications contrôlées.",
-       "apihelp-feedrecentchanges-param-hidemyself": "Masquer les modifications que vous avez faites.",
+       "apihelp-feedrecentchanges-param-hidemyself": "Masquer les modifications faites par l'utilisateur actuel.",
        "apihelp-feedrecentchanges-param-tagfilter": "Filtrer par balise.",
        "apihelp-feedrecentchanges-param-target": "Afficher uniquement les modifications sur les pages liées depuis cette page.",
        "apihelp-feedrecentchanges-param-showlinkedto": "Afficher les modifications plutôt sur les pages liées vers la page sélectionnée.",
        "apihelp-filerevert-param-filename": "Nom de fichier cible, sans le préfixe File:.",
        "apihelp-filerevert-param-comment": "Télécharger le commentaire.",
        "apihelp-filerevert-param-archivename": "Nom d’archive de la révision à rétablir.",
-       "apihelp-filerevert-example-revert": "Rétablir Wiki.png dans la version du 2011-03-05T15:27:40Z",
+       "apihelp-filerevert-example-revert": "Rétablir <kbd>Wiki.png</kbd> dans la version du <kbd>2011-03-05T15:27:40Z</kbd>",
        "apihelp-help-description": "Afficher l’aide pour les modules spécifiés.",
-       "apihelp-help-param-modules": "Modules pour lesquels afficher l’aide (valeurs des paramètres action= et format=, ou « main »). Les sous-modules peuvent être spécifiés avec un « + ».",
+       "apihelp-help-param-modules": "Modules pour lesquels afficher l’aide (valeurs des paramètres <var>action</var> et <var>format</var>, ou <kbd>main</kbd>). Les sous-modules peuvent être spécifiés avec un <kbd>+</kbd>.",
        "apihelp-help-param-submodules": "Inclure l’aide pour les sous-modules du module nommé.",
        "apihelp-help-param-recursivesubmodules": "Inclure l’aide pour les sous-modules de façon récursive.",
        "apihelp-help-param-helpformat": "Format de sortie de l’aide.",
        "apihelp-help-example-query": "Aide pour deux sous-modules de recherche",
        "apihelp-imagerotate-description": "Faire pivoter une ou plusieurs images.",
        "apihelp-imagerotate-param-rotation": "Degrés de rotation de l’image dans le sens des aiguilles d’une montre.",
-       "apihelp-imagerotate-example-simple": "Faire pivoter [[:File:Example.png]] de 90 degrés",
-       "apihelp-imagerotate-example-generator": "Faire pivoter toutes les images de [[:Category:Flip]] de 180 degrés",
-       "apihelp-import-description": "Importer une page depuis un autre wiki, ou un fichier XML.\n\nNoter que le POST HTTP doit être effectué comme un import de fichier (c’est-à-dire en utilisant multipart/form-data) lors de l’envoi d’un fichier pour le paramètre « xml ».",
+       "apihelp-imagerotate-example-simple": "Faire pivoter <kbd>File:Example.png</kbd> de <kbd>90</kbd> degrés.",
+       "apihelp-imagerotate-example-generator": "Faire pivoter toutes les images de <kbd>Category:Flip</kbd> de <kbd>180</kbd> degrés.",
+       "apihelp-import-description": "Importer une page depuis un autre wiki, ou un fichier XML.\n\nNoter que le POST HTTP doit être effectué comme un import de fichier (c’est-à-dire en utilisant multipart/form-data) lors de l’envoi d’un fichier pour le paramètre <var>xml</var>.",
        "apihelp-import-param-summary": "Importer le résumé.",
        "apihelp-import-param-xml": "Fichier XML téléchargé.",
        "apihelp-import-param-interwikisource": "Pour les importations interwiki : wiki depuis lequel importer.",
        "apihelp-login-example-login": "Se connecter",
        "apihelp-logout-description": "Se déconnecter et effacer les données de session.",
        "apihelp-logout-example-logout": "Déconnecter l’utilisateur actuel.",
+       "apihelp-managetags-description": "Effectuer des tâches de gestion relatives à la modification des balises.",
        "apihelp-move-description": "Déplacer une page.",
        "apihelp-move-param-from": "Titre de la page que vous voulez déplacer. Impossible de l’utiliser avec $1fromid.",
        "apihelp-move-param-fromid": "ID de la page que vous voulez déplacer. Impossible à utiliser avec $1from.",
        "apihelp-move-param-unwatch": "Supprimer la page et la redirection de votre liste de suivi.",
        "apihelp-move-param-watchlist": "Ajouter ou supprimer sans condition la page de votre liste de suivi, utiliser les préférences ou ne pas changer le suivi.",
        "apihelp-move-param-ignorewarnings": "Ignorer tous les avertissements.",
-       "apihelp-move-example-move": "Déplacer « Mauvais titre » en « Bon titre » sans garder de redirection",
+       "apihelp-move-example-move": "Déplacer <kbd>Mauvais titre</kbd> en <kbd>Bon titre</kbd> sans garder de redirection.",
        "apihelp-opensearch-description": "Rechercher dans le wiki en utilisant le protocole OpenSearch.",
        "apihelp-opensearch-param-search": "Chaîne de recherche.",
        "apihelp-opensearch-param-limit": "Nombre maximal de résultats à renvoyer.",
        "apihelp-opensearch-param-namespace": "Espaces de nom à rechercher.",
-       "apihelp-opensearch-param-suggest": "Ne rien faire si [https://www.mediawiki.org/wiki/Manual:$wgEnableOpenSearchSuggest $wgEnableOpenSearchSuggest] vaut faux.",
+       "apihelp-opensearch-param-suggest": "Ne rien faire si <var>[[mw:Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> vaut faux.",
        "apihelp-opensearch-param-redirects": "Comment gérer les redirections :\n;return:Renvoie la redirection elle-même.\n;resolve:Renvoie la page cible. Peut renvoyer moins de $1limit résultats.\nPour des raisons historiques, la valeur par défaut est « return » pour $1format=json et « resolve » pour les autres formats.",
        "apihelp-opensearch-param-format": "Le format de sortie.",
-       "apihelp-opensearch-example-te": "Trouver les pages commençant par « Te »",
+       "apihelp-opensearch-example-te": "Trouver les pages commençant par <kbd>Te</kbd>.",
        "apihelp-options-description": "Modifier les préférences de l’utilisateur courant.\n\nSeules les options enregistrées dans le cœur ou dans l’une des extensions installées, ou les options avec une clé préfixée par « userjs- » (devant être utilisées dans les scripts utilisateur), peuvent être définies.",
        "apihelp-options-param-reset": "Réinitialise les préférences aux valeurs par défaut du site.",
-       "apihelp-options-param-resetkinds": "Liste des types d’option à réinitialiser quand l’option « $1reset » est définie.",
+       "apihelp-options-param-resetkinds": "Liste des types d’option à réinitialiser quand l’option <var>$1reset</var> est définie.",
        "apihelp-options-param-change": "Liste des modifications, au format nom=valeur (par ex. skin=vector). La valeur ne peut pas contenir de caractère barre verticale. Si aucune valeur n’est fournie (pas même un signe égal), par ex., nomoption|autreoption|…, l’option sera réinitialisée à sa valeur par défaut.",
-       "apihelp-options-param-optionname": "Un nom d’option qui doit être fixé à la valeur fournie par « $1optionvalue ».",
-       "apihelp-options-param-optionvalue": "La valeur d’une option spécifiée par « $1optionname » peut contenir des caractères barre verticale.",
+       "apihelp-options-param-optionname": "Un nom d’option qui doit être fixé à la valeur fournie par <var>$1optionvalue</var>.",
+       "apihelp-options-param-optionvalue": "La valeur d’une option spécifiée par <var>$1optionname</var> peut contenir des caractères barre verticale.",
        "apihelp-options-example-reset": "Réinitialiser toutes les préférences",
-       "apihelp-options-example-change": "Modifier les préférences « skin » et « hideminor »",
-       "apihelp-options-example-complex": "Réinitialiser toutes les préférences, puis définir « skin » et « nickname »",
+       "apihelp-options-example-change": "Modifier les préférences <kbd>skin</kbd> et <kbd>hideminor</kbd>.",
+       "apihelp-options-example-complex": "Réinitialiser toutes les préférences, puis définir <kbd>skin</kbd> et <kbd>nickname</kbd>.",
        "apihelp-paraminfo-description": "Obtenir des informations sur les modules de l’API.",
-       "apihelp-paraminfo-param-modules": "Liste des noms de module (valeurs des paramètres action= et format=, ou « main »). Peut spécifier des sous-modules avec un « + ».",
+       "apihelp-paraminfo-param-modules": "Liste des noms de module (valeurs des paramètres <var>action</var> et <var>format</var>, ou <kbd>main</kbd>). Peut spécifier des sous-modules avec un <kbd>+</kbd>.",
        "apihelp-paraminfo-param-helpformat": "Format des chaînes d’aide.",
-       "apihelp-paraminfo-param-querymodules": "Liste des noms de module de requêtage (valeur des paramètres prop=, meta= ou list=). Utiliser « $1modules=query+foo » au lieu de « $1querymodules=foo ».",
-       "apihelp-paraminfo-param-mainmodule": "Obtenir aussi des informations sur le module principal (niveau supérieur). Utiliser plutôt « $1modules=main ».",
+       "apihelp-paraminfo-param-querymodules": "Liste des noms de module de requêtage (valeur des paramètres <var>prop</var>, <var>meta</var> ou <var>list</var>=). Utiliser <kbd>$1modules=query+foo</kbd> au lieu de <kbd>$1querymodules=foo</kbd>.",
+       "apihelp-paraminfo-param-mainmodule": "Obtenir aussi des informations sur le module principal (niveau supérieur). Utiliser plutôt <kbd>$1modules=main</kbd>.",
        "apihelp-paraminfo-param-pagesetmodule": "Obtenir aussi des informations sur le module pageset (en fournissant titles= et ses amis).",
-       "apihelp-paraminfo-param-formatmodules": "Liste des noms de module de mise en forme (valeur du paramètre format=). Utiliser plutôt « $1modules ».",
-       "apihelp-paraminfo-example-1": "Afficher les informations pour [[Special:ApiHelp/parse|action=parse]], [[Special:ApiHelp/jsonfm|format=jsonfm]], [[Special:ApiHelp/query+allpages|action=query&list=allpages]], et [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]",
-       "apihelp-parse-description": "Analyse le contenu et renvoie le résultat de l’analyseur.\n\nVoyez les différents modules prop de [[Special:ApiHelp/query|action=query]] pour avoir de l’information sur la version actuelle d’une page.\n\nIl y a plusieurs moyens de spécifier le texte à analyser :\n# Spécifier une page ou une révision, en utilisant $1page, $1pageid, ou $1oldid.\n# Spécifier explicitement un contenu, en utilisant $1text, $1title, et $1contentmodel.\n# Spécifier uniquement un résumé à analyser. $1prop doit recevoir une valeur vide.",
-       "apihelp-parse-param-title": "Titre de la page à laquelle appartient le texte. Si omis, $1contentmodel doit être spécifié, et « [[API]] » sera utilisé comme titre.",
-       "apihelp-parse-param-text": "Texte à analyser. utiliser $1title ou $1contentmodel pour contrôler le modèle de contenu.",
+       "apihelp-paraminfo-param-formatmodules": "Liste des noms de module de mise en forme (valeur du paramètre <var>format</var>). Utiliser plutôt <var>$1modules</kbd>.",
+       "apihelp-paraminfo-example-1": "Afficher les informations pour <kbd>[[Special:ApiHelp/parse|action=parse]]</kbd>, <kbd>[[Special:ApiHelp/jsonfm|format=jsonfm]]</kbd>, <kbd>[[Special:ApiHelp/query+allpages|action=query&list=allpages]]</kbd> et <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd>.",
+       "apihelp-parse-description": "Analyse le contenu et renvoie le résultat de l’analyseur.\n\nVoyez les différents modules prop de <kbd>[[Special:ApiHelp/query|action=query]]</kbd> pour avoir de l’information sur la version actuelle d’une page.\n\nIl y a plusieurs moyens de spécifier le texte à analyser :\n# Spécifier une page ou une révision, en utilisant <var>$1page</var>, <var>$1pageid</var> ou <var>$1oldid</var>.\n# Spécifier explicitement un contenu, en utilisant <var>$1text</var>, <var>$1title</var> et <var>$1contentmodel</var>\n# Spécifier uniquement un résumé à analyser. <var>$1prop</var> doit recevoir une valeur vide.",
+       "apihelp-parse-param-title": "Titre de la page à laquelle appartient le texte. Si omis, <var>$1contentmodel</var> doit être spécifié, et [[API]] sera utilisé comme titre.",
+       "apihelp-parse-param-text": "Texte à analyser. utiliser <var>$1title</var> ou <var>$1contentmodel</var> pour contrôler le modèle de contenu.",
        "apihelp-parse-param-summary": "Résumé à analyser.",
-       "apihelp-parse-param-page": "Analyser le contenu de cette page. Impossible à utiliser avec $1text et $1title.",
-       "apihelp-parse-param-pageid": "Analyser le contenu de cette page. Écrase $1page.",
-       "apihelp-parse-param-redirects": "Si le paramètre $1page ou $1pageid est positionné sur une redirection, la résoudre.",
-       "apihelp-parse-param-oldid": "Analyser le contenu de cette révision. Écrase $1page et $1pageid.",
+       "apihelp-parse-param-page": "Analyser le contenu de cette page. Impossible à utiliser avec <var>$1text</var> et <var>$1title</var>.",
+       "apihelp-parse-param-pageid": "Analyser le contenu de cette page. Écrase <var>$1page</var>.",
+       "apihelp-parse-param-redirects": "Si le paramètre <var>$1page</var> ou <var>$1pageid</var> est positionné sur une redirection, la résoudre.",
+       "apihelp-parse-param-oldid": "Analyser le contenu de cette révision. Écrase <var>$1page</var> et <var>$1pageid</var>.",
        "apihelp-parse-param-prop": "Quelles informations obtenir :\n;text:Fournit le texte analysé du wikitexte.\n;langlinks:Fournit les liens de langue dans le wikitexte analysé.\n;categories:Fournit les catégories dans le wikitexte analysé.\n;categorieshtml:Fournit la version HTML des catégories.\n;links:Fournit les liens internes dans le wikitexte analysé.\n;templates:Fournit les modèles dans le wikitexte analysé.\n;images:Fournit les images dans le wikitexte analysé.\n;externallinks:Fournit les liens externes dans le wikitexte analysé.\n;sections:Fournit les sections dans le wikitexte analysé.\n;revid:Ajoute l’ID de révision de la page analysée.\n;displaytitle:Ajoute le titre du wikitexte analysé.\n;headitems:Fournit les éléments à mettre dans le &lt;head&gt; de la page.\n;headhtml:Fournit le &lt;head&gt; analysé de la page.\n;modules:Fournit les modules ResourceLoader utilisés sur la page.\n;indicators:Fournit le HTML des indicateurs d’état de la page utilisés dans la page.\n;iwlinks:Fournit les liens interwiki dans le wikitexte analysé.\n;wikitext:Fournit le wikitexte d’origine qui a été analysé.\n;properties:Fournit différentes propriétés définies dans le wikitexte analysé.\n;limitreportdata:Fournit le rapport de limite de façon structurée. Ne fournit aucune donnée, quand $1disablepp est activé.\n;limitreporthtml:Fournit la version HTML du rapport de limite. Ne fournit aucune donnée, quand $1disablepp est activé.",
        "apihelp-parse-param-pst": "Faire une transformation avant enregistrement de l’entrée avant de l’analyser. Valide uniquement quand utilisé avec du texte.",
-       "apihelp-parse-param-onlypst": "Faire une transformation avant enregistrement (PST) de l’entrée, mais ne pas l’analyser. Renvoie le même wikitexte, après que la PST a été appliquée. Valide uniquement quand utilisé avec $1text.",
-       "apihelp-parse-param-effectivelanglinks": "Inclut les liens de langue fournis par les extensions (à utiliser avec $1prop=langlinks).",
+       "apihelp-parse-param-onlypst": "Faire une transformation avant enregistrement (PST) de l’entrée, mais ne pas l’analyser. Renvoie le même wikitexte, après que la PST a été appliquée. Valide uniquement quand utilisé avec <var>$1text</var>.",
+       "apihelp-parse-param-effectivelanglinks": "Inclut les liens de langue fournis par les extensions (à utiliser avec <kbd>$1prop=langlinks</kbd>).",
        "apihelp-parse-param-section": "Récupérer uniquement le contenu de ce numéro de section.",
        "apihelp-parse-param-disablepp": "Désactiver le rapport PP de la sortie de l’analyseur.",
        "apihelp-parse-param-disableeditsection": "Désactiver les liens de modification de section de la sortie de l’analyseur.",
-       "apihelp-parse-param-generatexml": "Générer un arbre d’analyse XML (nécessite le modèle de contenu « $1 »).",
+       "apihelp-parse-param-generatexml": "Générer un arbre d’analyse XML (nécessite le modèle de contenu <code>$1</code>).",
        "apihelp-parse-param-preview": "Analyser en mode aperçu.",
        "apihelp-parse-param-sectionpreview": "Analyser en mode aperçu de section (active aussi le mode aperçu).",
        "apihelp-parse-param-disabletoc": "Désactiver la table des matières dans la sortie.",
        "apihelp-protect-description": "Modifier le niveau de protection d’une page.",
        "apihelp-protect-param-title": "Titre de la page à (dé)protéger. Impossible à utiliser avec $1pageid.",
        "apihelp-protect-param-pageid": "ID de la page à (dé)protéger. Impossible à utiliser avec $1title.",
-       "apihelp-protect-param-protections": "Liste des niveaux de protection, au format action=niveau (par ex. edit=sysop).\n\n'''NOTE :''' Toutes les actions non listées auront leur restrictions supprimées.",
-       "apihelp-protect-param-expiry": "Horodatages d’expiration. Si un seul horodatage est fourni, il sera utilisé pour toutes les protections. Utiliser « infinite », « indefinite », « infinity » ou « never » pour une protection sans expiration.",
+       "apihelp-protect-param-protections": "Liste des niveaux de protection, au format <kbd>action=niveau</kbd> (par ex. <kbd>edit=sysop</kbd>).\n\n<strong>NOTE :<strong> Toutes les actions non listées auront leur restrictions supprimées.",
+       "apihelp-protect-param-expiry": "Horodatages d’expiration. Si un seul horodatage est fourni, il sera utilisé pour toutes les protections. Utiliser <kbd>infinite</kbd>, <kbd>indefinite</kbd>, <kbd>infinity</kbd> ou <kbd>never</kbd> pour une protection sans expiration.",
        "apihelp-protect-param-reason": "Motif de (dé)protection.",
        "apihelp-protect-param-cascade": "Activer la protection en cascade (c’est-à-dire protéger les pages incluses dans cette page). Ignoré si tous les niveaux de protection fournis ne supportent pas la mise en cascade.",
        "apihelp-protect-param-watch": "Si activé, ajouter la page (dé)protégée à votre liste de suivi.",
        "apihelp-protect-param-watchlist": "Ajouter ou supprimer sans condition la page de votre liste de suivi, utiliser les préférences ou ne pas modifier le suivi.",
        "apihelp-protect-example-protect": "Protéger une page",
-       "apihelp-protect-example-unprotect": "Enlever la protection d’une page en mettant les restrictions à « all »",
+       "apihelp-protect-example-unprotect": "Enlever la protection d’une page en mettant les restrictions à <kbd>all</kbd>.",
        "apihelp-protect-example-unprotect2": "Enlever la protection de la page en ne mettant aucune restriction",
        "apihelp-purge-description": "Vider le cache des titres fournis.\n\nNécessite une requête POST si l’utilisateur n’est pas connecté.",
        "apihelp-purge-param-forcelinkupdate": "Mettre à jour les tables de liens.",
        "apihelp-purge-param-forcerecursivelinkupdate": "Mettre à jour la table des liens, et mettre à jour les tables de liens pour toute page qui utilise cette page comme modèle",
-       "apihelp-purge-example-simple": "Purger les pages « Page principale » et « API »",
+       "apihelp-purge-example-simple": "Purger les pages <kbd>Page principale</kbd> et <kbd>API</kbd>.",
        "apihelp-purge-example-generator": "Purger les 10 premières pages de l’espace de noms principal",
        "apihelp-query-description": "Extraire des données de et sur MédiaWiki.\n\nToutes les modifications de données devront d’abord utiliser une requête pour obtenir un jeton, afin d’éviter les abus de la part de sites malveillants.",
        "apihelp-query-param-prop": "Quelles propriétés obtenir des pages demandées.",
        "apihelp-query-param-exportnowrap": "Renvoyer le XML exporté sans l’inclure dans un résultat XML (même format que [[Special:Export]]). Utilisable uniquement avec $1export.",
        "apihelp-query-param-iwurl": "S’il faut obtenir l’URL complète si le titre est un lien interwiki.",
        "apihelp-query-param-continue": "Quand il est présent, met en forme query-continue sous forme de paires clé-valeur qui devrait simplement être fusionné dans la requête d’origine. Ce paramètre doit être fixé à une chaîne vide dans la requête initiale.\n\nCe paramètre est recommandé pour tout nouveau développement, et sera mis par défaut dans la prochaine version de l’API.",
-       "apihelp-query-param-rawcontinue": "Actuellement ignoré. Plus tard, « $1continue= » deviendra la valeur par défaut et sera nécessaire pour recevoir les données brutes de query-continue.",
-       "apihelp-query-example-revisions": "Récupérer [[Special:ApiHelp/query+siteinfo|l’info du site]] et [[Special:ApiHelp/query+revisions|les révisions]] de la Page principale",
-       "apihelp-query-example-allpages": "Récupérer les révisions des pages commençant par « API/ »",
+       "apihelp-query-param-rawcontinue": "Actuellement ignoré. Plus tard, <var>$1continue</var> deviendra la valeur par défaut et sera nécessaire pour recevoir les données brutes de <samp>query-continue</samp>.",
+       "apihelp-query-example-revisions": "Récupérer [[Special:ApiHelp/query+siteinfo|l’info du site]] et [[Special:ApiHelp/query+revisions|les révisions]] de <kbd>Page principale</kbd>.",
+       "apihelp-query-example-allpages": "Récupérer les révisions des pages commençant par <kbd>API/</kbd>.",
        "apihelp-query+allcategories-description": "Énumérer toutes les catégories.",
        "apihelp-query+allcategories-param-from": "La catégorie depuis laquelle démarrer l’énumération.",
        "apihelp-query+allcategories-param-to": "La catégorie à laquelle terminer l’énumération.",
        "apihelp-query+allcategories-param-limit": "Combien de catégories renvoyer.",
        "apihelp-query+allcategories-param-prop": "Quelles propriétés récupérer :\n;size:Ajoute le nombre de pages dans la catégorie.\n;hidden:Marque les catégories qui sont cachées avec _&#95;HIDDENCAT_&#95;.",
        "apihelp-query+allcategories-example-size": "Lister les catégories avec l’information sur le nombre de pages dans chacune",
-       "apihelp-query+allcategories-example-generator": "Récupérer l’information sur la page de catégorie elle-même pour les catégories commençant par « List »",
+       "apihelp-query+allcategories-example-generator": "Récupérer l’information sur la page de catégorie elle-même pour les catégories commençant par <kbd>List</kbd>.",
        "apihelp-query+alldeletedrevisions-description": "Lister toutes les révisions supprimées par un utilisateur ou dans un espace de noms.",
-       "apihelp-query+alldeletedrevisions-paraminfo-useronly": "Utilisable uniquement avec $3user.",
-       "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "Impossible à utiliser avec $3user.",
+       "apihelp-query+alldeletedrevisions-paraminfo-useronly": "Utilisable uniquement avec <var>$3user</var>.",
+       "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "Impossible à utiliser avec <var>$3user</var>.",
        "apihelp-query+alldeletedrevisions-param-start": "L’horodatage auquel démarrer l’énumération.",
        "apihelp-query+alldeletedrevisions-param-end": "L’horodatage auquel arrêter l’énumération.",
        "apihelp-query+alldeletedrevisions-param-from": "Démarrer la liste à ce titre.",
        "apihelp-query+alldeletedrevisions-param-user": "Lister uniquement les révisions par cet utilisateur.",
        "apihelp-query+alldeletedrevisions-param-excludeuser": "Ne pas lister les révisions par cet utilisateur.",
        "apihelp-query+alldeletedrevisions-param-namespace": "Lister uniquement les pages dans cet espace de noms.",
-       "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "'''REMARQUE :''' Du fait du [https://www.mediawiki.org/wiki/Manual:$wgMiserMode mode minimal], utiliser $1user et $1namespace ensemble peut aboutir à moins de résultats renvoyés que « $1limit » avant de continuer ; dans les cas extrêmes, zéro résultats peuvent être renvoyés.",
+       "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "<strong>REMARQUE :</strong> Du fait du [[mw:Manual:$wgMiserMode|mode minimal]], utiliser <var>$1user</var> et <var>$1namespace</var> ensemble peut aboutir à moins de résultats renvoyés que <var>$1limit</var> avant de continuer ; dans les cas extrêmes, zéro résultats peuvent être renvoyés.",
        "apihelp-query+alldeletedrevisions-param-generatetitles": "Utilisé comme générateur, générer des titres plutôt que des IDs de révision.",
-       "apihelp-query+alldeletedrevisions-example-user": "Lister les 50 dernières contributions supprimées par User:Exemple",
-       "apihelp-query+alldeletedrevisions-example-ns-main": "Lister les 50 premières révisions supprimées dans l’espace de noms principal",
+       "apihelp-query+alldeletedrevisions-example-user": "Lister les 50 dernières contributions supprimées par l'utilisateur <kbd>Exemple</kbd>.",
+       "apihelp-query+alldeletedrevisions-example-ns-main": "Lister les 50 premières révisions supprimées dans l’espace de noms principal.",
        "apihelp-query+allfileusages-description": "Lister toutes les utilisations de fichier, y compris ceux n’existant pas.",
        "apihelp-query+allfileusages-param-from": "Le titre du fichier depuis lequel commencer l’énumération.",
        "apihelp-query+allfileusages-param-to": "Le titre du fichier auquel arrêter l’énumération.",
        "apihelp-query+allfileusages-param-prop": "Quelles informations inclure :\n;ids:Ajoute l’ID de la page utilisatrice (impossible à utiliser avec $1unique).\n;title:Ajoute le titre du fichier.",
        "apihelp-query+allfileusages-param-limit": "Combien d’éléments renvoyer au total.",
        "apihelp-query+allfileusages-param-dir": "La direction dans laquelle lister.",
-       "apihelp-query+allfileusages-example-B": "Lister les titres de fichier, y compris les manquants, avec les ids de page d’où ils proviennent, en commençant à B",
+       "apihelp-query+allfileusages-example-B": "Lister les titres de fichier, y compris les manquants, avec les IDs de page d’où ils proviennent, en commençant à <kbd>B</kbd>.",
        "apihelp-query+allfileusages-example-unique": "Lister les titres de fichier uniques",
        "apihelp-query+allfileusages-example-unique-generator": "Obtient tous les titres de fichier, en marquant les manquants",
        "apihelp-query+allfileusages-example-generator": "Obtient les pages contenant les fichiers",
        "apihelp-query+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": "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-B": "Afficher une liste des fichiers commençant par la lettre <kbd>B</kbd>.",
        "apihelp-query+allimages-example-recent": "Afficher une liste des fichiers récemment téléchargés semblable à [[Special:NewFiles]]",
        "apihelp-query+allimages-example-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+allimages-example-generator": "Afficher l’information sur 4 fichiers commençant par la lettre <kbd>T</kbd>.",
        "apihelp-query+alllinks-description": "Énumérer tous les liens pointant vers un espace de noms donné.",
        "apihelp-query+alllinks-param-from": "Le titre du lien auquel démarrer l’énumération.",
        "apihelp-query+alllinks-param-to": "Le titre du lien auquel arrêter l’énumération.",
        "apihelp-query+alllinks-param-prefix": "Rechercher tous les titres liés commençant par cette valeur.",
-       "apihelp-query+alllinks-param-unique": "Afficher uniquement les titres liés distincts. Impossible à utiliser avec $1prop=ids.\nUtilisé avec un générateur, produit les pages cible au lieu des pages source.",
-       "apihelp-query+alllinks-param-prop": "Quelles informations inclure :\n;ids:Ajoute l’ID de la page de liaison (impossible à utiliser avec $1unique).\n;title:Ajoute le titre du lien.",
+       "apihelp-query+alllinks-param-unique": "Afficher uniquement les titres liés distincts. Impossible à utiliser avec <kbd>$1prop=ids</kbd>.\nUtilisé avec un générateur, produit les pages cible au lieu des pages source.",
+       "apihelp-query+alllinks-param-prop": "Quelles informations inclure :\n;ids:Ajoute l’ID de la page de liaison (impossible à utiliser avec <var>$1unique</var>).\n;title:Ajoute le titre du lien.",
        "apihelp-query+alllinks-param-namespace": "L’espace de noms à énumérer.",
        "apihelp-query+alllinks-param-limit": "Combien d’éléments renvoyer au total.",
        "apihelp-query+alllinks-param-dir": "La direction dans laquelle lister.",
-       "apihelp-query+alllinks-example-B": "Lister les titres liés, y compris les manquants, avec les ids des pages d’où ils proviennent, en démarrant à B",
+       "apihelp-query+alllinks-example-B": "Lister les titres liés, y compris les manquants, avec les IDs des pages d’où ils proviennent, en démarrant à <kbd>B</kbd>.",
        "apihelp-query+alllinks-example-unique": "Lister les titres liés uniques",
        "apihelp-query+alllinks-example-unique-generator": "Obtient tous les titres liés, en marquant les manquants",
        "apihelp-query+alllinks-example-generator": "Obtient les pages contenant les liens",
        "apihelp-query+allmessages-description": "Renvoyer les messages depuis ce site.",
-       "apihelp-query+allmessages-param-messages": "Quels messages sortir. « * » (par défaut) signifie tous les messages.",
+       "apihelp-query+allmessages-param-messages": "Quels messages sortir. <kbd>*</kbd> (par défaut) signifie tous les messages.",
        "apihelp-query+allmessages-param-prop": "Quelles propriétés obtenir.",
        "apihelp-query+allmessages-param-enableparser": "Si positionné pour activer l’analyseur, traitera en avance le wikitexte du message (substitution des mots magiques, gestion des modèles, etc.).",
        "apihelp-query+allmessages-param-nocontent": "Si positionné, ne pas inclure le contenu des messages dans la sortie.",
        "apihelp-query+allmessages-param-to": "Renvoyer les messages en terminant à ce message.",
        "apihelp-query+allmessages-param-title": "Nom de page à utiliser comme contexte en analysant le message (pour l’option $1enableparser).",
        "apihelp-query+allmessages-param-prefix": "Renvoyer les messages avec ce préfixe.",
-       "apihelp-query+allmessages-example-ipb": "Afficher les messages commençant par « ipb- »",
-       "apihelp-query+allmessages-example-de": "Afficher les messages « august » et «mainpage » en allemand",
+       "apihelp-query+allmessages-example-ipb": "Afficher les messages commençant par <kbd>ipb-</kbd>.",
+       "apihelp-query+allmessages-example-de": "Afficher les messages <kbd>august</kbd> et <kbd>mainpage</kbd> en allemand.",
        "apihelp-query+allpages-description": "Énumérer toutes les pages séquentiellement dans un espace de noms donné.",
        "apihelp-query+allpages-param-from": "Le titre de la page depuis lequel commencer l’énumération.",
        "apihelp-query+allpages-param-to": "Le titre de la page auquel stopper l’énumération.",
        "apihelp-query+allpages-param-dir": "La direction dans laquelle lister.",
        "apihelp-query+allpages-param-filterlanglinks": "Filtrer si une page a des liens de langue. Noter que cela ne prend pas en compte les liens de langue ajoutés par des extensions.",
        "apihelp-query+allpages-param-prexpiry": "Quelle expiration de protection sur laquelle filtrer la page :\n;indefinite:N’obtenir que les pages avec une expiration de protection infinie.\n;definite:N’obtenir que les pages avec une expiration de protection définie (spécifique).\n;all:Obtenir toutes les pages avec une expiration de protection.",
-       "apihelp-query+allpages-example-B": "Afficher une liste des pages commençant par la lettre « B »",
-       "apihelp-query+allpages-example-generator": "Afficher l’information sur 4 pages commençant par la lettre « T »",
-       "apihelp-query+allpages-example-generator-revisions": "Afficher le contenu des 2 premières pages hors redirections commençant par « Re »",
+       "apihelp-query+allpages-example-B": "Afficher une liste des pages commençant par la lettre <kbd>B</kbd>.",
+       "apihelp-query+allpages-example-generator": "Afficher l’information sur 4 pages commençant par la lettre <kbd>T</kbd>.",
+       "apihelp-query+allpages-example-generator-revisions": "Afficher le contenu des 2 premières pages hors redirections commençant par <kbd>Re</kbd>.",
        "apihelp-query+allredirects-description": "Lister toutes les redirections vers un espace de noms.",
        "apihelp-query+allredirects-param-from": "Le titre de la redirection auquel démarrer l’énumération.",
        "apihelp-query+allredirects-param-to": "Le titre de la redirection auquel arrêter l’énumération.",
        "apihelp-query+allredirects-param-prefix": "Rechercher toutes les pages cible commençant par cette valeur.",
        "apihelp-query+allredirects-param-unique": "Afficher uniquement les pages cibles distinctes. Impossible à utiliser avec $1prop=ids|fragment|interwiki.\nUtilisé avec un générateur, produit les pages cible au lieu des pages source.",
-       "apihelp-query+allredirects-param-prop": "Quelles informations inclure :\n;ids:Ajoute l’ID de la page de redirection (impossible à utiliser avec $1unique).\n;title:Ajoute le titre de la redirection.\n;fragment:Ajoute le fragment de la redirection, s’il y en a un (impossible à utiliser avec $1unique).\n;interwiki:Ajoute le préfixe interwiki de la redirection, s’il y en a un (impossible à utiliser avec $1unique).",
+       "apihelp-query+allredirects-param-prop": "Quelles informations inclure :\n;ids:Ajoute l’ID de la page de redirection (impossible à utiliser avec <var>$1unique</var>).\n;title:Ajoute le titre de la redirection.\n;fragment:Ajoute le fragment de la redirection, s’il y en a un (impossible à utiliser avec <var>$1unique</var>).\n;interwiki:Ajoute le préfixe interwiki de la redirection, s’il y en a un (impossible à utiliser avec <var>$1unique</var>).",
        "apihelp-query+allredirects-param-namespace": "L’espace de noms à énumérer.",
        "apihelp-query+allredirects-param-limit": "Combien d’éléments renvoyer au total.",
        "apihelp-query+allredirects-param-dir": "La direction dans laquelle lister.",
-       "apihelp-query+allredirects-example-B": "Lister les pages cible, y compris les manquantes, avec les IDs de page d’où ils proviennent, en commençant à B",
+       "apihelp-query+allredirects-example-B": "Lister les pages cible, y compris les manquantes, avec les IDs de page d’où ils proviennent, en commençant à <kbd>B</kbd>.",
        "apihelp-query+allredirects-example-unique": "Lister les pages cible unique",
        "apihelp-query+allredirects-example-unique-generator": "Obtient toutes les pages cible, en marquant les manquantes",
        "apihelp-query+allredirects-example-generator": "Obtient les pages contenant les redirections",
        "apihelp-query+alltransclusions-param-namespace": "L’espace de noms à énumérer.",
        "apihelp-query+alltransclusions-param-limit": "Combien d’éléments renvoyer au total.",
        "apihelp-query+alltransclusions-param-dir": "La direction dans laquelle lister.",
-       "apihelp-query+alltransclusions-example-B": "Lister les titres inclus, y compris les manquants, avec les IDs des pages d’où ils viennent, en commençant à B",
+       "apihelp-query+alltransclusions-example-B": "Lister les titres inclus, y compris les manquants, avec les IDs des pages d’où ils viennent, en commençant à <kbd>B</kbd>.",
        "apihelp-query+alltransclusions-example-unique": "Lister les titres inclus uniques",
        "apihelp-query+alltransclusions-example-unique-generator": "Obtient tous les titres inclus, en marquant les manquants",
        "apihelp-query+alltransclusions-example-generator": "Obtient les pages contenant des transclusions",
        "apihelp-query+allusers-param-limit": "Combien de noms d’utilisateur renvoyer au total.",
        "apihelp-query+allusers-param-witheditsonly": "Ne lister que les utilisateurs qui ont fait des modifications.",
        "apihelp-query+allusers-param-activeusers": "Lister uniquement les utilisateurs actifs durant {{PLURAL:$1|le dernier jour|les $1 derniers jours}}.",
-       "apihelp-query+allusers-example-Y": "Lister les utilisateurs en commençant à Y",
+       "apihelp-query+allusers-example-Y": "Lister les utilisateurs en commençant à <kbd>Y</kbd>.",
        "apihelp-query+backlinks-description": "Trouver toutes les pages qui ont un lien vers la page donnée.",
-       "apihelp-query+backlinks-param-title": "Titre à rechercher. Impossible à utiliser avec $1pageid.",
-       "apihelp-query+backlinks-param-pageid": "ID de la page à chercher. Impossible à utiliser avec $1title.",
+       "apihelp-query+backlinks-param-title": "Titre à rechercher. Impossible à utiliser avec <var>$1pageid</var>.",
+       "apihelp-query+backlinks-param-pageid": "ID de la page à chercher. Impossible à utiliser avec <var>$1title</var>.",
        "apihelp-query+backlinks-param-namespace": "L’espace de noms à énumérer.",
        "apihelp-query+backlinks-param-dir": "La direction dans laquelle lister.",
-       "apihelp-query+backlinks-param-filterredir": "Comment filtrer les redirections. Si positionné à nonredirects quand $1redirect est activé, cela ne s’applique qu’au second niveau.",
+       "apihelp-query+backlinks-param-filterredir": "Comment filtrer les redirections. Si positionné à <kbd>nonredirects</kbd> quand <var>$1redirect</var> est activé, cela ne s’applique qu’au second niveau.",
        "apihelp-query+backlinks-param-limit": "Combien de pages renvoyer au total. Si $1redirect est activé, la limite s’applique à chaque niveau séparément (ce qui signifie que vous pouvez obtenir jusqu’à 2 * limite résultats).",
        "apihelp-query+backlinks-param-redirect": "Si le lien vers une page est une redirection, trouver toutes les pages qui ont un lien vers cette redirection aussi. La limite maximale est divisée par deux.",
-       "apihelp-query+backlinks-example-simple": "Afficher les liens vers [[Main page]]",
-       "apihelp-query+backlinks-example-generator": "Obtenir des informations sur les pages ayant un lien vers [[Main page]]",
+       "apihelp-query+backlinks-example-simple": "Afficher les liens vers <kbd>Main page<kbd>.",
+       "apihelp-query+backlinks-example-generator": "Obtenir des informations sur les pages ayant un lien vers <kbd>Main page<kbd>.",
        "apihelp-query+blocks-description": "Lister tous les utilisateurs et les adresses IP bloqués.",
        "apihelp-query+blocks-param-start": "L’horodatage auquel démarrer l’énumération.",
        "apihelp-query+blocks-param-end": "L’horodatage auquel arrêter l’énumération.",
        "apihelp-query+blocks-param-ids": "Liste des IDs de bloc à lister (facultatif).",
        "apihelp-query+blocks-param-users": "Liste des utilisateurs à rechercher (facultatif).",
-       "apihelp-query+blocks-param-ip": "Obtenir tous les blocs s’appliquant à cette adresse IP ou à cette plage CIDR, y compris les blocs de plage.\nImpossible à utiliser avec $3users. Les plages CIDR plus larges que IPv4/$1 ou IPv6/$2 ne sont pas acceptées.",
+       "apihelp-query+blocks-param-ip": "Obtenir tous les blocs s’appliquant à cette adresse IP ou à cette plage CIDR, y compris les blocs de plage.\nImpossible à utiliser avec <var>$3users</var>. Les plages CIDR plus larges que IPv4/$1 ou IPv6/$2 ne sont pas acceptées.",
        "apihelp-query+blocks-param-limit": "Le nombre maximal de blocs à lister.",
-       "apihelp-query+blocks-param-prop": "Quelles propriétés obtenir :\n;id:Ajoute l’ID du blocage.\n;user:Ajoute le nom de l’utilisateur bloqué.\n;userid:Ajoute l’ID de l’utilisateur bloqué.\n;by:Ajoute le nom de l’utilisateur ayant bloqué.\n;byid:Ajoute l’ID de l’utilisateur ayant bloqué.\n;timestamp:Ajoute l’horodatage du blocage.\n;expiry:Ajoute l’horodatage d’expiration du blocage.\n;reason:Ajoute le motif du blocage.\n;range:Ajoute la plage d&adresses IP affectée par le blocage.\n;flags:Marque le bannissement avec (autoblock, anononly, etc.).",
-       "apihelp-query+blocks-param-show": "Afficher uniquement les éléments correspondant à ces critères.\nPar exemple, pour voir uniquement les blocages infinis sur les adresses IP, mettre $1show=ip|!temp.",
+       "apihelp-query+blocks-param-prop": "Quelles propriétés obtenir :\n;id:Ajoute l’ID du blocage.\n;user:Ajoute le nom de l’utilisateur bloqué.\n;userid:Ajoute l’ID de l’utilisateur bloqué.\n;by:Ajoute le nom de l’utilisateur ayant bloqué.\n;byid:Ajoute l’ID de l’utilisateur ayant bloqué.\n;timestamp:Ajoute l’horodatage du blocage.\n;expiry:Ajoute l’horodatage d’expiration du blocage.\n;reason:Ajoute le motif du blocage.\n;range:Ajoute la plage dadresses IP affectée par le blocage.\n;flags:Marque le bannissement avec (autoblock, anononly, etc.).",
+       "apihelp-query+blocks-param-show": "Afficher uniquement les éléments correspondant à ces critères.\nPar exemple, pour voir uniquement les blocages infinis sur les adresses IP, mettre <kbd>$1show=ip|!temp</kbd>.",
        "apihelp-query+blocks-example-simple": "Lister les blocages",
-       "apihelp-query+blocks-example-users": "Lister les blocages des utilisateurs Alice et Bob",
+       "apihelp-query+blocks-example-users": "Lister les blocages des utilisateurs <kbd>Alice</kbd> et <kbd>Bob</kbd>.",
        "apihelp-query+categories-description": "Lister toutes les catégories auxquelles les pages appartiennent.",
        "apihelp-query+categories-param-prop": "Quelles propriétés supplémentaires obtenir de chaque catégorie :\n;sortkey:Ajoute la clé de tri (chaîne hexadécimale) et son préfixe (partie lisible) de la catégorie.\n;timestamp:Ajoute l’horodatage de l’ajout de la catégorie.\n;hidden:Marque els catégories cachées avec _&#95;HIDDENCAT_&#95;.",
        "apihelp-query+categories-param-show": "Quelle sorte de catégories afficher.",
        "apihelp-query+categories-param-limit": "Combien de catégories renvoyer.",
        "apihelp-query+categories-param-categories": "Lister uniquement ces catégories. Utile pour vérifier si une certaine page est dans une certaine catégorie.",
        "apihelp-query+categories-param-dir": "La direction dans laquelle lister.",
-       "apihelp-query+categories-example-simple": "Obtenir une liste des catégories auxquelles appartient [[Albert Einstein]]",
-       "apihelp-query+categories-example-generator": "Obtenir des informations sur toutes les catégories utilisées dans [[Albert Einstein]]",
+       "apihelp-query+categories-example-simple": "Obtenir une liste des catégories auxquelles appartient la page <kbd>Albert Einstein</kbd>.",
+       "apihelp-query+categories-example-generator": "Obtenir des informations sur toutes les catégories utilisées dans la page <kbd>Albert Einstein</kbd>.",
        "apihelp-query+categoryinfo-description": "Renvoie les informations sur les catégories données.",
-       "apihelp-query+categoryinfo-example-simple": "Obtenir des informations sur [[:Category:Foo]] et [[:Category:Bar]]",
+       "apihelp-query+categoryinfo-example-simple": "Obtenir des informations sur <kbd>Category:Foo</kbd> et <kbd>Category:Bar</kbd>.",
        "apihelp-query+categorymembers-description": "Lister toutes les pages d’une catégorie donnée.",
-       "apihelp-query+categorymembers-param-title": "Quelle catégorie énumérer (obligatoire). Doit comprendre le préfixe « Category: ». Impossible à utiliser avec $1pageid.",
-       "apihelp-query+categorymembers-param-pageid": "ID de la page de la catégorie à énumérer. Impossible à utiliser avec $1title.",
+       "apihelp-query+categorymembers-param-title": "Quelle catégorie énumérer (obligatoire). Doit comprendre le préfixe <kbd>{{ns:category}}:</kbd>. Impossible à utiliser avec <var>$1pageid</var>.",
+       "apihelp-query+categorymembers-param-pageid": "ID de la page de la catégorie à énumérer. Impossible à utiliser avec <var>$1title</var>.",
        "apihelp-query+categorymembers-param-prop": "Quelles informations inclure :\n;ids:Ajoute l’ID de la page.\n;title:Ajoute le titre et l’ID de l’espace de noms de la page.\n;sortkey:Ajoute la clé de tri utilisée pour trier dans la catégorie (chaîne hexadécimale).\n;sortkeyprefix:Ajoute le préfixe de la clé de tri utilisé pour trier dans la catégorie (partie lisible de la clé de tri).\n;type:Ajoute le type dans lequel a été catégorisée la page (page, sous-catégorie ou fichier).\n;timestamp:Ajoute l’horodatage de l’inclusion de la page.",
-       "apihelp-query+categorymembers-param-namespace": "Inclure uniquement les pages dans ces espaces de nom. Remarquez que $1type=subcat ou $1type=file peuvent  être utilisés à la place de $1namespace=14 or 6.",
-       "apihelp-query+categorymembers-param-type": "Quel type de membres de la catégorie inclure. Ignoré quand $1sort=timestamp est positionné.",
+       "apihelp-query+categorymembers-param-namespace": "Inclure uniquement les pages dans ces espaces de nom. Remarquez que <kbd>$1type=subcat</kbd> ou <kbd>$1type=file</kbd> peuvent  être utilisés à la place de <kbd>$1namespace=14</kbd> ou <kbd>6</kbd>.",
+       "apihelp-query+categorymembers-param-type": "Quel type de membres de la catégorie inclure. Ignoré quand <kbd>$1sort=timestamp</kbd> est positionné.",
        "apihelp-query+categorymembers-param-limit": "Le nombre maximal de pages à renvoyer.",
        "apihelp-query+categorymembers-param-sort": "Propriété par laquelle trier.",
        "apihelp-query+categorymembers-param-dir": "Dans quelle direction trier.",
-       "apihelp-query+categorymembers-param-start": "Horodatage auquel démarrer la liste. Peut être utilisé uniquement avec $1sort=timestamp.",
-       "apihelp-query+categorymembers-param-end": "Horodatage auquel terminer la liste. Peut être utilisé uniquement avec $1sort=timestamp.",
-       "apihelp-query+categorymembers-param-starthexsortkey": "Clé de tri à laquelle démarrer le listage, telle que renvoyée par $1prop=sortkey. Utilisable uniquement avec $1sort=sortkey.",
-       "apihelp-query+categorymembers-param-endhexsortkey": "Clé de tri à laquelle arrêter le listage, telle que renvoyée par $1prop=sortkey. Utilisable uniquement avec $1sort=sortkey.",
-       "apihelp-query+categorymembers-param-startsortkeyprefix": "Préfixe de la clé de tri à laquelle démarrer le listage. Utilisable uniquement avec $1sort=sortkey. Écrase $1starthexsortkey.",
+       "apihelp-query+categorymembers-param-start": "Horodatage auquel démarrer la liste. Peut être utilisé uniquement avec <kbd>$1sort=timestamp</kbd>.",
+       "apihelp-query+categorymembers-param-end": "Horodatage auquel terminer la liste. Peut être utilisé uniquement avec <kbd>$1sort=timestamp</kbd>.",
+       "apihelp-query+categorymembers-param-starthexsortkey": "Clé de tri à laquelle démarrer le listage, telle que renvoyée par <kbd>$1prop=sortkey</kbd>. Utilisable uniquement avec <kbd>$1sort=sortkey</kbd>.",
+       "apihelp-query+categorymembers-param-endhexsortkey": "Clé de tri à laquelle arrêter le listage, telle que renvoyée par <kbd>$1prop=sortkey</kbd>. Utilisable uniquement avec <kbd>$1sort=sortkey</kbd>.",
+       "apihelp-query+categorymembers-param-startsortkeyprefix": "Préfixe de la clé de tri à laquelle démarrer le listage. Utilisable uniquement avec <kbd>$1sort=sortkey</kbd>. Écrase <var>$1starthexsortkey</var>.",
        "apihelp-query+categorymembers-param-endsortkeyprefix": "Préfixe de la clé de tri AVANT laquelle se termine le listage (et non pas à, si cette valeur existe elle ne sera pas incluse !). Utilisable uniquement avec $1sort=sortkey. Écrase $1endhexsortkey.",
        "apihelp-query+categorymembers-param-startsortkey": "Utiliser plutôt $1starthexsortkey.",
        "apihelp-query+categorymembers-param-endsortkey": "Utiliser plutôt $1endhexsortkey.",
-       "apihelp-query+categorymembers-example-simple": "Obtenir les 10 premières pages de [[:Category:Physics]]",
-       "apihelp-query+categorymembers-example-generator": "Obtenir l’information sur les 10 premières pages de [[:Category:Physics]]",
+       "apihelp-query+categorymembers-example-simple": "Obtenir les 10 premières pages de <kbd>Category:Physics</kbd>.",
+       "apihelp-query+categorymembers-example-generator": "Obtenir l’information sur les 10 premières pages de <kbd>Category:Physics</kbd>.",
        "apihelp-query+contributors-description": "Obtenir la liste des contributeurs connectés et le nombre de contributeurs anonymes d’une page.",
        "apihelp-query+contributors-param-group": "Inclure uniquement les utilisateurs dans les groupes donnés. Ne pas inclure les groupes implicites ou auto-promus comme *, user ou autoconfirmed.",
        "apihelp-query+contributors-param-excludegroup": "Exclure les utilisateurs des groupes donnés. Ne pas inclure les groupes implicites ou auto-promus comme *, user ou autoconfirmed.",
        "apihelp-query+contributors-param-rights": "Inclure uniquement les utilisateurs ayant les droits donnés. Ne pas inclure les droits accordés par les groupes implicites ou auto-promus comme *, user ou autoconfirmed.",
        "apihelp-query+contributors-param-excluderights": "Exclure les utilisateurs ayant les droits donnés. Ne pas inclure les droits accordés par les groupes implicites ou auto-promus comme *, user ou autoconfirmed.",
        "apihelp-query+contributors-param-limit": "Combien de contributeurs renvoyer.",
-       "apihelp-query+contributors-example-simple": "Afficher les contributeurs dans la [[Main Page]]",
+       "apihelp-query+contributors-example-simple": "Afficher les contributeurs dans la <kbd>Main Page</kbd>.",
        "apihelp-query+deletedrevisions-description": "Obtenir des informations sur la révision supprimée.\n\nPeut être utilisé de différentes manières :\n# Obtenir les révisions supprimées pour un ensemble de pages, en donnant les titres ou les ids de page. Ordonné par titre  et horodatage.\n# Obtenir des données sur un ensemble de révisions supprimées en donnant leurs IDs et leurs ids de révision. Ordonné par ID de révision.",
        "apihelp-query+deletedrevisions-param-start": "L’horodatage auquel démarrer l’énumération. Ignoré lors du traitement d’une liste d’IDs de révisions.",
        "apihelp-query+deletedrevisions-param-end": "L’horodatage auquel arrêter l’énumération. Ignoré lors du traitement d’une liste d’IDs de révisions.",
        "apihelp-query+deletedrevisions-param-excludeuser": "Ne pas lister les révisions faites par cet utilisateur.",
        "apihelp-query+deletedrevisions-param-limit": "Le nombre maximal de révisions à lister.",
        "apihelp-query+deletedrevisions-param-prop": "Quelles propriétés obtenir :\n;revid:Ajoute l’ID de la révision supprimée.\n;parentid:Ajoute l’ID de la révision précédente de la page.\n;user:Ajoute l’utilisateur ayant fait la révision.\n;userid:Ajoute l’ID de l’utilisateur ayant fait la révision.\n;comment:Ajoute le commentaire de la révision.\n;parsedcomment:Ajoute le commentaire analysé de la révision.\n;minor:Marque si une révision est mineure.\n;len:Ajoute la taille (en octets) de la révision.\n;sha1:Ajoute le SHA-1 (base 16) de la révision.\n;content:Ajoute le contenu de la révision.\n;tags:Balises pour la révision.",
-       "apihelp-query+deletedrevisions-example-titles": "Lister les révisions supprimées de [[Main Page]] et [[Talk:Main Page]], avec leur contenu",
-       "apihelp-query+deletedrevisions-example-revids": "Lister les informations pour la révision supprimée 123456",
+       "apihelp-query+deletedrevisions-example-titles": "Lister les révisions supprimées des pages <kbd>Main Page</kbd> et <kbd>Talk:Main Page</kbd>, avec leur contenu.",
+       "apihelp-query+deletedrevisions-example-revids": "Lister les informations pour la révision supprimée <kbd>123456</kbd>.",
        "apihelp-query+deletedrevs-description": "Lister les révisions supprimées.\n\nOpère selon trois modes :\n# Lister les révisions supprimées pour les titres donnés, triées par horodatage.\n# Lister les contributions supprimées pour l’utilisateur donné, triées par horodatage (pas de titres spécifiés).\n# Lister toutes les révisions supprimées dans l’espace de noms donné, triées par titre et horodatage (aucun titre spécifié, $1user non positionné).\n\nCertains paramètres ne s’appliquent qu’à certains modes et sont ignorés dans les autres.",
        "apihelp-query+deletedrevs-paraminfo-modes": "{{PLURAL:$1|Mode|Modes}} : $2",
        "apihelp-query+deletedrevs-param-start": "L’horodatage auquel démarrer l’énumération.",
        "apihelp-query+deletedrevs-param-namespace": "Lister uniquement les pages dans cet espace de noms.",
        "apihelp-query+deletedrevs-param-limit": "Le nombre maximal de révisions à lister.",
        "apihelp-query+deletedrevs-param-prop": "Quelles propriétés obtenir :\n;revid:Ajoute l’ID de la révision supprimée.\n;parentid:Ajoute l’ID de la révision précédente de la page.\n;user:Ajoute l’utilisateur ayant fait la révision.\n;userid:Ajoute l’ID de l’utilisateur qui a fait la révision.\n;comment:Ajoute le commentaire de la révision.\n;parsedcomment:Ajoute le commentaire analysé de la révision.\n;minor:Marque si la révision est mineure.\n;len:Ajoute la longueur (en octets) de la révision.\n;sha1:Ajoute le SHA-1 (base 16) de la révision.\n;content:Ajoute le contenu de la révision.\n;token:<span class=\"apihelp-deprecated\">Obsolète.</span> Fournit le jeton de modification.\n;tags:Balises pour la révision.",
-       "apihelp-query+deletedrevs-example-mode1": "Lister les dernières révisions supprimées de Main Page et Talk:Main Page, avec le contenu (mode 1)",
-       "apihelp-query+deletedrevs-example-mode2": "Lister les 50 dernières contributions de Bob supprimées (mode 2)",
+       "apihelp-query+deletedrevs-example-mode1": "Lister les dernières révisions supprimées de des pages <kbd>Main Page</kbd> et <kbd>Talk:Main Page</kbd>, avec le contenu (mode 1).",
+       "apihelp-query+deletedrevs-example-mode2": "Lister les 50 dernières contributions de <kbd>Bob</kbd> supprimées (mode 2).",
        "apihelp-query+deletedrevs-example-mode3-main": "Lister les 50 premières révisions supprimées dans l’espace de noms principal (mode 3)",
-       "apihelp-query+deletedrevs-example-mode3-talk": "Lister les 50 premières pages supprimées dans l’espace de noms Talk (mode 3) :",
+       "apihelp-query+deletedrevs-example-mode3-talk": "Lister les 50 premières pages supprimées dans l’espace de noms {{ns:talk}} (mode 3).",
        "apihelp-query+disabled-description": "Ce module de requête a été désactivé.",
        "apihelp-query+duplicatefiles-description": "Lister tous les fichiers qui sont des doublons des fichiers donnés d’après leurs valeurs de hachage.",
        "apihelp-query+duplicatefiles-param-limit": "Combien de fichiers dupliqués à renvoyer.",
        "apihelp-query+embeddedin-param-dir": "La direction dans laquelle lister.",
        "apihelp-query+embeddedin-param-filterredir": "Comment filtrer les redirections.",
        "apihelp-query+embeddedin-param-limit": "Combien de pages renvoyer au total.",
-       "apihelp-query+embeddedin-example-simple": "Afficher les pages incluant [[Template:Stub]]",
-       "apihelp-query+embeddedin-example-generator": "Obteir des informations sur les pages incluant [[Template:Stub]]",
+       "apihelp-query+embeddedin-example-simple": "Afficher les pages incluant <kbd>Template:Stub</kbd>.",
+       "apihelp-query+embeddedin-example-generator": "Obteir des informations sur les pages incluant <kbd>Template:Stub</kbd>.",
        "apihelp-query+extlinks-description": "Renvoyer toutes les URLs externes (non interwikis) des pages données.",
        "apihelp-query+extlinks-param-limit": "Combien de liens renvoyer.",
-       "apihelp-query+extlinks-param-protocol": "Protocole de l’URL. Si vide et $1query est positionné, le protocole est « http ». Laisser à la fois ceci et $1query vide pour lister tous les liens externes.",
+       "apihelp-query+extlinks-param-protocol": "Protocole de l’URL. Si vide et <var>$1query</var> est positionné, le protocole est <kbd>http</kbd>. Laisser à la fois ceci et <var>$1query</var> vide pour lister tous les liens externes.",
        "apihelp-query+extlinks-param-query": "Rechercher une chaîne sans protocole. Utile pour vérifier si une certaine page contient une certaine URL externe.",
        "apihelp-query+extlinks-param-expandurl": "Étendre les URLs relatives au protocole avec le protocole canonique.",
-       "apihelp-query+extlinks-example-simple": "Obtenir une liste des liens externes de [[Main Page]]",
+       "apihelp-query+extlinks-example-simple": "Obtenir une liste des liens externes de <kbd>Main Page<kbd>.",
        "apihelp-query+exturlusage-description": "Énumérer les pages contenant une URL donnée.",
        "apihelp-query+exturlusage-param-prop": "Quelles informations inclure :\n;ids:Ajoute l’ID de la page.\n;title:Ajoute le titre et l’ID de l’espace de noms de la page.\n;url:Ajoute l’URL utilisée dans la page.",
-       "apihelp-query+exturlusage-param-protocol": "Protocole de l’URL. Si vide et que $1query est rempli, le protocole est « http ». Le laisser avec $1query vide pour lister tous les liens externes.",
+       "apihelp-query+exturlusage-param-protocol": "Protocole de l’URL. Si vide et que <var>$1query</var>  est rempli, le protocole est <kbd>http</kbd>. Le laisser avec <var>$1query</var>  vide pour lister tous les liens externes.",
        "apihelp-query+exturlusage-param-query": "Rechercher une chaîne sans protocole. Voyez [[Special:LinkSearch]]. Le laisser vide liste tous les liens externes.",
        "apihelp-query+exturlusage-param-namespace": "Les espaces de nom à énumérer.",
        "apihelp-query+exturlusage-param-limit": "Combien de pages renvoyer.",
        "apihelp-query+exturlusage-param-expandurl": "Étendre les URLs relatives au protocole avec le protocole canonique.",
-       "apihelp-query+exturlusage-example-simple": "Afficher les pages avec un lien vers http://www.mediawiki.org",
+       "apihelp-query+exturlusage-example-simple": "Afficher les pages avec un lien vers <kbd>http://www.mediawiki.org</kbd>.",
        "apihelp-query+filearchive-description": "Énumérer séquentiellement tous les fichiers supprimés.",
        "apihelp-query+filearchive-param-from": "Le titre de l’image auquel démarrer l’énumération.",
        "apihelp-query+filearchive-param-to": "Le titre de l’image auquel arrêter l’énumération.",
        "apihelp-query+filearchive-param-prop": "Quelle information obtenir sur l’image :\n;sha1:Ajoute le hachage SHA-1 pour l’image.\n;timestamp:Ajoute l÷’horodatage pour la version téléchargée.\n;user:Ajoute l’utilisateur qui a téléchargé la version de l’image.\n;size:Ajoute la taille de l’image en octets et la hauteur, la largeur et le nombre de page (si c’est applicable).\n;dimensions:Alias pour la taille.\n;description:Ajoute la description de la version de l’image.\n;parseddescription:Analyser la description de la version.\n;mime:Ajoute le MIME de l’image.\n;mediatype:Ajoute le type de média de l’image.\n;metadata:Liste les métadonnées Exif pour la version de l’image.\n;bitdepth:Ajoute la profondeur de bit de la version.\n;archivename:Ajoute le nom de fichier de la version d’archive pour les versions autres que la dernière.",
        "apihelp-query+filearchive-example-simple": "Afficher une liste de tous les fichiers supprimés",
        "apihelp-query+filerepoinfo-description": "Renvoyer les méta-informations sur les référentiels d’image configurés dans le wiki.",
-       "apihelp-query+filerepoinfo-param-prop": "Quelles propriétés du référentiel récupérer (il peut y en avoir plus de disponibles sur certains wikis) :\n;apiurl:URL de l’API du référentiel - utile pour obtenir les infos de l’image depuis l’hôte.\n;name:La clé du référentiel - utilisé par ex. dans $wgForeignFileRepos et les valeurs de retour de imageinfo.\n;displayname:Le nom lisible du wiki référentiel.\n;rooturl:URL racine des chemins d’image.\n;local:Si ce référentiel est le référentiel local ou non.",
+       "apihelp-query+filerepoinfo-param-prop": "Quelles propriétés du référentiel récupérer (il peut y en avoir plus de disponibles sur certains wikis) :\n;apiurl:URL de l’API du référentiel - utile pour obtenir les infos de l’image depuis l’hôte.\n;name:La clé du référentiel - utilisé par ex. dans les valeurs de retour de <var>[[mw:Manual:$wgForeignFileRepos|$wgForeignFileRepos]]</var> et [[Special:ApiHelp/query+imageinfo|imageinfo]].\n;displayname:Le nom lisible du wiki référentiel.\n;rooturl:URL racine des chemins d’image.\n;local:Si ce référentiel est le référentiel local ou non.",
        "apihelp-query+filerepoinfo-example-simple": "Obtenir l’information sur les référentiels de fichier",
        "apihelp-query+fileusage-description": "Trouver toutes les pages qui utilisent les fichiers donnés.",
        "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+imageinfo-param-end": "Horodatage auquel arrêter la liste.",
        "apihelp-query+imageinfo-param-urlwidth": "Si $2prop=url est défini, une URL vers une image à l’échelle de cette largeur sera renvoyée.\nPour des raisons de performance si cette option est utilisée, pas plus de $1 images mises à l’échelle seront renvoyées.",
        "apihelp-query+imageinfo-param-urlheight": "Similaire à $1urlwidth.",
-       "apihelp-query+imageinfo-param-metadataversion": "Version de métadonnées à utiliser. Si « latest » est spécifié, utiliser la dernière version. Par défaut à « 1 » pour la compatibilité ascendante.",
+       "apihelp-query+imageinfo-param-metadataversion": "Version de métadonnées à utiliser. Si <kbd>latest</kbd> est spécifié, utiliser la dernière version. Par défaut à <kbd>1</kbd> pour la compatibilité ascendante.",
        "apihelp-query+imageinfo-param-extmetadatalanguage": "Quelle langue pour analyser extmetadata. Cela affecte à la fois quelle traduction analyser, s’il y en a plusieurs, et comment les choses comme les nombres et d’autres valeurs sont mises en forme.",
        "apihelp-query+imageinfo-param-extmetadatamultilang": "Si des traductions pour la propriété extmetadata sont disponibles, les analyser toutes.",
        "apihelp-query+imageinfo-param-extmetadatafilter": "Si spécifié et non vide, seules ces clés seront renvoyées pour $1prop=extmetadata.",
-       "apihelp-query+imageinfo-param-urlparam": "Une chaîne de paramètre spécifique à l’analyseur. Par exemple, les PDFs peuvent utiliser « page15-100px ». $1urlwidth doit être utilisé et être cohérent avec $1urlparam.",
+       "apihelp-query+imageinfo-param-urlparam": "Une chaîne de paramètre spécifique à l’analyseur. Par exemple, les PDFs peuvent utiliser <kbd>page15-100px</kbd>. <var>$1urlwidth</var> doit être utilisé et être cohérent avec <var>$1urlparam</var>.",
        "apihelp-query+imageinfo-param-localonly": "Rechercher les fichiers uniquement dans le référentiel local.",
        "apihelp-query+imageinfo-example-simple": "Analyser les informations sur la version actuelle de [[:File:Albert Einstein Head.jpg]]",
        "apihelp-query+imageinfo-example-dated": "Analyser les informations sur les versions de [[:File:Test.jpg]] depuis 2008",
        "apihelp-query+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+info-example-simple": "Obtenir des informations sur la page <kbd>Main Page</kbd>.",
+       "apihelp-query+info-example-protection": "Obtenir des informations générale et de protection sur la page <kbd>Main Page</kbd>.",
        "apihelp-query+iwbacklinks-description": "Trouver toutes les pages qui ont un lien vers le lien interwiki indiqué.\n\nPeut être utilisé pour trouver tous les liens avec un préfixe, ou tous les liens vers un titre (avec un préfixe donné). N’utiliser aucun paramètre revient en pratique à « tous les liens interwiki ».",
        "apihelp-query+iwbacklinks-param-prefix": "Préfixe pour l’interwiki.",
-       "apihelp-query+iwbacklinks-param-title": "Lien interwiki à rechercher. Doit être utilisé avec $1blprefix.",
+       "apihelp-query+iwbacklinks-param-title": "Lien interwiki à rechercher. Doit être utilisé avec <var>$1blprefix</var>.",
        "apihelp-query+iwbacklinks-param-limit": "Combien de pages renvoyer.",
        "apihelp-query+iwbacklinks-param-prop": "Quelles propriétés obtenir :\n;iwprefix:Ajoute le préfixe de l’interwiki.\n;iwtitle:Ajoute le titre de l’interwiki.",
        "apihelp-query+iwbacklinks-param-dir": "La direction dans laquelle lister.",
        "apihelp-query+iwlinks-param-prop": "Quelles propriétés supplémentaires obtenir pour chaque lien interlangue :\n;url:Ajoute l’URL complète.",
        "apihelp-query+iwlinks-param-limit": "Combien de liens interwiki renvoyer.",
        "apihelp-query+iwlinks-param-prefix": "Renvoyer uniquement les liens interwiki avec ce préfixe.",
-       "apihelp-query+iwlinks-param-title": "Lien interwiki à rechercher. Doit être utilisé avec $1prefix.",
+       "apihelp-query+iwlinks-param-title": "Lien interwiki à rechercher. Doit être utilisé avec <var>$1prefix</var>.",
        "apihelp-query+iwlinks-param-dir": "La direction dans laquelle lister.",
-       "apihelp-query+iwlinks-example-simple": "Obtenir les liens interwiki de [[Main Page]]",
+       "apihelp-query+iwlinks-example-simple": "Obtenir les liens interwiki de la page <kbd>Main Page</kbd>.",
        "apihelp-query+langbacklinks-description": "Trouver toutes les pages qui ont un lien vers le lien de langue indiqué.\n\nPeut être utilisé pour trouver tous les liens avec un code de langue, ou tous les liens vers un titre (avec une langue donnée). N’utiliser aucun paramètre revient à « tous les liens de langue ».\n\nNotez que cela peut ne pas prendre en compte les liens de langue ajoutés par les extensions.",
        "apihelp-query+langbacklinks-param-lang": "Langue pour le lien de langue.",
        "apihelp-query+langbacklinks-param-title": "Lien interlangue à rechercher. Doit être utilisé avec $1lang.",
        "apihelp-query+langbacklinks-example-generator": "Obtenir des informations sur les pages ayant un lien vers [[:fr:Test]]",
        "apihelp-query+langlinks-description": "Renvoie tous les liens interlangue des pages fournies.",
        "apihelp-query+langlinks-param-limit": "Combien de liens interlangue renvoyer.",
-       "apihelp-query+langlinks-param-url": "S’il faut récupérer l’URL complète (impossible à utiliser avec $1prop).",
-       "apihelp-query+langlinks-param-prop": "Quelles propriétés supplémentaires obtenir pour chaque lien interlangue :\n;url:Ajoute l’URL complète.\n;langname:Ajoute le nom localisé de la langue (au mieux). Utiliser $1inlanguagecode pour contrôler la langue.\n;autonym:Ajoute le nom natif de la langue.",
+       "apihelp-query+langlinks-param-url": "S’il faut récupérer l’URL complète (impossible à utiliser avec <var>$1prop</var>).",
+       "apihelp-query+langlinks-param-prop": "Quelles propriétés supplémentaires obtenir pour chaque lien interlangue :\n;url:Ajoute l’URL complète.\n;langname:Ajoute le nom localisé de la langue (au mieux). Utiliser <var>$1inlanguagecode</var> pour contrôler la langue.\n;autonym:Ajoute le nom natif de la langue.",
        "apihelp-query+langlinks-param-lang": "Renvoyer uniquement les liens interlangue avec ce code de langue.",
-       "apihelp-query+langlinks-param-title": "Lien à rechercher. Doit être utilisé avec $1lang.",
+       "apihelp-query+langlinks-param-title": "Lien à rechercher. Doit être utilisé avec <var>$1lang</var>.",
        "apihelp-query+langlinks-param-dir": "La direction dans laquelle énumérer.",
        "apihelp-query+langlinks-param-inlanguagecode": "Code de langue pour les noms de langue localisés.",
-       "apihelp-query+langlinks-example-simple": "Obtenir les liens interlangue de [[Main Page]]",
+       "apihelp-query+langlinks-example-simple": "Obtenir les liens interlangue de la page <kbd>Main Page</kbd>.",
        "apihelp-query+links-description": "Renvoie tous les liens des pages fournies.",
        "apihelp-query+links-param-namespace": "Afficher les liens uniquement dans ces espaces de nom.",
        "apihelp-query+links-param-limit": "Combien de liens renvoyer.",
        "apihelp-query+links-param-titles": "Lister uniquement les liens vers ces titres. Utile pour vérifier si une certaine page a un lien vers un titre donné.",
        "apihelp-query+links-param-dir": "La direction dans laquelle lister.",
-       "apihelp-query+links-example-simple": "Obtenir les liens de [[Main Page]]",
-       "apihelp-query+links-example-generator": "Obtenir des informations sur tous les liens de page dans [[Main Page]]",
+       "apihelp-query+links-example-simple": "Obtenir les liens de la page <kbd>Main Page</kbd>",
+       "apihelp-query+links-example-generator": "Obtenir des informations sur tous les liens de page dans <kbd>Main Page</kbd>.",
        "apihelp-query+links-example-namespaces": "Obtenir les liens de [[Main Page]] dans les espaces de nom Utilisateur et Modèle",
        "apihelp-query+linkshere-description": "Trouver toutes les pages ayant un lien vers les pages données.",
        "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+logevents-description": "Obtenir des événements des journaux.",
        "apihelp-query+logevents-param-prop": "Quelles propriétés obtenir :\n;ids:Ajoute l’ID de l’événement.\n;title:Ajoute le titre de la page pour l’événement.\n;type:Ajoute le type de l’événement.\n;user:Ajoute l’utilisateur responsable de l’événement.\n;userid:Ajoute l’ID de l’utilisateur responsable de l’événement.\n;timestamp:Ajoute l’horodatage de l’événement.\n;comment:Ajoute le commentaire de l’événement.\n;parsedcomment:Ajoute le commentaire analysé de l’événement.\n;details:Liste les détails supplémentaires sur l’événement.\n;tags:Liste les balises de l’événement.",
        "apihelp-query+logevents-param-type": "Filtrer les entrées du journal à ce seul type.",
-       "apihelp-query+logevents-param-action": "Filtrer les actions du journal à cette seule action. Écrase $1type. Des actions avec une astérisque de la forme « action/* » sont autorisées pour spécifier n’importe quelle chaîne à la place de l’astérisque.",
+       "apihelp-query+logevents-param-action": "Filtrer les actions du journal à cette seule action. Écrase <var>$1type</var>. Des actions avec une astérisque de la forme <var>$1type</var> sont autorisées pour spécifier n’importe quelle chaîne à la place de l’astérisque.",
        "apihelp-query+logevents-param-start": "L’horodatage auquel démarrer l’énumération.",
        "apihelp-query+logevents-param-end": "L’horodatage auquel arrêter l’énumération.",
        "apihelp-query+logevents-param-user": "Restreindre aux entrées générées par l’utilisateur spécifié.",
        "apihelp-query+logevents-example-simple": "Liste les entrées de journal récentes.",
        "apihelp-query+pagepropnames-description": "Lister les noms de toutes les propriétés de page utilisées sur le wiki.",
        "apihelp-query+pagepropnames-param-limit": "Le nombre maximal de noms à renvoyer.",
-       "apihelp-query+pagepropnames-example-simple": "Obtenir les 10 premiers noms de propriété",
+       "apihelp-query+pagepropnames-example-simple": "Obtenir les 10 premiers noms de propriété.",
        "apihelp-query+pageprops-description": "Obtenir diverses propriétés définies dans le contenu de la page.",
        "apihelp-query+pageprops-param-prop": "Lister uniquement ces propriétés. Utile pour vérifier si une certaine page utilise une certaine propriété de page.",
-       "apihelp-query+pageprops-example-simple": "Obtenir les propriétés de [[:Category:Foo]]",
+       "apihelp-query+pageprops-example-simple": "Obtenir les propriétés de <kbd>Category:Foo</kbd>.",
        "apihelp-query+pageswithprop-description": "Lister toutes les pages utilisant une propriété de page donnée.",
        "apihelp-query+pageswithprop-param-propname": "Propriété de page pour laquelle énumérer les pages.",
        "apihelp-query+pageswithprop-param-prop": "Quelles informations inclure :\n;ids:Ajoute l’ID de la page.\n;title:Ajoute le titre et l’ID de l’espace de noms de la page.\n;value:Ajoute la valeur de la propriété de page.",
        "apihelp-query+pageswithprop-param-limit": "Le nombre maximal de pages à renvoyer.",
        "apihelp-query+pageswithprop-param-dir": "Dans quelle direction trier.",
-       "apihelp-query+pageswithprop-example-simple": "Lister les 10 premières pages en utilisant &#123;&#123;DISPLAYTITLE:&#125;&#125;",
-       "apihelp-query+pageswithprop-example-generator": "Obtenir des informations sur les 10 premières pages utilisant _&#95;NOTOC_&#95;",
+       "apihelp-query+pageswithprop-example-simple": "Lister les 10 premières pages en utilisant <code>&#123;&#123;DISPLAYTITLE:&#125;&#125;</code>.",
+       "apihelp-query+pageswithprop-example-generator": "Obtenir des informations sur les 10 premières pages utilisant <code>_&#95;NOTOC_&#95;</code>.",
        "apihelp-query+prefixsearch-description": "Effectuer une recherche de préfixe sur les titres de page.",
        "apihelp-query+prefixsearch-param-search": "Chaîne de recherche.",
        "apihelp-query+prefixsearch-param-namespace": "Espaces de nom à rechercher.",
        "apihelp-query+prefixsearch-param-limit": "Nombre maximal de résultats à renvoyer.",
        "apihelp-query+prefixsearch-param-offset": "Nombre de résultats à sauter.",
-       "apihelp-query+prefixsearch-example-simple": "Rechercher les titres de page commençant par « meaning »",
+       "apihelp-query+prefixsearch-example-simple": "Rechercher les titres de page commençant par <kbd>meaning</kbd>.",
        "apihelp-query+protectedtitles-description": "Lister tous les titres protégés en création.",
        "apihelp-query+protectedtitles-param-namespace": "Lister uniquement les titres dans ces espaces de nom.",
        "apihelp-query+protectedtitles-param-level": "Lister uniquement les titres avec ces niveaux de protection.",
        "apihelp-query+recentchanges-param-excludeuser": "Ne pas lister les modifications par cet utilisateur.",
        "apihelp-query+recentchanges-param-tag": "Lister uniquement les modifications marquées avec cette balise.",
        "apihelp-query+recentchanges-param-prop": "Inclure des informations supplémentaires :\n;user:Ajoute l’utilisateur responsable de la modification et marque si c’est une adresse IP.\n;userid:Ajoute l’ID de l’utilisateur responsable de la modification.\n;comment:Ajoute le commentaire de la modification.\n;parsedcomment:Ajoute le commentaire analysé pour la modification.\n;flags:Ajoute les balises de la modification.\n;timestamp:Ajoute l’horodatage de la modification.\n;title:Ajoute le titre de la page modifiée.\n;ids:Ajoute l’ID de la page, l’ID des modifications récentes et l’ID de l’ancienne et la nouvelle révisions.\n;sizes:Ajoute l’ancienne et la nouvelle tailles de la page en octets.\n;redirect:Marque la modification si la page est une redirection.\n;patrolled:Marque les modifications patrouillables comme patrouillées ou non.\n;loginfo:Ajoute les informations du journal (Id du journal, type de trace, etc.) aux entrées du journal.\n;tags:Liste les balises de l’entrée.\n;sha1:Ajoute la somme de contrôle du contenu pour les entrées associées à une révision.",
-       "apihelp-query+recentchanges-param-token": "Utiliser plutôt [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].",
+       "apihelp-query+recentchanges-param-token": "Utiliser plutôt <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.",
        "apihelp-query+recentchanges-param-show": "Afficher uniquement les éléments correspondant à ces critères. Par exemple, pour voir uniquement les modifications mineures par des utilisateurs connectés, mettre $1show=minor|!anon.",
        "apihelp-query+recentchanges-param-limit": "Combien de modifications renvoyer au total.",
        "apihelp-query+recentchanges-param-type": "Quels types de modification afficher.",
        "apihelp-query+revisions-param-excludeuser": "Exclure les révisions faites par l’utilisateur.",
        "apihelp-query+revisions-param-tag": "Lister uniquement les révisions marquées avec cette balise.",
        "apihelp-query+revisions-param-token": "Quels jetons obtenir pour chaque révision.",
-       "apihelp-query+revisions-example-content": "Obtenir des données avec le contenu pour la dernière révision des titres « API » et « Page principale »",
-       "apihelp-query+revisions-example-last5": "Obtenir les 5 dernières révisions de la « Page principale »",
-       "apihelp-query+revisions-example-first5": "Obtenir les 5 premières révisions de la « Page principale »",
-       "apihelp-query+revisions-example-first5-after": "Obtenir les 5 premières révisions de la « Page principale » faites après le 01/05/2006",
-       "apihelp-query+revisions-example-first5-not-localhost": "Obtenir les 5 premières révisions de la « Page principale » qui n’ont pas été faites par l’utilisateur anonyme « 127.0.0.1 »",
-       "apihelp-query+revisions-example-first5-user": "Obtenir les 5 premières révisions de la « Page principale » qui ont été faites par l’utilisateur « MédiaWiki par défaut »",
+       "apihelp-query+revisions-example-content": "Obtenir des données avec le contenu pour la dernière révision des titres <kbd>API</kbd> et <kbd>Page principale</kbd>.",
+       "apihelp-query+revisions-example-last5": "Obtenir les 5 dernières révisions de la <kbd>Main Page</kbd>.",
+       "apihelp-query+revisions-example-first5": "Obtenir les 5 premières révisions de la <kbd>Page principale</kbd>.",
+       "apihelp-query+revisions-example-first5-after": "Obtenir les 5 premières révisions de la <kbd>Page principale</kbd> faites après le 01/05/2006.",
+       "apihelp-query+revisions-example-first5-not-localhost": "Obtenir les 5 premières révisions de la <kbd>Page principale</kbd> qui n’ont pas été faites par l’utilisateur anonyme <kbd>127.0.0.1</kbd>.",
+       "apihelp-query+revisions-example-first5-user": "Obtenir les 5 premières révisions de la <kbd>Page principale</kbd> qui ont été faites par l’utilisateur <kbd>MédiaWiki par défaut</kbd>.",
        "apihelp-query+revisions+base-param-prop": "Quelles propriétés obtenir pour chaque révision :\n;ids:L’ID de la révision.\n;flags:Marques de la révision (mineure).\n;timestamp:L’horodatage de la révision.\n;user:Utilisateur ayant fait la révision.\n;userid:ID de l’utilisateur ayant créé la révision.\n;size:Taille (en octets) de la révision.\n;sha1:SHA-1 (base 16) de la révision.\n;contentmodel:ID du modèle de contenu de la révision.\n;comment:Commentaire par l’utilisateur de la révision.\n;parsedcomment:Commentaire analysé par l’utilisateur de la révision.\n;content:Texte de la révision.\n;tags:Balises de la révision.",
        "apihelp-query+revisions+base-param-limit": "Limiter le nombre de révisions retournées.",
        "apihelp-query+revisions+base-param-expandtemplates": "Développer les modèles dans le contenu de la révision (nécessite $1prop=content).",
        "apihelp-query+revisions+base-param-generatexml": "Générer l’arbre d’analyse XML pour le contenu de la révision (nécessite $1prop=content).",
        "apihelp-query+revisions+base-param-parse": "Analyser le contenu de la révision (nécessite $1prop=content). Pour des raisons de performance, si cette option est utilisée, $1limit est forcé à 1.",
        "apihelp-query+revisions+base-param-section": "Récupérer uniquement le contenu de ce numéro de section.",
-       "apihelp-query+revisions+base-param-diffto": "ID de révision à comparer à chaque révision. Utiliser « prev », « next » et « cur » pour la version précédente, suivante et actuelle respectivement.",
-       "apihelp-query+revisions+base-param-difftotext": "Texte auquel comparer chaque révision. Compare uniquement un nombre limité de révisions. Écrase $1diffto. Si $1section est positionné, seule cette section sera comparée avec ce texte",
-       "apihelp-query+revisions+base-param-contentformat": "Format de sérialisation utilisé pour $1difftotext et attendu pour la sortie du contenu.",
+       "apihelp-query+revisions+base-param-diffto": "ID de révision à comparer à chaque révision. Utiliser <kbd>prev</kbd>, <kbd>next</kbd> et <kbd>cur</kbd> pour la version précédente, suivante et actuelle respectivement.",
+       "apihelp-query+revisions+base-param-difftotext": "Texte auquel comparer chaque révision. Compare uniquement un nombre limité de révisions. Écrase <var>$1diffto</var>. Si <var>$1section</var> est positionné, seule cette section sera comparée avec ce texte",
+       "apihelp-query+revisions+base-param-contentformat": "Format de sérialisation utilisé pour <var>$1difftotext</var> et attendu pour la sortie du contenu.",
        "apihelp-query+search-description": "Effectuer une recherche en texte intégral.",
        "apihelp-query+search-param-search": "Rechercher les titres (ou le contenu) de toutes les pages ayant cette valeur.",
        "apihelp-query+search-param-namespace": "Rechercher uniquement dans ces espaces de nom.",
        "apihelp-query+search-param-limit": "Combien de pages renvoyer au total.",
        "apihelp-query+search-param-interwiki": "Inclure les résultats interwiki dans la recherche, s’ils sont disponibles.",
        "apihelp-query+search-param-backend": "Quel serveur de recherche utiliser, si ce n’est pas celui par défaut.",
-       "apihelp-query+search-example-simple": "Rechercher « signification »",
-       "apihelp-query+search-example-text": "Rechercher des textes pour « signification »",
-       "apihelp-query+search-example-generator": "Obtenir les informations sur les pages renvoyées par une recherche de « signification »",
+       "apihelp-query+search-example-simple": "Rechercher  <kbd>signification </kbd>.",
+       "apihelp-query+search-example-text": "Rechercher des textes pour <kbd>signification</kbd>.",
+       "apihelp-query+search-example-generator": "Obtenir les informations sur les pages renvoyées par une recherche de <kbd>signification</kbd>.",
        "apihelp-query+siteinfo-description": "Renvoyer les informations générales sur le site.",
-       "apihelp-query+siteinfo-param-prop": "Quelles informations obtenir :\n;general:Information globale du système.\n;namespaces:Liste des espaces de nom déclarés et leur nom canonique.\n;namespacealiases:Liste des alias des espaces de nom déclarés.\n;specialpagealiases:Liste des alias des pages spéciales.\n;magicwords:Liste des mots magiques et leurs alias.\n;statistics:Renvoie les statistiques du site.\n;interwikimap:Renvoie la correspondance interwiki (éventuellement filtrée, (éventuellement localisée en utilisant $1inlanguagecode)).\n;dbrepllag:Renvoie le serveur de base de donnée avec la plus grande latence de réplication.\n;usergroups:Renvoie les groupes utilisateur et les droits associés.\n;extensions:Renvoie les extensions installées sur le wiki.\n;fileextensions:Renvoie la liste des extensions de fichier autorisées au téléchargement.\n;rightsinfo:Renvoie l’information sur les droits du wiki (sa licence), si elle est disponible.\n;restrictions:Renvoie l’information sur les types de restriction disponibles (protection).\n;languages:Renvoie une liste des langues que supporte MédiaWiki (éventuellement localisé en utilisant $1inlanguagecode).\n;skins:Renvoie une liste de tous les habillages activés (éventuellement localisé en utilisant $1inlanguagecode, sinon dans la langue du contenu).\n;extensiontags:Renvoie une liste des balises d’extension de l’analyseur.\n;functionhooks:Renvoie une liste des accroches de fonction de l’analyseur.\n;showhooks:Renvoie une liste de toutes les accroches souscrites (contenu de $wgHooks).\n;variables:Renvoie une liste des IDs de variable.\n;protocols:Renvoie une liste des protocoles qui sont autorisés dans les liens externes.\n;defaultoptions:Renvoie les valeurs par défaut pour les préférences utilisateur.",
+       "apihelp-query+siteinfo-param-prop": "Quelles informations obtenir :\n;general:Information globale du système.\n;namespaces:Liste des espaces de nom déclarés et leur nom canonique.\n;namespacealiases:Liste des alias des espaces de nom déclarés.\n;specialpagealiases:Liste des alias des pages spéciales.\n;magicwords:Liste des mots magiques et leurs alias.\n;statistics:Renvoie les statistiques du site.\n;interwikimap:Renvoie la correspondance interwiki (éventuellement filtrée, éventuellement localisée en utilisant <var>$1inlanguagecode</var>).\n;dbrepllag:Renvoie le serveur de base de donnée avec la plus grande latence de réplication.\n;usergroups:Renvoie les groupes utilisateur et les droits associés.\n;extensions:Renvoie les extensions installées sur le wiki.\n;fileextensions:Renvoie la liste des extensions de fichier autorisées au téléchargement.\n;rightsinfo:Renvoie l’information sur les droits du wiki (sa licence), si elle est disponible.\n;restrictions:Renvoie l’information sur les types de restriction disponibles (protection).\n;languages:Renvoie une liste des langues que supporte MédiaWiki (éventuellement localisé en utilisant <var>$1inlanguagecode</var>).\n;skins:Renvoie une liste de tous les habillages activés (éventuellement localisé en utilisant <var>$1inlanguagecode</var>, sinon dans la langue du contenu).\n;extensiontags:Renvoie une liste des balises d’extension de l’analyseur.\n;functionhooks:Renvoie une liste des accroches de fonction de l’analyseur.\n;showhooks:Renvoie une liste de toutes les accroches souscrites (contenu de <var>[[mw:Manual:$wgHooks|$wgHooks]]</var>).\n;variables:Renvoie une liste des IDs de variable.\n;protocols:Renvoie une liste des protocoles qui sont autorisés dans les liens externes.\n;defaultoptions:Renvoie les valeurs par défaut pour les préférences utilisateur.",
        "apihelp-query+siteinfo-param-filteriw": "Renvoyer uniquement les entrées locales ou uniquement les non locales de la correspondance interwiki.",
        "apihelp-query+siteinfo-param-showalldb": "Lister tous les serveurs de base de données, pas seulement celui avec la plus grande latence.",
        "apihelp-query+siteinfo-param-numberingroup": "Liste le nombre d’utilisateurs dans les groupes.",
        "apihelp-query+templates-param-templates": "Lister uniquement ces modèles. Utile pour vérifier si une certaine page utilise un modèle donné.",
        "apihelp-query+templates-param-dir": "La direction dans laquelle lister.",
        "apihelp-query+templates-example-simple": "Obtenir les modèles de [[Main Page]]",
-       "apihelp-query+templates-example-generator": "Obtenir des informations sur les pages modèle de [[Main Page]]",
+       "apihelp-query+templates-example-generator": "Obtenir des informations sur les pages modèle utilisé sur <kbd>Main Page</kbd>.",
        "apihelp-query+templates-example-namespaces": "Obtenir les modèles de [[Main Page]] dans les espaces de nom Utilisateur et Modèle",
        "apihelp-query+tokens-description": "Récupère les jetons pour les actions de modification de données.",
        "apihelp-query+tokens-param-type": "Types de jeton à demander.",
        "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;!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+transcludedin-example-simple": "Obtenir une liste des pages incluant <kbd>Main Page</kbd>.",
+       "apihelp-query+transcludedin-example-generator": "Obtenir des informations sur les pages incluant <kbd>Main Page</kbd>.",
        "apihelp-query+usercontribs-description": "Obtenir toutes les modifications par un utilisateur.",
        "apihelp-query+usercontribs-param-limit": "Le nombre maximal de contributions à renvoyer.",
        "apihelp-query+usercontribs-param-start": "L’horodatage auquel démarrer le retour.",
        "apihelp-query+usercontribs-param-userprefix": "Récupérer les contributions pour tous les utilisateurs dont les noms commencent par cette valeur. Écrase $1user.",
        "apihelp-query+usercontribs-param-namespace": "Lister uniquement les contributions dans ces espaces de nom.",
        "apihelp-query+usercontribs-param-prop": "Inclure des informations supplémentaires:\n;ids:Ajoute l’ID de page et l’ID de révision.\n;title:Ajoute le titre et l’ID d’espace de noms de la page.\n;timestamp:Ajoute l’horodatage de la modification.\n;comment:Ajoute le commentaire de la modification.\n;parsedcomment:Ajoute le commentaire analysé de la modification.\n;size:Ajoute la nouvelle taille de la modification.\n;sizediff:Ajoute le delta de taille de la modification par rapport à son parent.\n;flags:Ajoute les marques de la modification.\n;patrolled:Marque les modifications patrouillées.\n;tags:Liste les balises de la modification.",
-       "apihelp-query+usercontribs-param-show": "Afficher uniquement les éléments correspondant à ces critères, par ex. les modifications non mineures uniquement : $2show=!minor.\n\nSi $2show=patrolled ou $2show=!patrolled est positionné, les révisions plus anciennes que [https://www.mediawiki.org/wiki/Manual:$wgRCMaxAge $wgRCMaxAge] ($1 {{PLURAL:$1|seconde|secondes}}) ne seront pas affichées.",
+       "apihelp-query+usercontribs-param-show": "Afficher uniquement les éléments correspondant à ces critères, par ex. les modifications non mineures uniquement : <kbd>$2show=!minor</kbd>.\n\nSi <kbd>$2show=patrolled</kbd> ou <kbd>$2show=!patrolled</kbd> est positionné, les révisions plus anciennes que <var>[[mw:Manual:$wgRCMaxAge|$wgRCMaxAge]]</var> ($1 {{PLURAL:$1|seconde|secondes}}) ne seront pas affichées.",
        "apihelp-query+usercontribs-param-tag": "Lister uniquement les révisions marquées avec cette balise.",
        "apihelp-query+usercontribs-param-toponly": "Lister uniquement les modifications qui sont la dernière révision.",
-       "apihelp-query+usercontribs-example-user": "Afficher les contributions de [[User:Exemple]]",
-       "apihelp-query+usercontribs-example-ipprefix": "Afficher les contributions de toutes les adresses IP avec le préfixe « 192.0.2. »",
+       "apihelp-query+usercontribs-example-user": "Afficher les contributions de l'utilisateur <kbd>Exemple</kbd>.",
+       "apihelp-query+usercontribs-example-ipprefix": "Afficher les contributions de toutes les adresses IP avec le préfixe <kbd>192.0.2.</kbd>.",
        "apihelp-query+userinfo-description": "Obtenir de l’information sur l’utilisateur courant.",
-       "apihelp-query+userinfo-param-prop": "Quelles informations inclure :\n;blockinfo:Marque si l’utilisateur actuel est bloqué, par qui, et pour quelle raison.\n;hasmsg:Ajoute une balise « message » si l’utilisateur actuel a des messages en cours.\n;groups:Liste tous les groupes auxquels appartient l’utilisateur actuel.\n;implicitgroups:Liste tous les groupes dont l’utilisateur actuel est automatiquement membre.\n;rights:Liste tous les droits qu’a l’utilisateur actuel.\n;changeablegroups:Liste les groupes pour lesquels l’utilisateur actuel peut ajouter ou supprimer.\n;options:Liste toutes les préférences qu’a défini l’utilisateur actuel.\n;preferencestoken:OBSOLETE ! Obtient un jeton pour modifier les préférences de l’utilisateur actuel.\n;editcount:Ajoute le compteur de modifications de l’utilisateur actuel.\n;ratelimits:Liste toutes les limites de débit s’appliquant à l’utilisateur actuel.\n;realname:Ajoute le vrai nom de l’utilisateur actuel.\n;email:Ajoute l’adresse de courriel de l’utilisateur et sa date d’authentification.\n;acceptlang:Renvoie en écho l’entête Accept-Language envoyé par le client dans un format structuré.\n;registrationdate:Ajoute la date d’inscription de l’utilisateur.\n;unreadcount:Ajoute le compteur de pages non lues de la liste de suivi de l’utilisateur (au maximum $1 ; renvoie « $2 » s’il y en a plus).",
+       "apihelp-query+userinfo-param-prop": "Quelles informations inclure :\n;blockinfo:Marque si l’utilisateur actuel est bloqué, par qui, et pour quelle raison.\n;hasmsg:Ajoute une balise <samp>message</samp> si l’utilisateur actuel a des messages en cours.\n;groups:Liste tous les groupes auxquels appartient l’utilisateur actuel.\n;implicitgroups:Liste tous les groupes dont l’utilisateur actuel est automatiquement membre.\n;rights:Liste tous les droits qu’a l’utilisateur actuel.\n;changeablegroups:Liste les groupes pour lesquels l’utilisateur actuel peut ajouter ou supprimer.\n;options:Liste toutes les préférences qu’a défini l’utilisateur actuel.\n;preferencestoken:<span class=\"apihelp-deprecated\">Obsolete.</span> Obtient un jeton pour modifier les préférences de l’utilisateur actuel.\n;editcount:Ajoute le compteur de modifications de l’utilisateur actuel.\n;ratelimits:Liste toutes les limites de débit s’appliquant à l’utilisateur actuel.\n;realname:Ajoute le vrai nom de l’utilisateur actuel.\n;email:Ajoute l’adresse de courriel de l’utilisateur et sa date d’authentification.\n;acceptlang:Renvoie en écho l’entête <code>Accept-Language</code> envoyé par le client dans un format structuré.\n;registrationdate:Ajoute la date d’inscription de l’utilisateur.\n;unreadcount:Ajoute le compteur de pages non lues de la liste de suivi de l’utilisateur (au maximum $1 ; renvoie <samp>$2</samp> s’il y en a plus).",
        "apihelp-query+userinfo-example-simple": "Obtenir de l’information sur l’utilisateur actuel",
        "apihelp-query+userinfo-example-data": "Obtenir des informations supplémentaires sur l’utilisateur actuel",
        "apihelp-query+users-description": "Obtenir des information sur une liste d’utilisateurs",
        "apihelp-query+users-param-prop": "Quelles informations inclure :\n;blockinfo:Marque si l’utilisateur est bloqué, par qui, et pour quelle raison.\n;groups:Liste tous les groupes auquel appartient chaque utilisateur.\n;implicitgroups:Liste tous les groupes dont un utilisateur est automatiquement membre.\n;rights:Liste tous les droits qu’a un utilisateur.\n;editcount:Ajoute le compteur de modifications de l’utilisateur.\n;registration:Ajoute l’horodatage d’inscription de l’utilisateur.\n;emailable:Marque si l’utilisateur peut et veut recevoir des courriels via [[Special:Emailuser]].\n;gender:Marque le sexe de l’utilisateur. Renvoie « male », « female », ou « unknown ».",
        "apihelp-query+users-param-users": "Une liste des utilisateurs sur lesquels obtenir de l’information.",
-       "apihelp-query+users-param-token": "Utiliser plutôt [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].",
-       "apihelp-query+users-example-simple": "Renvoyer des informations pour [[User:Exemple]]",
+       "apihelp-query+users-param-token": "Utiliser plutôt <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.",
+       "apihelp-query+users-example-simple": "Renvoyer des informations pour l'utilisateur <kbd>Exemple</kbd>.",
        "apihelp-query+watchlist-description": "Obtenir les modifications récentes des pages dans la liste de suivi de l’utilisateur connecté.",
        "apihelp-query+watchlist-param-allrev": "Inclure les multiples révisions de la même page dans l’intervalle de temps fourni.",
        "apihelp-query+watchlist-param-start": "L’horodatage auquel démarrer l’énumération.",
        "apihelp-query+watchlist-example-allrev": "Chercher les informations sur toutes les modifications récentes des pages de la liste de suivi de l’utilisateur actuel",
        "apihelp-query+watchlist-example-generator": "Chercher l’information de la page sur les pages récemment modifiées de la liste de suivi de l’utilisateur actuel",
        "apihelp-query+watchlist-example-generator-rev": "Chercher l’information de la révision pour les modifications récentes des pages de la liste de suivi de l’utilisateur actuel",
-       "apihelp-query+watchlist-example-wlowner": "Lister la révision de tête des pages récemment modifiées de la liste de suivi de [[User:Exemple]]",
+       "apihelp-query+watchlist-example-wlowner": "Lister la révision de tête des pages récemment modifiées de la liste de suivi de l'utilisateur <kbd>Exemple</kbd>.",
        "apihelp-query+watchlistraw-description": "Obtenir toutes les pages de la liste de suivi de l’utilisateur connecté.",
        "apihelp-query+watchlistraw-param-namespace": "Lister uniquement les pages dans les espaces de nom fournis.",
        "apihelp-query+watchlistraw-param-limit": "Combien de résultats renvoyer au total par requête.",
        "apihelp-revisiondelete-param-show": "Quoi démasquer pour chaque révision",
        "apihelp-revisiondelete-param-suppress": "S’il faut supprimer les données aux administrateurs comme aux autres.",
        "apihelp-revisiondelete-param-reason": "Motif de suppression ou d’annulation de suppression.",
-       "apihelp-revisiondelete-example-revision": "Masquer le contenu de la révision 12345 de la Page principale",
-       "apihelp-revisiondelete-example-log": "Masquer toutes les données de l’entrée de journal 67890 avec le motif « Violation de Biographie de Personne Vivante »",
+       "apihelp-revisiondelete-example-revision": "Masquer le contenu de la révision <kbd>12345</kbd> de la page <kbd>Main Page</kbd>",
+       "apihelp-revisiondelete-example-log": "Masquer toutes les données de l’entrée de journal <kbd>67890</kbd> avec le motif <kbd>Violation de Biographie de Personne Vivante</kbd>.",
        "apihelp-rollback-description": "Annuler la dernière modification de la page.\n\nSi le dernier utilisateur à avoir modifié la page a fait plusieurs modifications sur une ligne, elles seront toutes annulées.",
        "apihelp-rollback-param-title": "Titre de la page que vous voulez restaurer. Impossible à utiliser avec $1pageid.",
        "apihelp-rollback-param-pageid": "ID de la page que vous voulez restaurer. Impossible à utiliser avec $1title.",
        "apihelp-rollback-param-summary": "Personnaliser le résumé de la modification. S’il est vide, le résumé par défaut sera utilisé.",
        "apihelp-rollback-param-markbot": "Marquer les modifications annulées et les modifications annulées comme robot.",
        "apihelp-rollback-param-watchlist": "Ajouter ou supprimer la page de votre liste de suivi sans condition, utiliser les préférences ou ne pas modifier le suivi.",
-       "apihelp-rollback-example-simple": "Annuler les dernières modifications à [[Main Page]] par l’utilisateur Exemple",
-       "apihelp-rollback-example-summary": "Annuler les dernières modifications sur [[Main Page]] par l’utilisateur à l’adresse IP 192.0.2.5 avec le résumé « Annulation de vandalisme », et marquer ces modifications et l’annulation comme « robot »",
+       "apihelp-rollback-example-simple": "Annuler les dernières modifications à [<kbd>Main Page</kbd> par l’utilisateur <kbd>Exemple</kbd>.",
+       "apihelp-rollback-example-summary": "Annuler les dernières modifications de la page <kbd>Main Page</kbd> par l’utilisateur à l’adresse IP <kbd>192.0.2.5</kbd> avec le résumé <kbd>Annulation de vandalisme<kbd>, et marquer ces modifications et l’annulation comme modifications de robots.",
        "apihelp-rsd-description": "Exporter un schéma RSD (Découverte Très Simple).",
        "apihelp-rsd-example-simple": "Exporter le schéma RSD",
        "apihelp-setnotificationtimestamp-description": "Mettre à jour l’horodatage de notification pour les pages suivies.\n\nCela affecte la mise en évidence des pages modifiées dans la liste de suivi et l’historique, et l’envoi de courriel quand la préférence « M’envoyer un courriel quand une page de ma liste de suivi est modifiée » est activée.",
        "apihelp-setnotificationtimestamp-param-torevid": "Révision pour laquelle fixer l’horodatage de notification (une page uniquement).",
        "apihelp-setnotificationtimestamp-param-newerthanrevid": "Révision pour fixer l’horodatage de notification plus récent (une page uniquement).",
        "apihelp-setnotificationtimestamp-example-all": "Réinitialiser l’état de notification pour toute la liste de suivi",
-       "apihelp-setnotificationtimestamp-example-page": "Réinitialiser l’état de notification pour la « Page principale »",
-       "apihelp-setnotificationtimestamp-example-pagetimestamp": "Fixer l’horodatage de notification pour « Page principale » afin que toutes les modifications depuis le 1 janvier 2012 soient non vues",
-       "apihelp-setnotificationtimestamp-example-allpages": "Réinitialiser l’état de notification sur les pages dans l’espace de noms Utilisateur",
+       "apihelp-setnotificationtimestamp-example-page": "Réinitialiser l’état de notification pour la <kbd>Page principale<kbd>.",
+       "apihelp-setnotificationtimestamp-example-pagetimestamp": "Fixer l’horodatage de notification pour <kbd>Page principale</kbd> afin que toutes les modifications depuis le 1 janvier 2012 soient non vues",
+       "apihelp-setnotificationtimestamp-example-allpages": "Réinitialiser l’état de notification sur les pages dans l’espace de noms <kbd>{{ns:user}}</kbd>.",
        "apihelp-tokens-description": "Obtenir les jetons pour les actions modifiant les données.\n\nCe module est obsolète, remplacé par [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].",
        "apihelp-tokens-param-type": "Types de jeton à demander.",
        "apihelp-tokens-example-edit": "Récupérer un jeton de modification (par défaut).",
        "apihelp-tokens-example-emailmove": "Récupérer un jeton de courriel et un jeton de déplacement.",
        "apihelp-unblock-description": "Débloquer un utilisateur.",
-       "apihelp-unblock-param-id": "ID du blocage à lever (obtenu via list=blocks). Impossible à utiliser avec $1user.",
-       "apihelp-unblock-param-user": "Nom d’utilisateur, adresse IP ou plage d’adresse IP à débloquer. Impossible à utiliser avec $1id.",
+       "apihelp-unblock-param-id": "ID du blocage à lever (obtenu via <kbd>list=blocks</kbd>). Impossible à utiliser avec <var>$1user</var>.",
+       "apihelp-unblock-param-user": "Nom d’utilisateur, adresse IP ou plage d’adresse IP à débloquer. Impossible à utiliser avec <var>$1id</var>.",
        "apihelp-unblock-param-reason": "Motif de déblocage.",
-       "apihelp-unblock-example-id": "Lever le blocage d’ID #105",
-       "apihelp-unblock-example-user": "Débloquer l’utilisateur Bob avec le motif « Désolé Bob »",
+       "apihelp-unblock-example-id": "Lever le blocage d’ID #<kbd>105</kbd>.",
+       "apihelp-unblock-example-user": "Débloquer l’utilisateur <kbd>Bob</kbd> avec le motif <kbd>Désolé Bob</kbd>.",
        "apihelp-undelete-description": "Restaurer les révisions d’une page supprimée.\n\nUne liste des révisions supprimées (avec les horodatages) peut être récupérée via [[Special:ApiHelp/query+deletedrevs|list=deletedrevs]], et une liste d’IDs de fichier supprimé peut être récupérée via [[Special:ApiHelp/query+filearchive|list=filearchive]].",
        "apihelp-undelete-param-title": "Titre de la page à restaurer.",
        "apihelp-undelete-param-reason": "Motif de restauration.",
-       "apihelp-undelete-param-timestamps": "Horodatages des révisions à restaurer. Si $1timestamps et $1fileids sont vides, toutes seront restaurées.",
-       "apihelp-undelete-param-fileids": "IDs des révisions de fichier à restaurer. Si $1timestamps et $1fileids sont vides, toutes seront restaurées.",
+       "apihelp-undelete-param-timestamps": "Horodatages des révisions à restaurer. Si <var>$1timestamps</var> et <var>$1fileids</var> sont vides, toutes seront restaurées.",
+       "apihelp-undelete-param-fileids": "IDs des révisions de fichier à restaurer. Si <var>$1timestamps</var> et <var>$1fileids</var> sont vides, toutes seront restaurées.",
        "apihelp-undelete-param-watchlist": "Ajouter ou supprimer la page de votre liste de suivi sans condition, utiliser les préférences ou ne pas modifier le suivi.",
-       "apihelp-undelete-example-page": "Annuler la suppression de [[Main Page]]",
-       "apihelp-undelete-example-revisions": "Annuler la suppression de deux révisions de [[Main Page]]",
-       "apihelp-upload-description": "Télécharger un fichier, ou obtenir l’état des téléchargements en cours.\n\nPlusieurs méthodes sont disponibles :\n* Télécharger directement le contenu du fichier, en utilisant le paramètre « $1file ».\n* Télécharger le fichier par morceaux, en utilsiant les paramètres « $1filesize », « $1chunk » et « $1offset ».* Pour que le serveur MédiaWiki cherche un fichier depuis une URL, utiliser le paramètre « $1url ».\n* Terminer un téléchargement précédent qui a échoué à cause d’avertissements, en utilisant le paramètre « $1filekey ».\nNoter que le POST HTTP doit être fait comme un téléchargement de fichier (par ex. en utilisant multipart/form-data) en envoyant le « $1file ».",
+       "apihelp-undelete-example-page": "Annuler la suppression de la page <kbd>Main Page</kbd>.",
+       "apihelp-undelete-example-revisions": "Annuler la suppression de deux révisions de la page <kbd>Main Page</kbd>.",
+       "apihelp-upload-description": "Télécharger un fichier, ou obtenir l’état des téléchargements en cours.\n\nPlusieurs méthodes sont disponibles :\n* Télécharger directement le contenu du fichier, en utilisant le paramètre <var>$1file</var>.\n* Télécharger le fichier par morceaux, en utilsiant les paramètres <var>$1filesize</var>, <var>$1chunk</var>, and <var>$1offset</var>.* Pour que le serveur MédiaWiki cherche un fichier depuis une URL, utiliser le paramètre <var>$1url</var>.\n* Terminer un téléchargement précédent qui a échoué à cause d’avertissements, en utilisant le paramètre <var>$1filekey</var>.\nNoter que le POST HTTP doit être fait comme un téléchargement de fichier (par ex. en utilisant <code>multipart/form-data</code>) en envoyant le <code>multipart/form-data</code>.",
        "apihelp-upload-param-filename": "Nom de fichier cible.",
-       "apihelp-upload-param-comment": "Télécharger le commentaire. Utilisé aussi comme texte de la page initiale pour les nouveaux fichiers si « $1text » n’est pas spécifié.",
+       "apihelp-upload-param-comment": "Télécharger le commentaire. Utilisé aussi comme texte de la page initiale pour les nouveaux fichiers si <var>$1text</var> n’est pas spécifié.",
        "apihelp-upload-param-text": "Texte de page initiale pour les nouveaux fichiers.",
        "apihelp-upload-param-watch": "Suivre la page.",
        "apihelp-upload-param-watchlist": "Ajouter ou supprimer sans condition la page de votre liste de suivi, utiliser les préférences ou ne pas changer le suivi.",
        "apihelp-userrights-param-add": "Ajouter l’utilisateur à ces groupes.",
        "apihelp-userrights-param-remove": "Supprimer l’utilisateur de ces groupes.",
        "apihelp-userrights-param-reason": "Motif pour la modification.",
-       "apihelp-userrights-example-user": "Ajouter l’utilisateur FooBot au groupe « robot », et le supprimer des groupes « sysop » et « bureaucrate »",
-       "apihelp-userrights-example-userid": "Ajouter l’utilisateur d’ID 123 au groupe « robot », et le supprimer des groupes « sysop » et « bureaucrate »",
+       "apihelp-userrights-example-user": "Ajouter l’utilisateur <kbd>FooBot</kbd> au groupe <kbd>robot</kbd>, et le supprimer des groupes <kbd>sysop</kbd> et <kbd>bureaucrate</kbd>.",
+       "apihelp-userrights-example-userid": "Ajouter l’utilisateur d’ID <kbd>123</kbd> au groupe <kbd>robot</kbd>, et le supprimer des groupes <kbd>sysop</kbd> et <kbd>bureaucrate</kbd>.",
        "apihelp-watch-description": "Ajouter ou supprimer des pages de la liste de suivi de l’utilisateur actuel.",
-       "apihelp-watch-param-title": "La page à (ne plus) suivre. Utiliser plutôt $1titles.",
+       "apihelp-watch-param-title": "La page à (ne plus) suivre. Utiliser plutôt <var>$1titles</var>.",
        "apihelp-watch-param-unwatch": "Si défini, la page ne sera plus suivie plutôt que suivie.",
-       "apihelp-watch-example-watch": "Suivre la page « Page principale »",
-       "apihelp-watch-example-unwatch": "Ne plus suivre la page « Page principale »",
+       "apihelp-watch-example-watch": "Suivre la page <kbd>Page principale</kbd>.",
+       "apihelp-watch-example-unwatch": "Ne plus suivre la page <kbd>Page principale</kbd>.",
        "apihelp-watch-example-generator": "Suivre les quelques premières pages de l’espace de nom principal",
        "apihelp-format-example-generic": "Mettre en forme le résultat de la requête dans le format $1",
-       "apihelp-dbg-description": "Extraire les données au format de var_export() de PHP.",
-       "apihelp-dbgfm-description": "Extraire les données au format de var_export() de PHP (affiché proprement en HTML).",
-       "apihelp-dump-description": "Extraire les données au format de var_dump() de PHP.",
-       "apihelp-dumpfm-description": "Extraire les données au format de var_dump() de PHP (affiché proprement en HTML).",
+       "apihelp-dbg-description": "Extraire les données au format de <code>var_export()</code> de PHP.",
+       "apihelp-dbgfm-description": "Extraire les données au format de <code>var_export()</code> de PHP (affiché proprement en HTML).",
+       "apihelp-dump-description": "Extraire les données au format de <code>var_dump()</code> de PHP.",
+       "apihelp-dumpfm-description": "Extraire les données au format de <code>var_dump()</code> de PHP (affiché proprement en HTML).",
        "apihelp-json-description": "Extraire les données au format JSON.",
        "apihelp-json-param-callback": "Si spécifié, inclut la sortie dans l’appel d’une fonction fournie. Pour plus de sûreté, toutes les données spécifiques à l’utilisateur seront restreintes.",
        "apihelp-json-param-utf8": "Si spécifié, encode la plupart (mais pas tous) des caractères non ASCII en URF-8 au lieu de les remplacer par leur séquence d’échappement hexadécimale.",
        "apihelp-php-description": "Extraire les données au format sérialisé de PHP.",
        "apihelp-phpfm-description": "Extraire les données au format sérialisé de PHP (affiché proprement en HTML).",
        "apihelp-rawfm-description": "Extraire les données avec les éléments de débogage au format JSON (affiché proprement en HTML).",
-       "apihelp-txt-description": "Extraire les données au format de print_r() de PHP.",
-       "apihelp-txtfm-description": "Extraire les données au format de print_r() de PHP (affiché proprement en HTML).",
+       "apihelp-txt-description": "Extraire les données au format de <code>print_r()</code> de PHP.",
+       "apihelp-txtfm-description": "Extraire les données au format de <code>print_r()</code> de PHP (affiché proprement en HTML).",
        "apihelp-wddx-description": "Extraire les données au format WDDX.",
        "apihelp-wddxfm-description": "Extraire les données au format WDDX (affiché proprement en HTML).",
        "apihelp-xml-description": "Extraire les données au format XML.",
        "api-pageset-param-titles": "Une liste des titres sur lesquels travailler.",
        "api-pageset-param-pageids": "Une liste des IDs de page sur lesquelles travailler.",
        "api-pageset-param-revids": "Une liste des IDs de révision sur lesquelles travailler.",
-       "api-pageset-param-generator": "Obtenir la liste des pages sur lesquelles travailler en exécutant le module de recherche spécifié.\n\n'''NOTE :''' les noms de paramètre du générateur doivent être préfixés avec un « g », voir les exemples.",
-       "api-pageset-param-redirects-generator": "Résoudre automatiquement les redirections dans $1titles, $1pageids et $1revids, et dans les pages renvoyées par $1generator.",
-       "api-pageset-param-redirects-nogenerator": "Résoudre automatiquement les redirections dans $1titles, $1pageids et $1revids.",
+       "api-pageset-param-generator": "Obtenir la liste des pages sur lesquelles travailler en exécutant le module de recherche spécifié.\n\n<strong>NOTE :<strong> les noms de paramètre du générateur doivent être préfixés avec un « g », voir les exemples.",
+       "api-pageset-param-redirects-generator": "Résoudre automatiquement les redirections dans <var>$1titles</var>, <var>$1pageids</var> et <var>$1revids</var>, et dans les pages renvoyées par <var>$1generator</var>.",
+       "api-pageset-param-redirects-nogenerator": "Résoudre automatiquement les redirections dans <var>$1titles</var>, <var>$1pageids</var> et <var>$1revids</var>.",
        "api-pageset-param-converttitles": "Convertir les titres dans d’autres variantes si nécessaire. Fonctionne uniquement si la langue de contenu du wiki supporte la conversion en variantes. Les langues qui supportent la conversion en variante incluent $1.",
        "api-help-title": "Aide de l’API de MediaWiki",
        "api-help-lead": "Ceci est une page d’aide de l’API de MédiaWiki générée automatiquement.\n\nDocumentation et exemples : https://www.mediawiki.org/wiki/API",
        "api-help-parameters": "{{PLURAL:$1|Paramètre|Paramètres}} :",
        "api-help-param-deprecated": "Obsolète.",
        "api-help-param-required": "Ce paramètre est obligatoire.",
-       "api-help-param-list": "{{PLURAL:$1|1=Une valeur|2=Valeurs (séparées par « {{!}} »)}} : $2",
+       "api-help-param-list": "{{PLURAL:$1|1=Une valeur|2=Valeurs (séparées par <kbd>{{!}}</kbd>)}} : $2",
        "api-help-param-list-can-be-empty": "{{PLURAL:$1|0=Doit être vide|Peut être vide, ou $2}}",
        "api-help-param-limit": "Pas plus de $1 autorisé.",
        "api-help-param-limit2": "Pas plus de $1 autorisé ($2 pour les robots).",
        "api-help-param-integer-max": "{{PLURAL:$1|1=La valeur ne doit pas être supérieure|2=Les valeurs ne doivent pas être supérieures}} à $3.",
        "api-help-param-integer-minmax": "{{PLURAL:$1|1=La valeur doit|2=Les valeurs doivent}} être entre $2 et $3.",
        "api-help-param-upload": "Doit être envoyé comme un fichier importé utilisant multipart/form-data.",
-       "api-help-param-multi-separate": "Valeurs séparées par « | ».",
+       "api-help-param-multi-separate": "Valeurs séparées par <kbd>|</kbd>.",
        "api-help-param-multi-max": "Le nombre maximal de valeurs est {{PLURAL:$1|$1}} ({{PLURAL:$2|$2}} pour les robots).",
        "api-help-param-default": "Par défaut : $1",
        "api-help-param-default-empty": "Par défaut : <span class=\"apihelp-empty\">(vide)</span>",
        "api-help-param-token": "Un jeton « $1 » récupéré par [[Special:ApiHelp/query+tokens|action=query&meta=tokens]]",
        "api-help-param-token-webui": "Pour rester compatible, le jeton utilisé dans l’IHM web est aussi accepté.",
-       "api-help-param-disabled-in-miser-mode": "Désactivé à cause du [https://www.mediawiki.org/wiki/Manual:$wgMiserMode mode minimal].",
-       "api-help-param-limited-in-miser-mode": "'''NOTE :''' Du fait du [https://www.mediawiki.org/wiki/Manual:$wgMiserMode mode minimal], utiliser cela peut aboutir à moins de résultats que « $1limit » renvoyés avant de continuer ; dans les cas extrêmes, zéro résultats peuvent être renvoyés.",
+       "api-help-param-disabled-in-miser-mode": "Désactivé à cause du [[mw:Manual:$wgMiserMode|mode minimal]].",
+       "api-help-param-limited-in-miser-mode": "<strong>NOTE :</strong> Du fait du [[mw:Manual:$wgMiserMode|mode minimal]], utiliser cela peut aboutir à moins de résultats que <var>$1limit</var> renvoyés avant de continuer ; dans les cas extrêmes, zéro résultats peuvent être renvoyés.",
        "api-help-param-direction": "Dans quelle direction énumérer :\n;newer:Lister les plus anciens en premier. Note : $1start doit être avant $1end.\n;older:Lister les nouveaux en premier (par défaut). Note : $1start doit être postérieur à $1end.",
        "api-help-param-continue": "Quand plus de résultats sont disponibles, utiliser cela pour continuer.",
        "api-help-param-no-description": "<span class=\"apihelp-empty\">(aucune description)</span>",
index 27ff6dd..05d5db2 100644 (file)
@@ -6,7 +6,7 @@
        },
        "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-password": "Mot de passe (ignoré si <var>$1mailpassword</var> 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.",
index 6ee0a0c..6d3ed76 100644 (file)
@@ -1,22 +1,32 @@
 {
        "@metadata": {
                "authors": [
-                       "Elisardojm"
+                       "Elisardojm",
+                       "Agremon",
+                       "Chairego apc",
+                       "VaiPolaSombra",
+                       "Banjo",
+                       "Fisterraeomar"
                ]
        },
-       "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-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Documentación]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Lista de discusión]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Anuncios da API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Erros e solicitudes]\n</div>\n<strong>Estado:</strong> Tódalas funcionalidades mostradas nesta páxina deberían estar funcionanado, pero a API aínda está desenrolo, e pode ser modificada en calquera momento. Apúntese na [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ lista de discusión mediawiki-api-announce] para estar informado acerca das actualizacións.\n\n<strong>Solicitudes incorrectas:</strong> Cando se envían solicitudes incorrectas á API, envíase unha cabeceira HTTP coa chave \"MediaWiki-API-Error\" e, a seguir, tanto o valor da cabeceira como o código de erro retornado serán definidos co mesmo valor. Para máis información, consulte [[mw:API:Errors_and_warnings|API: Erros e avisos]].",
        "apihelp-main-param-action": "Que acción se realizará.",
        "apihelp-main-param-format": "O formato de saída.",
+       "apihelp-main-param-maxlag": "O retardo máximo pode usarse cando MediaWiki está instalada nun cluster de base de datos replicadas. Para gardar accións que causen calquera retardo máis de replicación do sitio, este parámetro pode facer que o cliente espere ata que o retardo de replicación sexa menor que o valor especificado. No caso de retardo excesivo, é devolto o código de erro <samp>maxlag</samp> cunha mensaxe como <samp>esperando por $host: $lag segundos de retardo</samp>.<br />Para máis información, ver [[mw:Manual:Maxlag_parameter|Manual: Maxlag parameter]].",
        "apihelp-main-param-requestid": "Calquera valor dado aquí será incluído na resposta. Pode usarse para distingir peticións.",
+       "apihelp-main-param-servedby": "Inclúa o nome do servidor que servía a solicitude nos resultados.",
        "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-anononly": "Bloquear só usuarios anónimos (é dicir, desactivar edicións anónimas desta dirección 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-allowusertalk": "Permitir que o usuario edite a súa propia páxina de conversa (depende de <var>[[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>).",
        "apihelp-block-param-reblock": "Se o usuario xa está bloqueado, sobreescribir o bloqueo existente.",
-       "apihelp-block-param-watchuser": "Vixiar a páxina de usuario ou IP e a de conversa deste usuario",
+       "apihelp-block-param-watchuser": "Vixiar a páxina de usuario ou direccións IP e a de conversa deste usuario",
+       "apihelp-clearhasmsg-description": "Limpar a bandeira <code>hasmsg</code> para o usuario actual",
+       "apihelp-clearhasmsg-example-1": "Limpar a bandeira <code>hasmsg</code> para o usuario actual",
        "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-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-password": "Contrasinal (ignorado se <var>$1mailpassword</var> 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-createaccount-param-mailpassword": "Se se establece calquera valor, enviarase un contrasinal aleatorio ao usuario.",
+       "apihelp-createaccount-example-pass": "Crear usuario <kbd>testuser</kbd> con contrasinal <kbd>test123</kbd>.",
+       "apihelp-createaccount-example-mail": "Crear usuario <kbd>testmailuser</kbd>\"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-title": "Título da páxina a eliminar. Non pode usarse xunto con <var>$1pageid</var>.",
+       "apihelp-delete-param-pageid": "Identificador da páxina a eliminar. Non pode usarse xunto con <var>$1title</var>.",
        "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-delete-param-watch": "Engadir esta páxina á lista de vixilancia do usuario actual.",
+       "apihelp-delete-param-unwatch": "Eliminar esta páxina da lista de vixilancia do usuario actual.",
+       "apihelp-delete-example-simple": "Borrar <kbd>Main Page</kbd>.",
+       "apihelp-delete-example-reason": "Eliminar <kbd>Main Page</kbd>  coa razón <kbd>Preparing for move</kbd>.",
        "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-title": "Título da páxina que quere editar. Non pode usarse xunto con <var>$1pageid</var>.",
+       "apihelp-edit-param-pageid": "Identificador da páxina que quere editar. Non pode usarse xunto con <var>$1title</var>.",
+       "apihelp-edit-param-section": "Número de selección. O <kbd>0</kbd> é para a sección superior, <kbd>new</kbd> 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-param-nocreate": "Amosar un mensaxe de erro se a páxina non existe",
+       "apihelp-edit-param-watch": "Engadir esta páxina á lista de vixilancia do usuario actual.",
+       "apihelp-edit-param-unwatch": "Eliminar esta páxina da lista de vixilancia do usuario actual.",
+       "apihelp-edit-param-prependtext": "Engadir este texto ao comezo da páxina. Sobreescribirase $1text.",
+       "apihelp-edit-param-redirect": "Resolver redireccións automáticamente",
        "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-subject": "Asunto.",
        "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-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-tagfilter": "Filtrar as contribucións que teñan estas etiquetas.",
        "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-feedcontributions-example-simple": "Mostrar as contribucións do usuario <kbd>Example</kbd>.",
+       "apihelp-feedrecentchanges-param-invert": "Tódolos nomes de espazos agás o seleccionado",
+       "apihelp-feedrecentchanges-param-days": "Días a limitar os resultados",
        "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-feedrecentchanges-param-hideanons": "Ocultar os cambios realizados por usuarios anónimos.",
+       "apihelp-feedrecentchanges-param-hideliu": "Ocultar os cambios realizados por usuarios rexistrados.",
+       "apihelp-feedrecentchanges-param-hidepatrolled": "Ocultar os cambios patrullados.",
+       "apihelp-feedrecentchanges-param-hidemyself": "Ocultar os cambios realizados polo usuario actual.",
+       "apihelp-feedrecentchanges-param-tagfilter": "Filtrar por etiqueta.",
+       "apihelp-feedrecentchanges-param-target": "Mostrar só os cambios nas páxinas ligadas a esta.",
+       "apihelp-feedrecentchanges-param-showlinkedto": "Mostrar os cambios nas páxinas ligadas coa páxina seleccionada.",
+       "apihelp-feedrecentchanges-example-simple": "Mostrar os cambios recentes",
+       "apihelp-feedrecentchanges-example-30days": "Mostrar os cambios recentes limitados a 30 días",
+       "apihelp-feedwatchlist-example-all6hrs": "Amosar tódolos cambios feitos ás páxinas vixiadas nas últimas 6 horas.",
+       "apihelp-filerevert-description": "Revertir o ficheiro a unha versión anterior.",
+       "apihelp-filerevert-param-filename": "Nome de ficheiro final, sen o prefixo Ficheiro:",
+       "apihelp-filerevert-param-comment": "Comentario de carga.",
+       "apihelp-filerevert-param-archivename": "Nome de ficheiro da revisión á que reverter.",
+       "apihelp-help-description": "Mostrar axuda para os módulos indicados.",
+       "apihelp-help-param-submodules": "Incluír axuda para os submódulos do módulo nomeado.",
+       "apihelp-help-param-recursivesubmodules": "Incluír axuda para os submódulos de forma recursiva.",
+       "apihelp-help-param-helpformat": "Formato de saída da axuda.",
+       "apihelp-help-param-toc": "Incluír unha táboa de contidos na saída por HTML",
+       "apihelp-help-example-main": "Axuda para o módulo principal",
+       "apihelp-help-example-recursive": "Toda a axuda nunha páxina",
+       "apihelp-help-example-help": "Axuda do módulo de axuda en si",
+       "apihelp-imagerotate-description": "Xirar unha ou máis imaxes.",
+       "apihelp-imagerotate-param-rotation": "Graos a rotar a imaxe no sentido do reloxio.",
+       "apihelp-imagerotate-example-simple": "Rotar <kbd>File:Example.png</kbd> <kbd>90</kbd> graos.",
+       "apihelp-imagerotate-example-generator": "Rotar tódalas imaxes en <kbd>Category:Flip</kbd> <kbd>180</kbd> graos",
+       "apihelp-import-param-summary": "Resume de importación.",
        "apihelp-import-param-xml": "Subido ficheiro XML.",
+       "apihelp-import-param-interwikisource": "Para importacións interwiki: wiki da que importar.",
+       "apihelp-import-param-interwikipage": "Para importacións interwiki: páxina a importar.",
+       "apihelp-import-param-fullhistory": "Para importacións interwiki: importar o historial completo, non só a versión actual.",
+       "apihelp-import-param-templates": "Para importacións interwiki: importar tódolos modelos incluídos.",
+       "apihelp-import-param-namespace": "Para importacións interwiki: importar a este espazo de nomes.",
        "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-managetags-description": "Realizar tarefas de xestión relacionadas coa modificación de etiquetas.",
        "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-from": "Título da páxina que quere renomear. Non pode usarse xunto con <var>$1fromid</var>.",
+       "apihelp-move-param-fromid": "Identificador da páxina que quere renomear. Non pode usarse xunto con <var>$1from</var>.",
+       "apihelp-move-param-to": "Título ó que renomear a páxina.",
+       "apihelp-move-param-reason": "Motivo para o renomeamento.",
+       "apihelp-move-param-movetalk": "Renomear a páxina de conversa, se existe.",
+       "apihelp-move-param-movesubpages": "Renomear as subpáxinas, se é aplicable.",
        "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-watch": "Engadir a páxina e a redirección á páxina de vixiancia do usuario actual.",
+       "apihelp-move-param-unwatch": "Eliminar a páxina e a redirección da páxina de vixiancia do usuario actual.",
        "apihelp-move-param-ignorewarnings": "Ignorar as advertencias.",
+       "apihelp-move-example-move": "Mover <kbd>Títulomalo</kbd> a <kbd>Títulobo</kbd> sen deixar unha redirección.",
+       "apihelp-opensearch-description": "Buscar no wiki mediante o protocolo OpenSearch.",
        "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-opensearch-example-te": "Atopar páxinas que comezan por <kbd>Te</kbd>.",
+       "apihelp-options-param-reset": "Reiniciar preferencias ás iniciais do sitio.",
        "apihelp-options-example-reset": "Restablecer tódaalas preferencias",
        "apihelp-paraminfo-description": "Obter información sobre módulos API.",
+       "apihelp-patrol-description": "Patrullar unha páxina ou edición.",
        "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-param-watch": "Se se define este parámetro, engadir a páxina que se (des)protexe á lista de vixilancia do usuario actual.",
        "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-purge-example-simple": "Purgar a <kbd>Páxina Principal</kbd> e páxina da <kbd>API</kbd>.",
+       "apihelp-purge-example-generator": "Purgar as primeiras 10 páxinas no espazo de nomes principal.",
+       "apihelp-query+allcategories-description": "Numerar tódalas categorías",
+       "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "Non pode usarse con <var>$3user</var>.",
+       "apihelp-query+alldeletedrevisions-param-start": "Selo de tempo para comezar a enumeración.",
+       "apihelp-query+alldeletedrevisions-param-end": "Selo de tempo para rematar a enumeración.",
        "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-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+alldeletedrevisions-example-user": "Listar as últimas 50 contribucións borradas do usuario <kbd>Exemplo<kbd>.",
+       "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+allfileusages-example-unique": "Listar títulos únicos de ficheiros.",
        "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-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+alllinks-description": "Numerar tódalas ligazóns que apuntan a un nome de espazos determinado.",
+       "apihelp-query+alllinks-param-from": "Título da ligazón na que comezar a enumerar.",
+       "apihelp-query+alllinks-param-to": "Título da ligazón na que rematar de enumerar.",
+       "apihelp-query+alllinks-param-prefix": "Buscar tódolos títulos ligados que comezan con este valor.",
+       "apihelp-query+alllinks-param-namespace": "Espazo de nomes a enumerar.",
+       "apihelp-query+alllinks-param-limit": "Número total de obxectos a devolver.",
+       "apihelp-query+alllinks-param-dir": "Dirección na cal listar.",
+       "apihelp-query+alllinks-example-unique": "Listar títulos ligados únicos",
+       "apihelp-query+allmessages-param-prop": "Que propiedades obter.",
+       "apihelp-query+allmessages-param-args": "Argumentos a substituír na mensaxe.",
+       "apihelp-query+allmessages-param-filter": "Retornar só mensaxes con nomes que conteñan esta cadea.",
+       "apihelp-query+allmessages-param-lang": "Retornar mensaxes nesta lingua.",
+       "apihelp-query+allmessages-param-from": "Retornar mensaxes que comezan nesta mensaxe.",
+       "apihelp-query+allmessages-param-to": "Retornar mensaxes que rematan nesta mensaxe.",
+       "apihelp-query+allmessages-example-ipb": "Mostar mensaxes que comecen por <kbd>ipb-</kbd>.",
+       "apihelp-query+allpages-description": "Numerar tódalas páxinas secuencialmente nun espazo de nomes determinado.",
+       "apihelp-query+allpages-param-from": "Título da páxina na que comezar a enumerar.",
+       "apihelp-query+allpages-param-to": "Título da páxina na que rematar de enumerar.",
+       "apihelp-query+allpages-param-prefix": "Buscar tódolos títulos de páxinas que comezan con este valor.",
+       "apihelp-query+allpages-param-namespace": "Espazo de nomes a enumerar.",
+       "apihelp-query+allpages-param-filterredir": "Que páxinas listar.",
+       "apihelp-query+allpages-param-prtype": "Limitar a só protección de páxinas.",
+       "apihelp-query+allpages-param-prlevel": "Filtrar proteccións baseándose no nivel de protección (debe empregarse có parámetro $1prtype= ).",
+       "apihelp-query+allpages-param-limit": "Número total de páxinas a devolver.",
+       "apihelp-query+allpages-param-dir": "Dirección na cal listar.",
+       "apihelp-query+allpages-example-B": "Mostrar unha lista de páxinas que comezan pola letra <kbd>B</kbd>.",
+       "apihelp-query+allpages-example-generator": "Mostrar inforfmación sobre 4 páxinas que comecen pola letra <kbd>T</kbd>.",
+       "apihelp-query+allredirects-description": "Lista tódalas redireccións a un espazo de nomes.",
+       "apihelp-query+allredirects-param-from": "Título da redirección na que comezar a enumerar.",
+       "apihelp-query+allredirects-param-to": "Título da redirección na que rematar de enumerar.",
+       "apihelp-query+allredirects-param-namespace": "Espazo de nomes a enumerar.",
+       "apihelp-query+allredirects-param-limit": "Número total de obxectos a devolver.",
+       "apihelp-query+allredirects-param-dir": "Dirección na cal listar.",
+       "apihelp-query+alltransclusions-param-from": "Título da transclusión na que comezar a enumerar.",
+       "apihelp-query+alltransclusions-param-to": "Título da transclusión na que rematar de enumerar.",
+       "apihelp-query+alltransclusions-param-namespace": "Nome de espazos a numerar.",
+       "apihelp-query+allusers-description": "Enumerar tódolos usuarios rexistrados.",
+       "apihelp-query+allusers-param-excludegroup": "Excluír usuarios nos grupos dados.",
+       "apihelp-query+allusers-param-witheditsonly": "Só listar usuarios que teñan feito edicións.",
+       "apihelp-query+categories-param-show": "Tipo de categorías a amosar.",
+       "apihelp-query+categorymembers-description": "Listar tódalas páxinas nunha categoría determinada.",
+       "apihelp-query+categorymembers-param-limit": "Máximo número de páxinas a retornar.",
+       "apihelp-query+contributors-param-excludegroup": "Excluír usuarios nos grupos dados. Non se inclúen grupos implícitos nin autopromocionados como *, usuario ou autoconfirmado.",
+       "apihelp-query+deletedrevisions-param-user": "Só listar revisións deste usuario.",
+       "apihelp-query+deletedrevisions-param-excludeuser": "Non listar revisións deste usuario.",
        "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-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-mode2": "Listar as últimas 50 contribucións borradas de <kbd>Bob</kbd> (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+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+extlinks-example-simple": "Obter unha de ligazóns externas á <kbd>Páxina Principal<kbd>.",
        "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+exturlusage-example-simple": "Mostrar páxinas ligando a <kbd>http://www.mediawiki.org</kbd>.",
        "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+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+imageinfo-param-localonly": "Só buscar ficheiros no repositorio local.",
+       "apihelp-query+images-example-simple": "Obter unha lista de arquivos empregados na [[Main Page]].",
+       "apihelp-query+imageusage-param-namespace": "Nome de espazos a numerar.",
+       "apihelp-query+pagepropnames-param-limit": "Máximo número de nomes a retornar.",
+       "apihelp-query+pageswithprop-description": "Mostrar a lista de páxinas que empregan unha propiedade determinada.",
        "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+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-example-last5": "Mostrar as cinco últimas revisión da <kbd>Páxina Principal</kbd>.",
+       "apihelp-query+revisions-example-first5": "Mostar as cinco primeiras revisións da <kbd>Páxina Principal</kbd>.",
+       "apihelp-query+revisions-example-first5-after": "Mostrar as cinco primeiras revisións da <kbd>Páxina Principal</kbd> feitas despois de 2006-05-01.",
+       "apihelp-query+revisions-example-first5-not-localhost": "Mostrar as cinco primeiras revisións da <kbd>Páxina Principal</kbd> que non foron feitas polo usuario anónimo <kbd>127.0.0.1</kbd>.",
+       "apihelp-query+revisions-example-first5-user": "Mostrar as cinco primeiras revisión da <kbd>Páxina Principal</kbd> feitas polo usuario <kbd>MediaWiki default</kbd>.",
        "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-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+search-example-simple": "Buscar por <kbd>significado</kbd>.",
+       "apihelp-query+search-example-text": "Buscar texto por <kbd>significado</kbd>.",
        "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+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+templates-example-simple": "Coller os modelos usado na <kbd>Páxina Principal</kbd>.",
+       "apihelp-query+templates-example-generator": "Obter información sobre os modelos usados na <kbd>Páxina Principal</kbd>.",
+       "apihelp-query+templates-example-namespaces": "Obter páxinas nos espazos de nomes {{ns:user}} e {{ns:template}} que se transclúen na <kbd>Páxina Principal</kbd>.",
        "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-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+usercontribs-example-user": "Mostrar as contribucións do usuario <kbd>Exemplo</kbd>.",
+       "apihelp-query+usercontribs-example-ipprefix": "Mostrar contribucións de tódalas direccións IP que comezan por <kbd>192.0.2.</kbd>.",
        "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+users-example-simple": "Mostar información para o usuario <kbd>Exemplo</kbd>.",
        "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-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-revisiondelete-example-revision": "Ocultar contido para revisión <kbd>12345</kbd> na <kbd>Páxina Principal</kbd>.",
        "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-rollback-example-simple": "Desfacer as últimas edicións á <kbd>Páxina Principal</kbd> do usuario <kbd>Exemplo</kbd>.",
        "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-setnotificationtimestamp-example-page": "Restaurar o estado de notificación para a <kbd>Páxina Principal</kbd>.",
+       "apihelp-setnotificationtimestamp-example-allpages": "Restaurar o estado de notificación para as páxinas no espazo de nomes de <kbd>{{ns:user}}</kbd>.",
        "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-unblock-example-id": "Desbloquear bloqueo ID #<kbd>105</kbd>.",
+       "apihelp-unblock-example-user": "Desbloquear usuario <kbd>Bob</kbd> con razón <kbd>Síntoo Bob</kbd>.",
        "apihelp-undelete-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-undelete-example-page": "Restaurar a <kbd>Páxina Principal</kbd>.",
+       "apihelp-undelete-example-revisions": "Restaurar dúas revisións de <kbd>[[Main Page]]</kbd>.",
        "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-file": "Contido do ficheiro.",
        "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-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-watch": "Vixiar a páxina <kbd>Páxina Principal</kbd>.",
+       "apihelp-watch-example-unwatch": "Deixar de vixiar a páxina <kbd>Páxina Principal</kbd>.",
        "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-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": "{{PLURAL:$1|1=Un valor|2=Valores (separados con <kbd>{{!}}</kbd>)}}: $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-multi-separate": "Separe os valores con <kbd>|</kbd>.",
        "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}}:",
index 18fdb04..6552dc4 100644 (file)
                "authors": [
                        "Guycn2",
                        "Amire80",
-                       "Inkbug"
+                       "Inkbug",
+                       "Danny-w",
+                       "YaronSh"
                ]
        },
        "apihelp-main-param-action": "איזו פעולה לבצע.",
        "apihelp-main-param-format": "התבנית של הפלט.",
+       "apihelp-main-param-curtimestamp": "הכללת חותמת הזמן הנוכחית בתוצאה.",
        "apihelp-block-description": "חסימת משתמש.",
        "apihelp-block-param-user": "שם משתמש, כתובת IP, או טווח IP שהנך רוצה לחסום.",
        "apihelp-block-param-reason": "סיבה לחסימה.",
+       "apihelp-compare-param-fromtitle": "כותרת ראשונה להשוואה.",
+       "apihelp-compare-param-fromid": "מס׳ זיהוי של העמוד הראשון להשוואה.",
+       "apihelp-compare-param-fromrev": "גרסה ראשונה להשוואה.",
+       "apihelp-compare-param-totitle": "כותרת שנייה להשוואה.",
+       "apihelp-compare-param-toid": "מס׳ מזהה של העמוד השני להשוואה.",
+       "apihelp-compare-param-torev": "גרסה שנייה להשוואה.",
+       "apihelp-compare-example-1": "יצירת תיעוד שינוי בין גרסה 1 ל־2.",
+       "apihelp-createaccount-description": "יצירת חשבון משתמש חדש.",
        "apihelp-createaccount-param-name": "שם משתמש.",
+       "apihelp-createaccount-param-password": "ססמה (לא ישפיע אם הוגדר <var>$1mailpassword</var>).",
+       "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": "קוד השפה שיוגדר כבררת המחדל למשתמש (רשות, בררת המחדל היא שפת התוכן).",
+       "apihelp-createaccount-example-pass": "יצירת המשתמש <kbd>testuser</kbd> עם הססמה <kbd>test123</kbd>.",
+       "apihelp-createaccount-example-mail": "יצירת המשתמש <kbd>testmailuser</kbd> ושליחת ססמה שיוצרה אקראית בדוא״ל.",
+       "apihelp-delete-description": "מחיקת דף.",
+       "apihelp-delete-param-title": "כותרת העמוד למחיקה. לא ניתן להשתמש בשילוב עם <var>$1pageid</var>.",
+       "apihelp-delete-param-pageid": "מס׳ הזיהוי של העמוד למחיקה. לא ניתן להשתמש בשילוב עם <var>$1title</var>.",
+       "apihelp-delete-param-reason": "סיבת המחיקה. אם לא הוגדרה, תתווסף סיבה שנוצרה אוטומטית.",
+       "apihelp-delete-param-watch": "הוספת העמוד לרשימת המעקב של המשתמש הנוכחי.",
+       "apihelp-delete-param-unwatch": "הסרת הדף מרשימת המעקב של של המשתמש הנוכחי.",
        "apihelp-delete-example-simple": "מחיקת הדף הראשי",
        "apihelp-edit-param-minor": "עריכה משנית.",
        "apihelp-edit-example-edit": "עריכת דף",
        "apihelp-emailuser-description": "שליחת דוא\"ל למשתמש.",
        "apihelp-expandtemplates-param-title": "כותרת הדף.",
+       "apihelp-feedcontributions-param-year": "החל משנה (ולפני כן).",
+       "apihelp-feedcontributions-param-month": "החל מחודש (ולפני כן).",
+       "apihelp-feedcontributions-param-tagfilter": "סינון תרומות בעלות התגיות הבאות.",
+       "apihelp-feedcontributions-param-deletedonly": "הצגת תרומות שנמחקו בלבד.",
+       "apihelp-feedcontributions-param-toponly": "הצגת עריכות שהן הגרסה העדכנית ביותר בלבד.",
+       "apihelp-feedcontributions-example-simple": "החזרת תרומות עבור המשתמש <kbd>Example</kbd>.",
+       "apihelp-feedrecentchanges-param-tagfilter": "סינון לפי תגית.",
        "apihelp-help-description": "הצגת עזרה עבור היחידות שצוינו.",
+       "apihelp-help-param-helpformat": "תסדיר פלט העזרה.",
        "apihelp-help-param-toc": "לכלול תוכן עניינים בפלט HTML.",
+       "apihelp-import-param-xml": "קובץ XML שהועלה.",
+       "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-managetags-description": "ביצוע פעולות ניהוליות הקשורות בשינוי תגיות.",
+       "apihelp-move-description": "העברת עמוד.",
+       "apihelp-opensearch-param-search": "מחרוזת לחיפוש.",
+       "apihelp-opensearch-param-namespace": "שמות מתחם לחיפוש.",
+       "apihelp-opensearch-param-format": "תסדיר הפלט.",
+       "apihelp-protect-example-protect": "הגנה על דף.",
+       "apihelp-query-param-list": "אילו רשימות לקבל.",
+       "apihelp-query+allcategories-description": "מניין של כל הקטגוריות.",
+       "apihelp-query+allcategories-param-from": "הקטגוריה ממנה להתחיל למנות.",
+       "apihelp-query+allimages-param-sha1": "גיבוב SHA1 של תמונה. דריסת $1sha1base36.",
+       "apihelp-query+allimages-param-sha1base36": "גיבוב SHA1 של התמונה בבסיס 36 (הבסיס בו נעשה שימוש במדיה־ויקי).",
+       "apihelp-query+allimages-param-limit": "כמה תמונות להחזיר בסך הכול.",
+       "apihelp-query+allimages-example-B": "הצגת רשימה של קבצים שמתחילים באות <kbd>B</kbd>.",
+       "apihelp-query+allimages-example-generator": "הצגת מידע על 4 קבצים המתחילים באות <kbd>T</kbd>.",
+       "apihelp-query+allmessages-param-prop": "אלו מאפיינים לקבל.",
+       "apihelp-query+allpages-param-limit": "כמה דפים להחזיר בסך הכול.",
+       "apihelp-query+allredirects-param-limit": "כמה פריטים להחזיר בסך הכול.",
        "apihelp-query+categories-param-limit": "כמה קטגוריות להחזיר.",
+       "apihelp-query+categorymembers-param-startsortkey": "כדאי להשתמש ב־$1starthexsortkey במקום.",
+       "apihelp-query+categorymembers-param-endsortkey": "כדאי להשתמש ב־$1endhexsortkey במקום.",
+       "apihelp-query+categorymembers-example-simple": "קבלת עשרת העמודים הראשונים שתחת <kbd>קטגוריה:פיזיקה</kbd>.",
+       "apihelp-query+contributors-param-limit": "כמה תורמים להחזיר.",
+       "apihelp-query+contributors-example-simple": "הצגת תורמים לדף <kbd>עמוד ראשי</kbd>.",
+       "apihelp-query+deletedrevs-paraminfo-modes": "{{PLURAL:$1|מצב|מצבים}}: $2",
+       "apihelp-query+duplicatefiles-param-limit": "כמה קבצים כפולים להחזיר.",
+       "apihelp-query+duplicatefiles-param-localonly": "חיפוש אחר קבצים במאגר המקומי בלבד.",
+       "apihelp-query+duplicatefiles-example-simple": "חיפוש אחר כפילויות של [[:קובץ:Albert Einstein Head.jpg]].",
+       "apihelp-query+duplicatefiles-example-generated": "חיפוש אחר כפילויות בין כל הקבצים.",
+       "apihelp-query+extlinks-param-limit": "כמה קישורים להחזיר.",
        "apihelp-query+imageinfo-paramvalue-prop-comment": "תגובה על הגרסה.",
+       "apihelp-query+imageinfo-param-localonly": "חיפוש אחר קבצים במאגר המקומי בלבד.",
+       "apihelp-query+imageinfo-example-simple": "קבלת פרטים על הגרסה הנוכחית של [[:קובץ:Albert Einstein Head.jpg]].",
+       "apihelp-query+images-param-limit": "כמה קבצים להחזיר.",
+       "apihelp-query+info-paramvalue-prop-watchers": "מספר העוקבים, אם קיבלת הרשאה.",
+       "apihelp-query+info-paramvalue-prop-readable": "האם המשתמש יכול להציג דף זה.",
+       "apihelp-query+langlinks-param-title": "קישור לחיפוש. חובה להשתמש עם <var>$1lang</var>.",
+       "apihelp-query+links-description": "החזרת כל הקישורים מהדפים שצוינו.",
+       "apihelp-query+linkshere-param-limit": "כמה להחזיר.",
+       "apihelp-query+linkshere-param-show": "הצגת פריטים שתואמים את הדרישות הללו בלבד:\n;redirect:הצגת הפניות בלבד.\n;!redirect:הצגת קישורים שאינם הפניות בלבד.",
+       "apihelp-query+logevents-description": "קבלת אירועים מהרישומים.",
+       "apihelp-query+pageswithprop-param-dir": "באיזה כיוון לסדר.",
+       "apihelp-query+pageswithprop-example-simple": "הצגת עשרת הדפים הראשונים שעושים שימוש ב־<code>&#123;&#123;DISPLAYTITLE:&#125;&#125;</code>.",
+       "apihelp-query+pageswithprop-example-generator": "קבלת פרטיהם של עשרת הדפים הראשונים המשתמשים ב־<code>_&#95;NOTOC_&#95;</code>.",
+       "apihelp-query+prefixsearch-param-search": "מחרוזת לחיפוש.",
+       "apihelp-query+prefixsearch-param-limit": "מספר התוצאות המרבי להחזרה.",
        "apihelp-query+prefixsearch-param-offset": "מספר תוצאות לדילוג.",
+       "apihelp-query+querypage-param-limit": "מספר תוצאות להחזרה.",
+       "apihelp-query+recentchanges-description": "מניית השינויים האחרונים.",
+       "apihelp-query+recentchanges-param-limit": "כמה שינויים להחזיר בסך הכול.",
+       "apihelp-query+recentchanges-param-type": "אילו סוגים של שינויים להציג.",
+       "apihelp-query+recentchanges-example-simple": "הצגת השינויים האחרונים.",
+       "apihelp-query+redirects-param-limit": "כמה הפניות להחזיר.",
+       "apihelp-query+revisions+base-param-limit": "הגבלת מספר הגרסאות שיוחזרו.",
        "apihelp-query+tokens-example-types": "אחזור אסימון של רשימת המעקב ואסימון של ניטור",
-       "apihelp-xml-param-xslt": "×\90×\9d ×¦×\95×\99×\9f, ×\9e×\95ס×\99×£ &lt;xslt&gt; ×\9b×\92×\9c×\99×\95×\9f ×¡×\92× ×\95× ×\95ת. ×\96×\94 ×¦×¨×\99×\9a ×\9c×\94×\99×\95ת ×\93×£ ×\95×\99ק×\99 ×\91×\9eר×\97×\91 ×\94ש×\9d ×\9e×\93×\99×\94 ×\95×\99ק×\99 ×©×©×\9e×\95 ×\9eסת×\99×\99×\9d ×\91\".xsl\".",
+       "apihelp-xml-param-xslt": "×\90×\9d ×¦×\95×\99×\9f, ×\99ש ×\9c×\94×\95ס×\99×£ ×\90ת ×©×\9d ×\94×\93×£ ×\9b×\92×\99×\9c×\99×\95×\9f ×¢×\99צ×\95×\91 XSL. ×¢×\9c ×\94ער×\9a ×\9c×\94×\99×\95ת ×\9b×\95תרת ×\91 {{ns:mediawiki}} ×\91×\9eר×\97×\91 ×©×\9d ×\94×\9eשת×\9eש, ×\94×\9eסת×\99×\99×\9d ×\91-  <code>.xsl</code>.",
        "api-format-title": "תוצאה של API של מדיה־ויקי",
        "api-format-prettyprint-header": "זהו ייצוג ב־HTML של תסדיר $1. תסדיר HTML טוב לתיקון שגיאות, אבל אינו מתאים ליישומים.\n\nיש לציין את הפרמטר format כדי לשנות את תסדיר הפלט. כדי לראות ייצוג של תסדיר $1 לא ב־HTML יש לרשום format=$2.\n\nר' את [https://www.mediawiki.org/wiki/API התיעוד המלא], או את [[Special:ApiHelp/main|העזרה של API]] למידע נוסף.",
        "api-orm-param-props": "באילו שדות לעשות שאילתה.",
        "api-help-param-integer-max": "ה{{PLURAL:$1|1=ערך לא יכול להיות גדול|2=ערכים לא יכולים להיות גדולים}} מ־$3.",
        "api-help-param-integer-minmax": "ה{{PLURAL:$1|1=ערך חייב|2=ערכים חייבים}} להיות בין $2 ל־$3.",
        "api-help-param-upload": "חייב להישלח (posted) בתור העלאת קובץ באמצעות multipart/form-data.",
-       "api-help-param-multi-separate": "הפרדה בין ערכים נעשית באמצעות \"|\".",
+       "api-help-param-multi-separate": "הפרדה בין ערכים נעשית באמצעות <kbd>|</kbd>",
        "api-help-param-multi-max": "מספר הערכים המרבי הוא {{PLURAL:$1|$1}} (עבור בוטים – {{PLURAL:$2|$2}}).",
        "api-help-param-default": "ברירת מחדל: $1",
        "api-help-param-default-empty": "ברירת מחדל: <span class=\"apihelp-empty\">(ריק)</span>",
index b756613..de9d65f 100644 (file)
@@ -7,8 +7,8 @@
        "apihelp-main-param-action": "Qual action exequer.",
        "apihelp-main-param-format": "Le formato del resultato.",
        "apihelp-main-param-maxlag": "Le latentia maximal pote esser usate quando MediaWiki es installate in un cluster de base de datos replicate. Pro evitar actiones que causa additional latentia de replication de sito, iste parametro pote facer le cliente attender usque le latentia de replication es minus que le valor specificate. In caso de latentia excessive, le codice de error \"maxlag\" es retornate con un message como \"Attende $host: $lag secundas de latentia\".<br />Vide https://www.mediawiki.org/wiki/Manual:Maxlag_parameter pro plus information.",
-       "apihelp-main-param-smaxage": "Fixar le capite s-maxage a iste numero de secundas. Errores nunquam es mittite in cache.",
-       "apihelp-main-param-maxage": "Fixar le capite max-age a iste numero de secundas. Errores nunquam es mittite in cache.",
+       "apihelp-main-param-smaxage": "Fixar le capite <code>s-maxage</code> a iste numero de secundas. Errores nunquam es mittite in cache.",
+       "apihelp-main-param-maxage": "Fixar le capite <code>max-age</code> a iste numero de secundas. Errores nunquam es mittite in cache.",
        "apihelp-main-param-assert": "Verificar si le usator ha aperite session si mittite a \"user\", o si ha le derecto de usator robot si \"bot\".",
        "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.",
index 884eb21..218d24c 100644 (file)
@@ -1,9 +1,12 @@
 {
        "@metadata": {
                "authors": [
-                       "Beta16"
+                       "Beta16",
+                       "Nivit"
                ]
        },
+       "apihelp-query+recentchanges-example-simple": "Elenco modifiche recenti.",
+       "apihelp-upload-example-url": "Carica da un URL.",
        "api-help-parameters": "{{PLURAL:$1|Parametro|Parametri}}:",
        "api-help-param-deprecated": "Deprecato.",
        "api-help-param-required": "Questo parametro è obbligatorio.",
index dc69351..4c7b20a 100644 (file)
@@ -9,59 +9,73 @@
        },
        "apihelp-main-param-action": "実行する操作です。",
        "apihelp-main-param-format": "出力する形式です。",
-       "apihelp-main-param-smaxage": "s-maxage ヘッダーにこの秒数を設定します。エラーがキャッシュされることはありません。",
-       "apihelp-main-param-maxage": "max-age ヘッダーにこの秒数を設定します。エラーがキャッシュされることはありません。",
-       "apihelp-main-param-assert": "\"user\" を設定した場合は利用者がログイン済みかどうかを、\"bot\" を指定した場合はボット権限があるかどうかを、それぞれ検証します。",
+       "apihelp-main-param-smaxage": "<code>s-maxage</code> ヘッダーにこの秒数を設定します。エラーがキャッシュされることはありません。",
+       "apihelp-main-param-maxage": "<code>max-age</code> ヘッダーにこの秒数を設定します。エラーがキャッシュされることはありません。",
+       "apihelp-main-param-assert": "<kbd>user</kbd> を設定した場合は利用者がログイン済みかどうかを、<kbd>bot</kbd> を指定した場合はボット権限があるかどうかを、それぞれ検証します。",
        "apihelp-main-param-requestid": "任意の値を指定でき、その値が結果に含められます。リクエストを識別するために使用できます。",
        "apihelp-main-param-servedby": "リクエストを処理したホスト名を結果に含めます。",
        "apihelp-main-param-curtimestamp": "現在のタイムスタンプを結果に含めます。",
-       "apihelp-main-param-uselang": "メッセージの翻訳に使用する言語です。コードの一覧は [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]] に siprop=languages を付けることで取得できます。\"user\" を指定することで現在の利用者の個人設定の言語を、\"content\" を指定することでこのウィキの本文の言語を使用することもできます。",
+       "apihelp-main-param-uselang": "メッセージの翻訳に使用する言語です。コードの一覧は <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> に <kbd>siprop=languages</kbd> を付けることで取得できます。<kbd>user</kbd> を指定することで現在の利用者の個人設定の言語を、<kbd>content</kbd> を指定することでこのウィキの本文の言語を使用することもできます。",
        "apihelp-block-description": "利用者をブロックします。",
        "apihelp-block-param-user": "ブロックする利用者名、IPアドレスまたはIPレンジ。",
        "apihelp-block-param-reason": "ブロックの理由。",
-       "apihelp-block-param-anononly": "匿名利用者のみブロックします(つまり、このIPからの匿名での編集を不可能にします)。",
+       "apihelp-block-param-anononly": "å\8c¿å\90\8då\88©ç\94¨è\80\85ã\81®ã\81¿ã\83\96ã\83­ã\83\83ã\82¯ã\81\97ã\81¾ã\81\99ï¼\88ã\81¤ã\81¾ã\82\8aã\80\81ã\81\93ã\81®IPã\82¢ã\83\89ã\83¬ã\82¹ã\81\8bã\82\89ã\81®å\8c¿å\90\8dã\81§ã\81®ç·¨é\9b\86ã\82\92ä¸\8då\8f¯è\83½ã\81«ã\81\97ã\81¾ã\81\99ï¼\89ã\80\82",
        "apihelp-block-param-nocreate": "アカウントの作成を禁止します。",
        "apihelp-block-param-autoblock": "その利用者が最後に使用したIPアドレスと、ブロック後に編集を試みた際のIPアドレスを自動的にブロックします。",
-       "apihelp-block-param-noemail": "Wikiを通して電子メールを送信することを禁止します。(\"blockemail\" 権限が必要です)",
-       "apihelp-block-param-hidename": "ブロック記録から利用者名を秘匿します。(\"hideuser\" 権限が必要です)",
+       "apihelp-block-param-noemail": "Wikiを通して電子メールを送信することを禁止します。(<code>blockemail</code> 権限が必要です)",
+       "apihelp-block-param-hidename": "ブロック記録から利用者名を秘匿します。(<code>hideuser</code> 権限が必要です)",
        "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-block-param-watchuser": "その利用者またはIPアドレスの利用者ページとトークページをウォッチします。",
+       "apihelp-block-example-ip-simple": "IPアドレス <kbd>192.0.2.5</kbd> を <kbd>First strike<kbd> という理由で3日ブロックする",
+       "apihelp-block-example-user-complex": "利用者 <kbd>Vandal</kbd> を <kbd>Vandalism</kbd> という理由で無期限ブロックし、新たなアカウント作成とメールの送信を禁止する。",
+       "apihelp-compare-example-1": "版1と2の差分を生成する。",
        "apihelp-createaccount-description": "新しい利用者アカウントを作成します。",
        "apihelp-createaccount-param-name": "利用者名。",
-       "apihelp-createaccount-param-password": "パスワード ($1mailpassword が設定されると無視されます)。",
+       "apihelp-createaccount-param-password": "パスワード (<var>$1mailpassword</var> が設定されると無視されます)。",
        "apihelp-createaccount-param-token": "最初のリクエストで得られたアカウント作成用トークンです。",
        "apihelp-createaccount-param-email": "利用者の電子メールアドレス (任意)。",
+       "apihelp-createaccount-param-realname": "利用者の本名 (省略可能)。",
        "apihelp-createaccount-param-mailpassword": "設定されると (その値を問わず)、ランダムなパスワードがその利用者に電子メールで送られます。",
-       "apihelp-createaccount-example-mail": "利用者「testuser」を作成し、ランダムに生成されたパスワードをメールで送る",
+       "apihelp-createaccount-example-pass": "利用者 <kbd>testuser</kbd> をパスワード <kbd>test123</kbd> として作成する。",
+       "apihelp-createaccount-example-mail": "利用者 <kbd>testuser</kbd>を作成し、ランダムに生成されたパスワードをメールで送る",
        "apihelp-delete-description": "ページを削除します。",
-       "apihelp-delete-param-title": "削除するページ名です。 $1pageid とは同時に使用できません。",
-       "apihelp-delete-param-pageid": "削除するページIDです。 $1title とは同時に使用できません。",
+       "apihelp-delete-param-title": "削除するページ名です。<var>$1pageid</var> とは同時に使用できません。",
+       "apihelp-delete-param-pageid": "削除するページIDです。<var>$1title</var> とは同時に使用できません。",
        "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-delete-param-watch": "そのページを現在の利用者のウォッチリストに追加します。",
+       "apihelp-delete-param-unwatch": "そのページを現在の利用者のウォッチリストから除去します。",
+       "apihelp-delete-example-simple": "<kbd>Main Page</kbd> を削除する",
+       "apihelp-delete-example-reason": "<kbd>Preparing for move</kbd> という理由で <kbd>Main Page</kbd> を削除する",
        "apihelp-disabled-description": "このモジュールは無効化されています。",
        "apihelp-edit-description": "ページを作成、編集します。",
-       "apihelp-edit-param-title": "編集するページ名です。$1pageid とは同時に使用できません。",
-       "apihelp-edit-param-pageid": "編集するページIDです。$1title とは同時に使用できません。",
+       "apihelp-edit-param-title": "編集するページ名です。<var>$1pageid</var> とは同時に使用できません。",
+       "apihelp-edit-param-pageid": "編集するページIDです。<var>$1title</var> とは同時に使用できません。",
+       "apihelp-edit-param-section": "節番号です。先頭の節の場合は <kbd>0</kbd>、新しい節の場合は <kbd>new</kbd>を指定します。",
+       "apihelp-edit-param-sectiontitle": "新しい節の名前です。",
        "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-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-emailuser-example-email": "利用者 <kbd>WikiSysop</kbd> に <kbd>Content</kbd> という本文の電子メールを送信。",
+       "apihelp-expandtemplates-description": "ウィキテキストに含まれるすべてのテンプレートを展開します。",
+       "apihelp-expandtemplates-param-title": "ページの名前です。",
+       "apihelp-expandtemplates-param-text": "変換するウィキテキストです。",
+       "apihelp-expandtemplates-example-simple": "ウィキテキスト <kbd><nowiki>{{Project:Sandbox}}</nowiki></kbd> を展開する。",
+       "apihelp-feedcontributions-param-deletedonly": "削除された投稿記録のみ表示します。",
+       "apihelp-feedcontributions-param-toponly": "最新版の編集のみ表示します。",
+       "apihelp-feedcontributions-param-newonly": "ページ作成を伴う編集のみを表示します。",
+       "apihelp-feedcontributions-example-simple": "利用者 <kbd>Example</kbd> の投稿記録を取得する。",
+       "apihelp-filerevert-example-revert": "<kbd>Wiki.png</kbd> を <kbd>2011-03-05T15:27:40Z</kbd> の版に差し戻す。",
        "apihelp-help-description": "指定したモジュールのヘルプを表示します。",
-       "apihelp-help-param-modules": "ヘルプを表示するモジュールです (action= パラメーターおよび format= パラメーターの値、または \"main\")。\"+\" を使用して下位モジュールを指定できます。",
+       "apihelp-help-param-modules": "ヘルプを表示するモジュールです (<var>action</var> パラメーターおよび <var>format</var> パラメーターの値、または <kbd>main</kbd>)。<kbd>+</kbd> を使用して下位モジュールを指定できます。",
        "apihelp-help-param-submodules": "指定したモジュールの下位モジュールのヘルプを含めます。",
        "apihelp-help-param-recursivesubmodules": "下位モジュールのヘルプを再帰的に含めます。",
        "apihelp-help-param-helpformat": "ヘルプの出力形式です。",
        "apihelp-help-example-recursive": "すべてのヘルプを1つのページに",
        "apihelp-help-example-help": "ヘルプ モジュール自身のヘルプ",
        "apihelp-help-example-query": "2つの下位モジュールのヘルプ",
+       "apihelp-imagerotate-example-simple": "<kbd>File:Example.png</kbd> を <kbd>90</kbd> 度回転させる。",
+       "apihelp-imagerotate-example-generator": "<kbd>Category:Flip</kbd> 内のすべての画像を <kbd>180</kbd> 度回転させる。",
+       "apihelp-import-param-xml": "XMLファイルをアップロード",
        "apihelp-login-param-name": "利用者名。",
        "apihelp-login-param-password": "パスワード。",
+       "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-from": "移動するページのページ名です。<var>$1fromid</var> とは同時に使用できません。",
+       "apihelp-move-param-fromid": "移動するページのページIDです。<var>$1from</var> とは同時に使用できません。",
        "apihelp-move-param-to": "移動後のページ名。",
        "apihelp-move-param-reason": "移動の理由。",
-       "apihelp-move-param-movetalk": "存在する場合、トークページも移動します。",
-       "apihelp-move-param-movesubpages": "可能であれば、サブページも移動します。",
+       "apihelp-move-param-movetalk": "存在する場合、トークページも名前を変更します。",
+       "apihelp-move-param-movesubpages": "可能であれば、下位ページも名前を変更します。",
        "apihelp-move-param-noredirect": "転送ページを作成しません。",
-       "apihelp-move-param-watch": "そのページと転送ページをウォッチリストに追加します。",
-       "apihelp-move-param-unwatch": "そのページと転送ページをウォッチリストから除去します。",
-       "apihelp-move-example-move": "「Badtitle」を「Goodtitle」に転送ページを残さず移動",
+       "apihelp-move-param-watch": "そのページと転送ページを現在の利用者のウォッチリストに追加します。",
+       "apihelp-move-param-unwatch": "そのページと転送ページを現在の利用者のウォッチリストから除去します。",
+       "apihelp-move-param-ignorewarnings": "あらゆる警告を無視",
+       "apihelp-move-example-move": "<kbd>Badtitle</kbd> を <kbd>Goodtitle</kbd> に転送ページを残さず移動",
+       "apihelp-opensearch-param-suggest": "<var>[[mw:Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> が false の場合、何もしません。",
+       "apihelp-paraminfo-description": "API モジュールに関する情報を取得します。",
+       "apihelp-patrol-description": "ページまたは版を巡回済みにします。",
+       "apihelp-patrol-param-revid": "巡回済みにする版ID。",
+       "apihelp-patrol-example-rcid": "最近の更新を巡回",
+       "apihelp-protect-description": "ページの保護レベルを変更します。",
+       "apihelp-protect-param-title": "保護(解除)するページ名です。$1pageid とは同時に指定できません。",
+       "apihelp-protect-param-pageid": "保護(解除)するページIDです。$1title とは同時に指定できません。",
+       "apihelp-protect-param-expiry": "有効期限です。タイムスタンプがひとつだけ指定された場合は、それがすべての保護に適用されます。無期限の保護を行う場合は<kbd>infinite</kbd>, <kbd>indefinite</kbd>, <kbd>infinity</kbd>, または <kbd>never</kbd> を指定します。",
+       "apihelp-protect-param-reason": "保護(解除)の理由。",
+       "apihelp-protect-param-watch": "指定されると、保護(解除)するページが現在の利用者のウォッチリストに追加されます。",
+       "apihelp-protect-example-protect": "ページを保護する。",
+       "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "<var>$3user</var> と同時に指定できません。",
+       "apihelp-query+alldeletedrevisions-param-user": "この利用者による版のみを一覧表示する。",
+       "apihelp-query+alldeletedrevisions-param-excludeuser": "この利用者による版を一覧表示しない。",
+       "apihelp-query+alldeletedrevisions-param-namespace": "この名前空間に含まれるページのみを一覧表示します。",
+       "apihelp-query+alldeletedrevisions-example-ns-main": "標準名前空間にある削除された最初の50版を一覧表示する。",
+       "apihelp-query+categorymembers-example-simple": "<kbd>Category:Physics</kbd> に含まれる最初の10ページを取得する。",
+       "apihelp-query+categorymembers-example-generator": "<kbd>Category:Physics</kbd> に含まれる最初の10ページのページ情報を取得する。",
+       "apihelp-query+contributors-example-simple": "<kbd>Main Page</kbd> への投稿者を表示する。",
+       "apihelp-query+deletedrevisions-param-user": "この利用者による版のみを一覧表示。",
+       "apihelp-query+deletedrevisions-param-excludeuser": "この利用者による版を一覧表示しない。",
+       "apihelp-query+deletedrevisions-param-limit": "一覧表示する版の最大数。",
+       "apihelp-query+deletedrevisions-example-titles": "ページ <kbd>Main Page</kbd> および <kbd>Talk:Main Page</kbd> の削除された版とその内容を一覧表示する。",
+       "apihelp-query+deletedrevisions-example-revids": "削除された版 <kbd>123456</kbd> に関する情報を一覧表示する。",
+       "apihelp-query+info-description": "ページの基本的な情報を取得します。",
+       "apihelp-query+info-paramvalue-prop-protection": "それぞれのページの保護レベルを一覧表示する。",
+       "apihelp-query+info-example-simple": "<kbd>Main Page</kbd> に関する情報を取得する。",
+       "apihelp-query+iwbacklinks-example-simple": "[[wikibooks:Test]] へリンクしているページを取得する。",
+       "apihelp-query+iwbacklinks-example-generator": "[[wikibooks:Test]] へリンクしているページの情報を取得する。",
+       "apihelp-query+langbacklinks-example-simple": "[[:fr:Test]] へリンクしているページを取得する。",
+       "apihelp-query+langbacklinks-example-generator": "[[:fr:Test]] へリンクしているページの情報を取得する。",
        "apihelp-format-example-generic": "クエリの結果を $1 形式に整形します",
-       "apihelp-dbg-description": "データを PHP の var_export() 形式で出力します。",
-       "apihelp-dbgfm-description": "データを PHP の var_export() 形式 (HTML に埋め込んだ形式) で出力します。",
-       "apihelp-dump-description": "データを PHP の var_dump() 形式で出力します。",
-       "apihelp-dumpfm-description": "データを PHP の var_dump() 形式 (HTML に埋め込んだ形式) で出力します。",
+       "apihelp-dbg-description": "データを PHP の <code>var_export()</code> 形式で出力します。",
+       "apihelp-dbgfm-description": "データを PHP の <code>var_export()</code> 形式 (HTML に埋め込んだ形式) で出力します。",
+       "apihelp-dump-description": "データを PHP の <code>var_dump()</code> 形式で出力します。",
+       "apihelp-dumpfm-description": "データを PHP の <code>var_dump()</code> 形式 (HTML に埋め込んだ形式) で出力します。",
        "apihelp-json-description": "データを JSON 形式で出力します。",
        "apihelp-json-param-callback": "指定すると、指定した関数呼び出しで出力をラップします。安全のため、利用者固有のデータはすべて制限されます。",
        "apihelp-json-param-utf8": "指定すると、大部分の非 ASCII 文字 (すべてではありません) を、16 進のエスケープ シーケンスに置換する代わりに UTF-8 として符号化します。",
        "apihelp-php-description": "データを PHP のシリアル化した形式で出力します。",
        "apihelp-phpfm-description": "データを PHP のシリアル化した形式 (HTML に埋め込んだ形式) で出力します。",
        "apihelp-rawfm-description": "データをデバッグ要素付きで JSON 形式 (HTML に埋め込んだ形式) で出力します。",
-       "apihelp-txt-description": "データを PHP の print_r() 形式で出力します。",
-       "apihelp-txtfm-description": "データを PHP の print_r() 形式 (HTML に埋め込んだ形式) で出力します。",
+       "apihelp-txt-description": "データを PHP の <code>print_r()</code> 形式で出力します。",
+       "apihelp-txtfm-description": "データを PHP の <code>print_r()</code> 形式 (HTML に埋め込んだ形式) で出力します。",
        "apihelp-wddx-description": "データを WDDX 形式で出力します。",
        "apihelp-wddxfm-description": "データを WDDX 形式 (HTML に埋め込んだ形式) で出力します。",
        "apihelp-xml-description": "データを XML 形式で出力します。",
        "apihelp-yaml-description": "データを YAML 形式で出力します。",
        "apihelp-yamlfm-description": "データを YAML 形式 (HTML に埋め込んだ形式) で出力します。",
        "api-format-title": "MediaWiki 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-format-prettyprint-header": "このページは $1 形式を HTML で表現したものです。HTML はデバッグに役立ちますが、アプリケーションでの使用には適していません。\n\n<var>format</var> パラメーターを指定すると出力形式を変更できます 。$1 形式の非 HTML 版を閲覧するには、format=$2 を設定してください。\n\n詳細情報については [[mw: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-parameters": "{{PLURAL:$1|パラメーター}}:",
        "api-help-param-deprecated": "廃止予定です。",
        "api-help-param-required": "このパラメーターは必須です。",
-       "api-help-param-list": "{{PLURAL:$1|1=値 (いずれか1つ)|2=値 (「{{!}}」で区切る)}}: $2",
+       "api-help-param-list": "{{PLURAL:$1|1=値 (いずれか1つ)|2=値 (<kbd>{{!}}</kbd>で区切る)}}: $2",
        "api-help-param-list-can-be-empty": "{{PLURAL:$1|0=空欄にしてください|空欄にするか、または $2}}",
        "api-help-param-integer-min": "{{PLURAL:$1|値}}は $2 以上にしてください。",
        "api-help-param-integer-max": "{{PLURAL:$1|値}}は $3 以下にしてください。",
        "api-help-param-integer-minmax": "{{PLURAL:$1|値}}は $2 以上 $3 以下にしてください。",
        "api-help-param-upload": "multipart/form-data 形式でファイルをアップロードしてください。",
-       "api-help-param-multi-separate": "複数の値は「|」で区切ってください。",
+       "api-help-param-multi-separate": "複数の値は <kbd>|</kbd> で区切ってください。",
        "api-help-param-multi-max": "値の最大値は {{PLURAL:$1|$1}} (ボットの場合は {{PLURAL:$2|$2}}) です。",
        "api-help-param-default": "既定値: $1",
        "api-help-param-default-empty": "既定値: <span class=\"apihelp-empty\">(空)</span>",
index f6608fd..5e18dc1 100644 (file)
@@ -1,10 +1,11 @@
 {
        "@metadata": {
                "authors": [
-                       "Kwj2772"
+                       "Kwj2772",
+                       "Twotwo2019"
                ]
        },
-       "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-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 FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api 메일링 리스트]\n* [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-block-description": "사용자를 차단합니다.",
        "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-noemail": "위키를 통해 이메일을 보내지 못하도록 막습니다. (<code>blockemail</code> 권한 필요)",
+       "apihelp-block-param-hidename": "차단 기록에서 사용자 이름을 숨깁니다. (<code>hideuser</code> 권한 필요)",
+       "apihelp-block-param-allowusertalk": "자신의 토론 문서를 편집할 수 있도록 허용합니다. (<var>[[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var> 값에 따라 다름)",
        "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-block-example-ip-simple": "IP <kbd>192.0.2.5</kbd>에 대해 <kbd>First strike</kbd>라는 이유로 3일간 차단하기",
+       "apihelp-block-example-user-complex": "사용자 <kbd>Vandal</kbd>을 <kbd>Vandalism</kbd>이라는 이유로 무기한 차단하며 계정 생성 및 이메일 발송을 막기",
        "api-help-param-list": "{{PLURAL:$1|1=하나의 값|2=값 (\"{{!}}\"로 구분)}}: $2",
        "api-help-param-default": "기본값: $1"
 }
index ff06724..ce7f695 100644 (file)
        "apihelp-block-description": "Ene Metmaacher schpärre.",
        "apihelp-block-param-user": "Däm Nahme vun däm Metmaacher, de <i lang=\"en\" xml:lang=\"en\" title=\"Internet Protocol\">IP</i>-Addräß udder dä Berätt, dä De Schpärre wells.",
        "apihelp-block-param-reason": "Der Schpärrjrond.",
-       "apihelp-block-param-anononly": "Bloß de nahmelohse Metmaaacher spärre, alsu donn et nahmelohse Beärbeide vun dä <i lang=\"en\" xml:lang=\"en\" title=\"Internet Protocol\">IP</i>-Addräß verhendere.",
+       "apihelp-block-param-anononly": "Bloß de nahmelohse Metmaaacher spärre, alsu donn et nahmelohse Beärbeide vun dä <i lang=\"en\" xml:lang=\"en\" title=\"Internet Protocol\">IP</i>-Addräß uß verhendere.",
        "apihelp-block-param-nocreate": "Et Neu-Aanmelde verbeede",
        "apihelp-block-param-autoblock": "Dun automattesch de läzde <i lang=\"en\" xml:lang=\"en\">IP</i>-Adräß schpärre, di dä Metmaacher jehatt hät, un och all di <i lang=\"en\" xml:lang=\"en\">IP</i>-Adräße, vun wo dä versöhk, jet ze ändere.",
        "apihelp-block-param-watchuser": "Donn de Metmaachersigg un de Klaafsigg dohzoh op mig Oppaßleß säze.",
-       "apihelp-compare-description": "Donn de Ongerscheide zwesche zwai Sigge beschtemme.\n\nDo moß derför jeweils en Väsjohn, ene Tettel, odder ener Sigg iehr Kännong aanjävve, för de beide Sigge.",
+       "apihelp-block-example-ip-simple": "Donn de <i lang=\"en\" xmL:lang=\"en\" title=\"Internet Protocol\">IP</i>-Addräß <kbd>192.0.2.5</kbd> för drei ääsch schpärre mem Jrond: <kbd>Eestschlaach</kbd>.",
+       "apihelp-compare-description": "Donn de Ongerscheide zwesche zwai Sigge beschtemme.\n\nDo moß derför jeweils en Väsjohn, en Övverschreff för di Sigg, odder ener Sigg iehr Kännong aanjävve, för de beide Sigge.",
        "apihelp-compare-param-fromtitle": "Der Tettel vun dä eezte Sigg zom verjlihsche.",
        "apihelp-compare-param-fromid": "De Kännong vun dä eezte Sigg zom verjlihsche.",
        "apihelp-compare-param-fromrev": "De Väsjohn vun dä zwaite Sigg zom verjlihsche.",
        "apihelp-compare-example-1": "Fengk de Ongerscheide zwesche dä Väsjohne 1 un 2",
        "apihelp-createaccount-description": "Ene neue Zohjang för ene Metmaacher aanlähje.",
        "apihelp-createaccount-param-name": "Der Nahme för dä Metmaacher.",
-       "apihelp-createaccount-param-password": "Et Paßwoot (Weed ävver it jebruc un övverjange, wann <code lang=\"en\" xml:lang=\"en\">$1mailpassword</code> jesaz es)",
+       "apihelp-createaccount-param-password": "Et Paßwoot (Weed ävver it jebruc un övverjange, wann <code lang=\"en\" xml:lang=\"en\"><var>$1mailpassword</var></code> jesaz es)",
        "apihelp-createaccount-param-realname": "Dämm Medmaacher singe reschtejje Nahme - kann fott blihve.",
        "apihelp-delete-description": "Schmieß en Sigg fott.",
-       "apihelp-delete-param-watch": "Donn die Sigg en Ding Oppassliss opnemme.",
-       "apihelp-delete-param-unwatch": "Schmiiß di Sigg us Dinge Oppassless erus.",
-       "apihelp-delete-example-simple": "Schmiiß de Houpsigg fott"
+       "apihelp-delete-param-watch": "Donn di Sigg en däm aktoälle Metmaacher sing Oppaßleß opnämme.",
+       "apihelp-delete-param-unwatch": "Schmihß di Sigg us däm aktoälle Metmaacher singe Oppaßless erus.",
+       "apihelp-delete-example-simple": "Schmiiß de Houpsigg fott",
+       "apihelp-edit-param-sectiontitle": "De Övverschreff för ene neue Affschnett.",
+       "apihelp-edit-param-minor": "En klein Änderong.",
+       "apihelp-edit-param-notminor": "Kein klein Änderong.",
+       "apihelp-edit-param-bot": "Makeer heh di Änderog als vun enem Bot jemaat.",
+       "apihelp-edit-example-edit": "Veränder en Sigg.",
+       "apihelp-emailuser-param-ccme": "scheck mer en Koppih vun heh dä <i lang=\"en\" xml:lang=\"en\">e-mail</i>.",
+       "apihelp-expandtemplates-description": "Deiht alle Schablohne en Wikkitäx ömsäze.",
+       "apihelp-expandtemplates-param-title": "De Övverschreff vun dä Sigg."
 }
diff --git a/includes/api/i18n/ku-latn.json b/includes/api/i18n/ku-latn.json
new file mode 100644 (file)
index 0000000..a40e4c1
--- /dev/null
@@ -0,0 +1,9 @@
+{
+       "@metadata": {
+               "authors": [
+                       "George Animal"
+               ]
+       },
+       "apihelp-delete-description": "Rûpelekê jê bibe.",
+       "apihelp-expandtemplates-param-title": "Sernavê rûpelê."
+}
index 5f4e0df..c54e089 100644 (file)
@@ -7,40 +7,44 @@
        "apihelp-block-description": "E Benotzer spären.",
        "apihelp-block-param-user": "Benotzernumm, IP-Adress oder IP-Beräich deen Dir späre wëllt.",
        "apihelp-block-param-reason": "Grond fir ze spären.",
-       "apihelp-block-param-anononly": "Nëmmen anonym Benotzer spären (z. Bsp. anonym Ännerunge vun dëser IP ausschalten)",
+       "apihelp-block-param-anononly": "Nëmmen anonym Benotzer spären (z. Bsp. anonym Ännerunge vun dëser IP-Adress ausschalten)",
        "apihelp-block-param-nocreate": "Opmaache vun engem Benotzerkont verhënneren.",
        "apihelp-block-param-reblock": "Wann de Benotzer scho gespaart ass, déi aktuell Spär iwwerschreiwen.",
-       "apihelp-block-param-watchuser": "Dem Benotzer oder der IP hier Benotzer- an Diskussiouns-Säiten iwwerwaachen.",
+       "apihelp-block-param-watchuser": "Dem Benotzer oder der IP-Adress hier Benotzer- an Diskussiouns-Säiten iwwerwaachen.",
        "apihelp-createaccount-description": "En neie Benotzerkont uleeën.",
        "apihelp-createaccount-param-name": "Benotzernumm.",
        "apihelp-createaccount-param-email": "E-Mail-Adress vum Benotzer (fakultativ).",
        "apihelp-createaccount-param-realname": "Richtegen Numm vum Benotzer (fakultativ).",
        "apihelp-delete-description": "Eng Säit läschen.",
-       "apihelp-delete-param-watch": "D'Säit op Är Iwwerwaachungslëscht derbäisetzen.",
-       "apihelp-delete-example-simple": "D'Haaptsäit läschen",
+       "apihelp-delete-param-watch": "D'Säit op dem aktuelle Benotzer seng Iwwerwaachungslëscht dobäisetzen.",
+       "apihelp-delete-example-simple": "D'<kbd>Haaptsäit</kbd> läschen.",
        "apihelp-disabled-description": "Dëse Modul gouf ausgeschalt.",
        "apihelp-edit-param-sectiontitle": "Den Titel fir en neien Abschnitt.",
        "apihelp-edit-param-minor": "Kleng Ännerung.",
        "apihelp-edit-param-bot": "Dës Ännerung als Bot-Ännerung markéieren.",
-       "apihelp-edit-param-watch": "D'Säit op Är Iwwerwaachungslëscht derbäisetzen.",
+       "apihelp-edit-param-watch": "D'Säit op dem aktuelle Benotzer seng Iwwerwaachungslëscht dobäisetzen.",
        "apihelp-edit-example-edit": "Eng Säit änneren",
        "apihelp-expandtemplates-param-title": "Titel vun der Säit.",
        "apihelp-feedrecentchanges-param-hideminor": "Kleng Ännerunge verstoppen.",
        "apihelp-feedrecentchanges-param-hideanons": "Ännerunge vun anonyme Benotzer verstoppen.",
        "apihelp-feedrecentchanges-param-hideliu": "Ännerunge vu registréierte Benotzer verstoppen.",
        "apihelp-feedrecentchanges-example-simple": "Rezent Ännerunge weisen",
+       "apihelp-help-example-main": "Hëllef fir den Haaptmodul.",
        "apihelp-help-example-recursive": "All Hëllef op enger Säit",
        "apihelp-imagerotate-description": "Eent oder méi Biller dréinen.",
-       "apihelp-imagerotate-example-generator": "All Biller an der [[:Category:Flip]] ëm 180 Grad dréinen",
+       "apihelp-imagerotate-example-generator": "All Biller an der <kbd>Category:Flip]]<kbd> ëm <kbd>180<kbd> Grad dréinen.",
        "apihelp-import-param-summary": "Resumé importéieren.",
        "apihelp-login-param-name": "Benotzernumm.",
        "apihelp-login-param-password": "Passwuert.",
+       "apihelp-login-example-login": "Aloggen.",
        "apihelp-move-description": "Eng Säit réckelen.",
        "apihelp-move-param-ignorewarnings": "All Warnungen ignoréieren.",
        "apihelp-options-example-reset": "All Astellungen zrécksetzen",
+       "apihelp-patrol-example-rcid": "Eng rezent Ännerung nokucken.",
+       "apihelp-patrol-example-revid": "Eng Versioun nokucken.",
        "apihelp-protect-example-protect": "Eng Säit spären",
        "apihelp-query+allcategories-description": "All Kategorien opzielen.",
-       "apihelp-query+alldeletedrevisions-paraminfo-useronly": "Kann nëmme mam $3user benotzt ginn.",
+       "apihelp-query+alldeletedrevisions-paraminfo-useronly": "Kann nëmme mam <var>$3user</var> benotzt ginn.",
        "apihelp-query+alldeletedrevisions-param-user": "Nëmme Versioune vun dësem Benotzer opzielen.",
        "apihelp-query+alldeletedrevisions-param-excludeuser": "Versioune vun dësem Benotzer net opzielen.",
        "apihelp-query+allusers-description": "All registréiert Benotzer opzielen.",
@@ -49,7 +53,7 @@
        "apihelp-query+blocks-example-simple": "Lëscht vun de Spären",
        "apihelp-query+categories-description": "All Kategorien opzielen zu deenen dës Säit gehéiert.",
        "apihelp-query+categorymembers-description": "All Säiten aus enger bestëmmter Kategorie opzielen.",
-       "apihelp-query+categorymembers-example-simple": "Déi éischt 10 Säiten aus der [[:Category:Physics]] kréien",
+       "apihelp-query+categorymembers-example-simple": "Déi éischt 10 Säiten aus der <kbd>Category:Physics</kbd> kréien.",
        "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",
@@ -64,7 +68,7 @@
        "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.",
        "apihelp-query+recentchanges-example-simple": "Rezent Ännerunge weisen",
-       "apihelp-query+revisions-example-last5": "Déi lescht 5 Versioune vun der \"Haaptsäit\" kréien",
+       "apihelp-query+revisions-example-last5": "Déi lescht 5 Versioune vun der <kbd>Haaptsäit</kbd> kréien.",
        "apihelp-query+usercontribs-description": "All Ännerunge vun engem Benotzer kréien.",
        "apihelp-query+watchlist-param-user": "Nëmmen Ännerunge vun dësem Benotzer opzielen.",
        "apihelp-query+watchlist-param-excludeuser": "Ännerunge vun dësem Benotzer net opzielen.",
        "apihelp-unblock-description": "D'Spär vun engem Benotzer ophiewen.",
        "apihelp-unblock-param-reason": "Grond fir d'Spär opzehiewen",
        "apihelp-undelete-param-reason": "Grond fir ze restauréieren.",
-       "apihelp-undelete-example-page": "[[Main Page]] restauréieren",
+       "apihelp-undelete-example-page": "<kbd>Main Page</kbd> restauréieren.",
        "apihelp-upload-param-watch": "D'Säit iwwerwaachen.",
+       "apihelp-upload-example-url": "Vun enger URL eroplueden.",
        "apihelp-userrights-param-user": "Benotzernumm.",
        "apihelp-userrights-param-userid": "Benotzer Id.",
        "apihelp-userrights-param-reason": "Grond fir d'Ännerung.",
-       "apihelp-watch-example-watch": "D'Säit \"Haaptsäit\" iwwerwaachen",
+       "apihelp-watch-example-watch": "D'Säit <kbd>Haaptsäit</kbd> iwwerwaachen.",
        "api-help-param-deprecated": "Vereelst.",
        "api-help-param-required": "Dëse Parameter ass obligatoresch.",
        "api-help-examples": "{{PLURAL:$1|Beispill|Beispiler}}:"
diff --git a/includes/api/i18n/ln.json b/includes/api/i18n/ln.json
new file mode 100644 (file)
index 0000000..cd11746
--- /dev/null
@@ -0,0 +1,8 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Moyogo"
+               ]
+       },
+       "apihelp-edit-example-edit": "Kobɔngisa lokásá lɔ̌kɔ́."
+}
diff --git a/includes/api/i18n/lzh.json b/includes/api/i18n/lzh.json
new file mode 100644 (file)
index 0000000..970bea9
--- /dev/null
@@ -0,0 +1,8 @@
+{
+       "@metadata": {
+               "authors": [
+                       "RalfX"
+               ]
+       },
+       "apihelp-feedcontributions-param-toponly": "僅示至新審之纂"
+}
index 686dab3..1efb45f 100644 (file)
@@ -8,8 +8,8 @@
        "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-main-param-smaxage": "Задајте му олку секунди на заглавитето s-maxage. Грешките никогаш не се чуваат во меѓускладот.",
-       "apihelp-main-param-maxage": "Задајте му олку секунди на заглавитето max-age. Грешките никогаш не се чуваат во меѓускладот.",
+       "apihelp-main-param-smaxage": "Задајте му олку секунди на заглавитето <code>s-maxage</code>. Грешките никогаш не се чуваат во меѓускладот.",
+       "apihelp-main-param-maxage": "Задајте му олку секунди на заглавитето <code>max-age</code>. Грешките никогаш не се чуваат во меѓускладот.",
        "apihelp-main-param-assert": "Провери дали корисникот е најавен ако е зададено „user“ или дали го има корисничкото право на бот, ако е зададено „bot“.",
        "apihelp-main-param-requestid": "Тука внесената вредност ќе биде вклучена во извештајот. Може да се користи за разликување на барањата.",
        "apihelp-main-param-servedby": "Вклучи го домаќинското име што го услужило барањето во резултатите.",
        "apihelp-block-param-autoblock": "Автоматски блокирај ја последно употребената IP-адреса и сите понатамошни IP-адреси од кои лицето ќе се обиде да се најави.",
        "apihelp-block-param-noemail": "Оневозможи му на корисникот да испаќа е-пошта преку викито. (Го бара правото „блокирање е-пошта“).",
        "apihelp-block-param-hidename": "Скриј го корисничкото име од дневникот на блокирања. (Го бара правото „скривање корисник“)",
-       "apihelp-block-param-allowusertalk": "Овозможи му на корисникот да си ја уредува сопствената страница за разговор (зависи од $wgBlockAllowsUTEdit).",
+       "apihelp-block-param-allowusertalk": "Овозможи му на корисникот да си ја уредува сопствената страница за разговор (зависи од <var>[[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>).",
        "apihelp-block-param-reblock": "Ако корисникот е веќе блокиран, наметни врз постоечкиот блок.",
        "apihelp-block-param-watchuser": "Набљудувај ја корисничката страница и страницата за разговор на овој корисник или IP-адреса",
        "apihelp-block-example-ip-simple": "Блокирај ја IP-адресата 192.0.2.5 три дена со причината „Прва опомена“",
        "apihelp-block-example-user-complex": "Блокирај го корисникот Вандал (Vandal) бесконечно со причината „Вандализам“ и оневозможи создавање на нови сметки и праќање е-пошта",
-       "apihelp-clearhasmsg-description": "Ја отстранува ознаката „hasmsg“ од тековниот корисник.",
-       "apihelp-clearhasmsg-example-1": "Отстрани ја ознаката „hasmsg“ од тековниот корисник",
+       "apihelp-clearhasmsg-description": "Ја отстранува ознаката „<code>hasmsg</code>“ од тековниот корисник.",
+       "apihelp-clearhasmsg-example-1": "Отстрани ја ознаката „<code>hasmsg</code>“ од тековниот корисник",
        "apihelp-compare-description": "Добивање на разлика помеѓу две страници.\n\nМора да се добие број на преработката, наслов на странивата или пак нејзина назнака. Важи и за „од“ и за „на“.",
        "apihelp-compare-param-fromtitle": "Прв наслов за споредба.",
        "apihelp-compare-param-fromid": "Прва назнака на страница за споредба.",
@@ -42,7 +42,7 @@
        "apihelp-compare-example-1": "Дај разлика помеѓу преработките 1 и 2",
        "apihelp-createaccount-description": "Создај нова корисничка сметка.",
        "apihelp-createaccount-param-name": "Корисничко име.",
-       "apihelp-createaccount-param-password": "Лозинка (се занемарува ако е зададено $1mailpassword).",
+       "apihelp-createaccount-param-password": "Лозинка (се занемарува ако е зададено <var>$1mailpassword</var>).",
        "apihelp-createaccount-param-domain": "Домен за надворешна заверка (незадолжително).",
        "apihelp-createaccount-param-token": "Шифра за создавање сметка добиена во првото барање.",
        "apihelp-createaccount-param-email": "Е-пошта на корисникот (незадолжително).",
@@ -91,7 +91,7 @@
        "apihelp-edit-param-contentmodel": "Содржински модел на новата содржина.",
        "apihelp-edit-param-token": "Шифрата треба секогаш да се испраќа како последниот параметар, или барем по параметарот $1text.",
        "apihelp-edit-example-edit": "Уреди страница",
-       "apihelp-edit-example-prepend": "Стави _&#95;NOTOC_&#95; пред страницата",
+       "apihelp-edit-example-prepend": "Стави <kbd>_&#95;NOTOC_&#95;</kbd> пред страницата",
        "apihelp-edit-example-undo": "Отповикај ги преработките од 13579 до 13585 со автоматски опис",
        "apihelp-emailuser-description": "Испрати е-пошта на корисник.",
        "apihelp-emailuser-param-target": "На кој корисник да му се испрати е-поштата.",
        "apihelp-filerevert-param-filename": "Име на целната податотека, без претставката „Податотека:“.",
        "apihelp-filerevert-param-comment": "Коментар за подигањето.",
        "apihelp-filerevert-param-archivename": "Архивски назив на преработката што ја повраќате.",
-       "apihelp-filerevert-example-revert": "Врати ја Wiki.png на верзијата од 2011-03-05T15:27:40Z",
+       "apihelp-filerevert-example-revert": "Врати ја <kbd>Wiki.png</kbd> на верзијата од <kbd>2011-03-05T15:27:40Z</kbd>",
        "apihelp-help-description": "Прикажувај помош за укажаните модули.",
        "apihelp-help-param-modules": "Модули за приказ на помош за (вредности на параметрите action= и format=, или пак „main“). Може да се укажат подмодули со „+“.",
        "apihelp-help-param-submodules": "Прикажувај и помош за подмодули на именуваниот модул.",
diff --git a/includes/api/i18n/nap.json b/includes/api/i18n/nap.json
new file mode 100644 (file)
index 0000000..a285b04
--- /dev/null
@@ -0,0 +1,10 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Chelin"
+               ]
+       },
+       "apihelp-block-description": "Blocca n'utente.",
+       "apihelp-createaccount-param-name": "Nomme utente.",
+       "apihelp-delete-description": "Scancella 'na paggena."
+}
diff --git a/includes/api/i18n/nds.json b/includes/api/i18n/nds.json
new file mode 100644 (file)
index 0000000..3f7cb12
--- /dev/null
@@ -0,0 +1,8 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Servien"
+               ]
+       },
+       "apihelp-login-param-password": "Passwoort."
+}
index d700f7a..e4e25a3 100644 (file)
@@ -6,16 +6,17 @@
                        "Robin0van0der0vliet",
                        "Mar(c)",
                        "Valhallasw",
-                       "Sikjes"
+                       "Sikjes",
+                       "Macofe"
                ]
        },
-       "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-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Documentatie]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api E-maillijst]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API-aankondigingen]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bugs & verzoeken]\n</div>\n<strong>Status:</strong> Alle functies die op deze pagina worden weergegeven horen te werken. Aan de API wordt actief gewerkt, en deze kan gewijzigd worden. Abonneer u op  de [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ e-maillijst mediawiki-api-announce] voor meldingen over aanpassingen.\n\n<strong>Foutieve verzoeken:</strong> als de API foutieve verzoeken ontvangt, wordt er geantwoord met een HTTP-header met de sleutel \"MediaWiki-API-Error\" en daarna worden de waarde van de header en de foutcode op dezelfde waarde ingesteld. Zie [[mw:API:Errors_and_warnings|API: Errors and warnings]] voor meer informatie.",
        "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 is aangemeld als \"user\" is meegegeven, en of de gebruiker het robotgebruikersrecht heeft als \"bot\" is meegegeven.",
+       "apihelp-main-param-maxlag": "De maximale vertraging kan gebruikt worden als MediaWiki is geïnstalleerd op een databasecluster die gebruik maakt van replicatie. Om te voorkomen dat handelingen nog meer databasereplicatievertraging veroorzaken, kan deze parameter er voor zorgen dat de client wacht totdat de replicatievertraging lager is dan de aangegeven waarde. In het geval van buitensporige vertraging, wordt de foutcode <samp>maxlag</samp> teruggegeven met een bericht als <samp>Waiting for $host: $lag seconds lagged</samp>.<br />Zie [[mw:Manual:Maxlag_parameter|Handboek: Maxlag parameter]] voor mee informatie.",
+       "apihelp-main-param-smaxage": "Stelt de header \"<code>s-maxage</code>\" in op het aangegeven aantal seconden. Foutmeldingen komen nooit in de cache.",
+       "apihelp-main-param-maxage": "Stelt de header \"<code>max-age</code>\" in op het aangegeven aantal seconden. Foutmeldingen komen nooit in de cache.",
+       "apihelp-main-param-assert": "Controleer of de gebruiker is aangemeld als <kbd>user</kbd> is meegegeven, en of de gebruiker het robotgebruikersrecht heeft als <kbd>bot</kbd> is meegegeven.",
        "apihelp-main-param-requestid": "Elke waarde die hier gegeven wordt, wordt aan het antwoord toegevoegd. Dit kan gebruikt worden om verzoeken te onderscheiden.",
        "apihelp-main-param-servedby": "Voeg de hostnaam van de server die de aanvraag heeft afgehandeld toe aan het antwoord.",
        "apihelp-main-param-curtimestamp": "Huidige tijd aan het antwoord toevoegen.",
@@ -24,8 +25,8 @@
        "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-delete-example-simple": "Verwijder <kbd>Hoofdpagina</kbd>.",
+       "apihelp-delete-example-reason": "Verwijder <kbd>Hoofdpagina</kbd> met als reden <kbd>Voorbereiding voor verplaatsing</kbd>.",
        "apihelp-disabled-description": "Deze module is uitgeschakeld.",
        "apihelp-edit-param-minor": "Kleine bewerking.",
        "apihelp-edit-param-notminor": "Geen kleine bewerking.",
@@ -48,6 +49,8 @@
        "apihelp-login-param-domain": "Domein (optioneel).",
        "apihelp-login-example-login": "Aanmelden",
        "apihelp-move-description": "Pagina hernoemen.",
+       "api-help-flag-readrights": "Voor deze module zijn leesrechten nodig.",
+       "api-help-flag-writerights": "Voor deze module zijn schrijfrechten nodig.",
        "api-help-parameters": "{{PLURAL:$1|Parameter|Parameters}}:",
        "api-help-param-deprecated": "Verouderd.",
        "api-help-param-default": "Standaard: $1",
diff --git a/includes/api/i18n/pam.json b/includes/api/i18n/pam.json
new file mode 100644 (file)
index 0000000..c82d88f
--- /dev/null
@@ -0,0 +1,31 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Leeheonjin"
+               ]
+       },
+       "apihelp-delete-example-simple": "Buran ya ing <kbd>Pun Bulung</kbd>.",
+       "apihelp-edit-example-edit": "Alilan ya ing bulung.",
+       "apihelp-feedrecentchanges-example-simple": "Pakit deng bayung mengayalili.",
+       "apihelp-help-example-main": "Saup para king pun modyul.",
+       "apihelp-help-example-recursive": "Deng eganaganang saup king metung a bulung.",
+       "apihelp-login-example-login": "Magpatala (login)",
+       "apihelp-patrol-example-rcid": "Magbante king bayung mengayalili.",
+       "apihelp-patrol-example-revid": "Banten ing meyalili.",
+       "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "E malyaring gamitan a yating <var>$3user</var>.",
+       "apihelp-query+allpages-example-B": "Ipakit ing talaan da reng bulung a mangumpisa king titik <kbd>B</kbd>.",
+       "apihelp-query+categoryinfo-example-simple": "Kumuwa ning impormasyun tungkul king <kbd>Kategorya:Foo</kbd> at <kbd>Kategorya:Bar</kbd>.",
+       "apihelp-query+deletedrevs-example-mode2": "Ilista la reng 50 binurang kontribusyun nang <kbd>Bob</kbd> (mode 2).",
+       "apihelp-query+deletedrevs-example-mode3-talk": "Ilista mu la reng minunang 50 meburang bulung king {{ns:talk}} lagyu-espasyu (mode 3)",
+       "apihelp-query+duplicatefiles-example-generated": "Mayintun para kareng duplika da reng egana-ganang simpan (file).",
+       "apihelp-query+extlinks-example-simple": "Kumuwa ning lista da reng suglung paluwal king <kbd>Pun Bulung</kbd>.",
+       "apihelp-query+exturlusage-example-simple": "Pakit la reng bulung a makasuglung king <kbd>http://www.mediawiki.org</kbd>.",
+       "apihelp-query+imageusage-example-simple": "Ipakit la reng bulung a gagamit ning [[:Simpan:Albert Einstein Head.jpg]].",
+       "apihelp-query+langbacklinks-example-simple": "Kunan deng bulung a maka-suglung king [[:fr:Test]].",
+       "apihelp-query+protectedtitles-example-generator": "Pantunan deng suglung king maka-protektang titulu king pun lagyu-espasyu.",
+       "apihelp-query+recentchanges-example-simple": "Talaan da reng bayung mengayalili.",
+       "apihelp-query+search-example-text": "Pantunan mo la reng tekstu para king <kbd>kabaldugan</kbd>",
+       "apihelp-query+siteinfo-example-simple": "Kung ing impormasyun ning sityu.",
+       "apihelp-upload-example-url": "Maglulan (upload) ibat king URL.",
+       "apihelp-watch-example-unwatch": "E banten ing bulung <kbd>Pun Bulung</kbd>"
+}
index 4578a06..098f974 100644 (file)
@@ -5,18 +5,19 @@
                        "Py64",
                        "Pan Cube",
                        "Alan ffm",
-                       "Devwebtel"
+                       "Devwebtel",
+                       "Macofe"
                ]
        },
        "apihelp-main-param-action": "Wybierz akcję do wykonania.",
        "apihelp-main-param-format": "Format danych wyjściowych.",
-       "apihelp-main-param-maxlag": "Maksymalne opóźnienie mogą być używane kiedy MediaWiki jest zainstalowana w klastrze zreplikowanej bazy danych. By zapisać działania powodujące większe opóźnienie replikacji, ten parametr może wymusić czekanie u klienta, dopóki opóźnienie replikacji jest mniejsze niż określona wartość. W przypadku nadmiernego opóźnienia, kod błędu \"maxlag\" jest zwracany z wiadomością jak \"Oczekiwanie na $host: $lag sekund opóźnienia\".<br />Zobacz https://www.mediawiki.org/wiki/Manual:Maxlag_parameter by uzyskać więcej informacji.",
-       "apihelp-main-param-assert": "Sprawdź, czy użytkownik jest zalogowany jeżeli jest ustawiony na \"użytkownik\", lub ma prawa bota jeśli \"bot\".",
+       "apihelp-main-param-maxlag": "Maksymalne opóźnienie mogą być używane kiedy MediaWiki jest zainstalowana w klastrze zreplikowanej bazy danych. By zapisać działania powodujące większe opóźnienie replikacji, ten parametr może wymusić czekanie u klienta, dopóki opóźnienie replikacji jest mniejsze niż określona wartość. W przypadku nadmiernego opóźnienia, kod błędu <samp>maxlag</samp> jest zwracany z wiadomością jak <samp>Oczekiwanie na $host: $lag sekund opóźnienia</samp>.<br />Zobacz [[mw:Manual:Maxlag_parameter|Podręcznik:Parametr Maxlag]] by uzyskać więcej informacji.",
+       "apihelp-main-param-assert": "Sprawdź, czy użytkownik jest zalogowany jeżeli jest ustawiony na <kbd>użytkownik</kbd>, lub ma prawa bota jeśli <kbd>bot</kbd>.",
        "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-block-example-ip-simple": "Zablokuj IP <kbd>192.0.2.5</kbd> na 3 dni za <kbd>Pierwszy atak</kbd>.",
        "apihelp-createaccount-param-name": "Nazwa użytkownika",
        "apihelp-delete-description": "Usuń stronę.",
        "apihelp-delete-param-watch": "Dodaj stronę do twojej listy obserwowanych.",
@@ -30,8 +31,9 @@
        "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-feedrecentchanges-example-simple": "Pokaż ostatnie zmiany.",
        "apihelp-help-description": "Wyświetl pomoc dla określonych modułów.",
-       "apihelp-help-param-modules": "Moduły do wyświetlenia pomocy dla (wartości akcji= i format= parametry, lub \"głównego\"). Może określić podmoduły z \"+\".",
+       "apihelp-help-param-modules": "Moduły do wyświetlenia pomocy dla (wartości <var>action</var> i <var>format</var> parametry, lub <kbd>main</kbd>). Może określić podmoduły z <kbd>+</kbd>.",
        "apihelp-help-param-recursivesubmodules": "Zawiera pomoc dla podmodułów rekursywnie.",
        "apihelp-help-example-main": "Pomoc dla modułu głównego",
        "apihelp-help-example-recursive": "Cała pomoc na jednej stronie.",
        "apihelp-login-param-name": "Nazwa użytkownika.",
        "apihelp-login-param-password": "Hasło.",
        "apihelp-login-example-login": "Zaloguj się",
+       "apihelp-managetags-param-ignorewarnings": "Czy zignorować ostrzeżenia, które pojawiają się w trakcie operacji.",
        "apihelp-move-description": "Przenieś stronę.",
+       "apihelp-move-param-reason": "Powód zmiany nazwy.",
        "apihelp-move-param-ignorewarnings": "Ignoruj wszystkie ostrzeżenia.",
        "apihelp-protect-example-protect": "Zabezpiecz stronę",
+       "apihelp-query+allpages-example-B": "Pokaż listę stron rozpoczynających się na literę <kbd>B</kbd>.",
+       "apihelp-query+filearchive-example-simple": "Pokaż listę wszystkich usuniętych plików.",
        "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+recentchanges-example-simple": "Lista ostatnich zmian.",
        "apihelp-query+search-description": "Wykonaj wyszukiwanie pełnotekstowe.",
        "apihelp-query+watchlist-param-excludeuser": "Nie wyświetlaj zmian wykonanych przez tego użytkownika.",
        "apihelp-unblock-param-reason": "Powód odblokowania.",
        "apihelp-upload-param-filename": "Nazwa pliku docelowego.",
        "apihelp-userrights-param-user": "Nazwa użytkownika.",
        "apihelp-userrights-param-reason": "Powód zmiany.",
-       "apihelp-dbg-description": "Dane wyjściowe w formacie var_export() (funkcji PHP).",
-       "apihelp-dbgfm-description": "Dane wyjściowe w formacie var_export() (funkcji PHP) (prawidłowo wyświetlane w HTML).",
-       "apihelp-dump-description": "Dane wyjściowe w formacie var_dump() (funkcji PHP).",
-       "apihelp-dumpfm-description": "Dane wyjściowe w formacie var_dump() (funkcji PHP) (prawidłowo wyświetlane w HTML).",
+       "apihelp-dbg-description": "Dane wyjściowe w formacie <code>var_export()</code> (funkcji PHP).",
+       "apihelp-dbgfm-description": "Dane wyjściowe w formacie <code>var_export()</code> (funkcji PHP) (prawidłowo wyświetlane w HTML).",
+       "apihelp-dump-description": "Dane wyjściowe w formacie <code>var_dump()</code> (funkcji PHP).",
+       "apihelp-dumpfm-description": "Dane wyjściowe w formacie <code>var_dump()</code> (funkcji PHP) (prawidłowo wyświetlane w HTML).",
        "apihelp-json-description": "Dane wyjściowe w formacie JSON.",
        "apihelp-jsonfm-description": "Dane wyjściowe w formacie JSON (prawidłowo wyświetlane w HTML).",
        "apihelp-php-description": "Dane wyjściowe w serializowany formacie PHP.",
        "apihelp-phpfm-description": "Dane wyjściowe w serializowanym formacie PHP (prawidłowo wyświetlane w HTML).",
-       "apihelp-txt-description": "Dane wyjściowe w formacie print_r() (funkcji PHP).",
-       "apihelp-txtfm-description": "Dane wyjściowe w formacie print_r() (funkcji PHP) (prawidłowo wyświetlane w HTML).",
+       "apihelp-txt-description": "Dane wyjściowe w formacie <code>print_r()</code> (funkcji PHP).",
+       "apihelp-txtfm-description": "Dane wyjściowe w formacie <code>print_r()</code> (funkcji PHP) (prawidłowo wyświetlane w HTML).",
        "apihelp-wddx-description": "Dane wyjściowe w formacie WDDX.",
        "apihelp-wddxfm-description": "Dane wyjściowe w formacie WDDX (prawidłowo wyświetlane w HTML).",
        "apihelp-xml-description": "Dane wyjściowe w formacie XML.",
        "api-help-parameters": "{{PLURAL:$1|Parametr|Parametry}}:",
        "api-help-param-deprecated": "Przestarzałe.",
        "api-help-param-required": "Ten parametr jest wymagany.",
-       "api-help-param-list": "{{PLURAL:$1|1=Jedna wartość|2=Wartości (oddziel z \"{{!}}\")}}: $2",
+       "api-help-param-list": "{{PLURAL:$1|1=Jedna wartość|2=Wartości (oddziel za pomocą <kbd>{{!}}</kbd>)}}: $2",
        "api-help-param-limit": "Nie więcej niż $1 dozwolone.",
        "api-help-param-limit2": "Nie więcej niż $1 ($2 dla botów) dozwolone.",
        "api-help-param-integer-min": "{{PLURAL:$1|1=Wartość|2=Wartości}} musza być mniejsze niż $2.",
        "api-help-param-integer-max": "{{PLURAL:$1|1=Wartość musi|2=Wartości muszą}} być nie większa niż $3.",
        "api-help-param-integer-minmax": "{{PLURAL:$1|1=Wartość musi|2=Wartości muszą}} być pomiędzy $2 a $3.",
-       "api-help-param-multi-separate": "Oddziel wartości z \"|\".",
+       "api-help-param-multi-separate": "Oddziel wartości za pomocą <kbd>|</kbd>.",
        "api-help-param-multi-max": "Maksymalna ilość wartości to {{PLURAL:$1|$1}} ({{PLURAL:$2|$2}} dla botów).",
        "api-help-param-default": "Domyślnie: $1",
        "api-help-param-default-empty": "Domyślnie: <span class=\"apihelp-empty\">(puste)</span>",
diff --git a/includes/api/i18n/pt-br.json b/includes/api/i18n/pt-br.json
new file mode 100644 (file)
index 0000000..5af806d
--- /dev/null
@@ -0,0 +1,14 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Fasouzafreitas"
+               ]
+       },
+       "apihelp-main-param-requestid": "Qualquer valor dado aqui será incluído na resposta. Pode ser usado para distinguir requisições.",
+       "apihelp-block-description": "Bloquear um usuário",
+       "apihelp-block-param-user": "Nome de usuário, endereço IP ou faixa de IP para bloquear.",
+       "apihelp-feedrecentchanges-param-hidemyself": "Ocultar alterações feitas pelo usuário atual.",
+       "apihelp-feedrecentchanges-example-30days": "Mostrar as alterações recentes por 30 dias.",
+       "apihelp-move-param-movetalk": "Renomear a página de discussão, se existir.",
+       "apihelp-options-example-reset": "Resetar todas as preferências"
+}
index f6c9a61..72044db 100644 (file)
@@ -2,14 +2,16 @@
        "@metadata": {
                "authors": [
                        "Vitorvicentevalente",
-                       "Fúlvio"
+                       "Fúlvio",
+                       "Macofe"
                ]
        },
-       "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-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Documentação]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Lista de discussão]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Anúncios da API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Erros e 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 [[mw:API:Errors_and_warnings|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).",
@@ -18,7 +20,7 @@
        "apihelp-delete-description": "Eliminar uma página.",
        "apihelp-delete-param-watch": "Adicionar esta página à lista de vigiadas.",
        "apihelp-delete-param-unwatch": "Remover esta página da lista de vigiadas.",
-       "apihelp-delete-example-simple": "Eliminar Página Principal",
+       "apihelp-delete-example-simple": "Eliminar <kbd>Página Principal</kbd>.",
        "apihelp-disabled-description": "O módulo foi desativado.",
        "apihelp-edit-description": "Criar e editar páginas.",
        "apihelp-edit-param-sectiontitle": "Título para uma nova seção.",
        "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.",
@@ -44,6 +51,8 @@
        "apihelp-login-param-domain": "Domínio (opcional).",
        "apihelp-login-example-login": "Entrar",
        "apihelp-logout-description": "Terminar e limpar dados de sessão.",
+       "apihelp-managetags-description": "Executar tarefas de gestão relacionadas com alteração de etiquetas.",
+       "apihelp-managetags-param-reason": "Um motivo, opcional, para a criação, eliminação, ativação ou desativação da etiqueta.",
        "apihelp-move-description": "Mover uma página.",
        "apihelp-move-param-noredirect": "Não criar um redirecionamento.",
        "apihelp-move-param-ignorewarnings": "Ignorar quaisquer avisos.",
@@ -56,8 +65,8 @@
        "apihelp-protect-example-protect": "Proteger uma página",
        "apihelp-query+allcategories-description": "Enumerar todas as categorias.",
        "apihelp-query+allpages-param-prefix": "Pesquisa para todos os títulos de páginas que comecem com este valor.",
-       "apihelp-query+allpages-example-generator": "Mostrar informação sobre 4 páginas que comecem com a letra \"T\"",
-       "apihelp-query+allusers-example-Y": "Lista de utilizadores que comecem com Y",
+       "apihelp-query+allpages-example-generator": "Mostrar informação sobre 4 páginas que comecem com a letra <kbd>T</kbd>.",
+       "apihelp-query+allusers-example-Y": "Lista de utilizadores que comecem com <kbd>Y</kbd>.",
        "apihelp-query+blocks-param-limit": "O número máximo de bloqueios a listar.",
        "apihelp-query+categorymembers-description": "Lista de todas as páginas numa categoria fornecida.",
        "apihelp-query+deletedrevs-paraminfo-modes": "{{PLURAL:$1|Modo|Modos}}: $2",
@@ -75,7 +84,7 @@
        "apihelp-userrights-param-userid": "ID de utilizador.",
        "apihelp-userrights-param-add": "Adicionar o utilizador a estes grupos.",
        "apihelp-userrights-param-remove": "Remover este utilizador destes grupos.",
-       "apihelp-watch-example-unwatch": "Deixar de vigiar a \"Página Principal\"",
+       "apihelp-watch-example-unwatch": "Deixar de vigiar a página <kbd>Página Principal</kbd>.",
        "apihelp-json-description": "Dados de saída em formato JSON.",
        "api-help-title": "Ajuda API da MediaWiki",
        "api-help-main-header": "Módulo principal",
        "api-help-parameters": "{{PLURAL:$1|Parâmetro|Parâmetros}}:",
        "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-multi-separate": "Separe os valores com <kbd>|</kbd>.",
+       "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://phabricator.wikimedia.org/."
 }
index c8713e8..3d1f3c4 100644 (file)
@@ -5,7 +5,8 @@
                        "Robby",
                        "Shirayuki",
                        "Umherirrender",
-                       "McDutchie"
+                       "McDutchie",
+                       "Raymond"
                ]
        },
        "apihelp-main-description": "{{doc-apihelp-description|main}}",
        "apihelp-block-param-watchuser": "{{doc-apihelp-param|block|watchuser}}",
        "apihelp-block-example-ip-simple": "{{doc-apihelp-example|block}}",
        "apihelp-block-example-user-complex": "{{doc-apihelp-example|block}}",
-       "apihelp-clearhasmsg-description": "{{doc-apihelp-description|clearhasmsg}}",
-       "apihelp-clearhasmsg-example-1": "{{doc-apihelp-example|clearhasmsg}}",
+       "apihelp-checktoken-description": "{{doc-apihelp-description|checktoken}}",
+       "apihelp-checktoken-param-type": "{{doc-apihelp-param|checktoken|type}}",
+       "apihelp-checktoken-param-token": "{{doc-apihelp-param|checktoken|token}}",
+       "apihelp-checktoken-param-maxtokenage": "{{doc-apihelp-param|checktoken|maxtokenage}}",
+       "apihelp-checktoken-example-simple": "{{doc-apihelp-example|checktoken}}",
+       "apihelp-clearhasmsg-description": "{{doc-apihelp-description|clear<code>hasmsg</code>}}",
+       "apihelp-clearhasmsg-example-1": "{{doc-apihelp-example|clear<code>hasmsg</code>}}",
        "apihelp-compare-description": "{{doc-apihelp-description|compare}}",
        "apihelp-compare-param-fromtitle": "{{doc-apihelp-param|compare|fromtitle}}",
        "apihelp-compare-param-fromid": "{{doc-apihelp-param|compare|fromid}}",
        "apihelp-login-example-login": "{{doc-apihelp-example|login}}",
        "apihelp-logout-description": "{{doc-apihelp-description|logout}}",
        "apihelp-logout-example-logout": "{{doc-apihelp-example|logout}}",
+       "apihelp-managetags-description": "{{doc-apihelp-description|managetags}}",
+       "apihelp-managetags-param-operation": "{{doc-apihelp-param|managetags|operation}}",
+       "apihelp-managetags-param-tag": "{{doc-apihelp-param|managetags|tag}}",
+       "apihelp-managetags-param-reason": "{{doc-apihelp-param|managetags|reason}}",
+       "apihelp-managetags-param-ignorewarnings": "{{doc-apihelp-param|managetags|ignorewarnings}}",
+       "apihelp-managetags-example-create": "{{doc-apihelp-example|managetags}}",
+       "apihelp-managetags-example-delete": "{{doc-apihelp-example|managetags}}",
+       "apihelp-managetags-example-activate": "{{doc-apihelp-example|managetags}}",
+       "apihelp-managetags-example-deactivate": "{{doc-apihelp-example|managetags}}",
        "apihelp-move-description": "{{doc-apihelp-description|move}}",
        "apihelp-move-param-from": "{{doc-apihelp-param|move|from}}",
        "apihelp-move-param-fromid": "{{doc-apihelp-param|move|fromid}}",
        "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-testactions": "{{doc-apihelp-param|query+info|testactions}}",
        "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}}",
index 330da6d..56d34ef 100644 (file)
@@ -2,13 +2,14 @@
        "@metadata": {
                "authors": [
                        "Mahairod",
-                       "Okras"
+                       "Okras",
+                       "Eakarpov"
                ]
        },
        "apihelp-main-param-action": "Действие, которое следует выполнить.",
        "apihelp-main-param-format": "Формат вывода.",
-       "apihelp-main-param-smaxage": "Устанавливает заголовок s-maxage в заданное число секунд. Ошибки никогда не кэшируются.",
-       "apihelp-main-param-maxage": "Устанавливает заголовок max-age в заданное число секунд. Ошибки никогда не кэшируются.",
+       "apihelp-main-param-smaxage": "Устанавливает заголовок <code>s-maxage</code> в заданное число секунд. Ошибки никогда не кэшируются.",
+       "apihelp-main-param-maxage": "Устанавливает заголовок <code>max-age</code> в заданное число секунд. Ошибки никогда не кэшируются.",
        "apihelp-main-param-assert": "Удостовериться, что пользователь авторизован, если задано \"user\", или что имеет права бота, если задано \"bot\".",
        "apihelp-main-param-requestid": "Любое значение, заданное здесь, будет включено в ответ. Может быть использовано для различения запросов.",
        "apihelp-main-param-servedby": "Включить в результаты имя хоста, обработавшего запрос.",
@@ -24,6 +25,7 @@
        "apihelp-disabled-description": "Этот модуль был отключен.",
        "apihelp-edit-param-sectiontitle": "Заголовок для нового раздела.",
        "apihelp-edit-param-text": "Содержание страницы.",
+       "apihelp-edit-param-watch": "Добавить страницу к текущему списку наблюдения пользователя.",
        "apihelp-edit-example-edit": "Редактировать страницу",
        "apihelp-expandtemplates-param-title": "Заголовок страницы.",
        "apihelp-import-param-xml": "Загруженный XML-файл.",
        "apihelp-login-param-domain": "Домен (необязательно).",
        "apihelp-login-example-login": "Войти",
        "apihelp-logout-description": "Выйти и очистить данные сессии.",
+       "apihelp-query+alllinks-example-unique-generator": "Получить все названия-ссылки, выделяя пропущенные.",
+       "apihelp-query+duplicatefiles-example-generated": "Поиск дубликатов всех файлов.",
+       "apihelp-query+recentchanges-example-simple": "Список последних изменений.",
+       "apihelp-upload-example-url": "Загрузить через URL",
        "api-help-main-header": "Главный модуль",
        "api-help-parameters": "Параметр{{PLURAL:$1||ы}}:",
        "api-help-param-deprecated": "Устаревший.",
index cf3a4de..db801b8 100644 (file)
@@ -1,11 +1,24 @@
 {
        "@metadata": {
                "authors": [
-                       "Milicevic01"
+                       "Milicevic01",
+                       "Aktron"
                ]
        },
        "apihelp-block-description": "Блокирај корисника.",
        "apihelp-block-param-reason": "Разлог за блокирање.",
+       "apihelp-createaccount-param-name": "Корисничко име.",
        "apihelp-delete-description": "Обриши страницу.",
-       "apihelp-edit-param-minor": "Мања измена."
+       "apihelp-edit-param-text": "Страница са садржајем.",
+       "apihelp-edit-param-minor": "Мања измена.",
+       "apihelp-edit-example-edit": "Уређивање странице.",
+       "apihelp-emailuser-description": "Слање е-поруке кориснику",
+       "apihelp-emailuser-param-target": "Корисник је послао е-поруку.",
+       "apihelp-feedcontributions-param-year": "Од године (и раније).",
+       "apihelp-filerevert-description": "Вратити датотеку у ранију верзију.",
+       "apihelp-help-example-recursive": "Сва помоћ у једној страници.",
+       "apihelp-login-param-name": "Корисничко име.",
+       "apihelp-login-param-password": "Лозинка.",
+       "apihelp-login-example-login": "Пријавa.",
+       "apihelp-move-description": "Премештање странице."
 }
index ca690bf..963bd5c 100644 (file)
@@ -7,35 +7,40 @@
                        "Victorsa",
                        "Albinomamba",
                        "Peki01",
-                       "Stens51"
+                       "Stens51",
+                       "Boom",
+                       "Jenniesarina",
+                       "Marfuas"
                ]
        },
-       "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-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Dokumentation]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api E-postlista]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API-aviseringar]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R|Buggar & förslag]\n</div>\n<strong>Status:</strong> Alla funktioner som visas på denna sida borde fungera. API:et är dock fortfarande under aktiv utveckling och kan ändras när som helst. Prenumerera på [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/mediawiki-api-announce e-postlistan] för att få aviseringar om uppdateringar.\n\n<strong>Felaktiga förfrågningar:</strong> När felaktiga förfrågningar skickas till API:et skickas en HTTP-header med nyckeln \"MediaWiki-API-Error\" och sedan sätts både värdet på headern och den felkoden som returneras till samma värde. För mer information läs [[mw:API:Errors_and_warnings|API: Fel och varningar]].",
        "apihelp-main-param-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-smaxage": "Ange headervärdet <code>s-maxage</code> till så här många sekunder. Fel cachelagras aldrig.",
+       "apihelp-main-param-maxage": "Ange headervärdet <code>max-age</code> till så här många sekunder. Fel cachelagras aldrig.",
+       "apihelp-main-param-assert": "Bekräftar att användaren är inloggad om satt till <kbd>user</kbd>, eller har bot-användarrättigheter om satt till <kbd>bot</kbd>.",
        "apihelp-main-param-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-main-param-origin": "När API:et används genom en cross-domain AJAX-begäran (CORS), ange detta till den ursprungliga domänen. Detta måste inkluderas i alla pre-flight-begäran, och mpste därför vara en del av den begärda URI:n (inte i POST-datat). Detta måste överensstämma med en av källorna i headern <code>Origin</code> exakt, så den måste sättas till något i stil med <kbd>http://en.wikipedia.org</kbd> eller <kbd>https://meta.wikimedia.org</kbd>. Om denna parameter inte överensstämmer med headern <code>Origin</code>, returneras ett 403-svar. Om denna parameter överensstämmer med headern <code>Origin</code> och källan är vitlistad, sätts en <code>Access-Control-Allow-Origin</code>-header.",
+       "apihelp-main-param-uselang": "Språk som ska användas för meddelandeöversättningar. En lista med koder kan hämtas från <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> med <kbd>siprop=languages</kbd>, eller ange <kbd>user</kbd> för att använda den aktuella användarens språkpreferenser, eller ange <kbd>content</kbd> för att använda innehållsspråket.",
        "apihelp-block-description": "Blockera en användare.",
        "apihelp-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-expiry": "Förfallotid. Kan vara Kan vara relativt (t.ex. <kbd>5 months</kbd> eller <kbd>2 weeks</kbd>) eller absolut (t.ex. <kbd>2014-09-18T12:34:56Z</kbd>). Om satt till <kbd>infinite</kbd>, <kbd>indefinite</kbd> eller <kbd>never</kbd>, 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-noemail": "Hindra användaren från att skicka e-post via wikin. (Kräver rättigheten <code>blockemail</code>).",
+       "apihelp-block-param-hidename": "Döljer användarnamnet från blockeringsloggen. (Kräver rättigheten <code>hideuser</code>).",
+       "apihelp-block-param-allowusertalk": "Låt användaren redigera sin egen diskussionssida (beror på <var>[[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>).",
        "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-block-example-ip-simple": "Blockera IP-adressen <kbd>192.0.2.5</kbd> i tre dagar med motivationen <kbd>First strike</kbd>",
+       "apihelp-block-example-user-complex": "Blockera användare <kbd>Vandal</kbd> på obegränsad tid med motivationen <kbd>Vandalism</kbd>, och förhindra kontoskapande och e-post.",
+       "apihelp-clearhasmsg-description": "Rensa <code>hasmsg</code>-flaggan för den aktuella användaren.",
+       "apihelp-clearhasmsg-example-1": "Rensa <code>hasmsg</code>-flaggan för den aktuella användaren",
+       "apihelp-compare-description": "Hämta skillnaden mellan två sidor.\n\nEtt versionsnummer, en sidtitel, eller ett sid-Id för både \"from\" och \"to\" måste skickas.",
        "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.",
@@ -45,7 +50,7 @@
        "apihelp-compare-example-1": "Skapa en diff mellan version 1 och 2",
        "apihelp-createaccount-description": "Skapa ett nytt användarkonto.",
        "apihelp-createaccount-param-name": "Användarnamn.",
-       "apihelp-createaccount-param-password": "Lösenord (ignoreras om $1mailpassword angetts).",
+       "apihelp-createaccount-param-password": "Lösenord (ignoreras om <var>$1mailpassword</var> 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-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-createaccount-example-pass": "Skapa användaren <kbd>testuser</kbd> med lösenordet <kbd>test123</kbd>",
+       "apihelp-createaccount-example-mail": "Skapa användaren <kbd>testmailuser</kbd> 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-title": "Titel på sidan du vill radera. Kan inte användas tillsammans med <var>$1pageid</var>.",
+       "apihelp-delete-param-pageid": "Sid-ID för sidan att radera. Kan inte användas tillsammans med <var>$1titel</var>.",
        "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-simple": "Radera huvudsidan",
-       "apihelp-delete-example-reason": "Raderar huvudsidan med orsaken \"Förbereder flyttning\"",
+       "apihelp-delete-param-watch": "Lägg till sidan i aktuell användares bevakningslista.",
+       "apihelp-delete-param-watchlist": "Lägg till eller ta bort sidan ovillkorligen från den aktuella användarens bevakningslista, använd inställningar eller ändra inte bevakning.",
+       "apihelp-delete-param-unwatch": "Ta bort sidan från aktuell användares bevakningslista.",
+       "apihelp-delete-param-oldimage": "Namnet på den gamla bilden att radera som tillhandahålls av [[Special:ApiHelp/query+imageinfo|action=query&prop=imageinfo&iiprop=archivename]].",
+       "apihelp-delete-example-simple": "Radera <kbd>huvudsidan</kbd>.",
+       "apihelp-delete-example-reason": "Raderar <kbd>huvudsidan</kbd> med orsaken <kbd>Förbereder flyttning</kbd>.",
        "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-title": "Titel på sidan du vill redigera. Kan inte användas tillsammans med <var>$1pageid</var>.",
+       "apihelp-edit-param-pageid": "Sid-ID för sidan du vill redigera. Kan inte användas tillsammans med <var>$1titel</var>.",
+       "apihelp-edit-param-section": "Avsnittsnummer. <kbd>0</kbd> för det översta avsnittet, <kbd>new</kbd> 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-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-starttimestamp": "Tidsstämpel för när redigeringsprocessen började, används för att upptäcka redigeringskonflikter. Ett lämpligt värde kan erhållas via  <var>[[Special:ApiHelp/main|curtimestamp]]</var> när redigeringsprocessen startas (t.ex. när sidans innehåll laddas för redigering).",
+       "apihelp-edit-param-recreate": "Ignorera felmeddelande om sidan har blivit raderad under tiden.",
        "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-watch": "Lägg till sidan i den aktuella användarens bevakningslista.",
+       "apihelp-edit-param-unwatch": "Ta bort sidan från aktuell användares bevakningslista.",
+       "apihelp-edit-param-watchlist": "Lägg till eller ta bort sidan ovillkorligen från den aktuella användarens bevakningslista, använd inställningar eller ändra inte bevakning.",
        "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-contentformat": "Det serialiseringsformat som används för indatatexten.",
+       "apihelp-edit-param-contentmodel": "Det nya innehållets innehållsmodell.",
        "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-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-emailuser-example-email": "Skicka ett e-postmeddelande till användaren <kbd>WikiSysop</kbd> med texten <kbd>Content</kbd>.",
        "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-expandtemplates-param-includecomments": "Om HTML-kommentarer skall inkluderas i utdata.",
+       "apihelp-expandtemplates-param-generatexml": "Generera ett XML tolknings träd (ersatt av $1prop=parsetree).",
+       "apihelp-expandtemplates-example-simple": "Expandera wikitexten <kbd><nowiki>{{Projekt:Sandbox}}</nowiki></kbd>.",
+       "apihelp-feedcontributions-description": "Returnerar en användares bidragsflöde.",
+       "apihelp-feedcontributions-param-feedformat": "Flödets format.",
+       "apihelp-feedcontributions-param-user": "De användare vars bidrag ska hämtas.",
+       "apihelp-feedcontributions-param-namespace": "Vilken namnrymd att filtrera bidrag med.",
        "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-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-feedcontributions-example-simple": "Returnera bidrag för <kbd>Exempel</kbd>",
+       "apihelp-feedrecentchanges-description": "Returnerar ett flöde med senaste ändringar.",
+       "apihelp-feedrecentchanges-param-feedformat": "Flödets format.",
+       "apihelp-feedrecentchanges-param-namespace": "Namnrymder att begränsa resultaten till.",
+       "apihelp-feedrecentchanges-param-invert": "Alla namnrymder utom den valda.",
        "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-hideanons": "Dölj ändringar av oinloggade användare.",
        "apihelp-feedrecentchanges-param-hideliu": "Dölj ändringar av inloggade användare.",
        "apihelp-feedrecentchanges-param-hidepatrolled": "Dölj patrullerade ändringar.",
-       "apihelp-feedrecentchanges-param-hidemyself": "Dölj mina ändringar.",
+       "apihelp-feedrecentchanges-param-hidemyself": "Dölj ändringar av aktuell användare.",
        "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-description": "Returnerar ett flöde från bevakningslistan.",
+       "apihelp-feedwatchlist-param-feedformat": "Flödets format.",
        "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-feedwatchlist-example-default": "Visa flödet från bevakningslistan.",
+       "apihelp-feedwatchlist-example-all6hrs": "Visa alla ändringar på besökta sidor under de senaste sex timmarna.",
        "apihelp-filerevert-description": "Återställ en fil till en äldre version.",
+       "apihelp-filerevert-param-filename": "Målfilens namn, utan prefixet Fil:.",
        "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-filerevert-param-archivename": "Arkiv-namn för revisionen att gå tillbaka till.",
+       "apihelp-filerevert-example-revert": "Återställ <kbd>Wiki.png</kbd> till versionen från <kbd>2011-03-05T15:27:40Z</kbd>",
+       "apihelp-help-description": "Visa hjälp för de angivna modulerna.",
+       "apihelp-help-param-modules": "Vilka moduler som hjälpen ska visas för (värdena på parametrarna <var>action</var> och <var>format</var>, eller <kbd>main</kbd>). Undermoduler kan anges med ett plustecken (<kbd>+</kbd>).",
+       "apihelp-help-param-submodules": "Inkludera hjälp för undermoduler av den namngivna modulen.",
+       "apihelp-help-param-recursivesubmodules": "Inkludera hjälp för undermoduler rekursivt.",
+       "apihelp-help-param-helpformat": "Formatet för hjälp-utdata.",
+       "apihelp-help-param-wrap": "Omge utdatan i en standard API respons struktur.",
+       "apihelp-help-param-toc": "Inkludera en innehållsförteckning i HTML-utdata.",
        "apihelp-help-example-main": "Hjälp för huvudmodul",
        "apihelp-help-example-recursive": "All hjälp på en sida",
        "apihelp-help-example-help": "Hjälp för själva hjälpmodulen",
        "apihelp-imagerotate-description": "Rotera en eller flera bilder.",
        "apihelp-imagerotate-param-rotation": "Grader att rotera bild medurs.",
-       "apihelp-imagerotate-example-simple": "Rotera [[:File:Example.png]] med 90 grader",
-       "apihelp-imagerotate-example-generator": "Rotera alla bilder i [[:Category:Flip]] med 180 grader",
+       "apihelp-imagerotate-example-simple": "Rotera <kbd>File:Example.png</kbd> med <kbd>90</kbd> grader",
+       "apihelp-imagerotate-example-generator": "Rotera alla bilder i <kbd>Category:Flip</kbd> med <kbd>180</kbd> grader.",
+       "apihelp-import-description": "Importera en sida från en annan wiki, eller en XML fil. \n\nNotera att HTTP POST måste bli gjord som en fil uppladdning (d.v.s med multipart/form-data) när man skickar en fil för  <var>xml</var> parametern.",
        "apihelp-import-param-summary": "Importera sammanfattning.",
        "apihelp-import-param-xml": "Uppladdad XML-fil.",
        "apihelp-import-param-interwikisource": "För interwiki-importer: wiki som du vill importera från.",
        "apihelp-import-param-namespace": "För interwiki-importer: importera till denna namnrymd.",
        "apihelp-import-param-rootpage": "Importera som undersida till denna sida.",
        "apihelp-import-example-import": "Importera [[meta:Help:Parserfunktioner]] till namnrymd 100 med full historik.",
+       "apihelp-login-description": "Logga in och hämta autentiserings-cookies.\n\nOm inloggningen lyckas, finns de cookies som krävs med i HTTP-svarshuvuden. Om inloggningen misslyckas kan ytterligare försök per tidsenhet begränsas, som ett sätt att försöka minska risken för automatiserade lösenordsgissningar.",
        "apihelp-login-param-name": "Användarnamn.",
        "apihelp-login-param-password": "Lösenord.",
        "apihelp-login-param-domain": "Domän (valfritt).",
+       "apihelp-login-param-token": "Login nyckel erhållen i första begäran.",
+       "apihelp-login-example-gettoken": "Hämta en login nyckel.",
        "apihelp-login-example-login": "Logga in",
        "apihelp-logout-description": "Logga ut och rensa sessionsdata.",
        "apihelp-logout-example-logout": "Logga ut den aktuella användaren",
+       "apihelp-managetags-description": "Utför hanterings uppgifter relaterade till förändrings taggar.",
+       "apihelp-managetags-param-tag": "Tagg för att skapa, radera, aktivera eller inaktivera. Vid skapande av tagg kan taggen inte existera. Vid raderande av tagg måste taggen existera. För aktiverande av tagg måste taggen existera och inte användas i ett tillägg. För inaktivering av tagg måste taggen användas just nu och vara manuellt definierad.",
+       "apihelp-managetags-param-reason": "En icke-obligatorisk orsak för att skapa, radera, aktivera, eller inaktivera taggen.",
+       "apihelp-managetags-param-ignorewarnings": "Om du vill ignorera varningar som utfärdas under operationen.",
+       "apihelp-managetags-example-create": "Skapa en tagg vid namn <kbd>spam</kbd> med anledningen: <kbd>För användning i redigerings patrullering</kbd>",
+       "apihelp-managetags-example-delete": "Radera <kbd>vandalims</kbd> taggen med andledningen: <kbd>Felstavat</kbd>",
+       "apihelp-managetags-example-activate": "Aktivera en tagg med namn <kbd>spam</kbd> med anledningen: <kbd>För användning i redigerings patrullering</kbd>",
+       "apihelp-managetags-example-deactivate": "Inaktivera en tagg vid namn <kbd>spam</kbd> med anledningen: <kbd>Inte längre behövd</kbd>",
        "apihelp-move-description": "Flytta en sida.",
-       "apihelp-move-param-reason": "Orsak till flyttningen.",
-       "apihelp-move-param-movetalk": "Flytta diskussionssidan om den finns.",
+       "apihelp-move-param-from": "Titeln på sidan du vill flytta. Kan inte användas tillsammans med <var>$1fromid</var>.",
+       "apihelp-move-param-fromid": "Sid-ID för sidan att byta namn. Kan inte användas tillsammans med <var>$1from</var>.",
+       "apihelp-move-param-to": "Titel att byta namn på sidan till.",
+       "apihelp-move-param-reason": "Orsak till namnbytet.",
+       "apihelp-move-param-movetalk": "Byt namn på diskussionssidan, om den finns.",
+       "apihelp-move-param-movesubpages": "Byt namn på undersidor, om tillämpligt.",
        "apihelp-move-param-noredirect": "Skapa inte en omdirigering.",
-       "apihelp-move-param-watch": "Lägg till sidan och omdirigeringen till din bevakningslista.",
-       "apihelp-move-param-unwatch": "Ta bort sidan och omdirigeringen från din bevakningslista.",
+       "apihelp-move-param-watch": "Lägg till sidan och omdirigeringen till den aktuella användarens bevakningslista.",
+       "apihelp-move-param-unwatch": "Ta bort sidan och omdirigeringen från den aktuella användarens bevakningslista.",
+       "apihelp-move-param-watchlist": "Lägg till eller ta bort sidan ovillkorligen från den aktuella användarens bevakningslista, använd inställningar eller ändra inte bevakning.",
        "apihelp-move-param-ignorewarnings": "Ignorera alla varningar.",
+       "apihelp-move-example-move": "Flytta <kbd>Felaktig titel</kbd> till <kbd>Korrekt titel</kbd> utan att lämna en omdirigering.",
+       "apihelp-opensearch-description": "Sök wikin med protokollet OpenSearch.",
        "apihelp-opensearch-param-search": "Söksträng.",
        "apihelp-opensearch-param-limit": "Maximalt antal resultat att returnera.",
        "apihelp-opensearch-param-namespace": "Namnrymder att genomsöka.",
-       "apihelp-opensearch-param-suggest": "Gör ingenting om [https://www.mediawiki.org/wiki/Manual:$wgEnableOpenSearchSuggest $wgEnableOpenSearchSuggest] är falskt.",
+       "apihelp-opensearch-param-suggest": "Gör ingenting om <var>[[mw:Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> är falskt.",
        "apihelp-opensearch-param-format": "Formatet för utdata.",
-       "apihelp-opensearch-example-te": "Hitta sidor som börjar med \"Te\"",
+       "apihelp-opensearch-example-te": "Hitta sidor som börjar med <kbd>Te</kbd>.",
+       "apihelp-options-param-reset": "Återställer inställningarna till sidans standardvärden.",
        "apihelp-options-example-reset": "Återställ alla inställningar",
+       "apihelp-options-example-complex": "Återställ alla inställningar, ställ sedan in <kbd>skin</kbd> och <kbd>nickname</kbd>.",
+       "apihelp-paraminfo-description": "Få information om API moduler.",
        "apihelp-paraminfo-param-helpformat": "Format för hjälpsträngar.",
+       "apihelp-parse-param-summary": "Sammanfattning att tolka.",
+       "apihelp-parse-param-page": "Tolka innehållet av denna sida. Kan inte användas tillsammans med <var>$1text</var> och <var>$1title</var>.",
+       "apihelp-parse-param-pageid": "Tolka innehållet på denna sida. Åsidosätter <var>$1sidan</var>.",
+       "apihelp-parse-param-preview": "Tolka i preview-läget.",
+       "apihelp-parse-example-page": "Tolka en sida.",
+       "apihelp-parse-example-text": "Tolka wikitext.",
+       "apihelp-parse-example-texttitle": "Tolka wikitext, specificera sid-titeln.",
+       "apihelp-parse-example-summary": "Tolka en sammanfattning.",
+       "apihelp-patrol-description": "Patrullera en sida eller en version.",
+       "apihelp-patrol-param-revid": "Versions ID att patrullera.",
+       "apihelp-patrol-example-rcid": "Patrullera en nykommen ändring.",
        "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+allcategories-param-dir": "Riktning att sortera mot.",
+       "apihelp-query+allcategories-param-min": "Returnera endast kategorier med minst så här många medlemmar.",
+       "apihelp-query+allcategories-param-max": "Returnera endast kategorier med som mest så här många medlemmar.",
+       "apihelp-query+allcategories-param-limit": "Hur många kategorier att returnera.",
+       "apihelp-query+alldeletedrevisions-description": "Lista alla raderade revisioner av en användare or inom en namnrymd.",
+       "apihelp-query+alldeletedrevisions-paraminfo-useronly": "Kan endast användas med <var>$3user</var>.",
+       "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "Kan inte användas med <var>$3user</var>.",
+       "apihelp-query+alldeletedrevisions-param-from": "Börja lista vid denna titel.",
+       "apihelp-query+alldeletedrevisions-param-to": "Sluta lista vid denna titel.",
+       "apihelp-query+alldeletedrevisions-param-prefix": "Sök alla sid-titlar som börjar med detta värde.",
+       "apihelp-query+alldeletedrevisions-param-tag": "Lista bara revideringar taggade med denna tagg.",
+       "apihelp-query+alldeletedrevisions-param-user": "Lista bara revideringar av denna användaren.",
+       "apihelp-query+alldeletedrevisions-param-excludeuser": "Lista inte revideringar av denna användaren.",
+       "apihelp-query+alldeletedrevisions-param-namespace": "Lista bara sidor i denna namnrymd.",
+       "apihelp-query+alldeletedrevisions-example-ns-main": "Lista dem första 50 revideringarna i huvud-namnrymden",
+       "apihelp-query+allfileusages-description": "Lista all fil användningsområden, inklusive icke-existerande.",
+       "apihelp-query+allfileusages-param-prefix": "Sök för all fil-titlar som börjar med detta värde.",
+       "apihelp-query+allfileusages-param-limit": "Hur många saker att returnera totalt.",
+       "apihelp-query+allfileusages-param-dir": "Riktningen att lista mot.",
        "apihelp-query+allfileusages-example-unique": "Lista unika filtitlar",
+       "apihelp-query+allfileusages-example-unique-generator": "Hämtar alla fil titlar, markerar dem saknade.",
+       "apihelp-query+allfileusages-example-generator": "Hämtar sidor som innehåller filerna.",
        "apihelp-query+allimages-param-sort": "Egenskap att sortera efter.",
+       "apihelp-query+allimages-param-dir": "Riktningen att lista mot.",
+       "apihelp-query+allimages-param-prefix": "Sök för alla bild titlar som börjar med detta värde. Kan endast användas med $1sort=name.",
+       "apihelp-query+allimages-param-minsize": "Begränsning på bilder med åtminstone så här många bytes.",
+       "apihelp-query+allimages-param-maxsize": "Begränsning på bilder med som mest så här många bytes.",
+       "apihelp-query+allimages-param-sha1": "SHA1 hash av bild. Åsidosätter $1sha1base36.",
+       "apihelp-query+allimages-param-sha1base36": "SHA1 hash av bild i bas 36 (används i MediaWiki).",
+       "apihelp-query+allimages-param-user": "Returnera enbart filer uppladdade av denna användare. Kan enbart användas med $1sort=timestamp. Kan inte användas tillsammans med $1filterbots.",
+       "apihelp-query+allimages-param-filterbots": "Hur man filtrerar filer uppladdade av bots. Kan enbart användas med $1sort=timestamp. Kan inte användas tillsammans med $1user.",
+       "apihelp-query+allimages-param-mime": "Vilka MIME-typer du vill söka efter, t.ex. <kbd>image/jpeg</kbd>.",
+       "apihelp-query+allimages-param-limit": "Hur många bilder att returnera totalt.",
+       "apihelp-query+allimages-example-B": "Visa en lista över filer som börjar på bokstaven <kbd>B</kbd>.",
+       "apihelp-query+allimages-example-recent": "Visa en lista över nyligen överförda filer, ungefär som [[Special:Nya_filer]].",
+       "apihelp-query+allimages-example-mimetypes": "Visa en lista över filer med MIME-typen <kbd>image/png</kbd> eller <kbd>image/gif</kbd>",
+       "apihelp-query+allimages-example-generator": "Visa info om 4 filer som börjar med bokstaven <kbd>T</kbd>.",
+       "apihelp-query+alllinks-param-prefix": "Sök alla länkade titlar som börjar med detta värde.",
+       "apihelp-query+alllinks-param-limit": "Hur många saker att returnera totalt.",
+       "apihelp-query+alllinks-param-dir": "Riktningen att lista mot.",
+       "apihelp-query+alllinks-example-B": "Lista länkade titlar, inkluderade saknade, med dem sid-IDs dem är från, med början vid <kbd>B</kbd>.",
+       "apihelp-query+alllinks-example-unique": "Lista unika länkade titlar.",
+       "apihelp-query+alllinks-example-unique-generator": "Hämtar alla länkade titlar, markera de saknade.",
+       "apihelp-query+alllinks-example-generator": "Hämtar sidor som innehåller länkarna.",
+       "apihelp-query+allmessages-description": "Returnera meddelande från denna sida.",
+       "apihelp-query+allmessages-param-messages": "Vilka meddelande att ge som utdata. <kbd>*</kbd> (standard) betyder alla meddelande .",
+       "apihelp-query+allmessages-param-prop": "Vilka egenskaper att hämta.",
+       "apihelp-query+allmessages-param-args": "Argument som ska substitueras i meddelandet.",
+       "apihelp-query+allmessages-param-filter": "Returnera enbart meddelande med namn som innehåller denna sträng.",
+       "apihelp-query+allmessages-param-customised": "Returnera endast meddelanden i detta anpassningstillstånd.",
        "apihelp-query+allmessages-param-lang": "Returnera meddelanden på detta språk.",
-       "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+allmessages-param-from": "Returnera meddelanden med början på detta meddelande.",
+       "apihelp-query+allmessages-param-to": "Returnera meddelanden fram till och med detta meddelande.",
+       "apihelp-query+allmessages-param-title": "Sidnamn som ska användas som kontext vid parsning av meddelande (för alternativet $1enableparser).",
+       "apihelp-query+allmessages-param-prefix": "Returnera meddelanden med detta prefix.",
+       "apihelp-query+allmessages-example-ipb": "Visa meddelanden som börjar med <kbd>ipb-</kbd>.",
+       "apihelp-query+allmessages-example-de": "Visa meddelanden <kbd>august</kbd> och <kbd>mainpage</kbd> på tyska.",
+       "apihelp-query+allpages-param-prefix": "Sök efter alla sidtitlar som börjar med detta värde.",
        "apihelp-query+allpages-param-filterredir": "Vilka sidor att lista.",
+       "apihelp-query+allpages-param-minsize": "Begränsa till sidor med detta antal byte eller fler.",
+       "apihelp-query+allpages-param-maxsize": "Begränsa till sidor med högst så här många byte.",
+       "apihelp-query+allpages-param-prtype": "Begränsa till endast skyddade sidor.",
+       "apihelp-query+allpages-param-limit": "Hur många sidor att returnera totalt.",
+       "apihelp-query+allpages-param-dir": "Riktningen att lista mot.",
+       "apihelp-query+allpages-example-B": "Visa en lista över sidor som börjar på bokstaven <kbd>B</kbd>.",
+       "apihelp-query+allredirects-param-dir": "Riktningen att lista mot.",
+       "apihelp-query+allredirects-example-unique-generator": "Hämtar alla målsidor, markerar de som saknas.",
+       "apihelp-query+alltransclusions-param-dir": "Riktningen att lista mot.",
+       "apihelp-query+allusers-param-prefix": "Sök för alla användare som börjar med detta värde.",
        "apihelp-query+allusers-param-dir": "Riktning att sortera i.",
-       "apihelp-query+allusers-example-Y": "Lista användare som börjar på Y",
+       "apihelp-query+allusers-param-group": "Inkludera bara användare i de givna grupperna.",
+       "apihelp-query+allusers-param-excludegroup": "Exkludera användare i de givna grupperna.",
+       "apihelp-query+allusers-param-rights": "Inkludera bara användare med de givna rättigheterna. Inkluderar inte rättigheter givna med implicita eller automatiskt promotade grupper som *, användare, eller auto-konfirmerad.",
+       "apihelp-query+allusers-param-limit": "Hur många användarnamn att returnera totalt.",
+       "apihelp-query+allusers-param-witheditsonly": "Lista bara användare som har gjort redigeringar.",
+       "apihelp-query+allusers-param-activeusers": "Lista bara användare aktiva i dem sista $1{{PLURAL:$1|dagen|dagarna}}.",
+       "apihelp-query+allusers-example-Y": "Lista användare som börjar på <kbd>Y</kbd>.",
+       "apihelp-query+backlinks-description": "Hitta alla sidor som länkar till den givna sidan.",
+       "apihelp-query+backlinks-param-dir": "Riktningen att lista mot.",
+       "apihelp-query+categories-param-dir": "Riktningen att lista mot.",
+       "apihelp-query+duplicatefiles-param-dir": "Riktningen att lista mot.",
+       "apihelp-query+duplicatefiles-example-generated": "Leta efter kopior av alla filer.",
+       "apihelp-query+embeddedin-param-dir": "Riktningen att lista mot.",
+       "apihelp-query+embeddedin-param-limit": "Hur många sidor att returnera totalt.",
+       "apihelp-query+filearchive-param-dir": "Riktningen att lista mot.",
+       "apihelp-query+filearchive-example-simple": "Visa en lista över alla borttagna filer.",
+       "apihelp-query+images-param-dir": "Riktningen att lista mot.",
+       "apihelp-query+imageusage-param-dir": "Riktningen att lista mot.",
+       "apihelp-query+imageusage-example-simple": "Visa sidor med hjälp av [[:File:Albert Einstein Head.jpg]].",
+       "apihelp-query+imageusage-example-generator": "Hämta information om sidor med hjälp av [[:File:Albert Einstein Head.jpg]].",
+       "apihelp-query+iwbacklinks-param-limit": "Hur många sidor att returnera totalt.",
+       "apihelp-query+iwbacklinks-param-dir": "Riktningen att lista mot.",
+       "apihelp-query+iwlinks-param-dir": "Riktningen att lista mot.",
+       "apihelp-query+langbacklinks-param-limit": "Hur många sidor att returnera totalt.",
+       "apihelp-query+langbacklinks-param-dir": "Riktningen att lista mot.",
+       "apihelp-query+langbacklinks-example-simple": "Hämta sidor som länkar till [[:fr:Test]].",
+       "apihelp-query+langlinks-param-dir": "Riktningen att lista mot.",
+       "apihelp-query+links-param-dir": "Riktningen att lista mot.",
+       "apihelp-query+protectedtitles-param-limit": "Hur många sidor att returnera totalt.",
+       "apihelp-query+protectedtitles-example-simple": "Lista skyddade titlar.",
+       "apihelp-query+recentchanges-example-simple": "Lista de senaste ändringarna.",
        "apihelp-query+revisions-example-first5-not-localhost": "Hämta första 5 revideringarna av \"huvudsidan\" och som inte gjorts av anonym användare \"127.0.0.1\"",
+       "apihelp-query+siteinfo-example-simple": "Hämta information om webbplatsen.",
        "apihelp-query+stashimageinfo-description": "Returnerar filinformation för temporära filer.",
        "apihelp-query+stashimageinfo-param-filekey": "Nyckel som identifierar en tidigare uppladdning som lagrats temporärt.",
        "apihelp-query+stashimageinfo-example-simple": "Returnerar information för en temporär fil",
+       "apihelp-query+tags-example-simple": "Lista tillgängliga taggar.",
+       "apihelp-query+userinfo-example-simple": "Få information om den aktuella användaren.",
+       "apihelp-query+userinfo-example-data": "Få ytterligare information om den aktuella användaren.",
+       "apihelp-query+watchlist-description": "Hämta de senaste ändringarna på sidor i den nuvarande användarens bevakningslista.",
+       "apihelp-query+watchlist-example-allrev": "Hämta information om de senaste ändringarna på sidor på den aktuella användarens bevakningslista.",
+       "apihelp-query+watchlist-example-generator": "Hämta sidinformation för nyligen uppdaterade sidor på nuvarande användares bevakningslista.",
+       "apihelp-query+watchlist-example-generator-rev": "Hämta ändringsinformation för nyligen uppdaterade sidor på nuvarande användares bevakningslista.",
+       "apihelp-query+watchlistraw-description": "Hämta alla sidor på den aktuella användarens bevakningslista.",
+       "apihelp-query+watchlistraw-example-simple": "Lista sidor på den aktuella användarens bevakningslista.",
+       "apihelp-setnotificationtimestamp-example-all": "Återställ meddelandestatus för hela bevakningslistan.",
        "apihelp-upload-param-filekey": "Nyckel som identifierar en tidigare uppladdning som lagrats temporärt.",
        "apihelp-upload-param-stash": "Om angiven, kommer servern att temporärt lagra filen istället för att lägga till den i centralförvaret.",
+       "apihelp-upload-example-url": "Ladda upp från URL.",
+       "apihelp-upload-example-filekey": "Slutför en uppladdning som misslyckades på grund av varningar.",
        "api-help-main-header": "Huvudmodul",
        "api-help-flag-deprecated": "Denna modul är föråldrad.",
        "api-help-flag-internal": "<strong>Denna modul är intern eller instabil.</strong> Dess funktion kan ändras utan föregående meddelande.",
diff --git a/includes/api/i18n/tl.json b/includes/api/i18n/tl.json
new file mode 100644 (file)
index 0000000..ddf52d4
--- /dev/null
@@ -0,0 +1,35 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Leeheonjin"
+               ]
+       },
+       "apihelp-feedrecentchanges-example-simple": "Ipakit ang mga kamakailangang pagbabago.",
+       "apihelp-feedrecentchanges-example-30days": "Ipakita ang mga huling pagbabago sa loob para sa 30 araw.",
+       "apihelp-help-example-main": "Tulong para sa pangunahing modulo.",
+       "apihelp-help-example-recursive": "Lahat ng tulong sa iisang pahina.",
+       "apihelp-login-example-login": "Lumagda (Mag-log in).",
+       "apihelp-move-example-move": "I-urong ang <kbd>Badtitle</kbd> sa <kbd>Goodtitle</kbd> nang hindi nag-iiwan ng redirekta.",
+       "apihelp-options-example-reset": "Ibalik sa dati ang lahat ng mga kanaisan.",
+       "apihelp-patrol-example-rcid": "Bantayan ang kasalukuyang pagbabago.",
+       "apihelp-query+allimages-example-B": "Ipakita ang talaan ng mga talakasang nagsisimula sa titik <kbd>B</kbd>.",
+       "apihelp-query+alllinks-example-generator": "Kinukuha ang mga pahinang naglalaman ng mga kawing.",
+       "apihelp-query+allpages-example-B": "Ipakita ang talaan ng mga pahinang nagsisimula sa titik <kbd>B</kbd>.",
+       "apihelp-query+alltransclusions-example-generator": "Kinukuha ang mga pahinang naglalaman ng mga transklusyon.",
+       "apihelp-query+backlinks-example-simple": "Ipakita ang mga kawing sa <kbd>Unang pahina<kbd>.",
+       "apihelp-query+categoryinfo-example-simple": "Kumuha ng impormasyon tungkol sa <kbd>Kategorya:Foo</kbd> at <kbd>Kategorya:Bar</kbd>.",
+       "apihelp-query+duplicatefiles-example-simple": "Maghanap para sa mga duplika ng [[:File:Albert Einstein Head.jpg]].",
+       "apihelp-query+duplicatefiles-example-generated": "Hanapin ang mga duplika ng lahat ng talakasan.",
+       "apihelp-query+images-example-simple": "Kumuha ng talaan ng mga talakasang ginagamit sa [[Unang Pahina]].",
+       "apihelp-query+imageusage-example-simple": "Ipakita ang mga pahina gamit ang [[:File:Albert Einstein Head.jpg]].",
+       "apihelp-query+iwbacklinks-example-simple": "Kumuha ng mga pahinang nakarugtong sa [[wikibooks:Test]].",
+       "apihelp-query+linkshere-example-generator": "Kumuha ng kabatiran tungkol sa mga pahina na kumakawing sa [[Unang Pahina]].",
+       "apihelp-query+recentchanges-example-simple": "Talaan ng mga kamakailang pagbabago.",
+       "apihelp-query+search-example-text": "Hanapin ang mga teksto para sa <kbd>kahulugan</kbd>.",
+       "apihelp-query+siteinfo-example-simple": "Kunin ang impormasyon ng sityo.",
+       "apihelp-query+templates-example-simple": "Kumuha ng mga suleras o padron na ginamit sa pahinang <kbd>Unang Pahina</kbd>.",
+       "apihelp-query+watchlist-example-simple": "Itala ang mga punong pagbabago ng mga kasalukuyang binagong pahina sa kasalukuyang listahan ng binabantayan ng tagagamit.",
+       "apihelp-revisiondelete-example-revision": "Itago ang nilalaman para sa pagbabago ng <kbd>12345</kbd> sa pahinang <kbd>Unang Pahina</kbd>.",
+       "apihelp-upload-example-url": "Mag-karga mula sa URL.",
+       "apihelp-watch-example-watch": "Bantayan ang pahinang <kbd>Unang Pahina</kbd>."
+}
index 6fd5514..4bd5c26 100644 (file)
@@ -8,7 +8,7 @@
        "apihelp-main-param-action": "Яку дію виконати.",
        "apihelp-main-param-format": "Формат виводу.",
        "apihelp-createaccount-param-name": "Ім'я користувача.",
-       "apihelp-createaccount-param-password": "Пароль (ігнорується, якщо встановлено $1mailpassword).",
+       "apihelp-createaccount-param-password": "Пароль (ігнорується, якщо встановлено <var>$1mailpassword</var>).",
        "apihelp-createaccount-param-domain": "Домен для зовнішньої аутентифікації (опціонально).",
        "apihelp-edit-example-edit": "Редагувати сторінку",
        "apihelp-edit-example-prepend": "Додати зміст на початок сторінки",
index 30211af..ff00e7c 100644 (file)
@@ -2,22 +2,40 @@
        "@metadata": {
                "authors": [
                        "Minh Nguyen",
-                       "Max20091"
+                       "Max20091",
+                       "Dinhxuanduyet"
                ]
        },
        "apihelp-main-param-action": "Tác vụ để thực hiện.",
        "apihelp-main-param-format": "Định dạng của dữ liệu được cho ra.",
        "apihelp-block-description": "Cấm người dùng.",
+       "apihelp-block-param-user": "Tên truy nhập, địa chỉ IP hoặc dãi IP mà bạn muốn chặn.",
        "apihelp-block-param-reason": "Lý do cấm.",
        "apihelp-block-param-nocreate": "Cấm tạo tài khoản.",
+       "apihelp-clearhasmsg-description": "Xóa cờ <code>hasmsg</code> cho người dùng hiện tại.",
+       "apihelp-clearhasmsg-example-1": "Xóa cờ <code>hasmsg</code> cho người dùng hiện tại",
+       "apihelp-compare-param-fromtitle": "So sánh tiêu đề đầu tiên.",
+       "apihelp-compare-param-fromid": "So sánh ID trang đầu tiên.",
+       "apihelp-compare-param-fromrev": "So sánh sửa đổi đầu tiên.",
+       "apihelp-compare-param-totitle": "So sánh tiêu đề thứ hai.",
+       "apihelp-compare-param-toid": "So sánh ID tran thứ hai.",
+       "apihelp-compare-param-torev": "So sánh sửa đổi thứ hai.",
+       "apihelp-compare-example-1": "Tạo một so sánh giữa phiên bản 1 và 2.",
        "apihelp-createaccount-description": "Mở tài khoản mới.",
        "apihelp-createaccount-param-name": "Tên người dùng.",
-       "apihelp-createaccount-param-password": "Mật khẩu (được bỏ qua nếu $1mailpassword được đặt).",
+       "apihelp-createaccount-param-password": "Mật khẩu (được bỏ qua nếu <var>$1mailpassword</var> được đặt).",
        "apihelp-createaccount-param-domain": "Tên miền để xác thực bên ngoài (tùy chọn).",
        "apihelp-createaccount-param-token": "Dấu hiệu mở tài khoản được lấy trong yêu cầu đầu tiên.",
        "apihelp-createaccount-param-email": "Địa chỉ thư điện tử của thành viên (tùy chọn).",
        "apihelp-createaccount-param-realname": "Tên thật của thành viên (tùy chọn).",
+       "apihelp-createaccount-param-mailpassword": "Nếu đặt bất kỳ giá trị nào, một mật khẩu ngẫu nhiên sẽ được email lại cho người dùng.",
+       "apihelp-createaccount-param-reason": "Lý do tùy chọn cho việc tạo tài khoản để đăng nhập.",
+       "apihelp-createaccount-param-language": "Mã ngôn ngữ để thiết lập mặc định cho người dùng (tùy chọn, mặc định là ngôn ngữ nội dung).",
+       "apihelp-createaccount-example-pass": "Tạo người dùng <kbd>người kiểm tra</kbd> với mật khẩu <kbd>test123</kbd>.",
+       "apihelp-createaccount-example-mail": "Tạo người dùng <kbd>người dùng kiểm tra email> và email một mật khẩu được tạo ra ngẫu nhiên.",
        "apihelp-delete-description": "Xóa trang.",
+       "apihelp-delete-param-title": "Xóa tiêu đề của trang. Không thể sử dụng cùng với <var>$1pageid</var>.",
+       "apihelp-delete-param-pageid": "Xóa ID của trang. Không thể sử dụng cùng với <var>$1title</var>.",
        "apihelp-delete-param-watch": "Thêm trang vào danh sách theo dõi của bạn.",
        "apihelp-delete-param-unwatch": "Bỏ trang này khỏi danh sách theo dõi của bạn.",
        "apihelp-delete-example-simple": "Xóa Trang Chính",
@@ -36,7 +54,7 @@
        "apihelp-edit-param-watch": "Thêm trang vào danh sách theo dõi của bạn.",
        "apihelp-edit-param-unwatch": "Bỏ trang này khỏi danh sách theo dõi của bạn.",
        "apihelp-edit-example-edit": "Sửa đổi trang",
-       "apihelp-edit-example-prepend": "Đưa _&#95;NOTOC_&#95; vào đầu trang",
+       "apihelp-edit-example-prepend": "Đưa <kbd>_&#95;NOTOC_&#95;</kbd> vào đầu trang",
        "apihelp-edit-example-undo": "Lùi sửa các thay đổi 13579–13585 và tự động tóm lược",
        "apihelp-emailuser-description": "Gửi thư cho người dùng.",
        "apihelp-emailuser-param-target": "Người dùng để gửi thư điện tử cho.",
        "apihelp-expandtemplates-description": "Bung tất cả bản mẫu trong văn bản wiki.",
        "apihelp-expandtemplates-param-title": "Tên trang.",
        "apihelp-expandtemplates-param-text": "Văn bản wiki để bung.",
+       "apihelp-filerevert-param-comment": "Tải lên bình luận.",
+       "apihelp-filerevert-param-archivename": "Tên lưu trữ của bản sửa đổi để trở lại .",
+       "apihelp-filerevert-example-revert": "Hoàn nguyên <kbd>Wiki.png</kbd> veef phiên bản 2011-03-05T15 : 27:40Z",
+       "apihelp-help-description": "Hiển thị trợ giúp cho các mô-đun xác định.",
        "apihelp-help-param-helpformat": "Định dạng của văn bản trợ giúp được cho ra.",
+       "apihelp-help-example-recursive": "Tất cả trợ giúp trong một trang",
+       "apihelp-help-example-help": "Trợ giúp cho chính bản thân module trợ giúp",
+       "apihelp-help-example-query": "Trợ giúp cho hai module con truy vấn",
+       "apihelp-imagerotate-description": "Xoay một hoặc nhiều hình ảnh.",
+       "apihelp-imagerotate-param-rotation": "Độ xoay hình ảnh theo chiều kim đồng hồ.",
        "apihelp-imagerotate-example-simple": "Xoay [[:Tập tin:Ví dụ.jpg]] 90 độ",
        "apihelp-imagerotate-example-generator": "Xoay tất cả các hình ảnh trong [[:Thể loại:Búng]] 180 độ",
        "apihelp-login-param-name": "Tên người dùng.",
@@ -70,6 +97,8 @@
        "apihelp-options-example-reset": "Mặc định lại các tùy chọn",
        "apihelp-paraminfo-param-helpformat": "Định dạng chuỗi trợ giúp.",
        "apihelp-parse-param-summary": "Lời tóm lược để phân tích.",
+       "apihelp-parse-param-section": "Chỉ truy xuất nội dung của số bộ phận này.",
+       "apihelp-parse-param-disablepp": "Vô hiệu hóa phân tích cú pháp đầu ra của Báo cáo PP .",
        "apihelp-parse-example-page": "Phân tích trang.",
        "apihelp-parse-example-text": "Phân tích văn bản wiki.",
        "apihelp-parse-example-texttitle": "Phân tích văn bản wiki theo tên trang.",
        "apihelp-query-param-prop": "Các thuộc tính để lấy khi truy vấn các trang.",
        "apihelp-query-param-list": "Các danh sách để lấy.",
        "apihelp-query-param-meta": "Siêu dữ liệu để lấy.",
+       "apihelp-query+allcategories-param-dir": "Hướng xếp loại.",
        "apihelp-format-example-generic": "Định dạng kết quả truy vấn dưới dạng $1",
        "apihelp-dbg-description": "Cho ra dữ liệu dưới dạng var_export() của PHP.",
        "apihelp-dbgfm-description": "Cho ra dữ liệu dưới dạng var_export() của PHP (định dạng bằng HTML).",
index ecfea8e..4b2f476 100644 (file)
@@ -7,38 +7,39 @@
                        "Papapasan",
                        "LNDDYL",
                        "Shizhao",
-                       "Yfdyh000"
+                       "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://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-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|文档]]\n* [[mw:API:FAQ|常见问题]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api 邮件列表]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API公告]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R 程序错误与功能请求]\n</div>\n<strong>状态信息:</strong>本页所展示的所有特性都应正常工作,但是API仍在开发当中,将会随时变化。请订阅[https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ mediawiki-api-announce 邮件列表]以便获得更新通知。\n\n<strong>错误请求:</strong>当API收到错误请求时,HTTP header将会返回一个包含\"MediaWiki-API-Error\"的值,随后header的值与error code将会送回并设置为相同的值。详细信息请参阅[[mw:API:Errors_and_warnings|API: 错误与警告]]。",
        "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-smaxage": "设置<code>s-maxage</code>页顶至这些秒。错误不会缓存。",
+       "apihelp-main-param-maxage": "设置<code>max-age</code>页顶至这些秒。错误不会缓存。",
+       "apihelp-main-param-assert": "如果设置为<kbd>user</kbd>就验证用户是否登录,或如果设置为<kbd>bot</kbd>就验证是否有机器人用户权限。",
        "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-main-param-uselang": "用于消息翻译的语言。代码列表可从[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]通过siprop=languages获取,或指定“user”以使用当前用户的语言设置,或指定“content”以使用此wiki的内容语言。",
+       "apihelp-main-param-origin": "当通过跨域名AJAX请求(CORS)访问API时,设置此作为起始域名。这必须包括在任何pre-flight请求中,并因此必须是请求的URI的一部分(而不是POST正文)。这必须匹配<code>Origin</code>中的一个起点:从头到底,因此它已经设置为像<kbd>https://zh.wikipedia.org</kbd>或<kbd>https://meta.wikimedia.org</kbd>的东西。如果此参数不匹配<code>Origin</code>页顶,就返回403错误响应。如果此参数匹配<code>Origin</code>页顶并且起点被白名单,将设置一个<code>Access-Control-Allow-Origin</code>开头。",
+       "apihelp-main-param-uselang": "用于消息翻译的语言。代码列表可从<kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd>通过<kbd>siprop=languages</kbd>获取,或指定<kbd>user</kbd>以使用当前用户的语言设置,或指定<kbd>content</kbd>以使用此wiki的内容语言。",
        "apihelp-block-description": "封禁一位用户。",
        "apihelp-block-param-user": "您要封禁的用户、IP地址或IP地址段。",
-       "apihelp-block-param-expiry": "到期时间。可以是相对时间(例如“5个月”或“2周”)或绝对时间(例如“2014-09-18T12:34:56Z”)。如果设置为“infinite”、“indefinite”或“never”,封禁将无限期。",
+       "apihelp-block-param-expiry": "到期时间。可以是相对时间(例如<kbd>5 months</kbd>或<kbd>2 weeks</kbd>)或绝对时间(例如<kbd>2014-09-18T12:34:56Z</kbd>)。如果设置为<kbd>infinite</kbd>、<kbd>indefinite</kbd>或<kbd>never</kbd>,封禁将无限期。",
        "apihelp-block-param-reason": "封禁的原因",
-       "apihelp-block-param-anononly": "只封禁匿名用户(也就是说禁止此IP的匿名编辑)。",
+       "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-noemail": "阻止用户通过wiki发送电子邮件。(需要<code>blockemail</code>权限)。",
+       "apihelp-block-param-hidename": "从封禁日志中隐藏用户名。(需要<code>hideuser</code>权限)。",
+       "apihelp-block-param-allowusertalk": "允许用户编辑自己的讨论页(取决于<var>[[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>)。",
        "apihelp-block-param-reblock": "如果该用户已被封禁,则覆盖已有的封禁。",
-       "apihelp-block-param-watchuser": "监视用户或该 IP 的用户页和讨论页。",
-       "apihelp-block-example-ip-simple": "封禁IP地址192.0.2.5三天,原因“首次处理”",
-       "apihelp-block-example-user-complex": "æ\97 é\99\90æ\9c\9få°\81ç¦\81ç ´å\9d\8fç\94¨æ\88·ï¼\8cå\8e\9få\9b â\80\9c纯破å\9d\8fç\94¨æ\88·â\80\9dï¼\8c并é\98»æ­¢æ\96°è´¦æ\88·å\88\9b建å\92\8cç\94µå­\90é\82®ä»¶",
-       "apihelp-clearhasmsg-description": "清除当前用户的 hasmsg 标志。",
-       "apihelp-clearhasmsg-example-1": "清除当前用户的 hasmsg 标志",
-       "apihelp-compare-description": "è\8e·å\8f\962个页é\9d¢ä¹\8bé\97´ç\9a\84å·®å\88«ã\80\82\n\næ\82¨å¿\85须为\"from\"å\92\8c\"to\"ä¼ é\80\92ç\89¹å®\9aç\9a\84修订ç\89\88æ\9c¬å\8f·ã\80\81 é¡µé\9d¢æ \87é¢\98æ\88\96页é\9d¢ID。",
+       "apihelp-block-param-watchuser": "监视用户或该 IP 的用户页和讨论页。",
+       "apihelp-block-example-ip-simple": "封禁IP地址<kbd>192.0.2.5</kbd>三天,原因<kbd>First strike</kbd>。",
+       "apihelp-block-example-user-complex": "æ\97 é\99\90æ\9c\9få°\81ç¦\81ç\94¨æ\88·<kbd>Vandal</kbd>ï¼\8cå\8e\9få\9b <kbd>Vandalism</kbd>ï¼\8c并é\98»æ­¢æ\96°è´¦æ\88·å\88\9b建å\92\8cç\94µå­\90é\82®ä»¶å\8f\91é\80\81ã\80\82",
+       "apihelp-clearhasmsg-description": "清除当前用户的<code>hasmsg</code>标记。",
+       "apihelp-clearhasmsg-example-1": "清除当前用户的<code>hasmsg</code>标记。",
+       "apihelp-compare-description": "è\8e·å¾\972个页é\9d¢ä¹\8bé\97´ç\9a\84å·®å\88«ã\80\82\n\nç\94¨äº\8eâ\80\9cfromâ\80\9då\92\8câ\80\9ctoâ\80\9dç\9a\84修订ç\89\88æ\9c¬å\8f·ã\80\81页é\9d¢æ \87é¢\98æ\88\96页é\9d¢ ID å¿\85é¡»è\8e·å¾\97é\80\9aè¿\87。",
        "apihelp-compare-param-fromtitle": "要比较的第一个标题。",
        "apihelp-compare-param-fromid": "要比较的第一个页面 ID。",
        "apihelp-compare-param-fromrev": "要比较的第一个修订版本。",
@@ -48,7 +49,7 @@
        "apihelp-compare-example-1": "在版本1和2中创建差异",
        "apihelp-createaccount-description": "创建一个新用户账户。",
        "apihelp-createaccount-param-name": "用户名",
-       "apihelp-createaccount-param-password": "密码(如果设置$1mailpassword则忽略)。",
+       "apihelp-createaccount-param-password": "密码(如果设置<var>$1mailpassword</var>则忽略)。",
        "apihelp-createaccount-param-domain": "外部身份验证域 (可选)。",
        "apihelp-createaccount-param-token": "在第一个请求中获得的帐户创建标记。",
        "apihelp-createaccount-param-email": "用户的电子邮件地址(可选)。",
        "apihelp-createaccount-param-mailpassword": "如果设置为任何值,将向用户发送一个随机密码。",
        "apihelp-createaccount-param-reason": "将要放在日志中的,关于创建帐户的可选原因。",
        "apihelp-createaccount-param-language": "要为用户设置为默认值的语言代码(可选,默认为内容语言)。",
-       "apihelp-createaccount-example-pass": "创建用户“testuser”和密码“test123”",
-       "apihelp-createaccount-example-mail": "创建用户“testmailuser”并电邮发送一个随机生成的密码",
+       "apihelp-createaccount-example-pass": "创建用户<kbd>testuser</kbd>和密码<kbd>test123</kbd>。",
+       "apihelp-createaccount-example-mail": "创建用户<kbd>testmailuser</kbd>并电邮发送一个随机生成的密码。",
        "apihelp-delete-description": "删除一个页面。",
-       "apihelp-delete-param-title": "你所希望删除的页面的标题。不能与$1pageid一起使用。",
-       "apihelp-delete-param-pageid": "你所希望删除的页面的页面ID。不能与$1title一起使用。",
+       "apihelp-delete-param-title": "你所希望删除的页面的标题。不能与<var>$1pageid</var>一起使用。",
+       "apihelp-delete-param-pageid": "要删除的页面的页面 ID。不能与<var>$1title</var>一起使用。",
        "apihelp-delete-param-reason": "删除原因。如果未设置,将使用一个自动生成的原因。",
-       "apihelp-delete-param-watch": "将该页面加入的监视列表。",
+       "apihelp-delete-param-watch": "将该页面加入当前用户的监视列表。",
        "apihelp-delete-param-watchlist": "无条件地将页面加入至您的监视列表或将其移除,使用设置或不更改监视。",
-       "apihelp-delete-param-unwatch": "将该页面从的监视列表删除。",
+       "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-delete-example-simple": "删除<kbd>Main Page</kbd>。",
+       "apihelp-delete-example-reason": "删除<kbd>Main Page</kbd>,原因<kbd>Preparing for move</kbd>。",
        "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-title": "您希望编辑的页面标题。不能与<var>$1pageid</var>一起使用。",
+       "apihelp-edit-param-pageid": "要编辑的页面的页面 ID。不能与<var>$1title</var>一起使用。",
+       "apihelp-edit-param-section": "段落数。<kbd>0</kbd>用于首段,<kbd>new</kbd>用于新的段落。",
        "apihelp-edit-param-sectiontitle": "新小节的标题。",
        "apihelp-edit-param-text": "页面内容。",
        "apihelp-edit-param-summary": "编辑摘要。当$1section=new且未设置$1sectiontitle时,还包括小节标题。",
        "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-recreate": "覆盖有关该页面在此期间已被删除的任何错误。",
        "apihelp-edit-param-createonly": "不要编辑页面,如果已经存在。",
        "apihelp-edit-param-nocreate": "如果该页面不存在,则抛出一个错误。",
-       "apihelp-edit-param-watch": "将页面加入的监视列表。",
-       "apihelp-edit-param-unwatch": "将页面从您的监视列表移除。",
+       "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-contentmodel": "新内容的内容模型。",
        "apihelp-edit-param-token": "令牌应总是发送为最后参数,或至少在$1text参数之后。",
        "apihelp-edit-example-edit": "编辑一个页面",
-       "apihelp-edit-example-prepend": "页面中预置_&#95;NOTOC_&#95;",
+       "apihelp-edit-example-prepend": "页面中预置<kbd>_&#95;NOTOC_&#95;</kbd>",
        "apihelp-edit-example-undo": "通过13585撤销修订版本13579并自动填写编辑摘要",
        "apihelp-emailuser-description": "电子邮件联系一位用户。",
        "apihelp-emailuser-param-target": "电子邮件的目标用户。",
        "apihelp-emailuser-param-subject": "主题页眉。",
        "apihelp-emailuser-param-text": "邮件正文。",
        "apihelp-emailuser-param-ccme": "给我发送一份该邮件的副本。",
-       "apihelp-emailuser-example-email": "向用户“WikiSysop”发送邮件,带文字“Content”",
+       "apihelp-emailuser-example-email": "向用户<kbd>WikiSysop</kbd>发送邮件,带文字<kbd>Content</kbd>。",
        "apihelp-expandtemplates-description": "展开维基文本中的所有模板。",
        "apihelp-expandtemplates-param-title": "页面标题。",
        "apihelp-expandtemplates-param-text": "要转换的wiki文本。",
        "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-expandtemplates-example-simple": "展开wiki文本<kbd><nowiki>{{Project:Sandbox}}</nowiki></kbd>。",
        "apihelp-feedcontributions-description": "返回用户贡献纲要。",
        "apihelp-feedcontributions-param-feedformat": "纲要的格式。",
        "apihelp-feedcontributions-param-user": "获取哪些用户的贡献。",
        "apihelp-feedcontributions-param-toponly": "仅仅显示那些作为最新修订的编辑。",
        "apihelp-feedcontributions-param-newonly": "仅仅显示那些作为页面创建的编辑。",
        "apihelp-feedcontributions-param-showsizediff": "显示修订版本之间的大小差别。",
-       "apihelp-feedcontributions-example-simple": "返回[[User:Example]]的贡献",
+       "apihelp-feedcontributions-example-simple": "返回用户<kbd>Example</kbd>的贡献。",
        "apihelp-feedrecentchanges-description": "返回最新变更纲要。",
        "apihelp-feedrecentchanges-param-feedformat": "纲要的格式。",
        "apihelp-feedrecentchanges-param-namespace": "用于限制结果的命名空间。",
        "apihelp-feedrecentchanges-param-hideanons": "隐藏匿名用户做出的更改。",
        "apihelp-feedrecentchanges-param-hideliu": "隐藏注册用户做出的更改。",
        "apihelp-feedrecentchanges-param-hidepatrolled": "隐藏已巡查更改。",
-       "apihelp-feedrecentchanges-param-hidemyself": "隐藏做出的更改。",
+       "apihelp-feedrecentchanges-param-hidemyself": "隐藏当前用户做出的更改。",
        "apihelp-feedrecentchanges-param-tagfilter": "按标签过滤。",
        "apihelp-feedrecentchanges-param-target": "仅仅显示从该页面链出的那些页面的变更。",
        "apihelp-feedrecentchanges-param-showlinkedto": "仅仅显示链入到该页面的那些页面的变更。",
        "apihelp-filerevert-description": "回退一个文件至某一旧版本。",
        "apihelp-filerevert-param-filename": "目标文件名,不包含前缀“File:”。",
        "apihelp-filerevert-param-comment": "上传评论。",
-       "apihelp-filerevert-example-revert": "回退Wiki.png至2011-03-05T15:27:40Z的版本",
+       "apihelp-filerevert-param-archivename": "恢复到修订版存档名称。",
+       "apihelp-filerevert-example-revert": "回退<kbd>Wiki.png</kbd>至<kbd>2011-03-05T15:27:40Z</kbd>的版本。",
        "apihelp-help-description": "显示指定模块的帮助。",
        "apihelp-help-param-submodules": "包括给定名称模块的子模块的帮助。",
        "apihelp-help-param-recursivesubmodules": "包括递归子模块的帮助。",
        "apihelp-help-example-query": "两个查询子模块的帮助",
        "apihelp-imagerotate-description": "旋转一幅或多幅图像。",
        "apihelp-imagerotate-param-rotation": "顺时针旋转图像的度数。",
-       "apihelp-imagerotate-example-simple": "90度旋转[[:File:Example.png]]",
-       "apihelp-imagerotate-example-generator": "将[[:Category:Flip]]之中的所有图像旋转180度",
+       "apihelp-imagerotate-example-simple": "<kbd>90</kbd>度旋转<kbd>File:Example.png</kbd>。",
+       "apihelp-imagerotate-example-generator": "将<kbd>Category:Flip</kbd>之中的所有图像旋转<kbd>180</kbd>度。",
        "apihelp-import-param-summary": "导入摘要。",
        "apihelp-import-param-xml": "上传的XML文件。",
        "apihelp-import-param-interwikisource": "用于跨wiki导入:导入的来源wiki。",
        "apihelp-login-example-login": "登录",
        "apihelp-logout-description": "退出并清除会话数据。",
        "apihelp-logout-example-logout": "退出当前用户",
+       "apihelp-managetags-description": "执行有关更改标签的管理任务。",
+       "apihelp-managetags-param-operation": "要执行哪个操作:\n;create:创建一个新的更改标签供手动使用。\n;delete:从数据库中移除一个更改标签,包括移除已使用在所有修订版本、最近更改记录和日志记录上的该标签。\n;activate:激活一个更改标签,允许用户手动应用它。\n;deactivate:停用一个更改标签,阻止用户手动应用它。",
+       "apihelp-managetags-param-reason": "一个创建、删除、激活或停用标签时的原因,可选。",
+       "apihelp-managetags-param-ignorewarnings": "是否忽略操作期间发生的任何警告。",
+       "apihelp-managetags-example-create": "创建一个名为<kbd>spam</kbd>的标签,原因<kbd>For use in edit patrolling</kbd>",
+       "apihelp-managetags-example-delete": "删除<kbd>vandlaism</kbd>标签,原因<kbd>Misspelt</kbd>",
+       "apihelp-managetags-example-activate": "激活一个名为<kbd>spam</kbd>的标签,原因<kbd>For use in edit patrolling</kbd>",
+       "apihelp-managetags-example-deactivate": "停用一个名为<kbd>spam</kbd>的标签,原因<kbd>No longer required</kbd>",
        "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-from": "要重命名的页面标题。不能与<var>$1fromid</var>一起使用。",
+       "apihelp-move-param-fromid": "您希望移动的页面ID。不能与<var>$1from</var>一起使用。",
+       "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-watch": "将页面和重定向加入至当前用户的监视列表中。",
+       "apihelp-move-param-unwatch": "从当前用户的监视列表中移除页面及重定向。",
        "apihelp-move-param-watchlist": "无条件地将页面加入至您的监视列表或将其移除,使用设置或不更改监视。",
        "apihelp-move-param-ignorewarnings": "忽略任何警告。",
-       "apihelp-move-example-move": "移动“坏标题”到“好标题”并且不留下重定向",
+       "apihelp-move-example-move": "移动<kbd>坏标题</kbd>到<kbd>好标题</kbd>并且不留下重定向。",
        "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-suggest": "如果<var>[[mw:Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var>设置为false则不做任何事情。",
        "apihelp-opensearch-param-redirects": "如何处理重定向:\n;return:返回重定向本身。\n;resolve:返回目标页面。可能返回少于$1limit个结果。\n由于历史原因,$1format=json默认为\"return\",其他格式默认为\"resolve\"",
        "apihelp-opensearch-param-format": "输出格式。",
-       "apihelp-opensearch-example-te": "查找以“Te”开头的页面",
+       "apihelp-opensearch-example-te": "查找以<kbd>Te</kbd>开头的页面。",
        "apihelp-options-description": "更改当前用户的偏好设置。\n\n只有注册在核心或者已安装扩展中的选项,或者具有\"userjs-\"键值前缀(旨在被用户脚本使用)的选项可被设置。",
        "apihelp-options-param-reset": "重置偏好设置到网站默认设置。",
        "apihelp-options-example-reset": "重置所有用户设置",
-       "apihelp-options-example-change": "更改“皮肤”和“hideminot”设置",
-       "apihelp-options-example-complex": "重置所有设置,之后设置“皮肤”和“昵称”",
+       "apihelp-options-example-change": "更改<kbd>skin</kbd>和<kbd>hideminor</kbd>设置。",
+       "apihelp-options-example-complex": "重置所有设置,然后设置<kbd>皮肤</kbd>和<kbd>昵称</kbd>。",
        "apihelp-paraminfo-description": "获取关于 API 模块的信息。",
-       "apihelp-paraminfo-param-modules": "模块名称列表(action=和format=参数值,或“主”)。可通过“+”指定子模块。",
+       "apihelp-paraminfo-param-modules": "模块名称(<var>action</var>和<var>format</var>参数值,或<kbd>main</kbd>)的列表。可通过<kbd>+</kbd>指定子模块。",
        "apihelp-paraminfo-param-helpformat": "帮助字符串的格式。",
-       "apihelp-paraminfo-example-1": "显示[[Special:ApiHelp/parse|action=parse]]、[[Special:ApiHelp/jsonfm|format=jsonfm]]、[[Special:ApiHelp/query+allpages|action=query&list=allpages]]和[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]的信息",
+       "apihelp-paraminfo-param-querymodules": "查询模块名称(<var>prop</var>、<var>meta</var>或<var>list</var>参数值)的列表。使用<kbd>$1modules=query+foo</kbd>而不是<kbd>$1querymodules=foo</kbd>。",
+       "apihelp-paraminfo-param-mainmodule": "获得有关主要(最高级)模块的信息。也可使用<kbd>$1modules=main</kbd>。",
+       "apihelp-paraminfo-param-pagesetmodule": "获得有关页面设置模块(提供titles=和朋友)的信息。",
+       "apihelp-paraminfo-param-formatmodules": "格式模块名称(<var>format</var>参数的值)的列表。也可使用<var>$1modules</kbd>。",
+       "apihelp-paraminfo-example-1": "显示<kbd>[[Special:ApiHelp/parse|action=parse]]</kbd>、<kbd>[[Special:ApiHelp/jsonfm|format=jsonfm]]</kbd>、<kbd>[[Special:ApiHelp/query+allpages|action=query&list=allpages]]</kbd>和<kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd>的信息。",
+       "apihelp-parse-description": "解析内容并返回解析器输出。\n\n参见<kbd>[[Special:ApiHelp/query|action=query]]</kbd>的各种prop-module以从页面的当前版本获得信息。\n\n这里有几种方法可以指定解析的文本:\n# 指定一个页面或修订,使用<var>$1page</var>、<var>$1pageid</var>或<var>$1oldid</var>。\n# 明确指定内容,使用<var>$1text</var>、<var>$1title</var>和<var>$1contentmodel</var>。\n# 只指定一段摘要解析。<var>$1prop</var>应提供一个空值。",
        "apihelp-parse-param-summary": "所要解析的摘要。",
-       "apihelp-parse-param-page": "解析此页的内容。不能与$1text和$1title一起使用。",
-       "apihelp-parse-param-pageid": "解析此页的内容。覆盖 $1 页。",
+       "apihelp-parse-param-page": "解析此页的内容。不能与<var>$1text</var>和<var>$1title</var>一起使用。",
+       "apihelp-parse-param-pageid": "解析此页的内容。覆盖<var>$1page</var>。",
        "apihelp-parse-param-redirects": "如果 $1page 或 $1 pageid 参数被设置为一个重定向,则解析它。",
-       "apihelp-parse-param-oldid": "解析该修订版本的内容。覆盖 $1page 和 $1 pageid。",
-       "apihelp-parse-param-generatexml": "生成XML解析树(需要内容模型\"$1\")。",
+       "apihelp-parse-param-oldid": "解析该修订版本的内容。覆盖<var>$1page</var>和<var>$1pageid</var>。",
+       "apihelp-parse-param-disablepp": "从解析器输出中禁用PP报告。",
+       "apihelp-parse-param-disableeditsection": "从解析器输出中禁用编辑段落链接。",
+       "apihelp-parse-param-generatexml": "生成XML解析树(需要内容模型<code>$1</code>)。",
        "apihelp-parse-param-preview": "在预览模式下解析。",
        "apihelp-parse-param-sectionpreview": "在小节预览模式下解析 (同时要启用预览模式)。",
        "apihelp-parse-param-disabletoc": "在输出中禁用目录。",
        "apihelp-protect-description": "更改页面的保护等级。",
        "apihelp-protect-param-title": "要(解除)保护的页面标题。不能与$1pageid一起使用。",
        "apihelp-protect-param-pageid": "要(解除)保护的页面ID。不能与$1title一起使用。",
-       "apihelp-protect-param-protections": "保护等级列表,格式:action=level(例如edit=sysop)。\n\n'''注意:'''未列出的操作将移除限制。",
+       "apihelp-protect-param-protections": "保护等级列表,格式:<kbd>action=level</kbd>(例如<kbd>edit=sysop</kbd>)。\n\n<strong>注意:</strong>未列出的操作将移除限制。",
+       "apihelp-protect-param-expiry": "到期时间戳。如果只有一个时间戳被设置,它将被用于所有保护。使用<kbd>infinite</kbd>、<kbd>indefinite</kbd>、<kbd>infinity</kbd>或<kbd>never</kbd>用于永不过期的保护。",
        "apihelp-protect-param-reason": "(解除)保护的原因。",
        "apihelp-protect-example-protect": "保护一个页面",
-       "apihelp-protect-example-unprotect": "通过设置限制为“all”解除保护一个页面",
+       "apihelp-protect-example-unprotect": "通过设置限制为<kbd>all</kbd>解除保护一个页面。",
        "apihelp-protect-example-unprotect2": "通过设置没有限制解除保护一个页面",
        "apihelp-purge-param-forcelinkupdate": "更新链接表。",
        "apihelp-purge-param-forcerecursivelinkupdate": "更新链接表中,并更新任何使用此页作为模板的页面的链接表。",
-       "apihelp-purge-example-simple": "刷新“首页”和“API”页面",
+       "apihelp-purge-example-simple": "刷新<kbd>Main Page</kbd>和<kbd>API</kbd>页面。",
        "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-example-allpages": "获取以“API/”开头的页面的修订版本",
+       "apihelp-query-param-rawcontinue": "目前被忽略。将来<var>$1continue</var>将成为默认,且这里将需要得到原始的<samp>query-continue</samp>数据。",
+       "apihelp-query-example-revisions": "获取<kbd>Main Page</kbd>的[[Special:ApiHelp/query+siteinfo|网站信息]]和[[Special:ApiHelp/query+revisions|修订版本]]。",
+       "apihelp-query-example-allpages": "获取以<kbd>API/</kbd>开头的页面的修订版本",
        "apihelp-query+allcategories-description": "枚举所有类别。",
        "apihelp-query+allcategories-param-from": "要作为枚举起始点的类别。",
        "apihelp-query+allcategories-param-to": "要作为枚举终止点的类别。",
+       "apihelp-query+allcategories-param-prefix": "搜索此值开头的所有分类标题。",
        "apihelp-query+allcategories-param-dir": "排序方向。",
        "apihelp-query+allcategories-param-limit": "要返回多少个类别。",
-       "apihelp-query+alldeletedrevisions-paraminfo-useronly": "只可以与$3user一起使用。",
-       "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "不能与$3user一起使用。",
+       "apihelp-query+allcategories-example-size": "列出分类及其含有多少页面的信息。",
+       "apihelp-query+alldeletedrevisions-paraminfo-useronly": "只可以与<var>$3user</var>一起使用。",
+       "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "不能与<var>$3user</var>一起使用。",
        "apihelp-query+alldeletedrevisions-param-from": "从此标题开始列出。",
        "apihelp-query+alldeletedrevisions-param-to": "列出至此标题为止。",
        "apihelp-query+alldeletedrevisions-param-user": "只列出此用户做出的修订。",
        "apihelp-query+alldeletedrevisions-param-excludeuser": "不要列出此用户做出的修订。",
        "apihelp-query+alldeletedrevisions-param-namespace": "只列出此名字空间的页面。",
-       "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "'''注意:'''由于[https://www.mediawiki.org/wiki/Manual:$wgMiserMode miser模式],同时使用$1user和$1namespace将导致继续前返回少于“$1limit”个结果,在极端条件下可能不返回任何结果。",
-       "apihelp-query+alldeletedrevisions-example-user": "列出由User:Example作出的最近50次已删除贡献",
-       "apihelp-query+alldeletedrevisions-example-ns-main": "列出最近50次已删除的主名字空间修订",
+       "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "<strong>注意:</strong>由于[[mw:Manual:$wgMiserMode|miser模式]],同时使用<var>$1user</var>和<var>$1namespace</var>将导致继续前返回少于<var>$1limit</var>个结果,在极端条件下可能不返回任何结果。",
+       "apihelp-query+alldeletedrevisions-example-user": "列出由<kbd>Example<kbd>作出的最近50次已删除贡献。",
+       "apihelp-query+alldeletedrevisions-example-ns-main": "列出前50次已删除的主名字空间修订。",
+       "apihelp-query+allfileusages-description": "列出所有文件用途,包括不存在的。",
        "apihelp-query+allfileusages-param-prefix": "搜索此值开头的所有文件标题。",
        "apihelp-query+allfileusages-param-limit": "要返回的总计项目。",
        "apihelp-query+allfileusages-param-dir": "罗列所采用的方向。",
        "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-B": "显示以字母<kbd>B</kbd>开始的文件列表。",
+       "apihelp-query+allimages-example-recent": "显示一个最近上传文件的列表,类似[[Special:NewFiles]]。",
        "apihelp-query+allimages-example-mimetypes": "显示带MIME类型<kbd>image/png</kbd>或<kbd>image/gif</kbd>的文件列表",
-       "apihelp-query+allimages-example-generator": "显示有关4个以“T”开头的文件的信息",
+       "apihelp-query+allimages-example-generator": "显示有关4个以<kbd>T</kbd>开头的文件的信息。",
+       "apihelp-query+alllinks-param-namespace": "要列举的名字空间。",
+       "apihelp-query+alllinks-param-limit": "总共要返回多少个项目。",
+       "apihelp-query+alllinks-param-dir": "列出方向。",
+       "apihelp-query+alllinks-example-unique": "列出唯一的链接标题",
+       "apihelp-query+alllinks-example-unique-generator": "获得所有已链接的标题,标记缺少的。",
        "apihelp-query+alllinks-example-generator": "获取包含这些链接的页面",
        "apihelp-query+allmessages-description": "返回来自该站点的消息。",
-       "apihelp-query+allmessages-param-messages": "要输出的哪些消息。\"*\" (默认值) 表示所有消息。",
+       "apihelp-query+allmessages-param-messages": "要输出的消息。<kbd>*</kbd>(默认)表示所有消息。",
        "apihelp-query+allmessages-param-prop": "要获取的属性。",
        "apihelp-query+allmessages-param-lang": "返回这种语言的信息。",
        "apihelp-query+allmessages-param-prefix": "返回带有该前缀的消息。",
-       "apihelp-query+allmessages-example-ipb": "显示以“ipb-”开始的消息",
-       "apihelp-query+allmessages-example-de": "显示德语版的“八月”和“首页”消息",
+       "apihelp-query+allmessages-example-ipb": "显示以<kbd>ipb-</kbd>开始的消息。",
+       "apihelp-query+allmessages-example-de": "显示德语版的<kbd>august</kbd>和<kbd>mainpage</kbd>消息。",
+       "apihelp-query+allpages-param-namespace": "要列举的名字空间。",
        "apihelp-query+allpages-param-filterredir": "要列出哪些页面。",
        "apihelp-query+allpages-param-minsize": "限于至少这么多字节的页面。",
        "apihelp-query+allpages-param-maxsize": "限于至多这么多字节的页面。",
        "apihelp-query+allpages-param-prtype": "仅限于受保护页面。",
        "apihelp-query+allpages-param-limit": "返回的总计页面数。",
+       "apihelp-query+allpages-example-B": "显示以字母<kbd>B</kbd>开头的页面的列表。",
+       "apihelp-query+allpages-example-generator": "显示有关4个以字母<kbd>T</kbd>开头的页面的信息。",
+       "apihelp-query+allpages-example-generator-revisions": "显示前2个以<kbd>Re</kbd>开头的非重定向页面的内容。",
        "apihelp-query+allredirects-description": "列出至一个名字空间的重定向。",
        "apihelp-query+allredirects-param-namespace": "要列举的名字空间。",
        "apihelp-query+allredirects-param-limit": "返回的总计项目数。",
+       "apihelp-query+allredirects-param-dir": "罗列所采用的方向。",
        "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-param-dir": "罗列所采用的方向。",
        "apihelp-query+alltransclusions-example-unique": "列出孤立嵌入标题",
+       "apihelp-query+alltransclusions-example-generator": "获得包含嵌入内容的页面。",
+       "apihelp-query+allusers-description": "列举所有注册用户。",
        "apihelp-query+allusers-param-dir": "排序方向。",
        "apihelp-query+allusers-param-group": "只包含指定组中的用户。",
        "apihelp-query+allusers-param-excludegroup": "排除指定组中的用户。",
        "apihelp-query+allusers-param-witheditsonly": "只列出有编辑的用户。",
        "apihelp-query+allusers-param-activeusers": "只列出最近$1天内活跃的用户。",
-       "apihelp-query+allusers-example-Y": "列出以Y开头的用户",
-       "apihelp-query+backlinks-param-title": "要搜索的标题。不能与$1pageid一起使用。",
-       "apihelp-query+backlinks-param-pageid": "要搜索的页面ID。不能与$1title一起使用。",
+       "apihelp-query+allusers-example-Y": "列出以<kbd>Y</kbd>开头的用户。",
+       "apihelp-query+backlinks-param-title": "要搜索的标题。不能与<var>$1pageid</var>一起使用。",
+       "apihelp-query+backlinks-param-pageid": "要搜索的页面ID。不能与<var>$1title</var>一起使用。",
        "apihelp-query+backlinks-param-namespace": "要列举的名字空间。",
-       "apihelp-query+backlinks-example-simple": "显示至[[首页]]的链接",
-       "apihelp-query+backlinks-example-generator": "获取关于链接至[[首页]]的页面的信息",
+       "apihelp-query+backlinks-param-dir": "罗列所采用的方向。",
+       "apihelp-query+backlinks-param-limit": "返回总计页面数。如果<var>$1redirect</var>被启用,则限定分别适用于每一等级(这意味着将返回多达2 * <var>$1limit</var>个结果)。",
+       "apihelp-query+backlinks-example-simple": "显示至<kbd>Main page<kbd>的链接。",
+       "apihelp-query+backlinks-example-generator": "获得关于链接至<kbd>Main page<kbd>的页面的信息。",
        "apihelp-query+blocks-description": "列出所有被封禁的用户和IP地址。",
        "apihelp-query+blocks-param-ids": "要列出的封禁ID列表(可选)。",
        "apihelp-query+blocks-param-users": "要搜索的用户列表(可选)。",
        "apihelp-query+blocks-example-simple": "封禁列表",
-       "apihelp-query+blocks-example-users": "列出用户Alice和Bob的封禁",
+       "apihelp-query+blocks-example-users": "列出用户<kbd>Alice</kbd>和<kbd>Bob</kbd>的封禁。",
        "apihelp-query+categories-param-show": "显示何种分类。",
        "apihelp-query+categories-param-limit": "返回多少分类。",
-       "apihelp-query+categories-example-simple": "获取属于[[阿尔伯特·爱因斯坦]]的分类列表",
-       "apihelp-query+categories-example-generator": "获取有关用于[[阿尔伯特·爱因斯坦]]的分类的信息",
-       "apihelp-query+categoryinfo-example-simple": "获取有关[[:Category:Foo]]和[[:Category:Bar]]的信息",
+       "apihelp-query+categories-param-dir": "罗列所采用的方向。",
+       "apihelp-query+categories-example-simple": "获取属于<kbd>Albert Einstein</kbd>的分类列表。",
+       "apihelp-query+categories-example-generator": "获得有关用于<kbd>Albert Einstein</kbd>的分类的信息。",
+       "apihelp-query+categoryinfo-example-simple": "获取有关<kbd>Category:Foo</kbd>和<kbd>Category:Bar</kbd>的信息。",
        "apihelp-query+categorymembers-description": "在指定的分类中列出所有页面。",
+       "apihelp-query+categorymembers-param-title": "要列举的分类(必需)。必须包括<kbd>{{ns:category}}:</kbd>前缀。不能与<var>$1pageid</var>一起使用。",
+       "apihelp-query+categorymembers-param-namespace": "仅包含这些名字空间的页面。注意<kbd>$1type=subcat</kbd>或<kbd>$1type=file</kbd>可能被使用,而不是<kbd>$1namespace=14</kbd>或<kbd>6</kbd>。",
+       "apihelp-query+categorymembers-param-type": "包含的分类成员类型。当<kbd>$1sort=timestamp</kbd>被设置时会忽略。",
        "apihelp-query+categorymembers-param-sort": "要作为排序方式的属性。",
        "apihelp-query+categorymembers-param-dir": "排序的方向。",
-       "apihelp-query+categorymembers-param-start": "开始列举的时间戳。不能与$1sort=timestamp一起使用。",
-       "apihelp-query+categorymembers-param-end": "列举的结尾时间戳。不能与$1sort=timestamp一起使用。",
+       "apihelp-query+categorymembers-param-start": "开始列举的时间戳。只能与<kbd>$1sort=timestamp</kbd>一起使用。",
+       "apihelp-query+categorymembers-param-end": "列举的结尾时间戳。只能与<kbd>$1sort=timestamp</kbd>一起使用。",
        "apihelp-query+categorymembers-param-startsortkey": "请改用$1starthexsortkey。",
        "apihelp-query+categorymembers-param-endsortkey": "请改用$1endhexsortkey。",
-       "apihelp-query+categorymembers-example-simple": "è\8e·å\8f\96[[:Category:Physics]]中的前10个页面。",
-       "apihelp-query+categorymembers-example-generator": "è\8e·å\8f\96å\85³äº\8e[[:Category:Physics]]中的前10个页面的页面信息。",
+       "apihelp-query+categorymembers-example-simple": "è\8e·å¾\97<kbd>Category:Physics</kbd>中的前10个页面。",
+       "apihelp-query+categorymembers-example-generator": "è\8e·å¾\97æ\9c\89å\85³<kbd>Category:Physics</kbd>中的前10个页面的页面信息。",
        "apihelp-query+contributors-description": "获取对一个页面的登录贡献者列表和匿名贡献数。",
        "apihelp-query+contributors-param-limit": "返回的贡献数。",
-       "apihelp-query+contributors-example-simple": "显示[[首页]]的贡献",
-       "apihelp-query+deletedrevisions-example-titles": "列出[[首页]]和[[Talk:首页]]的已删除修订,包含内容",
-       "apihelp-query+deletedrevisions-example-revids": "列出已删除修订123456的信息",
+       "apihelp-query+contributors-example-simple": "显示<kbd>Main Page</kbd>的贡献。",
+       "apihelp-query+deletedrevisions-description": "获得删除修订版本信息。\n\n可在很多途径中使用:\n# 获得一组页面的已删除修订,通过设置标题或页面ID。以标题和时间戳排序。\n# 通过设置它们的ID与修订ID获得关于一组已删除修订。以修订ID排序。",
+       "apihelp-query+deletedrevisions-param-tag": "只列出被此标签标记的修订。",
+       "apihelp-query+deletedrevisions-param-user": "只列出此用户做出的修订。",
+       "apihelp-query+deletedrevisions-param-excludeuser": "不要列出此用户做出的修订。",
+       "apihelp-query+deletedrevisions-example-titles": "列出页面<kbd>Main Page</kbd>和<kbd>Talk:Main Page</kbd>的已删除修订,包含内容。",
+       "apihelp-query+deletedrevisions-example-revids": "列出已删除修订<kbd>123456</kbd>的信息。",
        "apihelp-query+deletedrevs-paraminfo-modes": "{{PLURAL:$1|模式}}:$2",
        "apihelp-query+deletedrevs-param-from": "从此标题开始列出。",
        "apihelp-query+deletedrevs-param-to": "列出至此标题为止。",
        "apihelp-query+deletedrevs-param-excludeuser": "不要列出此用户做出的修订。",
        "apihelp-query+deletedrevs-param-namespace": "只列出此名字空间的页面。",
        "apihelp-query+deletedrevs-example-mode1": "列出最近已删除的对首页和Talk:首页的贡献,带内容(模式1)",
-       "apihelp-query+deletedrevs-example-mode2": "列出由Bob作出的最近50次已删除贡献(模式2)",
+       "apihelp-query+deletedrevs-example-mode2": "列出由<kbd>Bob</kbd>作出的最近50次已删除贡献(模式2)。",
        "apihelp-query+deletedrevs-example-mode3-main": "列出前50次主名字空间已删除贡献(模式3)",
-       "apihelp-query+deletedrevs-example-mode3-talk": "列出前50次讨论名字空间已删除页面(模式3):",
+       "apihelp-query+deletedrevs-example-mode3-talk": "列出前50次{{ns:talk}}名字空间已删除页面(模式3):",
        "apihelp-query+disabled-description": "此查询模块已被禁用。",
        "apihelp-query+duplicatefiles-param-limit": "返回多少重复文件。",
+       "apihelp-query+duplicatefiles-param-dir": "罗列所采用的方向。",
+       "apihelp-query+duplicatefiles-param-localonly": "只看本地存储库的文件。",
        "apihelp-query+duplicatefiles-example-simple": "查找与[[:File:Albert Einstein Head.jpg]]重复的文件",
        "apihelp-query+duplicatefiles-example-generated": "查找所有文件的重复文件",
        "apihelp-query+embeddedin-param-title": "要搜索的标题。不能与$1pageid一起使用。",
        "apihelp-query+embeddedin-param-pageid": "要搜索的页面ID。不能与$1title一起使用。",
        "apihelp-query+embeddedin-param-namespace": "列举的名字空间。",
+       "apihelp-query+embeddedin-param-dir": "罗列所采用的方向。",
        "apihelp-query+embeddedin-param-filterredir": "如何过滤重定向。",
        "apihelp-query+embeddedin-param-limit": "返回的总计页面数。",
-       "apihelp-query+embeddedin-example-simple": "显示嵌入[[Template:Stub]]的页面",
-       "apihelp-query+embeddedin-example-generator": "è\8e·å\8f\96æ\9c\89å\85³æ\98¾ç¤ºåµ\8cå\85¥[[Template:Stub]]ç\9a\84页é\9d¢ç\9a\84ä¿¡æ\81¯",
+       "apihelp-query+embeddedin-example-simple": "显示嵌入<kbd>Template:Stub</kbd>的页面。",
+       "apihelp-query+embeddedin-example-generator": "è\8e·å¾\97æ\9c\89å\85³æ\98¾ç¤ºåµ\8cå\85¥<kbd>Template:Stub</kbd>ç\9a\84页é\9d¢ç\9a\84ä¿¡æ\81¯ã\80\82",
        "apihelp-query+extlinks-param-limit": "返回多少链接。",
-       "apihelp-query+extlinks-example-simple": "获取[[首页]]的外部链接列表",
+       "apihelp-query+extlinks-example-simple": "获取<kbd>首页</kbd>的外部链接列表。",
        "apihelp-query+exturlusage-param-limit": "返回多少页面。",
-       "apihelp-query+exturlusage-example-simple": "显示链接至http://www.mediawiki.org的页面",
+       "apihelp-query+exturlusage-example-simple": "显示链接至<kbd>http://www.mediawiki.org</kbd>的页面。",
+       "apihelp-query+filearchive-param-dir": "罗列所采用的方向。",
        "apihelp-query+filearchive-param-sha1": "图片的SHA1哈希值。覆盖$1sha1base36。",
        "apihelp-query+filearchive-param-sha1base36": "基于base 36的图片的SHA1哈希值(用于MediaWiki)。",
        "apihelp-query+filearchive-example-simple": "显示已删除文件列表",
+       "apihelp-query+filerepoinfo-example-simple": "获得有关文件存储库的信息。",
        "apihelp-query+fileusage-param-prop": "要获取的属性:\n;pageid:每个页面的页面ID。\n;title:每个页面的标题。\n;redirect:标记作为重定向的页面。",
        "apihelp-query+fileusage-param-namespace": "只包括这些名字空间的页面。",
        "apihelp-query+fileusage-param-limit": "返回多少。",
        "apihelp-query+imageinfo-paramvalue-prop-sha1": "为文件加入SHA-1哈希值。",
        "apihelp-query+imageinfo-paramvalue-prop-mime": "添加文件的MIME类型。",
        "apihelp-query+imageinfo-param-urlheight": "与$1urlwidth类似。",
+       "apihelp-query+imageinfo-param-localonly": "只看本地存储库的文件。",
        "apihelp-query+imageinfo-example-simple": "获取有关[[:File:Albert Einstein Head.jpg]]的当前版本的信息",
        "apihelp-query+imageinfo-example-dated": "获取有关[[:File:Albert Einstein Head.jpg]]自2008年以来版本的信息",
        "apihelp-query+images-param-limit": "返回多少文件。",
+       "apihelp-query+images-param-dir": "罗列所采用的方向。",
        "apihelp-query+images-example-simple": "获取[[首页]]使用的文件列表",
        "apihelp-query+images-example-generator": "获取有关[[首页]]使用的文件的信息",
        "apihelp-query+imageusage-param-title": "要搜索的标题。不能与$1pageid一起使用。",
        "apihelp-query+imageusage-param-pageid": "要搜索的页面ID。不能与$1title一起使用。",
        "apihelp-query+imageusage-param-namespace": "要列举的名字空间。",
+       "apihelp-query+imageusage-param-dir": "罗列所采用的方向。",
        "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-paramvalue-prop-watchers": "监视人员数,如果允许。",
        "apihelp-query+info-param-token": "请改用[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]。",
-       "apihelp-query+info-example-simple": "è\8e·å\8f\96æ\9c\89å\85³[[é¦\96页]]ç\9a\84ä¿¡æ\81¯",
-       "apihelp-query+info-example-protection": "获取[[首页]]的一般和保护信息",
+       "apihelp-query+info-example-simple": "è\8e·å¾\97æ\9c\89å\85³é¡µé\9d¢<kbd>Main Page</kbd>ç\9a\84ä¿¡æ\81¯ã\80\82",
+       "apihelp-query+info-example-protection": "获取<kbd>首页</kbd>相关的常规和保护信息。",
        "apihelp-query+iwbacklinks-param-prefix": "跨维基前缀。",
+       "apihelp-query+iwbacklinks-param-title": "要搜索的跨wiki链接。必须与<var>$1blprefix</var>一起使用。",
        "apihelp-query+iwbacklinks-param-limit": "返回的总计页面数。",
        "apihelp-query+iwbacklinks-param-prop": "要获取的属性:\n;iwprefix:加入跨wiki前缀。\n;iwtitle:加入跨wiki标题。",
-       "apihelp-query+iwbacklinks-example-simple": "获取链接至[[wikibooks:Test]]的页面",
-       "apihelp-query+iwbacklinks-example-generator": "获取有关链接至[[wikibooks:Test]]的页面的信息",
+       "apihelp-query+iwbacklinks-param-dir": "罗列所采用的方向。",
+       "apihelp-query+iwbacklinks-example-simple": "获得链接至[[wikibooks:Test]]的页面。",
+       "apihelp-query+iwbacklinks-example-generator": "获得有关链接至[[wikibooks:Test]]的页面的信息。",
+       "apihelp-query+iwlinks-description": "从指定页面返回所有跨wiki链接。",
        "apihelp-query+iwlinks-param-url": "是否获取完整URL(不能与$1prop一起使用)。",
        "apihelp-query+iwlinks-param-limit": "返回多少跨wiki链接。",
        "apihelp-query+iwlinks-param-prefix": "只返回此前缀的跨wiki链接。",
-       "apihelp-query+iwlinks-param-title": "用于搜索的跨wiki链接。必须与$1prefix一起使用。",
-       "apihelp-query+iwlinks-example-simple": "从[[首页]]获取跨wiki链接",
+       "apihelp-query+iwlinks-param-title": "用于搜索的跨wiki链接。必须与<var>$1prefix</var>一起使用。",
+       "apihelp-query+iwlinks-param-dir": "罗列所采用的方向。",
+       "apihelp-query+iwlinks-example-simple": "从页面<kbd>Main Page</kbd>获得跨wiki链接。",
        "apihelp-query+langbacklinks-param-lang": "用于语言链接的语言。",
        "apihelp-query+langbacklinks-param-title": "要搜索的语言链接。必须与$1lang一起使用。",
+       "apihelp-query+langbacklinks-param-limit": "返回的总计页面数。",
+       "apihelp-query+langbacklinks-param-prop": "要获得的属性:\n;lllang:添加语言链接的语言代码。\n;lltitle:添加语言链接的标题。",
+       "apihelp-query+langbacklinks-param-dir": "罗列所采用的方向。",
        "apihelp-query+langbacklinks-example-simple": "获取链接至[[:fr:Test]]的页面",
        "apihelp-query+langbacklinks-example-generator": "获取链接至[[:fr:Test]]的页面的信息",
+       "apihelp-query+langlinks-description": "从指定页面返回所有跨语言链接。",
        "apihelp-query+langlinks-param-limit": "返回多少语言链接。",
-       "apihelp-query+langlinks-param-url": "是否获取完整URL(不能与$1prop一起使用)。",
-       "apihelp-query+langlinks-param-title": "要搜索的链接。必须与$1lang一起使用。",
+       "apihelp-query+langlinks-param-url": "是否获取完整URL(不能与<var>$1prop</var>一起使用)。",
+       "apihelp-query+langlinks-param-lang": "只返回带此语言代码的语言链接。",
+       "apihelp-query+langlinks-param-title": "要搜索的链接。必须与<var>$1lang</var>一起使用。",
+       "apihelp-query+langlinks-param-dir": "罗列所采用的方向。",
        "apihelp-query+langlinks-param-inlanguagecode": "本地化语言名称的语言代码。",
-       "apihelp-query+langlinks-example-simple": "从[[首页]]获取跨语言链接",
+       "apihelp-query+langlinks-example-simple": "从页面<kbd>Main Page</kbd>获得跨语言链接。",
+       "apihelp-query+links-description": "从指定页面返回所有链接。",
+       "apihelp-query+links-param-namespace": "只显示这些名字空间的链接。",
        "apihelp-query+links-param-limit": "返回多少链接。",
-       "apihelp-query+links-example-simple": "从[[首页]]获取链接",
-       "apihelp-query+links-example-generator": "获取有关[[首页]]链接页面的信息",
-       "apihelp-query+links-example-namespaces": "获取用户和模板名字空间中来自[[首页]]的链接",
+       "apihelp-query+links-param-dir": "罗列所采用的方向。",
+       "apihelp-query+links-example-simple": "从页面<kbd>Main Page</kbd>获得链接",
+       "apihelp-query+links-example-generator": "获得有关在页面<kbd>Main Page</kbd>中连接的页面的信息。",
+       "apihelp-query+links-example-namespaces": "获得在{{ns:user}}和{{ns:template}}名字空间中来自页面<kbd>Main Page</kbd>的链接。",
        "apihelp-query+linkshere-param-namespace": "只包括这些名字空间的页面。",
        "apihelp-query+linkshere-param-limit": "返回多少。",
        "apihelp-query+linkshere-param-show": "只显示符合以下标准的项:\n;redirect:只显示重定向。\n;!redirect:只显示非重定向。",
        "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+pageswithprop-example-generator": "获取有关前10个使用_&#95;NOTOC_&#95;的页面的信息",
+       "apihelp-query+pagepropnames-example-simple": "获取前10个属性名称。",
+       "apihelp-query+pageprops-example-simple": "获得用于<kbd>Category:Foo</kbd>的属性。",
+       "apihelp-query+pageswithprop-description": "列出所有使用指定页面属性的页面。",
+       "apihelp-query+pageswithprop-param-dir": "排序的方向。",
+       "apihelp-query+pageswithprop-example-simple": "列出前10个使用<code>&#123;&#123;DISPLAYTITLE:&#125;&#125;</code>的页面。",
+       "apihelp-query+pageswithprop-example-generator": "获取有关前10个使用<code>_&#95;NOTOC_&#95;</code>的页面的信息。",
        "apihelp-query+prefixsearch-param-search": "搜索字符串。",
        "apihelp-query+prefixsearch-param-namespace": "搜索的名字空间。",
        "apihelp-query+prefixsearch-param-offset": "跳过的结果数。",
+       "apihelp-query+prefixsearch-example-simple": "搜索以<kbd>meaning</kbd>开头的页面标题。",
        "apihelp-query+protectedtitles-param-namespace": "只列出这些名字空间的标题。",
        "apihelp-query+protectedtitles-param-limit": "返回的总计页面数。",
        "apihelp-query+protectedtitles-example-simple": "受保护标题列表",
+       "apihelp-query+protectedtitles-example-generator": "找到主命名空间中已保护的标题的链接。",
        "apihelp-query+querypage-param-limit": "返回的结果数。",
        "apihelp-query+querypage-example-ancientpages": "返回[[Special:Ancientpages]]的结果。",
        "apihelp-query+random-param-namespace": "只返回这些名字空间的页面。",
+       "apihelp-query+random-param-limit": "限制返回多少随机页面。",
+       "apihelp-query+random-param-redirect": "加载一个随机重定向而不是一个随机页面。",
+       "apihelp-query+random-example-simple": "从主名字空间返回两个随机页面。",
        "apihelp-query+recentchanges-description": "枚举最近更改。",
        "apihelp-query+recentchanges-param-user": "只列出此用户的更改。",
        "apihelp-query+recentchanges-param-excludeuser": "不要列出此用户的更改。",
        "apihelp-query+recentchanges-param-tag": "只列出带此标签的更改。",
-       "apihelp-query+recentchanges-param-token": "请改用[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]。",
+       "apihelp-query+recentchanges-param-token": "请改用<kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>。",
+       "apihelp-query+recentchanges-param-limit": "返回的总计更新数。",
+       "apihelp-query+recentchanges-param-type": "显示的更改类型。",
        "apihelp-query+recentchanges-example-simple": "最近更改列表",
+       "apihelp-query+redirects-description": "返回至指定页面的所有重定向。",
        "apihelp-query+redirects-param-namespace": "只包含这些名字空间的页面。",
        "apihelp-query+redirects-param-limit": "返回多少重定向。",
        "apihelp-query+redirects-example-simple": "获取至[[Project:首页]]的重定向列表",
        "apihelp-query+redirects-example-generator": "获取所有重定向至[[首页]]的信息",
-       "apihelp-query+revisions-example-last5": "获取“首页”的最近5次修订",
-       "apihelp-query+revisions-example-first5": "获取“首页”的前5次修订版本",
-       "apihelp-query+revisions-example-first5-after": "获取“首页”于2006年05月01日之后做出的前5次修订版本",
+       "apihelp-query+revisions-example-content": "获得带内容的数据,用于标题<kbd>API</kbd>和<kbd>Main Page</kbd>的最近修订。",
+       "apihelp-query+revisions-example-last5": "获取<kbd>Main Page</kbd>的最近5次修订。",
+       "apihelp-query+revisions-example-first5": "获取<kbd>Main Page</kbd>的前5次修订。",
+       "apihelp-query+revisions-example-first5-after": "获得<kbd>Main Page</kbd>于2006年05月01日之后做出的前5次修订版本。",
+       "apihelp-query+revisions-example-first5-not-localhost": "获取<kbd>Main Page</kbd>的前5次不是由匿名用户<kbd>127.0.0.1</kbd>做出的修订。",
+       "apihelp-query+revisions-example-first5-user": "获取<kbd>Main Page</kbd>的前5次由用户<kbd>MediaWiki default</kbd>做出的修订。",
+       "apihelp-query+revisions+base-param-limit": "限制返回多少修订。",
        "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+search-example-simple": "搜索<kbd>meaning</kbd>。",
+       "apihelp-query+search-example-text": "搜索文本<kbd>meaning</kbd>。",
+       "apihelp-query+search-example-generator": "获得有关搜索<kbd>meaning</kbd>返回页面的页面信息。",
        "apihelp-query+siteinfo-param-numberingroup": "列出用户组中的用户数。",
        "apihelp-query+siteinfo-example-simple": "获取网站信息",
        "apihelp-query+siteinfo-example-interwiki": "获取本地跨wiki前缀列表",
+       "apihelp-query+siteinfo-example-replag": "检查当前的响应延迟。",
        "apihelp-query+tags-description": "列出更改标签。",
+       "apihelp-query+tags-param-prop": "要获取哪个属性:\n;name:添加标签名称。\n;displayname:为标签添加系统消息。\n;description:为标签添加描述。\n;hitcount:已添加此标签的修订版本与日志数量。\n;defined:标识标签是否已定义。\n;source:获得标签来源,它可能包括用于扩展定义的标签的<samp>extension</samp>,以及用于可被用户手动应用的标签的<samp>manual</samp>。\n;active:标签是否仍可被应用。",
        "apihelp-query+tags-example-simple": "可用标签列表",
        "apihelp-query+templates-param-namespace": "只显示此名字空间的模板。",
        "apihelp-query+templates-param-limit": "返回多少模板。",
        "apihelp-query+templates-param-templates": "只列出这些模板。对于检查某一页面使用某一模板很有用。",
-       "apihelp-query+templates-example-simple": "从[[首页]]获取模板",
-       "apihelp-query+templates-example-generator": "获取有关[[首页]]中的模板页面的信息",
-       "apihelp-query+templates-example-namespaces": "从[[首页]]获取用户和模板名字空间中的模板",
+       "apihelp-query+templates-param-dir": "罗列所采用的方向。",
+       "apihelp-query+templates-example-simple": "获得在页面<kbd>Main Page</kbd>使用的模板。",
+       "apihelp-query+templates-example-generator": "获得有关<kbd>Main Page</kbd>中使用的模板页面的信息。",
+       "apihelp-query+templates-example-namespaces": "获得在{{ns:user}}和{{ns:template}}名字空间中,嵌入在<kbd>Main Page</kbd>页面的页面。",
        "apihelp-query+tokens-param-type": "要请求的令牌类型。",
        "apihelp-query+transcludedin-param-namespace": "至包含这些名字空间的页面。",
        "apihelp-query+transcludedin-param-limit": "返回多少。",
-       "apihelp-query+transcludedin-example-simple": "è\8e·å\8f\96åµ\8cå\85¥[[é¦\96页]]ç\9a\84页é\9d¢å\88\97表",
-       "apihelp-query+transcludedin-example-generator": "è\8e·å\8f\96æ\9c\89å\85³åµ\8cå\85¥[[é¦\96页]]ç\9a\84页é\9d¢ç\9a\84ä¿¡æ\81¯",
+       "apihelp-query+transcludedin-example-simple": "è\8e·å¾\97åµ\8cå\85¥<kbd>Main Page</kbd>ç\9a\84页é\9d¢å\88\97表ã\80\82",
+       "apihelp-query+transcludedin-example-generator": "è\8e·å¾\97æ\9c\89å\85³åµ\8cå\85¥<kbd>Main Page</kbd>ç\9a\84页é\9d¢ç\9a\84ä¿¡æ\81¯ã\80\82",
        "apihelp-query+usercontribs-description": "获取一位用户的所有编辑。",
+       "apihelp-query+usercontribs-param-start": "返回的起始时间戳。",
+       "apihelp-query+usercontribs-param-end": "返回的最终时间戳。",
        "apihelp-query+usercontribs-param-namespace": "只列出这些名字空间的贡献。",
-       "apihelp-query+usercontribs-example-user": "显示[[User:Example]]的贡献",
-       "apihelp-query+usercontribs-example-ipprefix": "显示来自“192.0.2.”前缀所有IP地址的贡献",
+       "apihelp-query+usercontribs-example-user": "显示用户<kbd>Example</kbd>的贡献。",
+       "apihelp-query+usercontribs-example-ipprefix": "显示来自<kbd>192.0.2.</kbd>前缀所有 IP 地址的贡献。",
        "apihelp-query+userinfo-description": "获取有关当前用户的信息。",
        "apihelp-query+userinfo-example-simple": "获取有关当前用户的信息",
        "apihelp-query+userinfo-example-data": "获取有关当前用户的额外信息",
        "apihelp-query+users-description": "获取有关列出用户的信息。",
-       "apihelp-query+users-param-token": "请改用[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]。",
-       "apihelp-query+users-example-simple": "返回[[User:Example]]的信息",
+       "apihelp-query+users-param-token": "请改用<kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>。",
+       "apihelp-query+users-example-simple": "返回用户<kbd>Example</kbd>的信息。",
        "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+watchlist-example-generator": "在当前用户的监视列表中检索用于最近更改页面的页面信息。",
+       "apihelp-query+watchlistraw-description": "获得当前用户的监视列表上的所有页面。",
        "apihelp-query+watchlistraw-param-namespace": "只列出指定名字空间的页面。",
        "apihelp-query+watchlistraw-param-token": "允许访问其他用户监视列表的安全密钥(可通过用户的[[Special:Preferences#mw-prefsection-watchlist|参数设置]]找到)。",
+       "apihelp-query+watchlistraw-example-simple": "列出当前用户的监视列表中的页面。",
        "apihelp-revisiondelete-description": "删除和恢复修订版本。",
        "apihelp-revisiondelete-param-hide": "每次修订要隐藏的东西。",
        "apihelp-revisiondelete-param-show": "每次修订要恢复显示的东西。",
        "apihelp-revisiondelete-param-reason": "删除或恢复的原因。",
-       "apihelp-rollback-example-simple": "回退由用户Example对[[首页]]做出的最近编辑",
-       "apihelp-rollback-example-summary": "回退由IP用户192.0.2.5对[[首页]]做出的最近编辑,带编辑摘要“回退破坏”,并将这些编辑和回退标记为“机器人”",
+       "apihelp-revisiondelete-example-revision": "隐藏<kbd>首页</kbd>的修订版本<kbd>12345</kbd>的内容。",
+       "apihelp-rollback-param-title": "要回退的页面标题。不能与<var>$1pageid</var>一起使用。",
+       "apihelp-rollback-param-pageid": "要回退的页面的页面 ID。不能与<var>$1title</var>一起使用。",
+       "apihelp-rollback-example-simple": "回退由用户<kbd>Example</kbd>对<kbd>Main Page</kbd>做出的最近编辑。",
+       "apihelp-rollback-example-summary": "回退由IP用户<kbd>192.0.2.5</kbd>对页面<kbd>Main Page</kbd>做出的最近编辑,带编辑摘要<kbd>Reverting vandalism</kbd>,并将这些编辑和回退标记为机器人编辑。",
        "apihelp-rsd-description": "导出一个RSD(Really Simple Discovery)架构",
        "apihelp-rsd-example-simple": "导出RSD架构",
+       "apihelp-setnotificationtimestamp-example-pagetimestamp": "设置<kbd>Main page</kbd>的通知时间戳,这样所有从2012年1月1日起的编辑都会是未复核的。",
+       "apihelp-setnotificationtimestamp-example-allpages": "重置在<kbd>{{ns:user}}</kbd>名字空间中的页面的通知状态。",
        "apihelp-tokens-param-type": "要请求的令牌类型。",
        "apihelp-unblock-description": "解封一位用户。",
-       "apihelp-unblock-param-id": "解封时需要的封禁ID(通过list=blocks获得)。不能与$1user一起使用。",
-       "apihelp-unblock-param-user": "要解封的用户名、IP地址或IP段。不能与$1id一起使用。",
+       "apihelp-unblock-param-id": "解封时需要的封禁ID(通过<kbd>list=blocks</kbd>获得)。不能与<var>$1user</var>一起使用。",
+       "apihelp-unblock-param-user": "要解封的用户名、IP地址或IP段。不能与<var>$1id</var>一起使用。",
        "apihelp-unblock-param-reason": "解封的原因。",
-       "apihelp-unblock-example-id": "解封封禁ID#105",
-       "apihelp-unblock-example-user": "解封用户Bob,原因“抱歉Bob”",
+       "apihelp-unblock-example-id": "解封封禁ID #<kbd>105</kbd>。",
+       "apihelp-unblock-example-user": "解封用户<kbd>Bob</kbd>,原因<kbd>Sorry Bob</kbd>。",
        "apihelp-undelete-param-title": "要恢复的页面标题。",
        "apihelp-undelete-param-reason": "恢复的原因。",
-       "apihelp-undelete-example-page": "恢复[[首页]]",
-       "apihelp-undelete-example-revisions": "恢复[[首页]]的两个修订",
+       "apihelp-undelete-example-page": "恢复页面<kbd>Main Page</kbd>。",
+       "apihelp-undelete-example-revisions": "恢复<kbd>首页</kbd>的两个修订。",
        "apihelp-upload-param-filename": "目标文件名。",
        "apihelp-upload-param-watch": "监视页面。",
        "apihelp-upload-param-ignorewarnings": "忽略任何警告。",
        "apihelp-upload-param-stash": "如果设置,服务器将临时藏匿文件而不是加入存储库。",
        "apihelp-upload-param-chunk": "大块内容。",
        "apihelp-upload-example-url": "从URL上传",
+       "apihelp-upload-example-filekey": "完成一次由于警告而失败的上传。",
        "apihelp-userrights-description": "更改一位用户的组成员。",
        "apihelp-userrights-param-user": "用户名。",
        "apihelp-userrights-param-userid": "用户ID。",
        "apihelp-userrights-param-add": "将用户加入至这些组中。",
        "apihelp-userrights-param-remove": "将用户从这些组中移除。",
        "apihelp-userrights-param-reason": "更改原因。",
-       "apihelp-userrights-example-user": "将用户FooBot添加至“机器人”用户组,并从“管理员”和“行政员”组移除",
-       "apihelp-userrights-example-userid": "将ID为123的用户加入至“机器人”组,并将其从“管理员”和“行政员”组移除",
-       "apihelp-watch-param-title": "要(取消)监视的页面。也可使用$1titles。",
-       "apihelp-watch-example-watch": "监视页面“首页”",
-       "apihelp-watch-example-unwatch": "取消监视页面“首页”",
-       "apihelp-dbg-description": "输出数据为PHP的var_export()格式。",
-       "apihelp-dbgfm-description": "输出数据为PHP的var_export()格式(HTML优质打印效果)。",
-       "apihelp-dump-description": "输出数据为PHP的var_dump()格式。",
-       "apihelp-dumpfm-description": "输出数据为PHP的var_dump()格式(HTML优质打印效果)。",
+       "apihelp-userrights-example-user": "将用户<kbd>FooBot</kbd>添加至<kbd>bot</kbd>用户组,并从<kbd>sysop</kbd>和<kbd>bureaucrat</kbd>组移除。",
+       "apihelp-userrights-example-userid": "将ID为<kbd>123</kbd>的用户加入至<kbd>机器人</kbd>组,并将其从<kbd>管理员</kbd>和<kbd>行政员</kbd>组移除。",
+       "apihelp-watch-param-title": "要(取消)监视的页面。也可使用<var>$1titles</var>。",
+       "apihelp-watch-example-watch": "监视页面<kbd>Main Page</kbd>。",
+       "apihelp-watch-example-unwatch": "取消监视页面<kbd>首页</kbd>。",
+       "apihelp-format-example-generic": "格式化查询结果为$1格式。",
+       "apihelp-dbg-description": "输出数据为PHP的<code>var_export()</code>格式。",
+       "apihelp-dbgfm-description": "输出数据为PHP的<code>var_export()</code>格式(HTML优质打印效果)。",
+       "apihelp-dump-description": "输出数据为PHP的<code>var_dump()</code>格式。",
+       "apihelp-dumpfm-description": "输出数据为PHP的<code>var_dump()</code>格式(HTML优质打印效果)。",
        "apihelp-json-description": "输出数据为JSON格式。",
        "apihelp-jsonfm-description": "输出数据为JSON格式(HTML优质打印效果)。",
        "apihelp-none-description": "不输出任何东西。",
        "apihelp-php-description": "输出数据为序列化PHP格式。",
        "apihelp-phpfm-description": "输出数据为序列化PHP格式(HTML优质打印效果)。",
        "apihelp-rawfm-description": "输出数据为JSON格式,带调试元素(HTML优质打印效果)。",
-       "apihelp-txt-description": "输出数据为PHP的print_r()格式。",
-       "apihelp-txtfm-description": "输出数据为PHP的print_r()格式(HTML优质打印效果)。",
+       "apihelp-txt-description": "输出数据为PHP的<code>print_r()</code>格式。",
+       "apihelp-txtfm-description": "输出数据为PHP的<code>print_r()</code>格式(HTML优质打印效果)。",
        "apihelp-wddx-description": "输出数据为WDDX格式。",
        "apihelp-wddxfm-description": "输出数据为WDDX格式(HTML优质打印效果)。",
        "apihelp-xml-description": "输出数据为XML格式。",
+       "apihelp-xml-param-xslt": "如果指定,加入已命名的页面作为一个XSL样式表。值必须是在{{ns:mediawiki}}名字空间以<code>.xsl</code>为结尾的标题。",
        "apihelp-xmlfm-description": "输出数据为XML格式(HTML优质打印效果)。",
        "apihelp-yaml-description": "输出数据为YAML格式。",
        "apihelp-yamlfm-description": "输出数据为YAML格式(HTML优质打印效果)。",
        "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-pageset-param-redirects-nogenerator": "自动解决<var>$1titles</var>、<var>$1pageids</var>和<var>$1revids</var>中的重定向。",
        "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-parameters": "{{PLURAL:$1|参数}}:",
        "api-help-param-deprecated": "不推荐使用。",
        "api-help-param-required": "这个参数是必须的。",
-       "api-help-param-list": "{{PLURAL:$1|1=一个值|2=值(以“{{!}}”分隔)}}:$2",
+       "api-help-param-list": "{{PLURAL:$1|1=一个值|2=值(以<kbd>{{!}}</kbd>分隔)}}:$2",
        "api-help-param-list-can-be-empty": "{{PLURAL:$1|0=必须为空|可以为空,或$2}}",
        "api-help-param-limit": "不允许超过$1。",
        "api-help-param-limit2": "不允许超过$1个(对于机器人则是$2个)。",
        "api-help-param-integer-min": "{{PLURAL:$1|值}}必须不少于$2。",
        "api-help-param-integer-max": "{{PLURAL:$1|值}}必须不大于$2。",
        "api-help-param-integer-minmax": "{{PLURAL:$1|值}}必须介于$2和$3之间。",
-       "api-help-param-multi-separate": "通过“|”隔开各值。",
+       "api-help-param-multi-separate": "通过“<kbd>|</kbd>”隔开各值。",
        "api-help-param-multi-max": "值的最高数字是{{PLURAL:$1|$1}}(对于机器人则是{{PLURAL:$2|$2}})。",
        "api-help-param-default": "默认:$1",
        "api-help-param-default-empty": "默认:<span class=\"apihelp-empty\">(空)</span>",
        "api-help-param-token": "从[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]取回的“$1”令牌",
-       "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-disabled-in-miser-mode": "由于[[mw:Manual:$wgMiserMode|miser模式]]而禁用。",
+       "api-help-param-limited-in-miser-mode": "<strong>注意:</strong>由于[[mw:Manual:$wgMiserMode|miser模式]],使用这个可能导致继续前返回少于<var>$1limit</var>个结果;极端情况下可能不会返回任何结果。",
        "api-help-param-direction": "列举的方向:\n;newer:最早的优先。注意:$1start应早于$1end。\n;older:最新的优先(默认)。注意:$1start应晚于$1end。",
        "api-help-param-continue": "当更多结果可用时,使用这个继续。",
        "api-help-param-no-description": "<span class=\"apihelp-empty\">(没有说明)</span>",
index 460ee1f..c6aa730 100644 (file)
@@ -6,6 +6,7 @@
                        "LNDDYL"
                ]
        },
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|文件]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api 郵件清單]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API公告]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bug與請求]\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 的值與錯誤碼將會送回並設定為相同的值。詳細資訊請參閱[[mw:API:Errors_and_warnings|API: 錯誤與警告]]。",
        "apihelp-main-param-action": "要執行的動作。",
        "apihelp-main-param-format": "輸出的格式。",
        "apihelp-block-description": "封鎖使用者。",
@@ -16,7 +17,7 @@
        "apihelp-block-param-autoblock": "自動封鎖最後使用的 IP 位址,以及在這之後嘗試登入的 IP 位址。",
        "apihelp-block-param-noemail": "禁止使用者透過 Wiki 寄送電子郵件。 (需要 \"blockemail\" 權限)。",
        "apihelp-block-param-hidename": "隱藏封鎖日誌的使用者名稱。 (需要 \"hideuser\" 權限)。",
-       "apihelp-block-param-allowusertalk": "允許使用者編輯自己的對話頁面 (依據 $wgBlockAllowsUTEdit 的設定)。",
+       "apihelp-block-param-allowusertalk": "允許使用者編輯自己的對話頁面 (依據 <var>[[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var> 的設定)。",
        "apihelp-block-param-reblock": "若使用者已被封鎖,覆寫既有的封鎖設定值。",
        "apihelp-block-param-watchuser": "監視使用者或 IP 的使用者頁面與對話頁面。",
        "apihelp-compare-param-fromtitle": "要比對的第一個標題。",
@@ -28,7 +29,7 @@
        "apihelp-compare-example-1": "建立修訂 1 與 1 的差異檔",
        "apihelp-createaccount-description": "建立新使用者帳號。",
        "apihelp-createaccount-param-name": "使用者名稱。",
-       "apihelp-createaccount-param-password": "密碼 (若有設定 $1mailpassword 則可略過)。",
+       "apihelp-createaccount-param-password": "密碼 (若有設定 <var>$1mailpassword</var> 則可略過)。",
        "apihelp-createaccount-param-domain": "外部認証使用的網域 (選填)。",
        "apihelp-createaccount-param-token": "已取得帳號建立密鑰於第一次請求。",
        "apihelp-createaccount-param-email": "使用者的電子郵件位址 (選填)。",
        "apihelp-expandtemplates-param-text": "要轉換的 Wikitext。",
        "apihelp-feedrecentchanges-example-simple": "顯示近期變動",
        "apihelp-feedrecentchanges-example-30days": "顯示近期30天內的變動",
+       "apihelp-feedwatchlist-description": "返回監視清單 feed。",
+       "apihelp-feedwatchlist-param-feedformat": "Feed 的格式。",
        "apihelp-filerevert-param-comment": "上載意見。",
        "apihelp-help-example-main": "主模組使用說明",
+       "apihelp-help-example-recursive": "一個頁面中的所有說明。",
+       "apihelp-help-example-help": "說明模組自身的說明。",
+       "apihelp-imagerotate-description": "旋轉一張或多張圖片。",
+       "apihelp-import-param-summary": "匯入摘要。",
        "apihelp-import-param-xml": "上載的 XML 檔。",
        "apihelp-import-param-interwikisource": "用於跨 wiki 匯入:匯入的來源 wiki。",
        "apihelp-import-param-interwikipage": "用於跨 wiki 匯入:匯入的頁面。",
        "apihelp-logout-description": "登出並清除 session 資料。",
        "apihelp-logout-example-logout": "登出當前使用者",
        "apihelp-move-description": "移動頁面。",
+       "apihelp-move-param-from": "重新命名本頁面的標題。不能與 <var>$1fromid</var> 一起出現。",
+       "apihelp-move-param-fromid": "重新命名本頁面的 ID 。不能與 <var>$1fromid</var> 一起出現。",
+       "apihelp-move-param-to": "將本頁面的標題重新命名為",
+       "apihelp-move-param-reason": "重新命名的原因。",
+       "apihelp-move-param-movesubpages": "如果適用,則重新命名子頁面。",
+       "apihelp-move-param-noredirect": "不要建立重新導向。",
+       "apihelp-opensearch-description": "使用 OpenSearch 協定搜尋本 wiki。",
        "apihelp-opensearch-param-search": "搜尋字串。",
+       "apihelp-opensearch-param-namespace": "搜尋的命名空間。",
        "apihelp-options-example-reset": "重設所有偏好設定",
        "apihelp-userrights-param-user": "使用者名稱。",
        "apihelp-userrights-param-userid": "使用者 ID。",
        "api-help-param-required": "此參數為必填。",
        "api-help-param-limit": "不允許超過 $1。",
        "api-help-param-limit2": "不允許超過 $1 (機器人為 $2)。",
-       "api-help-param-multi-separate": "使用 \"|\" 分隔數值。",
+       "api-help-param-multi-separate": "使用 <kbd>|</kbd> 分隔數值。",
        "api-help-param-default": "預設值:$1",
        "api-help-param-default-empty": "預設值:<span class=\"apihelp-empty\">(空)</span>",
        "api-help-param-no-description": "<span class=\"apihelp-empty\">(無描述)</span>",
index c6d9a18..c3aefc5 100644 (file)
@@ -487,4 +487,45 @@ class BacklinkCache {
 
                return array( 'numRows' => $numRows, 'batches' => $batches );
        }
+
+       /**
+        * Get a Title iterator for cascade-protected template/file use backlinks
+        *
+        * @return TitleArray
+        * @since 1.25
+        */
+       public function getCascadeProtectedLinks() {
+               // This method is used to make redudant jobs anyway, so its OK to use
+               // a slave. Also, the set of cascade protected pages tends to be stable.
+               $dbr = $this->getDB();
+
+               $queries = array();
+               // @note: UNION filters any duplicate pages
+               $queries[] = $dbr->selectSQLText(
+                       array( 'templatelinks', 'page_restrictions', 'page' ),
+                       array( 'page_namespace', 'page_title', 'page_id' ),
+                       array(
+                               'tl_namespace' => $this->title->getNamespace(),
+                               'tl_title' => $this->title->getDBkey(),
+                               'tl_from = pr_page',
+                               'pr_cascade' => 1,
+                               'page_id = tl_from'
+                       )
+               );
+               $queries[] = $dbr->selectSQLText(
+                       array( 'imagelinks', 'page_restrictions', 'page' ),
+                       array( 'page_namespace', 'page_title', 'page_id' ),
+                       array(
+                               'il_to' => $this->title->getDBkey(),
+                               'il_from = pr_page',
+                               'pr_cascade' => 1,
+                               'page_id = il_from'
+                       )
+               );
+
+               return TitleArray::newFromResult( $dbr->query(
+                       $dbr->unionQueries( $queries, false ),
+                       __METHOD__
+               ) );
+       }
 }
index 9b710d7..8017bac 100644 (file)
@@ -26,8 +26,11 @@ class BloomFilterTitleHasLogs {
        public static function mergeAndCheck(
                BloomCache $bcache, $domain, $virtualKey, array $status
        ) {
+               $ttr = 5; // try to refresh before this many seconds
                $age = microtime( true ) - $status['asOfTime']; // seconds
-               $scopedLock = ( mt_rand( 1, (int)pow( 3, max( 0, 5 - $age ) ) ) == 1 )
+               $chance = min( 1, $age / $ttr );
+
+               $scopedLock = ( mt_rand( 1, 1e9 ) <= 1e9 * $chance )
                        ? $bcache->getScopedLock( $virtualKey )
                        : false;
 
index 86cd1d7..b430bab 100644 (file)
@@ -796,29 +796,6 @@ class RecentChange {
                return ChangesList::showCharacterDifference( $old, $new );
        }
 
-       /**
-        * Purge expired changes from the recentchanges table
-        * @since 1.22
-        */
-       public static function purgeExpiredChanges() {
-               if ( wfReadOnly() ) {
-                       return;
-               }
-
-               $method = __METHOD__;
-               $dbw = wfGetDB( DB_MASTER );
-               $dbw->onTransactionIdle( function () use ( $dbw, $method ) {
-                       global $wgRCMaxAge;
-
-                       $cutoff = $dbw->timestamp( time() - $wgRCMaxAge );
-                       $dbw->delete(
-                               'recentchanges',
-                               array( 'rc_timestamp < ' . $dbw->addQuotes( $cutoff ) ),
-                               $method
-                       );
-               } );
-       }
-
        private static function checkIPAddress( $ip ) {
                global $wgRequest;
                if ( $ip ) {
index 054f27a..8ce7f3f 100644 (file)
@@ -46,9 +46,6 @@ 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;
@@ -817,6 +814,10 @@ abstract class DatabaseBase implements IDatabase {
                if ( $user ) {
                        $this->open( $server, $user, $password, $dbName );
                }
+
+               $isMaster = !is_null( $this->getLBInfo( 'master' ) );
+               $trxProf = Profiler::instance()->getTransactionProfiler();
+               $trxProf->recordConnection( $this->mServer, $this->mDBname, $isMaster );
        }
 
        /**
@@ -1082,8 +1083,11 @@ abstract class DatabaseBase implements IDatabase {
 
                $isWriteQuery = $this->isWriteQuery( $sql );
                if ( $isWriteQuery ) {
+                       if ( !$this->mDoneWrites ) {
+                               wfDebug( __METHOD__ . ': Writes done: ' .
+                                       DatabaseBase::generalizeSQL( $sql ) . "\n" );
+                       }
                        # Set a flag indicating that writes have been done
-                       wfDebug( __METHOD__ . ': Writes done: ' . DatabaseBase::generalizeSQL( $sql ) . "\n" );
                        $this->mDoneWrites = microtime( true );
                }
 
@@ -1117,24 +1121,21 @@ abstract class DatabaseBase implements IDatabase {
                                $this->mServer, $this->mDBname, $this->mTrxShortId );
                }
 
-               $queryProf = '';
-               $totalProf = '';
                $isMaster = !is_null( $this->getLBInfo( 'master' ) );
+               # generalizeSQL will probably cut down the query to reasonable
+               # logging size most of the time. The substr is really just a sanity check.
+               if ( $isMaster ) {
+                       $queryProf = 'query-m: ' . substr( DatabaseBase::generalizeSQL( $sql ), 0, 255 );
+                       $totalProf = 'DatabaseBase::query-master';
+               } else {
+                       $queryProf = 'query: ' . substr( DatabaseBase::generalizeSQL( $sql ), 0, 255 );
+                       $totalProf = 'DatabaseBase::query';
+               }
+               # Include query transaction state
+               $queryProf .= $this->mTrxShortId ? " [TRX#{$this->mTrxShortId}]" : "";
 
                $profiler = Profiler::instance();
                if ( !$profiler instanceof ProfilerStub ) {
-                       # generalizeSQL will probably cut down the query to reasonable
-                       # logging size most of the time. The substr is really just a sanity check.
-                       if ( $isMaster ) {
-                               $queryProf = 'query-m: ' . substr( DatabaseBase::generalizeSQL( $sql ), 0, 255 );
-                               $totalProf = 'DatabaseBase::query-master';
-                       } else {
-                               $queryProf = 'query: ' . substr( DatabaseBase::generalizeSQL( $sql ), 0, 255 );
-                               $totalProf = 'DatabaseBase::query';
-                       }
-                       # Include query transaction state
-                       $queryProf .= $this->mTrxShortId ? " [TRX#{$this->mTrxShortId}]" : "";
-
                        $totalProfSection = $profiler->scopedProfileIn( $totalProf );
                        $queryProfSection = $profiler->scopedProfileIn( $queryProf );
                }
@@ -1158,19 +1159,12 @@ abstract class DatabaseBase implements IDatabase {
                        throw new DBUnexpectedError( $this, "DB connection was already closed." );
                }
 
-               # Log the query time and feed it into the DB trx profiler
-               if ( $queryProf != '' ) {
-                       $queryStartTime = microtime( true );
-                       $queryProfile = new ScopedCallback(
-                               function () use ( $queryStartTime, $queryProf, $isMaster ) {
-                                       $trxProfiler = Profiler::instance()->getTransactionProfiler();
-                                       $trxProfiler->recordQueryCompletion( $queryProf, $queryStartTime, $isMaster );
-                               }
-                       );
-               }
-
                # Do the query and handle errors
+               $startTime = microtime( true );
                $ret = $this->doQuery( $commentedSql );
+               # Log the query time and feed it into the DB trx profiler
+               $profiler->getTransactionProfiler()->recordQueryCompletion(
+                       $queryProf, $startTime, $isWriteQuery, $this->affectedRows() );
 
                MWDebug::queryTime( $queryId );
 
@@ -1197,7 +1191,11 @@ abstract class DatabaseBase implements IDatabase {
                                        $this->reportQueryError( $lastError, $lastErrno, $sql, $fname, $tempIgnore );
                                } else {
                                        # Should be safe to silently retry (no trx and thus no callbacks)
+                                       $startTime = microtime( true );
                                        $ret = $this->doQuery( $commentedSql );
+                                       # Log the query time and feed it into the DB trx profiler
+                                       $profiler->getTransactionProfiler()->recordQueryCompletion(
+                                               $queryProf, $startTime, $isWriteQuery, $this->affectedRows() );
                                }
                        } else {
                                wfDebug( "Failed\n" );
@@ -1205,14 +1203,8 @@ 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 ) );
-                       }
+                       $this->reportQueryError(
+                               $this->lastError(), $this->lastErrno(), $sql, $fname, $tempIgnore );
                }
 
                $res = $this->resultObject( $ret );
@@ -1391,9 +1383,13 @@ abstract class DatabaseBase implements IDatabase {
         *
         * @return bool|mixed The value from the field, or false on failure.
         */
-       public function selectField( $table, $var, $cond = '', $fname = __METHOD__,
-               $options = array()
+       public function selectField(
+               $table, $var, $cond = '', $fname = __METHOD__, $options = array()
        ) {
+               if ( $var === '*' ) { // sanity
+                       throw new DBUnexpectedError( $this, "Cannot use a * field: got '$var'" );
+               }
+
                if ( !is_array( $options ) ) {
                        $options = array( $options );
                }
@@ -1401,7 +1397,6 @@ abstract class DatabaseBase implements IDatabase {
                $options['LIMIT'] = 1;
 
                $res = $this->select( $table, $var, $cond, $fname, $options );
-
                if ( $res === false || !$this->numRows( $res ) ) {
                        return false;
                }
@@ -1415,6 +1410,48 @@ abstract class DatabaseBase implements IDatabase {
                }
        }
 
+       /**
+        * A SELECT wrapper which returns a list of single field values from result rows.
+        *
+        * Usually throws a DBQueryError on failure. If errors are explicitly
+        * ignored, returns false on failure.
+        *
+        * If no result rows are returned from the query, false is returned.
+        *
+        * @param string|array $table Table name. See DatabaseBase::select() for details.
+        * @param string $var The field name to select. This must be a valid SQL
+        *   fragment: do not use unvalidated user input.
+        * @param string|array $cond The condition array. See DatabaseBase::select() for details.
+        * @param string $fname The function name of the caller.
+        * @param string|array $options The query options. See DatabaseBase::select() for details.
+        *
+        * @return bool|array The values from the field, or false on failure
+        * @since 1.25
+        */
+       public function selectFieldValues(
+               $table, $var, $cond = '', $fname = __METHOD__, $options = array()
+       ) {
+               if ( $var === '*' ) { // sanity
+                       throw new DBUnexpectedError( $this, "Cannot use a * field: got '$var'" );
+               }
+
+               if ( !is_array( $options ) ) {
+                       $options = array( $options );
+               }
+
+               $res = $this->select( $table, $var, $cond, $fname, $options );
+               if ( $res === false ) {
+                       return false;
+               }
+
+               $values = array();
+               foreach ( $res as $row ) {
+                       $values[] = $row->$var;
+               }
+
+               return $values;
+       }
+
        /**
         * Returns an optional USE INDEX clause to go after the table, and a
         * string to go at the end of the query.
@@ -1822,7 +1859,7 @@ abstract class DatabaseBase implements IDatabase {
 
                if ( $res ) {
                        $row = $this->fetchRow( $res );
-                       $rows = ( isset( $row['rowcount'] ) ) ? $row['rowcount'] : 0;
+                       $rows = ( isset( $row['rowcount'] ) ) ? (int)$row['rowcount'] : 0;
                }
 
                return $rows;
@@ -1852,7 +1889,7 @@ abstract class DatabaseBase implements IDatabase {
 
                if ( $res ) {
                        $row = $this->fetchRow( $res );
-                       $rows = ( isset( $row['rowcount'] ) ) ? $row['rowcount'] : 0;
+                       $rows = ( isset( $row['rowcount'] ) ) ? (int)$row['rowcount'] : 0;
                }
 
                return $rows;
index a7bc6dd..f5e6667 100644 (file)
@@ -518,7 +518,7 @@ class DatabaseMssql extends DatabaseBase {
                        $row = $this->fetchRow( $res );
 
                        if ( isset( $row['EstimateRows'] ) ) {
-                               $rows = $row['EstimateRows'];
+                               $rows = (int)$row['EstimateRows'];
                        }
                }
 
@@ -812,64 +812,27 @@ class DatabaseMssql extends DatabaseBase {
                                'DatabaseBase::makeList called with incorrect parameters' );
                }
 
-               $first = true;
-               $list = '';
+               if ( $mode != LIST_NAMES ) {
+                       // In MS SQL, values need to be specially encoded when they are
+                       // inserted into binary fields. Perform this necessary encoding
+                       // for the specified set of columns.
+                       foreach ( array_keys( $a ) as $field ) {
+                               if ( !isset( $binaryColumns[$field] ) ) {
+                                       continue;
+                               }
 
-               foreach ( $a as $field => $value ) {
-                       if ( $mode != LIST_NAMES && isset( $binaryColumns[$field] ) ) {
-                               if ( is_array( $value ) ) {
-                                       foreach ( $value as &$v ) {
+                               if ( is_array( $a[$field] ) ) {
+                                       foreach ( $a[$field] as &$v ) {
                                                $v = new MssqlBlob( $v );
                                        }
+                                       unset( $v );
                                } else {
-                                       $value = new MssqlBlob( $value );
-                               }
-                       }
-
-                       if ( !$first ) {
-                               if ( $mode == LIST_AND ) {
-                                       $list .= ' AND ';
-                               } elseif ( $mode == LIST_OR ) {
-                                       $list .= ' OR ';
-                               } else {
-                                       $list .= ',';
-                               }
-                       } else {
-                               $first = false;
-                       }
-
-                       if ( ( $mode == LIST_AND || $mode == LIST_OR ) && is_numeric( $field ) ) {
-                               $list .= "($value)";
-                       } elseif ( ( $mode == LIST_SET ) && is_numeric( $field ) ) {
-                               $list .= "$value";
-                       } elseif ( ( $mode == LIST_AND || $mode == LIST_OR ) && is_array( $value ) ) {
-                               if ( count( $value ) == 0 ) {
-                                       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] );
-                               } else {
-                                       $list .= $field . " IN (" . $this->makeList( $value ) . ") ";
-                               }
-                       } elseif ( $value === null ) {
-                               if ( $mode == LIST_AND || $mode == LIST_OR ) {
-                                       $list .= "$field IS ";
-                               } elseif ( $mode == LIST_SET ) {
-                                       $list .= "$field = ";
-                               }
-                               $list .= 'NULL';
-                       } else {
-                               if ( $mode == LIST_AND || $mode == LIST_OR || $mode == LIST_SET ) {
-                                       $list .= "$field = ";
+                                       $a[$field] = new MssqlBlob( $a[$field] );
                                }
-                               $list .= $mode == LIST_NAMES ? $value : $this->addQuotes( $value );
                        }
                }
 
-               return $list;
+               return parent::makeList( $a, $mode );
        }
 
        /**
index f02aa93..c1f2969 100644 (file)
@@ -126,19 +126,25 @@ 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__,
                                        ) )
                                );
-                               $this->reportConnectionError( "Error setting sql_mode to $mode" );
+                               $this->reportConnectionError(
+                                       'Error setting MySQL variables on server {db_server} (check $wgSQLMode)' );
                        }
                }
 
@@ -462,7 +468,7 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
                        $rows *= $plan->rows > 0 ? $plan->rows : 1; // avoid resetting to zero
                }
 
-               return $rows;
+               return (int)$rows;
        }
 
        /**
@@ -1195,6 +1201,7 @@ class MySQLField implements Field {
                $this->is_multiple = $info->multiple_key;
                $this->is_key = ( $this->is_pk || $this->is_unique || $this->is_multiple );
                $this->type = $info->type;
+               $this->flags = $info->flags;
                $this->binary = isset( $info->binary ) ? $info->binary : false;
        }
 
@@ -1244,6 +1251,13 @@ class MySQLField implements Field {
                return $this->is_multiple;
        }
 
+       /**
+        * @return int
+        */
+       function flags() {
+               return $this->flags;
+       }
+
        function isBinary() {
                return $this->binary;
        }
index ce14d7a..abf26e0 100644 (file)
@@ -712,7 +712,7 @@ class DatabasePostgres extends DatabaseBase {
                        $row = $this->fetchRow( $res );
                        $count = array();
                        if ( preg_match( '/rows=(\d+)/', $row[0], $count ) ) {
-                               $rows = $count[1];
+                               $rows = (int)$count[1];
                        }
                }
 
index 9257ffe..95c44df 100644 (file)
@@ -144,8 +144,8 @@ class DatabaseSqlite extends DatabaseBase {
                }
 
                $this->mOpened = !!$this->mConn;
-               # set error codes only, don't raise exceptions
                if ( $this->mOpened ) {
+                       # Set error codes only, don't raise exceptions
                        $this->mConn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT );
                        # Enforce LIKE to be case sensitive, just like MySQL
                        $this->query( 'PRAGMA case_sensitive_like = 1' );
@@ -711,38 +711,6 @@ class DatabaseSqlite extends DatabaseBase {
                return false;
        }
 
-       protected function doBegin( $fname = '' ) {
-               if ( $this->mTrxLevel == 1 ) {
-                       $this->commit( __METHOD__ );
-               }
-               try {
-                       $this->mConn->beginTransaction();
-               } catch ( PDOException $e ) {
-                       throw new DBUnexpectedError( $this, 'Error in BEGIN query: ' . $e->getMessage() );
-               }
-               $this->mTrxLevel = 1;
-       }
-
-       protected function doCommit( $fname = '' ) {
-               if ( $this->mTrxLevel == 0 ) {
-                       return;
-               }
-               try {
-                       $this->mConn->commit();
-               } catch ( PDOException $e ) {
-                       throw new DBUnexpectedError( $this, 'Error in COMMIT query: ' . $e->getMessage() );
-               }
-               $this->mTrxLevel = 0;
-       }
-
-       protected function doRollback( $fname = '' ) {
-               if ( $this->mTrxLevel == 0 ) {
-                       return;
-               }
-               $this->mConn->rollBack();
-               $this->mTrxLevel = 0;
-       }
-
        /**
         * @param string $s
         * @return string
index 4c9fd32..917d703 100644 (file)
@@ -328,9 +328,11 @@ class LoadBalancer {
                                        $this->mServers[$i]['slave pos'] = $conn->getSlavePos();
                                }
                        }
-                       if ( $this->mReadIndex <= 0 && $this->mLoads[$i] > 0 && $group !== false ) {
+                       if ( $this->mReadIndex <= 0 && $this->mLoads[$i] > 0 && $group === false ) {
                                $this->mReadIndex = $i;
                        }
+                       $serverName = $this->getServerName( $i );
+                       wfDebug( __METHOD__ . ": using server $serverName for group '$group'\n" );
                }
 
                return $i;
@@ -476,8 +478,6 @@ class LoadBalancer {
                        foreach ( $groups as $group ) {
                                $groupIndex = $this->getReaderIndex( $group, $wiki );
                                if ( $groupIndex !== false ) {
-                                       $serverName = $this->getServerName( $groupIndex );
-                                       wfDebug( __METHOD__ . ": using server $serverName for group $group\n" );
                                        $i = $groupIndex;
                                        break;
                                }
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 960faef..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 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.
+ * @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;
-       }
-
+class MWLogger {
 
        /**
-        * 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 );
-       }
-
-
-       /**
-        * Critical conditions.
-        *
-        * 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
-        */
-       public function info( $message, array $context = array() ) {
-               $this->log( \Psr\Log\LogLevel::INFO, $message, $context );
-       }
-
-
-       /**
-        * Detailed debug information.
-        *
-        * @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.
+        * Register a service provider to create new \Psr\Log\LoggerInterface
+        * instances.
         *
         * @param MWLoggerSpi $provider Provider to register
+        * @deprecated since 1.25 Use MWLoggerFactory::registerProvider()
         */
        public static function registerProvider( MWLoggerSpi $provider ) {
-               self::$spi = $provider;
+               MWLoggerFactory::registerProvider( $provider );
        }
 
 
@@ -209,26 +51,22 @@ class MWLogger implements \Psr\Log\LoggerInterface {
         * @return MWLoggerSpi
         * @see registerProvider()
         * @see ObjectFactory::getObjectFromSpec()
+        * @deprecated since 1.25 Use MWLoggerFactory::getProvider()
         */
        public static function getProvider() {
-               if ( self::$spi === null ) {
-                       global $wgMWLoggerDefaultSpi;
-                       $provider = ObjectFactory::getObjectFromSpec(
-                               $wgMWLoggerDefaultSpi
-                       );
-                       self::registerProvider( $provider );
-               }
-               return self::$spi;
+               return MWLoggerFactory::getProvider();
        }
 
+
        /**
         * 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 ) {
-               return self::getProvider()->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 0737770..be46c27 100644 (file)
@@ -31,7 +31,7 @@
  * 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.
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 05ac64e..a872d84 100644 (file)
@@ -97,16 +97,6 @@ class MWLoggerMonologHandler extends \Monolog\Handler\AbstractProcessingHandler
                $this->useLegacyFilter = $useLegacyFilter;
        }
 
-       public function isHandling( array $record ) {
-               $levelOk = parent::isHandling( $record );
-               if ( $levelOk && $this->useLegacyFilter ) {
-                       return MWLoggerLegacyLogger::shouldEmit(
-                               $record['channel'], $record['message'], $record['level'], $record
-                       );
-               }
-               return $levelOk;
-       }
-
        /**
         * Open the log sink described by our stream URI.
         */
@@ -183,6 +173,18 @@ class MWLoggerMonologHandler extends \Monolog\Handler\AbstractProcessingHandler
 
 
        protected function write( array $record ) {
+               if ( $this->useLegacyFilter &&
+                       !MWLoggerLegacyLogger::shouldEmit(
+                               $record['channel'], $record['message'],
+                               $record['level'], $record
+               ) ) {
+                       // Do not write record if we are enforcing legacy rules and they
+                       // do not pass this message. This used to be done in isHandling(),
+                       // but Monolog 1.12.0 made a breaking change that removed access
+                       // to the needed channel and context information.
+                       return;
+               }
+
                if ( $this->sink === null ) {
                        $this->openSink();
                }
index 6f6aa72..a9f83b0 100644 (file)
@@ -40,7 +40,7 @@ use Monolog\Formatter\FormatterInterface;
  *         'class' => 'MWLoggerMonologSamplingHandler',
  *         'args' => array(
  *           function() {
- *             return MWLogger::getProvider()->getHandler( 'some-handler');
+ *             return MWLoggerFactory::getProvider()->getHandler( 'some-handler');
  *           },
  *           2, // emit logs with a 1:2 chance
  *         ),
index 121dbe4..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];
diff --git a/includes/debug/logger/monolog/SyslogHandler.php b/includes/debug/logger/monolog/SyslogHandler.php
new file mode 100644 (file)
index 0000000..50c2fb5
--- /dev/null
@@ -0,0 +1,94 @@
+<?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\SyslogUdpHandler;
+use Monolog\Logger;
+
+/**
+ * Log handler that supports sending log events to a syslog server using RFC
+ * 3164 formatted UDP packets.
+ *
+ * Monolog's SyslogUdpHandler creates a partial RFC 5424 header (PRI and
+ * VERSION) and relies on the associated formatter to complete the header and
+ * message payload. This makes using it with a fixed format formatter like
+ * Monolog\Formatter\LogstashFormatter impossible. Additionally, the direct
+ * syslog input for Logstash only handles RFC 3164 syslog packets.
+ *
+ * This Handler should work with any Formatter. The formatted message will be
+ * prepended with an RFC 3164 message header and a partial message body. The
+ * resulting packet will looks something like:
+ *
+ *   <PRI>DATETIME HOSTNAME PROGRAM: MESSAGE
+ *
+ * This format works as input to rsyslog and can also be processed by the
+ * default Logstash syslog input handler.
+ *
+ * @since 1.25
+ * @author Bryan Davis <bd808@wikimedia.org>
+ * @copyright © 2015 Bryan Davis and Wikimedia Foundation.
+ */
+class MWLoggerMonologSyslogHandler extends SyslogUdpHandler {
+
+       /**
+        * @var string $appname
+        */
+       private $appname;
+
+       /**
+        * @var string $hostname
+        */
+       private $hostname;
+
+
+       /**
+        * @param string $appname Application name to report to syslog
+        * @param string $host Syslog host
+        * @param int $port Syslog port
+        * @param int $facility Syslog message facility
+        * @param string $level The minimum logging level at which this handler
+        *   will be triggered
+        * @param bool $bubble Whether the messages that are handled can bubble up
+        *   the stack or not
+        */
+       public function __construct(
+               $appname,
+               $host,
+               $port = 514,
+               $facility = LOG_USER,
+               $level = Logger::DEBUG,
+               $bubble = true
+       ) {
+               parent::__construct( $host, $port, $facility, $level, $bubble );
+               $this->appname = $appname;
+               $this->hostname = php_uname( 'n' );
+       }
+
+       protected function makeCommonSyslogHeader( $severity ) {
+               $pri = $severity + $this->facility;
+
+               // Goofy date format courtesy of RFC 3164 :(
+               // RFC 3164 actually specifies that the day of month should be space
+               // padded rather than unpadded but this seems to work with rsyslog and
+               // Logstash.
+               $timestamp = date( 'M j H:i:s' );
+
+               return "<{$pri}>{$timestamp} {$this->hostname} {$this->appname}: ";
+       }
+}
index e02cfbc..862ac27 100644 (file)
@@ -43,7 +43,6 @@ class HTMLCacheUpdate implements DeferrableUpdate {
        }
 
        public function doUpdate() {
-
                $job = new HTMLCacheUpdateJob(
                        $this->mTitle,
                        array(
@@ -63,6 +62,5 @@ class HTMLCacheUpdate implements DeferrableUpdate {
                                $job->run(); // just do the purge query now
                        } );
                }
-
        }
 }
index 9c377df..e4f00e7 100644 (file)
@@ -228,12 +228,24 @@ class LinksUpdate extends SqlDataUpdate {
         * Which means do LinksUpdate on all pages that include the current page,
         * using the job queue.
         */
-       function queueRecursiveJobs() {
+       protected function queueRecursiveJobs() {
                self::queueRecursiveJobsForTable( $this->mTitle, 'templatelinks' );
                if ( $this->mTitle->getNamespace() == NS_FILE ) {
                        // Process imagelinks in case the title is or was a redirect
                        self::queueRecursiveJobsForTable( $this->mTitle, 'imagelinks' );
                }
+
+               $bc = $this->mTitle->getBacklinkCache();
+               // Get jobs for cascade-protected backlinks for a high priority queue.
+               // If meta-templates change to using a new template, the new template
+               // should be implicitly protected as soon as possible, if applicable.
+               // These jobs duplicate a subset of the above ones, but can run sooner.
+               // Which ever runs first generally no-ops the other one.
+               $jobs = array();
+               foreach ( $bc->getCascadeProtectedLinks() as $title ) {
+                       $jobs[] = new RefreshLinksJob( $title, array( 'prioritize' => true ) );
+               }
+               JobQueueGroup::singleton()->push( $jobs );
        }
 
        /**
@@ -253,6 +265,7 @@ class LinksUpdate extends SqlDataUpdate {
                                        "refreshlinks:{$table}:{$title->getPrefixedText()}"
                                )
                        );
+
                        JobQueueGroup::singleton()->push( $job );
                        JobQueueGroup::singleton()->deduplicateRootJob( $job );
                }
index 47967e4..1bd2092 100644 (file)
@@ -605,7 +605,7 @@ class DifferenceEngine extends ContextSource {
        protected function getParserOutput( WikiPage $page, Revision $rev ) {
                $parserOptions = $page->makeParserOptions( $this->getContext() );
 
-               if ( !$rev->isCurrent() || !$rev->getTitle()->quickUserCan( "edit" ) ) {
+               if ( !$rev->isCurrent() || !$rev->getTitle()->quickUserCan( 'edit', $this->getUser() ) ) {
                        $parserOptions->setEditSection( false );
                }
 
@@ -962,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"
                        }
 
index 8c0a61a..b87e26d 100644 (file)
@@ -1204,7 +1204,9 @@ abstract class FileBackend {
 
        /**
         * Preload file stat information (concurrently if possible) into in-process cache.
+        *
         * This should be used when stat calls will be made on a known list of a many files.
+        * This does not make use of the persistent file stat cache.
         *
         * @see FileBackend::getFileStat()
         *
@@ -1491,7 +1493,7 @@ abstract class FileBackend {
  * @ingroup FileBackend
  * @since 1.23
  */
-class FileBackendException extends MWException {
+class FileBackendException extends Exception {
 }
 
 /**
index a3b0009..de189ec 100644 (file)
@@ -627,7 +627,7 @@ abstract class FileBackendStore extends FileBackend {
                }
                $ps = Profiler::instance()->scopedProfileIn( __METHOD__ . "-{$this->name}" );
                $latest = !empty( $params['latest'] ); // use latest data?
-               if ( !$this->cheapCache->has( $path, 'stat', self::CACHE_TTL ) ) {
+               if ( !$latest && !$this->cheapCache->has( $path, 'stat', self::CACHE_TTL ) ) {
                        $this->primeFileCache( array( $path ) ); // check persistent cache
                }
                if ( $this->cheapCache->has( $path, 'stat', self::CACHE_TTL ) ) {
@@ -1745,17 +1745,18 @@ abstract class FileBackendStore extends FileBackend {
                // Get all cache entries for these container cache keys...
                $values = $this->memCache->getMulti( array_keys( $pathNames ) );
                foreach ( $values as $cacheKey => $val ) {
+                       $path = $pathNames[$cacheKey];
                        if ( is_array( $val ) ) {
-                               $path = $pathNames[$cacheKey];
+                               $val['latest'] = false; // never completely trust cache
                                $this->cheapCache->set( $path, 'stat', $val );
                                if ( isset( $val['sha1'] ) ) { // some backends store SHA-1 as metadata
                                        $this->cheapCache->set( $path, 'sha1',
-                                               array( 'hash' => $val['sha1'], 'latest' => $val['latest'] ) );
+                                               array( 'hash' => $val['sha1'], 'latest' => false ) );
                                }
                                if ( isset( $val['xattr'] ) ) { // some backends store headers/metadata
                                        $val['xattr'] = self::normalizeXAttributes( $val['xattr'] );
                                        $this->cheapCache->set( $path, 'xattr',
-                                               array( 'map' => $val['xattr'], 'latest' => $val['latest'] ) );
+                                               array( 'map' => $val['xattr'], 'latest' => false ) );
                                }
                        }
                }
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 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 16d3de1..24d96e0 100644 (file)
@@ -61,7 +61,7 @@ class MemcLockManager extends QuorumLockManager {
         *                    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 58245a5..d1a16b5 100644 (file)
@@ -1681,23 +1681,26 @@ class FileRepo {
         * Create a new fatal error
         *
         * @param string $message
-        * @return FileRepoStatus
+        * @return Status
         */
        public function newFatal( $message /*, parameters...*/ ) {
-               $params = func_get_args();
-               array_unshift( $params, $this );
+               $status = call_user_func_array( array( 'Status', 'newFatal' ), func_get_args() );
+               $status->cleanCallback = $this->getErrorCleanupFunction();
 
-               return call_user_func_array( array( 'FileRepoStatus', 'newFatal' ), $params );
+               return $status;
        }
 
        /**
         * Create a new good result
         *
         * @param null|string $value
-        * @return FileRepoStatus
+        * @return Status
         */
        public function newGood( $value = null ) {
-               return FileRepoStatus::newGood( $this, $value );
+               $status = Status::newGood( $value );
+               $status->cleanCallback = $this->getErrorCleanupFunction();
+
+               return $status;
        }
 
        /**
index 56848df..daf26ba 100644 (file)
 /**
  * Generic operation result class for FileRepo-related operations
  * @ingroup FileRepo
+ * @deprecated 1.25
  */
-class FileRepoStatus extends Status {
-       /**
-        * Factory function for fatal errors
-        *
-        * @param FileRepo $repo
-        * @return FileRepoStatus
-        */
-       static function newFatal( $repo /*, parameters...*/ ) {
-               $params = array_slice( func_get_args(), 1 );
-               $result = new self( $repo );
-               call_user_func_array( array( &$result, 'error' ), $params );
-               $result->ok = false;
-
-               return $result;
-       }
-
-       /**
-        * @param FileRepo|bool $repo Default: false
-        * @param mixed $value
-        * @return FileRepoStatus
-        */
-       static function newGood( $repo = false, $value = null ) {
-               $result = new self( $repo );
-               $result->value = $value;
-
-               return $result;
-       }
-
-       /**
-        * @param bool|FileRepo $repo
-        */
-       function __construct( $repo = false ) {
-               if ( $repo ) {
-                       $this->cleanCallback = $repo->getErrorCleanupFunction();
-               }
-       }
-}
+class FileRepoStatus extends Status {}
index 5b0d8e2..1d45428 100644 (file)
@@ -100,8 +100,9 @@ class ArchivedFile {
         * @param Title $title
         * @param int $id
         * @param string $key
+        * @param string $sha1
         */
-       function __construct( $title, $id = 0, $key = '' ) {
+       function __construct( $title, $id = 0, $key = '', $sha1 = '' ) {
                $this->id = -1;
                $this->title = false;
                $this->name = false;
@@ -136,7 +137,11 @@ class ArchivedFile {
                        $this->key = $key;
                }
 
-               if ( !$id && !$key && !( $title instanceof Title ) ) {
+               if ( $sha1 ) {
+                       $this->sha1 = $sha1;
+               }
+
+               if ( !$id && !$key && !( $title instanceof Title ) && !$sha1 ) {
                        throw new MWException( "No specifications provided to ArchivedFile constructor." );
                }
        }
@@ -162,6 +167,9 @@ class ArchivedFile {
                if ( $this->title ) {
                        $conds['fa_name'] = $this->title->getDBkey();
                }
+               if ( $this->sha1 ) {
+                       $conds['fa_sha1'] = $this->sha1;
+               }
 
                if ( !count( $conds ) ) {
                        throw new MWException( "No specific information for retrieving archived file" );
index df85f9c..6ca61b2 100644 (file)
@@ -2046,6 +2046,17 @@ abstract class File {
                return $this->repo->getFileTimestamp( $this->getPath() );
        }
 
+       /**
+        * Returns the timestamp (in TS_MW format) of the last change of the description page.
+        * Returns false if the file does not have a description page, or retrieving the timestamp
+        * would be expensive.
+        * @since 1.25
+        * @return string|bool
+        */
+       public function getDescriptionTouched() {
+               return false;
+       }
+
        /**
         * Get the SHA-1 base 36 hash of the file
         *
index b2e5b00..699c915 100644 (file)
@@ -109,6 +109,9 @@ class LocalFile extends File {
        /** @var string Description of current revision of the file */
        private $description;
 
+       /** @var string TS_MW timestamp of the last change of the file description */
+       private $descriptionTouched;
+
        /** @var bool Whether the row was upgraded on load */
        private $upgraded;
 
@@ -1777,6 +1780,22 @@ class LocalFile extends File {
                return $this->timestamp;
        }
 
+       /**
+        * @return bool|string
+        */
+       public function getDescriptionTouched() {
+               // The DB lookup might return false, e.g. if the file was just deleted, or the shared DB repo
+               // itself gets it from elsewhere. To avoid repeating the DB lookups in such a case, we
+               // need to differentiate between null (uninitialized) and false (failed to load).
+               if ( $this->descriptionTouched === null ) {
+                       $cond = array( 'page_namespace' => $this->title->getNamespace(), 'page_title' => $this->title->getDBkey() );
+                       $touched = $this->repo->getSlaveDB()->selectField( 'page', 'page_touched', $cond, __METHOD__ );
+                       $this->descriptionTouched = $touched ? wfTimestamp( TS_MW, $touched ) : false;
+               }
+
+               return $this->descriptionTouched;
+       }
+
        /**
         * @return string
         */
index 5a3e4e9..4c11341 100644 (file)
@@ -165,6 +165,18 @@ class UnregisteredLocalFile extends File {
                return $this->handler->getImageSize( $this, $this->getLocalRefPath() );
        }
 
+       /**
+       * @return int
+       */
+       function getBitDepth() {
+               $gis = $this->getImageSize( $this->getLocalRefPath() );
+
+               if ( !$gis || !isset( $gis['bits'] ) ) {
+                       return 0;
+               }
+               return $gis['bits'];
+       }
+
        /**
         * @return bool
         */
index 2a888a5..c89c6b6 100644 (file)
 abstract class ImageGalleryBase extends ContextSource {
        /**
         * @var array Gallery images
-        * @deprecated since 1.23 (was declared "var") and will be removed in 1.24
         */
-       public $mImages;
+       protected $mImages;
 
        /**
         * @var bool Whether to show the filesize in bytes in categories
-        * @deprecated since 1.23 (was declared "var") and will be removed in 1.24
         */
-       public $mShowBytes;
+       protected $mShowBytes;
 
        /**
         * @var bool Whether to show the filename. Default: true
-        * @deprecated since 1.23 (was declared "var") and will be removed in 1.24
         */
-       public $mShowFilename;
+       protected $mShowFilename;
 
        /**
         * @var string Gallery mode. Default: traditional
-        * @deprecated since 1.23 (was declared "var") and will be removed in 1.24
         */
-       public $mMode;
+       protected $mMode;
 
        /**
         * @var bool|string Gallery caption. Default: false
-        * @deprecated since 1.23 (was declared "var") and will be removed in 1.24
         */
-       public $mCaption = false;
+       protected $mCaption = false;
 
        /**
         * @var bool Hide blacklisted images?
-        * @deprecated since 1.23 (was declared "var") and will be removed in 1.24
         */
-       public $mHideBadImages;
+       protected $mHideBadImages;
 
        /**
         * @var Parser Registered parser object for output callbacks
index e54f748..4942327 100644 (file)
@@ -58,23 +58,16 @@ class HTMLCheckField extends HTMLFormField {
         * @return string
         */
        function loadDataFromRequest( $request ) {
-               $invert = false;
-               if ( isset( $this->mParams['invert'] ) && $this->mParams['invert'] ) {
-                       $invert = true;
-               }
+               $invert = isset( $this->mParams['invert'] ) && $this->mParams['invert'];
 
                // GetCheck won't work like we want for checks.
                // Fetch the value in either one of the two following case:
                // - we have a valid token (form got posted or GET forged by the user)
                // - checkbox name has a value (false or true), ie is not null
                if ( $request->getCheck( 'wpEditToken' ) || $request->getVal( $this->mName ) !== null ) {
-                       // XOR has the following truth table, which is what we want
-                       // INVERT VALUE | OUTPUT
-                       // true   true  | false
-                       // false  true  | true
-                       // false  false | false
-                       // true   false | true
-                       return $request->getBool( $this->mName ) xor $invert;
+                       return $invert
+                               ? !$request->getBool( $this->mName )
+                               : $request->getBool( $this->mName );
                } else {
                        return $this->getDefault();
                }
index 6c538fd..83f1266 100644 (file)
@@ -178,6 +178,13 @@ class HTMLCheckMatrix extends HTMLFormField implements HTMLNestedFilterable {
                $helptext = $this->getHelpTextHtmlTable( $this->getHelpText() );
                $cellAttributes = array( 'colspan' => 2 );
 
+               $hideClass = '';
+               $hideAttributes = array();
+               if ( $this->mHideIf ) {
+                       $hideAttributes['data-hide-if'] = FormatJson::encode( $this->mHideIf );
+                       $hideClass = 'mw-htmlform-hide-if';
+               }
+
                $label = $this->getLabelHtml( $cellAttributes );
 
                $field = Html::rawElement(
@@ -186,9 +193,12 @@ class HTMLCheckMatrix extends HTMLFormField implements HTMLNestedFilterable {
                        $inputHtml . "\n$errors"
                );
 
-               $html = Html::rawElement( 'tr', array( 'class' => 'mw-htmlform-vertical-label' ), $label );
+               $html = Html::rawElement( 'tr',
+                       array( 'class' => "mw-htmlform-vertical-label $hideClass" ) + $hideAttributes,
+                       $label );
                $html .= Html::rawElement( 'tr',
-                       array( 'class' => "mw-htmlform-field-$fieldType {$this->mClass} $errorClass" ),
+                       array( 'class' => "mw-htmlform-field-$fieldType {$this->mClass} $errorClass $hideClass" ) +
+                               $hideAttributes,
                        $field );
 
                return $html . $helptext;
index 3b38fbe..2ef4978 100644 (file)
@@ -17,7 +17,7 @@ class HTMLFloatField extends HTMLTextField {
 
                $value = trim( $value );
 
-               # http://dev.w3.org/html5/spec/common-microsyntaxes.html#real-numbers
+               # http://www.w3.org/TR/html5/infrastructure.html#floating-point-numbers
                # with the addition that a leading '+' sign is ok.
                if ( !preg_match( '/^((\+|\-)?\d+(\.\d+)?(E(\+|\-)?\d+)?)?$/i', $value ) ) {
                        return $this->msg( 'htmlform-float-invalid' )->parseAsBlock();
index d0ee13b..b0148d9 100644 (file)
@@ -11,7 +11,7 @@ class HTMLIntField extends HTMLFloatField {
                        return $p;
                }
 
-               # http://dev.w3.org/html5/spec/common-microsyntaxes.html#signed-integers
+               # http://www.w3.org/TR/html5/infrastructure.html#signed-integers
                # with the addition that a leading '+' sign is ok. Note that leading zeros
                # are fine, and will be left in the input, which is useful for things like
                # phone numbers when you know that they are integers (the HTML5 type=tel
index eac9423..8075de5 100644 (file)
@@ -1,14 +1,30 @@
 <?php
 /**
- * Wrapper for ChgangeTags::buildTagFilterSelector to use in HTMLForm
+ * Wrapper for ChangeTags::buildTagFilterSelector to use in HTMLForm
  */
 class HTMLTagFilter extends HTMLFormField {
+       protected $tagFilter;
+
+       function getTableRow( $value ) {
+               $this->tagFilter = ChangeTags::buildTagFilterSelector( $value );
+               if ( $this->tagFilter ) {
+                       return parent::getTableRow( $value );
+               }
+               return '';
+       }
+
+       function getDiv( $value ) {
+               $this->tagFilter = ChangeTags::buildTagFilterSelector( $value );
+               if ( $this->tagFilter ) {
+                       return parent::getDiv( $value );
+               }
+               return '';
+       }
+
        function getInputHTML( $value ) {
-               $tagFilter = ChangeTags::buildTagFilterSelector( $value );
-               if ( $tagFilter ) {
-                       list( $tagFilterLabel, $tagFilterSelector ) = $tagFilter;
+               if ( $this->tagFilter ) {
                        // we only need the select field, HTMLForm should handle the label
-                       return $tagFilterSelector;
+                       return $this->tagFilter[1];
                }
                return '';
        }
index f36bac1..1c15ad0 100644 (file)
@@ -657,7 +657,7 @@ abstract class DatabaseInstaller {
                        if ( $row == "" ) {
                                continue;
                        }
-                       $row .= "||";
+                       $row .= "|";
                        $interwikis[] = array_combine(
                                array( 'iw_prefix', 'iw_url', 'iw_local', 'iw_api', 'iw_wikiid' ),
                                explode( '|', $row )
index 7a36f01..eada44a 100644 (file)
@@ -37,7 +37,6 @@ class MysqlUpdater extends DatabaseUpdater {
                        array( 'addField', 'ipblocks', 'ipb_expiry', 'patch-ipb_expiry.sql' ),
                        array( 'doInterwikiUpdate' ),
                        array( 'doIndexUpdate' ),
-                       array( 'addTable', 'hitcounter', 'patch-hitcounter.sql' ),
                        array( 'addField', 'recentchanges', 'rc_type', 'patch-rc_type.sql' ),
                        array( 'addIndex', 'recentchanges', 'new_name_timestamp', 'patch-rc-newindex.sql' ),
 
@@ -271,6 +270,7 @@ class MysqlUpdater extends DatabaseUpdater {
                        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' ),
+                       array( 'doUserNewTalkUseridUnsigned' ),
                );
        }
 
@@ -1063,4 +1063,26 @@ class MysqlUpdater extends DatabaseUpdater {
                        'Making iwl_prefix_title_from index non-UNIQUE'
                );
        }
+
+       protected function doUserNewTalkUseridUnsigned() {
+               if ( !$this->doTable( 'user_newtalk' ) ) {
+                       return true;
+               }
+
+               $info = $this->db->fieldInfo( 'user_newtalk', 'user_id' );
+               if ( $info === false ) {
+                       return true;
+               }
+               if ( ( $info->flags() & 32 /*MYSQLI_UNSIGNED_FLAG*/ ) ) {
+                       $this->output( "...user_id is already unsigned int.\n" );
+
+                       return true;
+               }
+
+               return $this->applyPatch(
+                       'patch-user-newtalk-userid-unsigned.sql',
+                       false,
+                       'Making user_id unsigned int'
+               );
+       }
 }
index bc25455..6ac5436 100644 (file)
@@ -384,8 +384,6 @@ class PostgresUpdater extends DatabaseUpdater {
                                'page(page_id) ON DELETE CASCADE' ),
                        array( 'changeFkeyDeferrable', 'protected_titles', 'pt_user',
                                'mwuser(user_id) ON DELETE SET NULL' ),
-                       array( 'changeFkeyDeferrable', 'recentchanges', 'rc_cur_id',
-                               'page(page_id) ON DELETE SET NULL' ),
                        array( 'changeFkeyDeferrable', 'recentchanges', 'rc_user',
                                'mwuser(user_id) ON DELETE SET NULL' ),
                        array( 'changeFkeyDeferrable', 'redirect', 'rd_from', 'page(page_id) ON DELETE CASCADE' ),
@@ -423,6 +421,7 @@ class PostgresUpdater extends DatabaseUpdater {
                        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' ),
+                       array( 'dropFkey', 'recentchanges', 'rc_cur_id' )
                );
        }
 
@@ -774,6 +773,24 @@ END;
                }
        }
 
+       protected function dropFkey( $table, $field ) {
+               $fi = $this->db->fieldInfo( $table, $field );
+               if ( is_null( $fi ) ) {
+                       $this->output( "WARNING! Column '$table.$field' does not exist but it should! " .
+                               "Please report this.\n" );
+                       return;
+               }
+               $conname = $fi->conname();
+               if ( $fi->conname() ) {
+                       $this->output( "Dropping foreign key constraint on '$table.$field'\n" );
+                       $conclause = "CONSTRAINT \"$conname\"";
+                       $command = "ALTER TABLE $table DROP CONSTRAINT $conname";
+                       $this->db->query( $command );
+               } else {
+                       $this->output( "...foreign key constraint on '$table.$field' already does not exist\n" );
+               };
+       }
+
        protected function changeFkeyDeferrable( $table, $field, $clause ) {
                $fi = $this->db->fieldInfo( $table, $field );
                if ( is_null( $fi ) ) {
index dd54831..7b3b5a5 100644 (file)
@@ -54,6 +54,7 @@
        "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",
@@ -70,6 +71,7 @@
        "config-uploads-not-safe": "<strong>Avís:</strong> El directori de càrregues per defecte <code>$1</code> és vulnerable a l'execució d'scripts arbitraris.\nEncara que el MediaWiki comprova tots els fitxers que es carreguen davant d'amenaces de seguretat, és molt recomanable [//www.mediawiki.org/ wiki/Special:MyLanguage/Manual:Security#Upload_security tancar aquesta vulnerabilitat de seguretat] abans d'habilitar les càrregues.",
        "config-db-type": "Tipus de base de dades:",
        "config-db-host": "Servidor de la base de dades:",
+       "config-db-host-oracle": "TNS de la base de dades:",
        "config-db-wiki-settings": "Identifica aquest wiki",
        "config-db-name": "Nom de la base de dades:",
        "config-db-name-help": "Trieu un nom que identifiqui el wiki.\nNo ha de contenir espais.\n\nSi esteu fent servir un hostatge web compartit, el vostre proveïdor us proporcionarà un nom específic per a la base de dades o us permetrà crear base de dades des d'un tauler de control.",
        "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-mssql-old": "Cal utilitzar el Microsoft SQL Server $1 o posterior. Teniu la versió $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].",
diff --git a/includes/installer/i18n/eml.json b/includes/installer/i18n/eml.json
new file mode 100644 (file)
index 0000000..37fefef
--- /dev/null
@@ -0,0 +1,16 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Gloria sah"
+               ]
+       },
+       "config-information": "Infurmasiòun",
+       "config-your-language": "La tó lengva:",
+       "config-page-language": "Lengva",
+       "config-charset-mysql5-binary": "binàri MySQL 4.1/5.0",
+       "config-charset-mysql5": "MySQL 4.1/5.0 UTF-8",
+       "config-admin-password-mismatch": "El dó paró li cêv 't ê pruvê i n'vàn mia bèin.",
+       "config-admin-email": "Indirìs e-mail:",
+       "config-optional-continue": "Edmànd-em de piò.",
+       "config-license-cc-by": "Atribusiòun Creative Commons"
+}
index 4bf1268..d29a3d4 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "Avjoska",
                        "Pikne",
-                       "Boxmein"
+                       "Boxmein",
+                       "Cumbril"
                ]
        },
        "config-information": "Teave",
        "config-admin-email": "E-posti aadress:",
        "config-admin-error-bademail": "Sisestasid vigase e-posti aadressi.",
        "config-optional-continue": "Küsi minult veel küsimusi.",
+       "config-profile-wiki": "Avalik viki",
+       "config-profile-no-anon": "Registreerumine nõutav",
+       "config-profile-fishbowl": "Ainult volitatud kasutajad",
        "config-profile-private": "Eraviki",
+       "config-profile-help": "Vikid toimivad kõige paremini siis, kui lased neid redigeerida nii paljudel inimestel kui võimalik.\nMediaWikis on lihtne viimaseid muudatusi üle vaadata ja pöörata tagasi oskamatute või pahatahtlike kasutajate tehtud kahju.\n\nEnt inimesed on leidnud MediaWikile mitmesuguseid erinevaid kasutusvõimalusi ja mõnikord pole lihtne kõiki veenda viki meetodi kasulikkuses. \nSeega on sul valik.\n\n\"<strong>{{int:config-profile-wiki}}</strong>\" annab kõigile redigeerimisvõimaluse isegi sisse logimata.\nMudeli \"<strong>{{int:config-profile-no-anon}}</strong>\" viki tagab lisavastutuse, kuid võib juhuslikud kaastöölised eemale peletada.\n\nStsenaarium \"<strong>{{int:config-profile-fishbowl}}</strong>\" võimaldab redigeerida heaks kiidetud kasutajatel, kuid avalikkus saab lehekülgi ja nende ajalugu vaadata.\n\"<strong>{{int:config-profile-private}}</strong>\" laseb vaid heaks kiidetud kasutajatel lehekülgi vaadata ja samadel kasutajatel on õigus lehekülgi redigeerida.\n\nPärast paigaldamist on kasutajaõigusi võimalik täpsemalt häälestada, vaata [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights kasutusjuhendi vastavat kohta].",
        "config-license": "Autoriõigus ja litsents:",
        "config-license-none": "Litsentsijaluseta",
        "config-license-cc-by-sa": "Creative Commonsi litsents \"Autorile viitamine + jagamine samadel tingimustel\"",
index 7e06c60..ac486bb 100644 (file)
        "config-db-name": "نام پایگاه اطلاعاتی:",
        "config-db-name-help": "نامی را انتخاب کنید که ویکی شما را شناسایی کند.\nنباید شامل فاصله باشد.\nاگر از گروه شبکهٔ اشتراک‌گذاری استفاده می‌کنید، تهیه‌کنندهٔ گروهتان یا باید به شما نام یک پایگاه اطلاعاتی مشخص برای استفاده بدهد یا برای ایجاد پایگاه‌های اطلاعاتی از طریق یک کنترل پنل به شما اجازه بدهد.",
        "config-db-name-oracle": "طرح کلی پایگاه اطلاعاتی:",
-       "config-db-account-oracle-warn": "برای نصب برنامهٔ اوراکل بهعنوان پایگاه اطلاعاتی در بخش گذشته،سه سناریو پشتیبانی شده است:\nاگر مایل به ایجاد حساب پایگاه اطلاعاتی به عنوان بخشی از روند نصب هستید، لطفاً یک حساب با نقش اس‌وای‌اس‌دی‌بی‌ای به عنوان حساب پایگاه اطلاعاتی برای نصب تهیه کنید و اعتبارنامه‌های مطلوبی را برای حساب دردسترس شبکه تعیین کنید، به عبارتی دیگر یا می‌توانید حساب دردسترس شبکه را به طور دستی ایجاد کنید و تنها آن حساب را تهیه کنید (اگر مستلزم مجوزهایی برای ایجاد موضوعات طرح کلی باشد) یا دو حساب دیگر تهیه کنید،یکی با ایجاد مزایا و یک حساب محدود برای دسترسی شبکه.\nمتنی برای ایجاد یک حساب با مزایای لازم بنویسید که می‌تواند در فهرست\"نگهداری/برنامهٔ اوراکل\" این نصب یافت شود. به یاد داشته باشید که استفاده از یک حساب محدود،همهٔ قابلیت‌های نگهداری با حساب پیش‌فرض را غیرفعال خواهد کرد.",
+       "config-db-account-oracle-warn": "برای نصب برنامهٔ اوراکل به عنوان پایگاه اطلاعاتی در بخش گذشته،سه سناریو پشتیبانی شده است:\nاگر مایل به ایجاد حساب پایگاه اطلاعاتی به عنوان بخشی از روند نصب هستید، لطفاً یک حساب با نقش اس‌وای‌اس‌دی‌بی‌ای به عنوان حساب پایگاه اطلاعاتی برای نصب تهیه کنید و اعتبارنامه‌های مطلوبی را برای حساب دردسترس شبکه تعیین کنید، به عبارتی دیگر یا می‌توانید حساب دردسترس شبکه را به طور دستی ایجاد کنید و تنها آن حساب را تهیه کنید (اگر مستلزم مجوزهایی برای ایجاد موضوعات طرح کلی باشد) یا دو حساب دیگر تهیه کنید،یکی با ایجاد مزایا و یک حساب محدود برای دسترسی شبکه.\nمتنی برای ایجاد یک حساب با مزایای لازم بنویسید که می‌تواند در فهرست\"نگهداری/برنامهٔ اوراکل\" این نصب یافت شود. به یاد داشته باشید که استفاده از یک حساب محدود،همهٔ قابلیت‌های نگهداری با حساب پیش‌فرض را غیرفعال خواهد کرد.",
        "config-db-install-account": "حساب کاربری برای نصب",
        "config-db-username": "نام کاربری پایگاه اطلاعات:",
        "config-db-password": "گذرواژه پایگاه داده‌ها:",
index 0a118f0..6b01b61 100644 (file)
@@ -15,7 +15,8 @@
                        "Syreeni",
                        "Stryn",
                        "SMAUG",
-                       "SuperPete"
+                       "SuperPete",
+                       "McSalama"
                ]
        },
        "config-desc": "MediaWiki-asennin",
        "config-pg-test-error": "Tietokantaan <strong>$1 ei voida muodostaa yhteyttä</strong>: $2",
        "config-sqlite-dir": "SQLiten datahakemisto:",
        "config-sqlite-dir-help": "SQLite tallentaa kaiken sisällön yhteen tiedostoon.\n\nPalvelimen pitää pystyä kirjoittamaan tietoa hakemistoon asennuksen aikana.\n\nHakemiston <strong>ei</strong> tulisi olla nähtävissä www-selaimella. Siksi hakemisto on eri kuin missä PHP-tiedostot sijaitsevat.\n\nAsennusohjelma luo <code>.htaccess</code>-tiedoston, mutta jos sen luomisessa ilmenee ongelmia joku voi päästä käsiksi tietokantaasi. \nTietokannassa on kaikki sähköpostiosoitteet, salasanat, poistetut versiot ja kaikki muu tieto, joka ei näy wikissä.\n\nSuosittelemme tallentamaan tietokannan eri hakemistoon, esimerkiksi <code>/var/lib/mediawiki/yourwiki</code>.",
+       "config-oracle-def-ts": "Oletus taulukkotila:",
+       "config-oracle-temp-ts": "Väliaikainen taulukkotila:",
        "config-type-mysql": "MySQL (tai yhteensopiva)",
        "config-type-postgres": "PostgreSQL",
        "config-type-sqlite": "SQLite",
        "config-type-oracle": "Oracle",
+       "config-type-mssql": "Microsoft SQL Server",
        "config-header-mysql": "MySQL-asetukset",
        "config-header-postgres": "PostgreSQL-asetukset",
        "config-header-sqlite": "SQLite-asetukset",
index 9fd6726..c975090 100644 (file)
@@ -21,7 +21,8 @@
                        "Maxim21",
                        "Wladek92",
                        "Scoopfinder",
-                       "Seb35"
+                       "Seb35",
+                       "Linedwell"
                ]
        },
        "config-desc": "Le programme d’installation de MediaWiki",
@@ -71,7 +72,7 @@
        "config-unicode-using-intl": "Utilisation de [http://pecl.php.net/intl l'extension PECL intl] pour la normalisation Unicode.",
        "config-unicode-pure-php-warning": "<strong>Attention</strong> : L'[http://pecl.php.net/intl extension PECL intl] n'est pas disponible pour la normalisation d’Unicode, retour à la version lente implémentée en PHP.\nSi votre site web sera très fréquenté, vous devriez lire ceci : [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations ''Unicode normalization''] (en anglais).",
        "config-unicode-update-warning": "'''Attention''': La version installée du ''wrapper'' de normalisation Unicode utilise une vieille version de la [http://site.icu-project.org/ bibliothèque logicielle ''ICU Project''].\nVous devriez faire une [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations mise à jour] si vous êtes tout à fait concerné par l'usage d'Unicode.",
-       "config-no-db": "Impossible de trouver un pilote de base de données approprié ! Vous devez installer un pilote de base de données pour PHP. Les types de bases de données suivants sont reconnus : $1.\n\nSi vous avez compilé PHP vous-même, reconfigurez-le avec un client de base de données activé, par exemple en utilisant <code>./configure --with-mysqli</code>. Si vous avez installé PHP depuis un paquet Debian ou Ubuntu, alors vous devrez aussi installer, par exemple, le paquet <code>php5-mysql</code>.",
+       "config-no-db": "Impossible de trouver un pilote de base de données approprié ! Vous devez installer un pilote de base de données pour PHP. {{PLURAL:$2|Le type suivant|Les types suivants}} de bases de données {{PLURAL:$2|est reconnu|sont reconnus}} : $1.\n\nSi vous avez compilé PHP vous-même, reconfigurez-le avec un client de base de données actif, par exemple en utilisant <code>./configure --with-mysqli</code>. Si vous avez installé PHP depuis un paquet Debian ou Ubuntu, alors vous devrez aussi installer, par exemple, le paquet <code>php5-mysql</code>.",
        "config-outdated-sqlite": "'''Attention''': vous avez SQLite $1, qui est inférieur à la version minimale requise $2. SQLite sera indisponible.",
        "config-no-fts3": "'''Attention :''' SQLite est compilé sans le module [//sqlite.org/fts3.html FTS3] ; les fonctions de recherche ne seront pas disponibles sur ce moteur.",
        "config-register-globals-error": "<strong>Erreur : L’option <code>[http://php.net/register_globals register_globals]</code> de PHP est activée.\nElle doit être désactivée pour poursuivre l’installation.</strong>\nVoyez [https://www.mediawiki.org/wiki/register_globals https://www.mediawiki.org/wiki/register_globals] pour avoir de l’aide sur la manière de faire cela.",
index ab59ac1..39c46b5 100644 (file)
@@ -15,5 +15,5 @@
        "config-admin-password": "Wachtwurd:",
        "config-help": "help",
        "mainpagetext": "'''MediaWiki-program goed ynstallearre.'''",
-       "mainpagedocfooter": "Rieplachtsje de [//meta.wikimedia.org/wiki/Help:Contents Ynhâldsopjefte hantlieding] foar ynformaasje oer it gebrûk fan 'e wikisoftware.\n\n== Mear help oer Mediawiki ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings List mei ynstellings]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Faak stelde fragen (FAQ)]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailinglist foar oankundigings fan nije ferzjes]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]"
+       "mainpagedocfooter": "Rieplachtsje de [//meta.wikimedia.org/wiki/Help:Contents Ynhâldsopjefte hantlieding] foar ynformaasje oer it gebrûk fan 'e wikisoftware.\n\n== Mear help oer Mediawiki ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings List mei ynstellingen]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Faak stelde fragen (FAQ)]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailinglist foar oankundigings fan nije ferzjes]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]"
 }
index a42cb17..940b4c0 100644 (file)
@@ -54,7 +54,7 @@
        "config-unicode-using-intl": "Usando a [http://pecl.php.net/intl extensión intl PECL] para a normalización Unicode.",
        "config-unicode-pure-php-warning": "<strong>Atención:</strong> A [http://pecl.php.net/intl extensión intl PECL] non está dispoñible para manexar a normalización Unicode; volvendo á implementación lenta de PHP puro.\nSe o seu sitio posúe un alto tráfico de visitantes, debería ler un chisco sobre a [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations normalización Unicode].",
        "config-unicode-update-warning": "<strong>Atención:</strong> A versión instalada da envoltura de normalización Unicode emprega unha versión vella da biblioteca [http://site.icu-project.org/ do proxecto ICU].\nDebería [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations actualizar] se o uso de Unicode é importante para vostede.",
-       "config-no-db": "Non se puido atopar un controlador axeitado para a base de datos! Necesita instalar un controlador de base de datos para PHP.\nOs tipos de base de datos admitidos son os seguintes: $1.\n\nSe compilou o PHP vostede mesmo, reconfigúreo activando un cliente de base de datos, por exemplo, usando <code>./configure --with-mysql</code>.\nSe instalou o PHP desde un paquete Debian ou Ubuntu, entón tamén necesita instalar, por exemplo, o módulo <code>php5-mysql</code>.",
+       "config-no-db": "Non se puido atopar un controlador axeitado para a base de datos! Necesita instalar un controlador de base de datos para PHP.\n{{PLURAL:$2|Acéptase o seguinte tipo|Acéptanse os seguintes tipos}} de base de datos: $1.\n\nSe compilou o PHP vostede mesmo, reconfigúreo activando un cliente de base de datos, por exemplo, usando <code>./configure --with-mysql</code>.\nSe instalou o PHP desde un paquete Debian ou Ubuntu, entón tamén necesita instalar, por exemplo, o módulo <code>php5-mysql</code>.",
        "config-outdated-sqlite": "<strong>Atención:</strong> Ten o SQLite $1, que é inferior á versión mínima necesaria: $2. O SQLite non estará dispoñible.",
        "config-no-fts3": "<strong>Atención:</strong> O SQLite está compilado sen o [//sqlite.org/fts3.html módulo FTS3]; as características de procura non estarán dispoñibles nesta instalación.",
        "config-register-globals-error": "<strong>Erro: A opción <code>[http://php.net/register_globals register_globals]</code> do PHP está activada.\nCómpre desactivala para continuar a instalación.</strong>\nConsulte o enderezo [https://www.mediawiki.org/wiki/register_globals https://www.mediawiki.org/wiki/register_globals] para obter axuda sobre como facelo.",
index a35ea31..2303658 100644 (file)
@@ -52,6 +52,7 @@
        "config-env-good": "A környezet ellenőrzése befejeződött.\nA MediaWiki telepíthető.",
        "config-env-bad": "A környezet ellenőrzése befejeződött.\nA MediaWiki nem telepíthető.",
        "config-env-php": "A PHP verziója: $1",
+       "config-env-hhvm": "HHVM verziója: $1",
        "config-unicode-using-utf8": "A rendszer Unicode normalizálására Brion Vibber utf8_normalize.so könyvtárát használja.",
        "config-unicode-using-intl": "A rendszer Unicode normalizálására az [http://pecl.php.net/intl intl PECL kiterjesztést] használja.",
        "config-unicode-pure-php-warning": "'''Figyelmeztetés''': Az Unicode normalizáláshoz szükséges [http://pecl.php.net/intl intl PECL kiterjesztés] nem érhető el, helyette a lassú, PHP alapú implementáció lesz használva.\nHa nagy látogatottságú oldalt üzemeltetsz, itt találhatsz további információkat [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations a témáról].",
index c2411ef..47dea14 100644 (file)
@@ -8,7 +8,8 @@
                        "아라",
                        "C5st4wr6ch",
                        "Seb35",
-                       "Arifin.wijaya"
+                       "Arifin.wijaya",
+                       "Ilham151096"
                ]
        },
        "config-desc": "Penginstal untuk MediaWiki",
@@ -53,6 +54,7 @@
        "config-env-good": "Kondisi telah diperiksa.\nAnda dapat menginstal MediaWiki.",
        "config-env-bad": "Kondisi telah diperiksa.\nAnda tidak dapat menginstal MediaWiki.",
        "config-env-php": "PHP $1 diinstal.",
+       "config-env-hhvm": "HHVM $1 telah dipasang.",
        "config-unicode-using-utf8": "Menggunakan utf8_normalize.so Brion Vibber untuk normalisasi Unicode.",
        "config-unicode-using-intl": "Menggunakan [http://pecl.php.net/intl ekstensi PECL intl] untuk normalisasi Unicode.",
        "config-unicode-pure-php-warning": "'''Peringatan''': [http://pecl.php.net/intl Ekstensi intl PECL] untuk menangani normalisasi Unicode tidak tersedia, kembali menggunakan implementasi murni PHP yang lambat.\nJika Anda menjalankan situs berlalu lintas tinggi, Anda harus sedikit membaca [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations normalisasi Unicode].",
index 8ef3188..b9aab3a 100644 (file)
@@ -61,7 +61,7 @@
        "config-unicode-using-intl": "Usa [http://pecl.php.net/intl l'estensione PECL intl] per la normalizzazione Unicode.",
        "config-unicode-pure-php-warning": "'''Attenzione:''' [http://pecl.php.net/intl l'estensione PECL intl] non è disponibile per gestire la normalizzazione Unicode, così si usa la lenta implementazione in puro PHP.\nSe esegui un sito ad alto traffico, dovresti leggere alcune considerazioni sulla [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations normalizzazione Unicode].",
        "config-unicode-update-warning": "'''Attenzione:''' La versione installata del gestore per la normalizzazione Unicode usa una vecchia versione della libreria [http://site.icu-project.org/ del progetto ICU].\nDovresti [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations aggiornare] se ti interessa usare l'Unicode.",
-       "config-no-db": "Impossibile trovare un driver adatto per il database! È necessario installare un driver per PHP.\nI seguenti formati di database sono supportati: $1.\n\nSe compili PHP autonomamente, riconfiguralo attivando un client database, per esempio utilizzando <code>./configure --with-mysqli</code>.\nQualora avessi installato PHP per mezzo di un pacchetto Debian o Ubuntu, allora devi installare anche il pacchetto <code>php5-mysql</code>.",
+       "config-no-db": "Impossibile trovare un driver adatto per il database! È necessario installare un driver per PHP.\n{{PLURAL:$2|Il seguente formato di database è supportato|I seguenti formati di database sono supportati}}: $1.\n\nSe compili PHP autonomamente, riconfiguralo attivando un client database, per esempio utilizzando <code>./configure --with-mysqli</code>.\nQualora avessi installato PHP per mezzo di un pacchetto Debian o Ubuntu, allora devi installare anche il pacchetto <code>php5-mysql</code>.",
        "config-outdated-sqlite": "'''Attenzione''': è presente SQLite $1 mentre è richiesta la versione $2, SQLite non sarà disponibile.",
        "config-no-fts3": "'''Attenzione''': SQLite è compilato senza il [//sqlite.org/fts3.html modulo FTS3], le funzionalità di ricerca non saranno disponibili su questo backend.",
        "config-register-globals-error": "<strong>Errore: l'opzione PHP <code>[http://php.net/register_globals register_globals]</code> è abilitata.\nDeve essere disabilitata per continuare con l'installazione.</strong>\nVedi [https://www.mediawiki.org/wiki/register_globals https://www.mediawiki.org/wiki/register_globals] per un aiuto su come farlo.",
index a08c83a..920d9ae 100644 (file)
@@ -6,6 +6,7 @@
        },
        "config-information": "Agahî",
        "config-your-language": "Zimanê te:",
+       "config-wiki-language": "Zimanê wîkiyê:",
        "config-page-language": "Ziman",
        "config-page-name": "Nav",
        "config-page-options": "Vebijêrk",
index bb1c829..2dccc50 100644 (file)
@@ -46,7 +46,7 @@
        "config-env-php": "PHP $1 ass installéiert.",
        "config-env-hhvm": "HHVM $1 ass installéiert.",
        "config-unicode-using-utf8": "Fir d'Unicode-Normalisatioun gëtt dem Brion Vibber säin <code>utf8_normalize.so</code> benotzt.",
-       "config-no-db": "Et konnt kee passenden Datebank-Driver fonnt ginn! Dir musst een Datebank-Driver fir PHP installéieren.\nDës Datebank-Type ginn ënnerstëtzt: $1.\n\nWann Dir PHP selwer compiléiert hutt, da rekonfiguréiert en mat dem ageschalten Datebank-Client, zum Beispill an deem Dir <code>./configure --with-mysql</code> benotzt.\nWann Dir PHP vun engem Debian oder Ubuntu Package aus installéiert hutt, da musst Dir och den php5-mysql Modul installéieren.",
+       "config-no-db": "Et konnt kee passenden Datebank-Driver fonnt ginn! Dir musst een Datebank-Driver fir PHP installéieren.\n{{PLURAL:$2|Dësn Datebank-Typ gëtt|Dës Datebank-Type ginn}} ënnerstëtzt: $1.\n\nWann Dir PHP selwer compiléiert hutt, da rekonfiguréiert en mat dem ageschalten Datebank-Client, zum Beispill an deem Dir <code>./configure --with-mysql</code> benotzt.\nWann Dir PHP vun engem Debian oder Ubuntu Package aus installéiert hutt, da musst Dir och den php5-mysql Modul installéieren.",
        "config-outdated-sqlite": "'''Warnung:''' SQLite $1 ass installéiert. Allerdengs brauch MediaWiki SQLite $2 oder méi nei. SQLite ass dofir net disponibel.",
        "config-memory-bad": "'''Opgepasst:''' De Parameter <code>memory_limit</code> vu PHP ass $1.\nDat ass wahrscheinlech ze niddreg.\nD'Installatioun kéint net funktionéieren.",
        "config-iconv": "<strong>Fatal:</strong> PHP muss mat Support fir d'[http://www.php.net/manual/en/iconv.installation.php iconv-Erweiderung] kompiléiert ginn.",
        "config-email-settings": "E-Mail-Astellungen",
        "config-enable-email": "E-Mailen déi no bausse ginn aschalten",
        "config-email-user": "Benotzer-op-Benotzer E-Mail aschalten",
+       "config-email-user-help": "All Benotzer erlaben sech géigesäiteg E-Mailen ze schécken, wa si dat an hiren Astellungen aktivéiert hunn.",
        "config-email-usertalk": "Benoriichtege bei Ännerung vun der Benotzerdiskussiounssäit aschalten",
        "config-email-watchlist": "Benoriichtigung vun der Iwwerwaachungslëscht aschalten",
        "config-email-watchlist-help": "Erlaabt et de Benotzer fir Notifikatioune vun hiren iwwerwaachte Säiten ze kréie wa si dat an hiren Astellungen aktivéiert hunn.",
index b8a68a7..3a43d90 100644 (file)
@@ -1,7 +1,8 @@
 {
        "@metadata": {
                "authors": [
-                       "C.R."
+                       "C.R.",
+                       "Chelin"
                ]
        },
        "config-desc": "'O prugramma d'istallazione 'e MediaWiki",
        "config-charset-mysql5-binary": "MySQL 4.1/5.0 binario",
        "config-charset-mysql5": "MySQL 4.1/5.0 UTF-8",
        "config-charset-mysql4": "MySQL 4.0 cu compatibbelità UTF-8",
+       "config-charset-help": "<strong>Attenziò:</strong> Si state ausanno <strong>backwards-compatible UTF-8</strong> ncopp' 'o MySQL 4.1+, e po' se fà 'o backup d' 'o databas c' 'o codece <code>mysqldump</code>, putesse scassà tutt' 'e carattere nun-ASCII, sfunnanno irreversibbilmente sti backup!\n\nDint' 'a <strong>modalità binaria</strong>, MediaWiki astipa 'o testo UTF-8 dint' 'o database 'n campe binarie.\nChest'è assaje cchiù efficiente rispett' 'a modalità UTF-8 'e MySQL, e te premmettesse 'ausà 'a gamma cumpreta 'e carattere unicode.\nDint' 'o <strong>UTF-8 mode</strong>, MySQL canoscerrà dint'a qualu set 'e carattere stanno 'e date vuoste, putenn'accussì apprisentà e cagnà chiste int'a nu modo appropriato,\nchesto però nun te lassarrà astipà 'e carattere pe' copp' 'o [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane].",
        "config-mysql-old": "MySQL $1 o cchiù muderno è necessario. Vuje avite $2.",
        "config-db-port": "Porta d' 'o database:",
        "config-db-schema": "Schema pe' MediaWiki:",
        "config-db-schema-help": "Stu schema 'n genere sarrà buono.\nSi 'o vulite cagnà facite sulamente si ne tenite abbesuogno.",
        "config-pg-test-error": "Nun se può connettà a 'o database <strong>$1</strong>: $2",
        "config-sqlite-dir": "Cartella 'e data 'e SQLite:",
+       "config-sqlite-dir-help": "SQLite astipa tutte 'e date dint'a n'uneco file.\n\n'A cartella ca starraje a innecà adda essere scrivibbele d' 'o server webe pe' tramente ca sta l'istallazione.\n\nAvess'a essere <strong>nun trasibbele via web</strong>, è pecchesto ca nun se sta mettenno addò stanno 'e file PHP.\n\nL'installatore scriverrà nzieme a chesta nu file <code>.htaccess</code>, ma si 'o tentativo scassasse, coccheruno putesse tenè acciesso dint' 'o database ncruro.\nChesto pure cunzidera 'e date ncruro 'e ll'utente (indirizze, password cifrate) accussì comme 'e verziune luvate e ati dati d'accesso limmetato dint' 'o wiki.\n\nCunzidera ll'opportunità 'e sistimà ô tiempo 'o database 'a n'ata parte, p'esempio int'a <code>/var/lib/mediawiki/tuowiki</code>.",
        "config-oracle-def-ts": "Tablespace 'e default:",
        "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-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] è 'a configurazione cchiù mmeglio p' 'o MediaWiki e è chilla meglio suppurtata. MediaWiki può faticà pure cu' [{{int:version-db-mariadb-url}} MariaDB] e [{{int:version-db-percona-url}} Percona Server], ca fossero MySQL cumpatibbele. ([http://www.php.net/manual/en/mysqli.installation.php Comme s'adda fà pe' cumpilà PHP cu suppuorto MySQL])",
+       "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] è nu sistema canusciuto 'e database open source ca fosse n'alternativa a MySQL. Putess'avé cocch'errore p'arricettà, e nun è cunzigliato 'e ll'ausà dint'a n'ambiente 'e produziona. ([http://www.php.net/manual/en/pgsql.installation.php Comme s'avess'a cumpilà PHP cu suppuorto PostgreSQL])",
        "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-invalid-db-server-oracle": "'O database 'e TNS \"$1\" nun è buono.\nAusate 'o \"TNS Name\" o na catena d' \"Easy Connect\"([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Metude 'e Nommena 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-postgres-old": "PostgreSQL $1 o cchiù muderno è necessario. Vuje tenite $2.",
+       "config-mssql-old": "Microsoft SQL Server $1 o cchiù muderno è necessario. Vuje tenite $2.",
+       "config-sqlite-name-help": "Sciglite nu nomme ca identificasse 'o wiki vuosto.\nNun ausà spazie o trattine.\nChesto serverrà pe' putè miettere 'o nomme ro file 'e date SQLite.",
+       "config-sqlite-parent-unwritable-group": "Nun se pò crià 'a cartella 'e date <code><nowiki>$1</nowiki></code>, pecché 'a cartella supiriore <code><nowiki>$2</nowiki></code> nun se pò scrivere 'a 'o webserver.\n\n'O prugramma d'installazione ha determinato l'utente c' 'o quale 'o server web se stà a esecutà.\nDàte 'a pussibbelità 'e scrivere dint' 'a cartella <code><nowiki>$3</nowiki></code> pe' cuntinuà\nNcopp'a nu sistema Unix/Linux:\n\n<pre>cd $2\nmkdir $3\nchgrp $4 $3\nchmod g+w $3</pre>",
+       "config-sqlite-connection-error": "$1.\n\nCuntrullate 'a cartella 'e date e 'o nomme d' 'o database ccà abbascio e pruvate n'ata vota.",
        "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-can-upgrade": "Nce stanno tabbelle 'e MediaWiki int'a stu database.\nPe ll'agghiurnà a MediaWiki $1, facite click ncopp' 'a '''continua'''.",
+       "config-upgrade-done": "Agghiurnamiento cumpreto.\n\nMo' putite [$1 accummincià 'ausà 'o wiki vuosto].\n\nSi vulite ringignà 'o file vuosto 'e <code>LocalSettings.php</code>, cliccate ncopp' 'o buttone ccà abbascio. St'operazione '''nun è cunzigliata''', si nun è pecché forse tenite cocche prubblema c' 'o wiki vuosto.",
+       "config-upgrade-done-no-regenerate": "Agghiurnamiento cumpreto.\n\nPutite [$1 accummincià 'ausà 'o wiki vuosto].",
        "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-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"
+       "config-ns-site-name": "'O stesso ch' 'o nomme d' 'o wiki: $1",
+       "config-ns-other": "Ati (specificà)",
+       "config-ns-other-default": "MyWiki",
+       "config-ns-invalid": "'O namespace specificato \"<nowiki>$1</nowiki>\" nun è buono.\nSpecificate nu namespace 'e pruggetto differente.",
+       "config-ns-conflict": "'O namespace innecato \"<nowiki>$1</nowiki>\" tràse ncunflitto cu nu namespace predefinito 'e MediaWiki.\nSpecifiate n'atu nomme divierzo 'e namespace 'e pruggetto.",
+       "config-admin-box": "Cunto ammenistratore",
+       "config-admin-name": "'O nomme utente vuosto:",
+       "config-admin-password": "'A password vuosta:",
+       "config-admin-password-confirm": "Password n'ata vota:",
+       "config-admin-help": "Mettite 'o nomme utente ca vuje vulite ccà, p'esempio \"Gennaro Esposito\".\nChest'è 'o nomme ca vuje auserrate pe' trasì 'o wiki.",
+       "config-admin-name-blank": "Mettite nu nomme utente p' 'ammenistratore.",
+       "config-admin-name-invalid": "'O namespace specificato \"<nowiki>$1</nowiki>\" nun è buono.\nSpecificate nu namespace differente.",
+       "config-admin-password-blank": "Miette na password p' 'o cunto d'ammenistratore.",
+       "config-admin-email": "Indirizzo e-mail:",
+       "config-admin-error-bademail": "Avite miso n'indirizzo e-mail invalido.",
+       "config-optional-continue": "Spiate cchiù dimanne.",
+       "config-profile": "Profilo 'e deritte utente:",
+       "config-profile-wiki": "Wiki araputo",
+       "config-profile-no-anon": "Cunto utente obbligatorio",
+       "config-profile-fishbowl": "Surtanto ll'editure premmesse",
+       "config-profile-private": "Wiki privato",
+       "config-license-pd": "Pubbreco duminio",
+       "config-logo": "URL d\"o logo:",
+       "config-cc-again": "Selezziona 'e novo...",
+       "config-install-step-done": "fatto",
+       "config-install-updates": "Mpiccià ll'agghiurnamiente ca nun fossero necessarie",
+       "config-help": "ajùto"
 }
index 55771c8..26772e9 100644 (file)
@@ -55,7 +55,7 @@
        "config-unicode-using-intl": "Bruker [http://pecl.php.net/intl intl PECL-utvidelsen] for Unicode-normalisering.",
        "config-unicode-pure-php-warning": "'''Advarsel''': [http://pecl.php.net/intl intl PECL-utvidelsen] er ikke tilgjengelig for å håndtere Unicode-normaliseringen, faller tilbake til en langsommere ren-PHP-implementasjon.\nOm du kjører et nettsted med høy trafikk bør du lese litt om [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode-normalisering].",
        "config-unicode-update-warning": "'''Advarsel''': Den installerte versjonen av Unicode-normalisereren bruker en eldre versjon av [http://site.icu-project.org/ ICU-prosjektets] bibliotek.\nDu bør [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations oppgradere] om du er bekymret for å bruke Unicode.",
-       "config-no-db": "Fant ingen passende databasedriver! Du må installere en databasedriver for PHP.\nFølgende databasetyper støttes: $1\n\nOm du kompilerte PHP selv, rekonfigurer den med en aktivert databaseklient, for eksempel ved å bruke <code>./configure --with-mysql</code>.\nOm du installerte PHP fra en Debian- eller Ubuntu-pakke, må du også installere for eksempel <code>php5-mysql</code>-pakken.",
+       "config-no-db": "Fant ingen passende databasedriver! Du må installere en databasedriver for PHP.\nFølgende {{PLURAL:$2|databasetype|databasetyper}} støttes: $1\n\nOm du kompilerte PHP selv, rekonfigurer den med en aktivert databaseklient, for eksempel ved å bruke <code>./configure --with-mysql</code>.\nOm du installerte PHP fra en Debian- eller Ubuntu-pakke, må du også installere for eksempel <code>php5-mysql</code>-pakken.",
        "config-outdated-sqlite": "'''Advarsel''': Du har SQLite $1, som er en eldre versjon enn minimumskravet SQLite $2. SQLite vil ikke være tilgjengelig.",
        "config-no-fts3": "'''Advarsel''': SQLite er kompilert uten [//sqlite.org/fts3.html FTS3-modulen], søkefunksjoner vil ikke være tilgjengelig på dette bakstykket.",
        "config-register-globals-error": "<strong>Feil: PHPs <code>[http://php.net/register_globals register_globals]</code>-valg er aktivt.\nDet må deaktiveres for å kunne fortsette med installeringen.</strong>\nSe [https://www.mediawiki.org/wiki/register_globals https://www.mediawiki.org/wiki/register_globals] for å få hjelp til å gjøre dette.",
        "config-license-gfdl": "GNU Free Documentation License 1.3 eller senere",
        "config-license-pd": "Offentlig eiendom",
        "config-license-cc-choose": "Velg en egendefinert Creative Commons-lisens",
-       "config-license-help": "Mange åpne wikier legger alle bidrag under en [http://freedomdefined.org/Definition gratislisens].\nDette gir en følelse av felleseie og stimulerer til langvarige bidrag.\nDette er normalt unødvendig for en privat eller virksomhetsbegrenset wiki.\n\nHvis du ønsker å kunne bruke tekst fra Wikipedia, og at Wikipedia skal kunne ta i mot tekst kopiert fra din wiki, bør du velge '''Creative Commons Attribution Share Alike'''.\n\nWikipedia brukte tidligere GNU Free Documentation License.\nGFDL er en grei lisens, med vanskelig å forstå.\nDet er også vanskelig å gjenbruke innhold lisensiert under GFDL.",
+       "config-license-help": "Mange åpne wikier legger alle bidrag under en [http://freedomdefined.org/Definition gratislisens].\nDette gir en følelse av felleseie og stimulerer til langvarige bidrag.\nDette er normalt unødvendig for en privat eller virksomhetsbegrenset wiki.\n\nHvis du ønsker å kunne bruke tekst fra Wikipedia, og at Wikipedia skal kunne ta i mot tekst kopiert fra din wiki, bør du velge <strong>{{int:config-license-cc-by-sa}}</strong>.\n\nWikipedia brukte tidligere GNU Free Documentation License.\nGFDL er en grei lisens, med vanskelig å forstå.\nDet er også vanskelig å gjenbruke innhold lisensiert under GFDL.",
        "config-email-settings": "E-postinnstillinger",
        "config-enable-email": "Aktiver utgående e-post",
        "config-enable-email-help": "Hvis du vil at e-post skal virke må [http://www.php.net/manual/en/mail.configuration.php PHPs e-postinnstillinger] bli konfigurert riktig.\nHvis du ikke ønsker noen e-postfunksjoner kan du deaktivere dem her.",
        "config-extensions": "Utvidelser",
        "config-extensions-help": "Utvidelsene listet over ble oppdaget i din <code>./extensions</code>-folder.\n\nDisse kan trenge ekstra konfigurering, men du kan aktivisere dem nå.",
        "config-skins": "Drakt",
+       "config-skins-help": "Draktene som listes opp nedenfor ble funnet i <code>./skins</code>-mappen din. Du må slå på minst én, og velge en standarddrakt.",
        "config-skins-use-as-default": "Bruk denne drakta som standard",
+       "config-skins-missing": "Ingen drakter ble funnet; MediaWiki vil bruke en reservedrakt til du har installert noen ordentlige drakter.",
+       "config-skins-must-enable-some": "Du må velge minst én drakt å slå på.",
+       "config-skins-must-enable-default": "Standarddrakten må være slått på.",
        "config-install-alreadydone": "'''Advarsel:''' Det ser ut til at allerede har installert MediaWiki og prøver å installere denne må nytt.\nVær vennlig å fortsette til neste side.",
        "config-install-begin": "Ved å trykke \"{{int:config-continue}}\", starter du installeringen av MediaWiki.\nHvis du først ønsker å endre på noe, trykk\"{{int:config-back}}\".",
        "config-install-step-done": "ferdig",
        "config-install-stats": "Initialiserer statisikk",
        "config-install-keys": "Genererer hemmelige nøkler",
        "config-insecure-keys": "<strong>Advarsel:</strong> {{PLURAL:$2|En sikker nøkkel|Sikre nøkler}} ($1) generert under installeringen er ikke helt {{PLURAL:$2|trygg|trygge}}. Vurder å endre {{PLURAL:$2|den|dem}} manuelt.",
+       "config-install-updates": "Forhindre unødvendige oppdateringer",
+       "config-install-updates-failed": "<strong>Feil:</strong> Innsetting av oppdateringsnøkler i tabellene mislyktes med følgende feilmelding: $1",
        "config-install-sysop": "Oppretter brukerkonto for administrator",
        "config-install-subscribe-fail": "Ikke mulig å abonnere på mediawiki-announce: $1",
        "config-install-subscribe-notpossible": "cURL er ikke installert og <code>allow_url_fopen</code> er ikke tilgjengelig.",
index a28f610..132644d 100644 (file)
@@ -13,7 +13,8 @@
                        "Fabsouza1",
                        "Rodrigo codignoli",
                        "Tuliouel",
-                       "Marcos dias de oliveira"
+                       "Marcos dias de oliveira",
+                       "Fasouzafreitas"
                ]
        },
        "config-desc": "O instalador do MediaWiki",
        "config-install-done": "<strong>Parabéns!</strong>\nVocê concluiu a instalação do MediaWiki.\n\nO instalador gerou um arquivo <code>LocalSettings.php</code>.\nEste arquivo contém todas as suas configurações.\n\nVocê precisa fazer o download desse arquivo e colocá-lo na raiz da sua instalação (o mesmo diretório onde está o arquivo <code>index.php</code>). Este download deve ter sido iniciado automaticamente.\n\nSe o download não foi iniciado, ou se ele foi cancelado, pode recomeçá-lo clicando no link abaixo:\n\n$3\n\n<strong>Nota</strong>: Se não fizer isto agora, o arquivo que foi gerado não estará disponível depois que você sair do processo de instalação sem baixá-lo.\n\nQuando isso tiver sido feito, pode <strong>[$2 entrar na sua wiki]</strong>.",
        "config-download-localsettings": "Baixar <code>LocalSettings.php</code>",
        "config-help": "ajuda",
+       "config-help-tooltip": "clique para expandir",
        "config-nofile": "O arquivo \"$1\" não foi encontrado. Ele foi apagado?",
        "config-extension-link": "Você sabia que sua wiki suporta [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensões]?\n\nVocê pode explorar as  [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensões por categoria] ou visitar a [//www.mediawiki.org/wiki/Extension_Matrix Matriz de Extensões] para ver a lista completa.",
        "mainpagetext": "<strong>O MediaWiki foi instalado com sucesso.</strong>",
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 40dca4d..386215a 100644 (file)
@@ -68,7 +68,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 нормализации Юникода].",
        "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Если вы скомпилировали PHP сами, перенастройте его с включением клиента баз данных, например, с помощью <code>./configure --with-mysqli</code>.\nЕсли вы скомпилировали PHP сами, сконфигурируйте его снова с включенным клиентом базы данных, например, с помощью <code>./configure --with-mysql</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 950ee44..c63ac00 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "Rancher",
                        "Михајло Анђелковић",
-                       "Milicevic01"
+                       "Milicevic01",
+                       "Aktron"
                ]
        },
        "config-desc": "Инсталација за Медијавики",
@@ -42,6 +43,8 @@
        "config-db-type": "Тип базе података:",
        "config-db-host": "Хост базе података",
        "config-db-name": "Назив базе података:",
+       "config-db-password": "Лозинка за базу података:",
+       "config-db-password-empty": "Унесите лозинку за новог корисника базе података: ($1).\n\nМада је могуће отворити налоге без лозинки, то се не препоручује.",
        "config-type-mysql": "MySQL (или компактибилан)",
        "config-type-postgres": "PostgreSQL",
        "config-type-sqlite": "SQLite",
@@ -49,6 +52,7 @@
        "config-type-mssql": "Microsoft SQL Server",
        "config-header-mysql": "MySQL подешавања",
        "config-header-mssql": "Поставке Microsoft SQL Server-а",
+       "config-invalid-db-type": "Неважећи тип базе података.",
        "config-mssql-old": "Потребан је Microsoft SQL Server $1 или новији. Ви имате $2.",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
        "config-admin-name": "Корисничко име:",
        "config-admin-password": "Лозинка:",
        "config-admin-email": "Адреса е-поште:",
+       "config-optional-skip": "Досадно ми је, хајде да инсталирамо вики.",
+       "config-profile-no-anon": "Неопходно је отворити налог",
+       "config-profile-fishbowl": "Само овлашћени корисници",
+       "config-profile-private": "Приватна вики",
        "config-license": "Ауторска права и лиценца:",
        "config-license-none": "Без заглавља са лиценцом",
        "config-license-cc-by-sa": "Creative Commons Ауторство-Делити под истим условима (CC BY-SA)",
        "config-license-cc-0": "Creative Commons Zero (јавно власништво)",
        "config-license-gfdl": "ГНУ-ова лиценца за слободну документацију верзија 1.3 или новија верзија",
        "config-license-pd": "Јавно власништво",
+       "config-email-settings": "Подешавања е-поште",
+       "config-cc-not-chosen": "Одаберите која Кријејтив комонс лиценца вам одговара и потврдите.",
+       "config-skins": "Теме",
+       "config-install-step-done": "готово",
+       "config-install-step-failed": "није успело",
+       "config-help": "помоћ",
+       "config-help-tooltip": "кликните да проширите",
        "mainpagetext": "'''Медијавики је успешно инсталиран.'''",
        "mainpagedocfooter": "Погледајте [//meta.wikimedia.org/wiki/Help:Contents кориснички водич] за коришћење програма.\n\n== Увод ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Помоћ у вези са подешавањима]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Често постављена питања]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Дописна листа о издањима Медијавикија]"
 }
index 60d072a..87ac7a5 100644 (file)
@@ -7,7 +7,8 @@
                        "Josve05a",
                        "Lokal Profil",
                        "Tobulos1",
-                       "Rotsee"
+                       "Rotsee",
+                       "Boom"
                ]
        },
        "config-desc": "Installationsprogrammet för MediaWiki",
@@ -57,7 +58,7 @@
        "config-unicode-using-intl": "Använder [http://pecl.php.net/intl intl PECL-tillägget] för Unicode-normalisering.",
        "config-unicode-pure-php-warning": "'''Varning:''' [http://pecl.php.net/intl intl PECL-tillägget] är inte tillgängligt för att hantera Unicode-normalisering, faller tillbaka till en långsamt implementering i ren PHP.\nOm du driver en högtrafikerad webbplats bör du läsa lite om [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode-normalisering].",
        "config-unicode-update-warning": "'''Varning:''' Den installerade versionen av Unicode-normaliserings \"wrappern\" använder en äldre version av [http://site.icu-project.org/ ICU projektets] bibliotek.\nDu bör [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations uppgradera] om är intresserad av att använda Unicode.",
-       "config-no-db": "Kunde inte hitta en lämplig databasdrivrutin! Du måste installera en databasdrivrutin för PHP.\nFöljande databastyper stöds: $1.\n\nI du själv kompilerat din PHP, konfigurera den med en databasklient aktiverad genom att t.ex. använda <code>./configure --with-mysqli</code>.\nOm du installerade PHP från ett Debian- eller Ubuntupaket måste du även installera, t.ex. <code>php5-mysql</code>-paketet.",
+       "config-no-db": "Kunde inte hitta en lämplig databasdrivrutin! Du måste installera en databasdrivrutin för PHP.\nFöljande databas{{PLURAL:$2|typ |typer}} stöds: $1.\n\nI du själv kompilerat din PHP, konfigurera den med en databasklient aktiverad genom att t.ex. använda <code>./configure --with-mysqli</code>.\nOm du installerade PHP från ett Debian- eller Ubuntupaket måste du även installera, t.ex. <code>php5-mysql</code>-paketet.",
        "config-outdated-sqlite": "'''Varning:''' du har SQLite $1, vilket är lägre än minimikravet version $2. SQLite kommer inte att vara tillgänglig.",
        "config-no-fts3": "'''Varning:''' SQLite kompileras utan [//sqlite.org/fts3.html FTS3-modulen], sökfunktioner kommer att vara otillgängliga på denna backend.",
        "config-register-globals-error": "<strong>Fel: PHP-alternativet <code>[http://php.net/register_globals register_globals]</code> är aktiverad.\nDen måste vara inaktiverad för att fortsätta med installationen.</strong>\nSe [https://www.mediawiki.org/wiki/register_globals https://www.mediawiki.org/wiki/register_globals] för hjälp om hur man gör så.",
index f5c7970..13309b5 100644 (file)
        "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": "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:",
@@ -40,8 +44,8 @@
        "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à một phần mềm miễn phí; 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 GNU General Public License khi xuất bản bởi Free Software Foundation; 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ỳ đảm bảo nào</strong>; không có thậm chí đảm bảo tối thiểu nào<strong>có thể bán được</strong> or <strong> tương ứng với một mục đích cụ thể</strong>.\nXem GNU General Public License để biết thêm chi tiết.\n\nBạn phải nhận <doclink href=Copying>một bản sao của GNU General Public License</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 Trang chủ MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents User's Guide]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Administrator's Guide]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ]\n----\n* <doclink href=Readme>Read me</doclink>\n* <doclink href=ReleaseNotes>Release notes</doclink>\n* <doclink href=Copying>Copying</doclink>\n* <doclink href=UpgradeDoc>Upgrading</doclink>",
+       "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-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 thể tìm một ổ dĩa cơ sở dữ liệu phù hợp! Bạn cần phải cài một ổ dĩa cơ sở dữ liệu cho PHP.\nCơ sở dữ liệu sau đây {{PLURAL:$2|type is|types are}} hỗ trợ: $1.\n\nNếu bạn biên dịch PHP cho chính bạn, cấu hình lại nó với một database clicent đã cho phép, ví dụ, sử dụng <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, cái 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ần [//sqlite.org/fts3.html module FTS3], để tìm kiếm các tính năng sẽ bị vô hiệu trong backend 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 cấp phép.\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 đầu vào dữ liệu ngoài ý muốn.\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ẽ phá hủy dữ liệu nhập vào ngoài ý muốn.\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ẽ phá hủy dữ liệu nhập vào ngoài ý muốn.\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-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].\nTheo dõi đối tượng không được kích hoạt.",
-       "config-mod-security": "<strong>Cảnd báo:</strong> Máy chủ trang web của bạn đã được kích hoạt  [http://modsecurity.org/ mod_security]/mod_security2. Nhiều cấu hình cung của nó sẽ gây ra các vấn đề cho MediaWiki và 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, xem phần [http://modsecurity.org/documentation/ tài liệu mod_security] hoặc liên hệ với nhà cung cấp máy chủ nếu bạn gặp một lỗi ngẫu nhiên nào đó.",
+       "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.  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-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 nếu muốn 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-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-engine-help": "<strong>InnoDB</strong> hầu như luôn là tùy chọn tốt nhất, vì nó có hỗ trợ đồng thời rất tốt.\n\n<strong>MyISAM</strong> có thể nhanh hơn trong chế độ một người dùng hoặc các cài đặt chỉ-đọc (read-only).\nCơ sở dữ liệu MyISAM có xu hướng thường xuyên bị hỏng hóc hơn so với cơ sở dữ liệu InnoDB.",
        "config-mysql-charset": "Bảng mã cơ sở dữ liệu:",
        "config-mysql-binary": "Nhị phân",
        "config-mysql-utf8": "UTF-8",
+       "config-mysql-charset-help": "Trong <strong>chế độ nhị phân</strong>, MediaWiki lưu 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ự Unicode.\n\nTrong <strong>chế độ UTF-8 </strong>, MySQL sẽ biết những ký tự nào thiết lập dữ liệu của bạn, và có thể trình bày và chuyển đổi nó một cách thích hợp, nhưng nó sẽ không cho phép bạn lưu trữ các ký tự nằm trên [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane].",
        "config-mssql-auth": "Kiểu xác thực:",
+       "config-mssql-install-auth": "Chọn loại xác thực sẽ được sử dụng để kết nối với cơ sở dữ liệu trong quá trình cài đặt.\nNếu bạn chọn \"{{int:config-mssql-windowsauth}}\", thông tin của bất cứ người sử dụng nào mà máy chủ web đang chạy sẽ được sử dụng.",
+       "config-mssql-web-auth": "Chọn kiểu xác thực 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.\nNếu bạn chọn \"{{int:config-mssql-windowsauth}}\", thông tin của bất cứ người sử dụng nào mà máy chủ web đang hoạt động sẽ được sử dụng.",
        "config-mssql-sqlauth": "Xác thực SQL Server",
        "config-mssql-windowsauth": "Xác thực Windows",
        "config-site-name": "Tên wiki:",
+       "config-site-name-help": "Điều này sẽ xuất hiện trên thanh tiêu đề của trình duyệt và ở những nơi khác.",
        "config-site-name-blank": "Nhập tên của trang Web.",
        "config-project-namespace": "Không gian tên dự án:",
        "config-ns-generic": "Dự án",
        "config-ns-site-name": "Cùng với tên wiki: $1",
        "config-ns-other": "Khác (định rõ)",
        "config-ns-other-default": "WikiTôi",
+       "config-project-namespace-help": "Ví dụ sau đây của Wikipedia, nhiều wiki tách các trang sách họ với các trang nội dung, trong một \"''' không gian tên dự án'''\".\nTất cả các tiêu đề trang trong không gian tên này bắt đầu với một tiền tố nhất định, bạn có thể xác định ở đây.\nThông thường, tiền tố này được bắt nguồn từ tên của wiki, nhưng nó không thể chứa các ký tự đặc biệt như \"#\" hoặc \":\".",
+       "config-ns-invalid": "Không gian tên cụ thể \"<nowiki>$1</nowiki>\" không hợp lệ.\nXác định một không gian tên dự án khác.",
+       "config-ns-conflict": "Không gian tên cụ thể \"<nowiki>$1</nowiki>\" xung đột với một không gian tên MediaWiki mặc định.\nXác định một không gian tên dự án khác.",
        "config-admin-box": "Tài khoản bảo quản viên",
        "config-admin-name": "Tên người dùng của bạn:",
        "config-admin-password": "Mật khẩu:",
        "config-admin-password-confirm": "Nhập lại mật khẩu:",
+       "config-admin-help": "Nhập tên người dùng ưa thích ở đây, ví dụ như \" Joe Bloggs\" .\nĐây là tên mà bạn sẽ sử dụng để đăng nhập vào wiki.",
        "config-admin-name-blank": "Nhập tên người dùng của bảo quản viên.",
+       "config-admin-name-invalid": "Tên người dùng cụ thể \"<nowiki>$1</nowiki>\" không hợp lệ.\nChỉ định một tên người dùng khác.",
        "config-admin-password-blank": "Nhập mật khẩu của tài khoản bảo quản viên.",
        "config-admin-password-mismatch": "Bạn đã nhập hai mật khẩu không khớp với nhau.",
        "config-admin-email": "Địa chỉ thư điện tử:",
+       "config-admin-email-help": "Nhập một địa chỉ email vào đây để cho phép bạn nhận được email từ những người dùng khác trên wiki, thiết lập lại mật khẩu của bạn, và sẽ được thông báo về những thay đổi trong các trang nằm trong danh sách theo dõi của bạn. Bạn có thể để trống trường này.",
+       "config-admin-error-user": "Lỗi nội bộ khi tạo một admin với tên <nowiki>$1</nowiki>\".",
+       "config-admin-error-password": "Lỗi nội bộ khi thiết lập một mật khẩu cho admin \" <nowiki>$1</nowiki>\": <pre>$2</pre>",
        "config-admin-error-bademail": "Bạn đã nhập một địa chỉ thư điện tử không hợp lệ.",
        "config-subscribe": "Theo dõi [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce danh sách thư thông báo phát hành].",
+       "config-subscribe-help": "thông báo an ninh.\nBạn nên đồng ý với nó và cập nhật bản cài đặt MediaWiki của bạn khi phiên bản mới xuất hiện.",
+       "config-subscribe-noemail": "Bạn đã cố gắng để đăng ký vào danh sách nhận thư thông báo phát hành mà không cung cấp một địa chỉ email nào cả.\nVui lòng cung cấp một địa chỉ email nếu bạn muốn đăng ký vào danh sách nhận thư.",
+       "config-almost-done": "Bạn gần như đã hoàn tất!\nBây giờ bạn có thể bỏ qua cấu hình còn lại và cài đặt wiki ngay bây giờ.",
        "config-optional-continue": "Hỏi tôi về thêm chi tiết.",
        "config-optional-skip": "Chán quá, cài đặt wiki rỗi.",
        "config-profile": "Hồ sơ quyền người dùng:",
        "config-profile-no-anon": "Bắt buộc mở tài khoản",
        "config-profile-fishbowl": "Chỉ những người dùng được phép",
        "config-profile-private": "Wiki riêng tư",
+       "config-profile-help": "Wiki làm việc tốt nhất khi có càng nhiều người chỉnh sửa chúng nhất có thể.\nTrong MediaWiki, rất dễ dàng để xem lại các thay đổi gần đây, và quay trở lại tình trạng ban đầu trước bất kỳ thiệt hại nào được thực hiện bởi người dùng vô tình hoặc người dùng có dụng ý xấu.\n\nTuy nhiên, nhiều người thấy là MediaWiki rất hữu ích trong chừng mực nào đó, và đôi khi thật không phải dễ dàng để thuyết phục mọi người về những lợi ích theo cách thức mà wiki mang lại.\nVì vậy, bạn có sự lựa chọn của riêng bạn.\n\nMô hình <strong>{{int:config-profile-wiki}}</strong> cho phép bất cứ ai tham gia chỉnh sửa, thậm chí không cần đăng nhập.\nMột wiki với <strong>{{int:config-profile-no-anon}}</strong> cung cấp thêm trách nhiệm, nhưng có thể ngăn chặn những người đóng góp thông thường.\n\nKịch bản <strong>{{int:config-profile-fishbowl}}</strong>  cho phép người dùng được duyệt chỉnh sửa, nhưng công chúng có thể xem các trang web, bao gồm cả lịch sử.\nMột <strong>{{int:config-profile-private}}</strong> chỉ cho phép được duyệt xem các trang, với cùng nhóm được phép chỉnh sửa.\n\nNhiều cấu hình quyền sử dụng phức tạp có sẵn sau khi cài đặt, xin xem [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights relevant manual entry].",
        "config-license": "Bản quyền và giấy phép:",
        "config-license-none": "Không hiển thị giấy phép ở chân trang",
        "config-license-cc-by-sa": "Creative Commons Ghi công–Chia sẻ tương tự",
        "config-license-cc-choose": "Chọn một giấy phép Creative Commons tùy biến",
        "config-email-settings": "Thiết lập thư điện tử",
        "config-enable-email": "Cho phép gửi thư điện tử đi",
+       "config-enable-email-help": "Nếu bạn muốn email để làm việc, [http://www.php.net/manual/en/mail.configuration.php thiết lập mail của PHP] cần phải được cấu hình đúng.\nNếu bạn không muốn sử dụng bất kỳ tính năng email nào, bạn có thể vô hiệu chúng ở đây.",
        "config-email-user": "Cho phép người dùng gửi thư điện tử cho người dùng khác",
+       "config-email-user-help": "Cho phép tất cả người dùng gửi email cho nhau, nếu họ đã kích hoạt nó trong cài đặt tùy chọn của họ.",
        "config-email-usertalk": "Gửi thư thông báo về tin nhắn mới",
+       "config-email-usertalk-help": "Cho phép người dùng nhận được thông báo về các thay đổi trong trang thảo luận người dùng, nếu họ đã kích hoạt nó trong cài đặt tùy chọn của họ.",
        "config-email-watchlist": "Gửi thư thông báo về bài theo dõi",
+       "config-email-watchlist-help": "Cho phép người dùng nhận được thông báo về các trang theo dõi của họ nếu họ đã kích hoạt nó trong ưu tiên của họ.",
        "config-email-auth": "Xác minh qua thư điện tử",
+       "config-email-auth-help": "Nếu tùy chọn này được kích hoạt, người dùng phải xác nhận địa chỉ email của họ bằng cách sử dụng một liên kết được gửi tới cho họ bất cứ khi nào họ thiết lập hoặc thay đổi nó.\nChỉ có địa chỉ email được xác thực mới có thể nhận email từ những người dùng khác hoặc các email thông báo thay đổi.\nThiết lập tùy chọn này <strong>khuyến cáo sử dụng</strong> cho các wiki công cộng do khả năng các tính năng email dễ bị lạm dụng để gây hại.",
        "config-email-sender": "Địa chỉ thư điện tử trả lại:",
+       "config-email-sender-help": "Nhập địa chỉ email để làm địa chỉ trở về trong mail gửi đi.\nĐây là nơi mà thư từ chối sẽ được gửi đi.\nNhiều máy chủ mail yêu cầu phải có ít nhất là phần tên miền để đảm bảo tính hợp lệ.",
        "config-upload-settings": "Hình ảnh và tập tin tải lên",
        "config-upload-enable": "Cho phép tải lên tập tin",
+       "config-upload-help": "Tập tin tải lên có khả năng làm lộ các nguy cơ bảo mật của máy chủ của bạn.\nĐể biết thêm thông tin, xin đọc [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security phần bảo mật] trong tài liệu hướng dẫn.\n\nĐể kích hoạt tính năng tải tập tin lên, thay đổi chế độ trên thư mục con <code>hình ảnh</code> trong thư mục gốc (root) của MediaWiki để máy chủ web có thể lưu dữ liệu vào đó.\nSau đó kích hoạt tùy chọn này.",
        "config-upload-deleted": "Thư mục chứa các tập tin đã xóa:",
+       "config-upload-deleted-help": "Chọn một thư mục trong đó lưu trữ các tập tin đã bị xóa.\nLý tưởng nhất, thư mục này không nên được truy cập từ trang web.",
        "config-logo": "URL biểu trưng:",
+       "config-logo-help": "Giao diện mặc định của MediaWiki bao gồm không gian cho một logo 135x160 điểm ảnh trên menu sidebar (thanh bên).\nTải lên một hình ảnh kích thước thích hợp, và nhập URL hình ảnh đó vào đây.\n\nBạn có thể sử dụng <code>$wgStylePath</code> hoặc <code>$wgScriptPath</code> nếu logo của bạn liên quan đường những đường dẫn ở đây.\n\nNếu bạn không muốn có một logo, hãy bỏ trống ô này.",
        "config-instantcommons": "Kích hoạt Instant Commons",
+       "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons Instant Commons] là một tính năng cho phép wiki sử dụng hình ảnh, âm thanh và tập tin đa phương tiện khác được tìm thấy trong trang web [//commons.wikimedia.org/ Wikimedia Commons].\nĐể làm được điều này, MediaWiki yêu cầu phải truy cập vào Internet.\n\nĐể biết thêm thông tin về tính năng này, trong đó có hướng dẫn về cách thiết lập cho các wiki khác với Wikimedia Commons, tham khảo thêm tại [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos tài liệu hướng dẫn].",
+       "config-cc-error": "Người chọn giấy phép Creative Commons đã không đưa ra kết quả nào.\nNhập tên giấy phép bằng tay.",
        "config-cc-again": "Chọn một lần nữa…",
        "config-cc-not-chosen": "Chọn một giấy phép Creative Commons và bấm “Tiếp tục”.",
        "config-advanced-settings": "Thiết lập nâng cao",
        "config-cache-options": "Thiết lập bộ nhớ đệm đối tượng:",
+       "config-cache-help": "Lưu vào bộ nhớ đệm đối tượng được sử dụng để cải thiện tốc độ của MediaWiki bằng cách lưu vào bộ nhớ đệm những dữ liệu thường xuyên sử dụng.\nCác trang web từ trung bình cho đến các trang web lớn rất được khuyến khích kích hoạt tính năng này, và các trang web nhỏ cũng sẽ nhìn thấy lợi ích tương tự.",
+       "config-cache-none": "Không lưu vào bộ nhớ đệm (không có chức năng nhiệm vụ sẽ được loại bỏ, nhưng tốc độ có thể bị ảnh hưởng trên các trang web wiki lớn hơn)",
        "config-cache-accel": "Bộ nhớ đệm đối tượng PHP (APC, XCache, hoặc WinCache)",
        "config-cache-memcached": "Sử dụng Memcached (cần thiết lập và cấu hình thêm)",
        "config-memcached-servers": "Máy chủ Memcached:",
+       "config-memcached-help": "Danh sách các địa chỉ IP để sử dụng cho Memcached .\nNên xác định trên một dòng và chỉ định các cổng được sử dụng. Ví dụ:\n 127.0.0.1:11211\n 192.168.1.25:1234",
        "config-memcache-needservers": "Bạn đã chọn Memcached là loại bộ nhớ đệm nhưng không định rõ máy chủ nào.",
        "config-memcache-badip": "Bạn đã nhập một địa chỉ IP không hợp lệ cho Memcached: $1.",
+       "config-memcache-noport": "Bạn không thể chỉ định một cổng để sử dụng cho máy chủ Memcached:$1.\nNếu bạn không biết cổng nào, mặc định là 11211.",
        "config-memcache-badport": "Số cổng Memcached phải từ $1 đến $2.",
        "config-extensions": "Phần mở rộng",
+       "config-extensions-help": "Mở rộng được liệt kê ở trên đã được phát hiện trong thư mục <code>./extensions</code> của bạn.\n\nChúng có thể yêu cầu thêm cấu hình, nhưng bạn có thể kích hoạt chúng ngay bây giờ.",
        "config-skins": "Giao diện",
+       "config-skins-help": "Các giao diện được liệt kê ở trên đã được phát hiện trong thư mục <code>./skins</code> của bạn. Bạn phải kích hoạt ít nhất một giao diện, và chọn nó làm mặc định.",
        "config-skins-use-as-default": "Dùng giao diện này làm mặc định",
+       "config-skins-missing": "Không giao diện nào được tìm thấy; MediaWiki sẽ sử dụng một giao diện dự phòng cho đến khi bạn cài đặt giao diện thích hợp.",
        "config-skins-must-enable-some": "Phải chọn ít nhất một giao diện để kích hoạt.",
        "config-skins-must-enable-default": "Giao diện được chọn làm mặc định phải được kích hoạt.",
+       "config-install-alreadydone": "<strong>Cảnh báo:</strong> Bạn dường như đã cài đặt MediaWiki và đang cố gắng để cài đặt nó lại một lần nữa.\nXin hãy chuyển sang trang tiếp theo.",
+       "config-install-begin": "Bằng cách nhấn \"{{int:config-continue}}\", bạn sẽ bắt đầu cài đặt MediaWiki của mình.\nNếu bạn vẫn muốn thay đổi, nhấn \"{{int:config-back}}\".",
        "config-install-step-done": "hoàn tất",
        "config-install-step-failed": "thất bại",
        "config-install-extensions": "Đang bao gồm phần mở rộng",
        "config-install-pg-commit": "Đang gửi các thay đổi",
        "config-install-pg-plpgsql": "Tìm ngôn ngữ PL/pgSQL",
        "config-pg-no-plpgsql": "Bạn cần phải cài đặt ngôn ngữ PL/pgSQL vào cơ sở dữ liệu $1",
+       "config-pg-no-create-privs": "Tài khoản bạn xác định để cài đặt không đủ quyền hạn để tạo một tài khoản.",
+       "config-pg-not-in-role": "Tài khoản bạn xác định cho người dùng web đã tồn tại.\nTài khoản bạn xác định cho việc cài đặt không phải là một superuser(người dùng cao cấp) và không phải là một thành viên của vai trò người sử dụng web, vì vậy nó không thể tạo ra các đối tượng thuộc sở hữu của người sử dụng web.\n\nMediaWiki hiện nay yêu cầu rằng các bảng được sở hữu bởi người sử dụng web. Hãy xác định một tên tài khoản web, hoặc click \"back\" (quay trở về) và chỉ định một người dùng cài đặt có đặc quyền thích hợp.",
        "config-install-user": "Đang tạo người dùng trên cơ sở dữ liệu",
        "config-install-user-alreadyexists": "Người dùng “$1” đã tồn tại",
        "config-install-user-create-failed": "Thất bại khi tạo người dùng “$1”: $2",
        "config-install-interwiki-exists": "'''Cảnh báo:''' Hình như đã có mục trong bảng liên wiki.\nĐã bỏ qua danh sách mặc định.",
        "config-install-stats": "Đang khởi tạo các thống kê",
        "config-install-keys": "Tạo ra các chìa khóa bí mật",
+       "config-insecure-keys": "<strong>Cảnh báo:</strong>{{PLURAL:$2|Một khóa an toàn|Khóa an toàn}} ($1) được tạo ra trong quá trình cài đặt {{PLURAL:$2|là}} không hoàn toàn an toàn. Hãy cân nhắc việc thay đổi {{PLURAL: $2|nó|chúng}} bằng tay.",
        "config-install-updates": "Tránh các cập nhật không cần thiết",
+       "config-install-updates-failed": "<strong>Lỗi:</strong> Chèn phím cập nhật vào các bảng không thành công với các lỗi sau:1$",
        "config-install-sysop": "Đang mở tài khoản người dùng bảo quản viên",
        "config-install-subscribe-fail": "Không thể theo dõi mediawiki-announce: $1",
        "config-install-subscribe-notpossible": "cURL không được cài đặt và <code>allow_url_fopen</code> không có sẵn.",
        "config-install-mainpage": "Đang tạo trang đầu với nội dung mặc định",
        "config-install-extension-tables": "Đang tạo bảng cho các phần mở rộng được kích hoạt",
        "config-install-mainpage-failed": "Không thể chèn trang đầu: $1",
+       "config-install-done": "<strong>Xin chúc mừng!</strong>\nBạn đã cài đặt thành công MediaWiki.\n\nBộ cài đặt đã tạo ra một file <code>LocalSettings.php</code>.\nFile này chứa tất cả các cấu hình của bạn.\n\nBạn sẽ cần phải tải nó về và đặt nó trong thư mục cài đặt wiki của bạn (cùng thư mục với index.php). Việc tải về có lẽ sẽ được khởi động tự động.\n\nNếu việc tải về không được cung cấp, hoặc nếu bạn hủy bỏ nó, bạn có thể khởi động lại tải về bằng cách nhấn vào liên kết dưới đây:\n\n$3\n\n<strong>Lưu ý:</strong> Nếu bạn không làm điều này ngay bây giờ, điều này sẽ tạo ra tập tin cấu hình sẽ không có giá trị cho bạn sau này nếu bạn thoát khỏi trình cài đặt mà không tải nó về.\n\nKhi đã việc tải về đã hoàn thành, bạn có thể <strong>[$2 truy cập trang wiki của bạn]</strong>.",
        "config-download-localsettings": "Tải về <code>LocalSettings.php</code>",
        "config-help": "Trợ giúp",
        "config-help-tooltip": "nhấn chuột để mở rộng",
        "config-nofile": "Không tìm thấy tập tin “$1”. Nó có phải bị xóa không?",
+       "config-extension-link": "Bạn có biết rằng wiki của bạn có hỗ trợ [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions mở rộng]?\n\nBạn có thể truy cập [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category phần mở rộng theo thể loại] hoặc [//www.mediawiki.org/wiki/Extension_Matrix Ma trận Mở rộng] để xem danh sách đầy đủ các phần mở rộng.",
        "mainpagetext": "'''MediaWiki đã được cài đặt thành công.'''",
        "mainpagedocfooter": "Xin đọc [//meta.wikimedia.org/wiki/Help:Contents Hướng dẫn sử dụng] để biết thêm thông tin về cách sử dụng phần mềm wiki.\n\n== Để bắt đầu ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Danh sách các thiết lập cấu hình]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Các câu hỏi thường gặp MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Danh sách gửi thư về việc phát hành MediaWiki]"
 }
index 0e03296..934b4b4 100644 (file)
@@ -63,7 +63,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\n如果您的網站瀏覽人次很高,您應先閱讀 [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations/zh Unicode 正規化]。",
        "config-unicode-update-warning": "<strong>警告</strong>:目前安裝的 Unicode 正規化包裝程式使用了舊版 [http://site.icu-project.org/ ICU 計劃] 的程式庫。\n若您需要使用 Unicode,您應先進行 [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations 升級]。",
-       "config-no-db": "找不到合適的資料庫驅動程式!您需要安裝 PHP 資料庫驅動程式。\n目前支援以下類型的資料庫: $1 。\n\n如果您是自行編譯 PHP,您必須重新設定並開啟資料庫客戶端,例:使用 <code>./configure --with-mysqli</code> 指令參數。\n如果您是使用 Debian 或 Ubuntu 的套件安裝,您則需要額外安裝,例:<code>php5-mysql</code> 套件。",
+       "config-no-db": "找不到合適的資料庫驅動程式!您需要安裝 PHP 資料庫驅動程式。\n目前支援以下{{PLURAL:$2|type is|類型}}的資料庫: $1 。\n\n如果您是自行編譯 PHP,您必須重新設定並開啟資料庫用戶端,例:使用 <code>./configure --with-mysqli</code> 指令參數。\n如果您是使用 Debian 或 Ubuntu 的套件安裝 PHP ,您則需要額外安裝,例:<code>php5-mysql</code> 套件。",
        "config-outdated-sqlite": "<strong>警告:</strong>您已安裝 SQLite $1,但是它的版本低於最低需求版本 $2。 因此您無法使用 SQLite。",
        "config-no-fts3": "<strong>警告:</strong> 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 abfdc8c..243fec9 100644 (file)
@@ -24,7 +24,7 @@
 /**
  * Class to handle job queues stored in Redis
  *
- * This is faster, less resource intensive, queue that JobQueueDB.
+ * This is a faster and less resource-intensive job queue than JobQueueDB.
  * All data for a queue using this class is placed into one redis server.
  *
  * There are eight main redis keys used to track jobs:
@@ -49,7 +49,7 @@
  *
  * This class requires Redis 2.6 as it makes use Lua scripts for fast atomic operations.
  * Additionally, it should be noted that redis has different persistence modes, such
- * as rdb snapshots, journaling, and no persistent. Appropriate configuration should be
+ * as rdb snapshots, journaling, and no persistence. Appropriate configuration should be
  * made on the servers based on what queues are using it and what tolerance they have.
  *
  * @ingroup JobQueue
@@ -64,8 +64,6 @@ class JobQueueRedis extends JobQueue {
        protected $server;
        /** @var string Compression method to use */
        protected $compression;
-       /** @var bool */
-       protected $daemonized;
 
        const MAX_AGE_PRUNE = 604800; // integer; seconds a job can live once claimed (7 days)
 
@@ -90,7 +88,11 @@ class JobQueueRedis extends JobQueue {
                $this->server = $params['redisServer'];
                $this->compression = isset( $params['compression'] ) ? $params['compression'] : 'none';
                $this->redisPool = RedisConnectionPool::singleton( $params['redisConfig'] );
-               $this->daemonized = !empty( $params['daemonized'] );
+               if ( empty( $params['daemonized'] ) ) {
+                       throw new Exception(
+                               "Non-daemonized mode is no longer supported. Please install the " .
+                               "mediawiki/services/jobrunner service and update \$wgJobTypeConf as needed." );
+               }
                $this->checkDelay = true; // always enabled
        }
 
@@ -291,19 +293,9 @@ LUA;
        protected function doPop() {
                $job = false;
 
-               // Push ready delayed jobs into the queue every 10 jobs to spread the load.
-               // This is also done as a periodic task, but we don't want too much done at once.
-               if ( !$this->daemonized && mt_rand( 0, 9 ) == 0 ) {
-                       $this->recyclePruneAndUndelayJobs();
-               }
-
                $conn = $this->getConnection();
                try {
                        do {
-                               // Keep the claimed job list down for high-traffic queues
-                               if ( !$this->daemonized && mt_rand( 0, 99 ) == 0 ) {
-                                       $this->recyclePruneAndUndelayJobs();
-                               }
                                $blob = $this->popAndAcquireBlob( $conn );
                                if ( !is_string( $blob ) ) {
                                        break; // no jobs; nothing to do
@@ -316,7 +308,7 @@ LUA;
                                        continue;
                                }
 
-                               // If $item is invalid, recyclePruneAndUndelayJobs() will cleanup as needed
+                               // If $item is invalid, the runner loop recyling will cleanup as needed
                                $job = $this->getJobFromFields( $item ); // may be false
                        } while ( !$job ); // job may be false if invalid
                } catch ( RedisException $e ) {
@@ -583,112 +575,11 @@ LUA;
                }
        }
 
-       /**
-        * Recycle or destroy any jobs that have been claimed for too long
-        * and release any ready delayed jobs into the queue
-        *
-        * @return int Number of jobs recycled/deleted/undelayed
-        * @throws MWException|JobQueueError
-        */
-       public function recyclePruneAndUndelayJobs() {
-               $count = 0;
-               // For each job item that can be retried, we need to add it back to the
-               // main queue and remove it from the list of currenty claimed job items.
-               // For those that cannot, they are marked as dead and kept around for
-               // investigation and manual job restoration but are eventually deleted.
-               $conn = $this->getConnection();
-               try {
-                       $now = time();
-                       static $script =
-<<<LUA
-                       local kClaimed, kAttempts, kUnclaimed, kData, kAbandoned, kDelayed = unpack(KEYS)
-                       local released,abandoned,pruned,undelayed = 0,0,0,0
-                       -- Get all non-dead jobs that have an expired claim on them.
-                       -- The score for each item is the last claim timestamp (UNIX).
-                       local staleClaims = redis.call('zRangeByScore',kClaimed,0,ARGV[1])
-                       for k,id in ipairs(staleClaims) do
-                               local timestamp = redis.call('zScore',kClaimed,id)
-                               local attempts = redis.call('hGet',kAttempts,id)
-                               if attempts < ARGV[3] then
-                                       -- Claim expired and retries left: re-enqueue the job
-                                       redis.call('lPush',kUnclaimed,id)
-                                       released = released + 1
-                               else
-                                       -- Claim expired and no retries left: mark the job as dead
-                                       redis.call('zAdd',kAbandoned,timestamp,id)
-                                       abandoned = abandoned + 1
-                               end
-                               redis.call('zRem',kClaimed,id)
-                       end
-                       -- Get all of the dead jobs that have been marked as dead for too long.
-                       -- The score for each item is the last claim timestamp (UNIX).
-                       local deadClaims = redis.call('zRangeByScore',kAbandoned,0,ARGV[2])
-                       for k,id in ipairs(deadClaims) do
-                               -- Stale and out of retries: remove any traces of the job
-                               redis.call('zRem',kAbandoned,id)
-                               redis.call('hDel',kAttempts,id)
-                               redis.call('hDel',kData,id)
-                               pruned = pruned + 1
-                       end
-                       -- Get the list of ready delayed jobs, sorted by readiness (UNIX timestamp)
-                       local ids = redis.call('zRangeByScore',kDelayed,0,ARGV[4])
-                       -- Migrate the jobs from the "delayed" set to the "unclaimed" list
-                       for k,id in ipairs(ids) do
-                               redis.call('lPush',kUnclaimed,id)
-                               redis.call('zRem',kDelayed,id)
-                       end
-                       undelayed = #ids
-                       return {released,abandoned,pruned,undelayed}
-LUA;
-                       $res = $conn->luaEval( $script,
-                               array(
-                                       $this->getQueueKey( 'z-claimed' ), # KEYS[1]
-                                       $this->getQueueKey( 'h-attempts' ), # KEYS[2]
-                                       $this->getQueueKey( 'l-unclaimed' ), # KEYS[3]
-                                       $this->getQueueKey( 'h-data' ), # KEYS[4]
-                                       $this->getQueueKey( 'z-abandoned' ), # KEYS[5]
-                                       $this->getQueueKey( 'z-delayed' ), # KEYS[6]
-                                       $now - $this->claimTTL, # ARGV[1]
-                                       $now - self::MAX_AGE_PRUNE, # ARGV[2]
-                                       $this->maxTries, # ARGV[3]
-                                       $now # ARGV[4]
-                               ),
-                               6 # number of first argument(s) that are keys
-                       );
-                       if ( $res ) {
-                               list( $released, $abandoned, $pruned, $undelayed ) = $res;
-                               $count += $released + $pruned + $undelayed;
-                               JobQueue::incrStats( 'job-recycle', $this->type, $released, $this->wiki );
-                               JobQueue::incrStats( 'job-abandon', $this->type, $abandoned, $this->wiki );
-                               JobQueue::incrStats( 'job-undelay', $this->type, $undelayed, $this->wiki );
-                       }
-               } catch ( RedisException $e ) {
-                       $this->throwRedisException( $conn, $e );
-               }
-
-               return $count;
-       }
-
        /**
         * @return array
         */
        protected function doGetPeriodicTasks() {
-               if ( $this->daemonized ) {
-                       return array(); // managed in the runner loop
-               }
-               $periods = array( 300 ); // 5 min; delayed/stale jobs
-               if ( $this->claimTTL > 0 ) {
-                       $periods[] = ceil( $this->claimTTL / 2 ); // halved to avoid bad timing
-               }
-               $period = min( $periods );
-               $period = max( $period, 30 ); // sanity
-
-               return array(
-                       'recyclePruneAndUndelayJobs' => array(
-                               'callback' => array( $this, 'recyclePruneAndUndelayJobs' ),
-                               'period'   => $period,
-                       )
-               );
+               return array(); // managed in the runner loop
        }
 
        /**
index ef0f087..091e648 100644 (file)
  * @ingroup JobQueue
  */
 
+use Psr\Log\LoggerAwareInterface;
+use Psr\Log\LoggerInterface;
+
 /**
  * Job queue runner utility methods
  *
  * @ingroup JobQueue
  * @since 1.24
  */
-class JobRunner {
+class JobRunner implements LoggerAwareInterface {
        /** @var callable|null Debug output handler */
        protected $debug;
 
@@ -38,6 +41,28 @@ class JobRunner {
                $this->debug = $debug;
        }
 
+       /**
+        * @var LoggerInterface $logger
+        */
+       protected $logger;
+
+       /**
+        * @param LoggerInterface $logger
+        */
+       public function setLogger( LoggerInterface $logger ) {
+               $this->logger = $logger;
+       }
+
+       /**
+        * @param LoggerInterface $logger
+        */
+       public function __construct( LoggerInterface $logger = null ) {
+               if ( $logger === null ) {
+                       $logger = MWLoggerFactory::getInstance( 'runJobs' );
+               }
+               $this->setLogger( $logger );
+       }
+
        /**
         * Run jobs of the specified number/type for the specified time
         *
@@ -73,7 +98,9 @@ class JobRunner {
                // Handle any required periodic queue maintenance
                $count = $group->executeReadyPeriodicTasks();
                if ( $count > 0 ) {
-                       $this->runJobsLog( "Executed $count periodic queue task(s)." );
+                       $msg = "Executed $count periodic queue task(s).";
+                       $this->logger->debug( $msg );
+                       $this->debugCallback( $msg );
                }
 
                // Bail out if in read-only mode
@@ -132,7 +159,9 @@ class JobRunner {
                                        $backoffs = $this->syncBackoffDeltas( $backoffs, $backoffDeltas, $wait );
                                }
 
-                               $this->runJobsLog( $job->toString() . " STARTING" );
+                               $msg = $job->toString() . " STARTING";
+                               $this->logger->info( $msg );
+                               $this->debugCallback( $msg );
 
                                // Run the job...
                                $jobStartTime = microtime( true );
@@ -164,9 +193,13 @@ class JobRunner {
                                }
 
                                if ( $status === false ) {
-                                       $this->runJobsLog( $job->toString() . " t=$timeMs error={$error}" );
+                                       $msg = $job->toString() . " t=$timeMs error={$error}";
+                                       $this->logger->error( $msg );
+                                       $this->debugCallback( $msg );
                                } else {
-                                       $this->runJobsLog( $job->toString() . " t=$timeMs good" );
+                                       $msg = $job->toString() . " t=$timeMs good";
+                                       $this->logger->info( $msg );
+                                       $this->debugCallback( $msg );
                                }
 
                                $response['jobs'][] = array(
@@ -357,10 +390,9 @@ class JobRunner {
         * Log the job message
         * @param string $msg The message to log
         */
-       private function runJobsLog( $msg ) {
+       private function debugCallback( $msg ) {
                if ( $this->debug ) {
                        call_user_func_array( $this->debug, array( wfTimestamp( TS_DB ) . " $msg\n" ) );
                }
-               wfDebugLog( 'runJobs', $msg );
        }
 }
diff --git a/includes/jobqueue/jobs/RecentChangesUpdateJob.php b/includes/jobqueue/jobs/RecentChangesUpdateJob.php
new file mode 100644 (file)
index 0000000..b54ecfd
--- /dev/null
@@ -0,0 +1,85 @@
+<?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
+ * @author Aaron Schulz
+ */
+
+/**
+ * Job for pruning recent changes
+ *
+ * @ingroup JobQueue
+ * @since 1.25
+ */
+class RecentChangesUpdateJob extends Job {
+       function __construct( $title, $params ) {
+               parent::__construct( 'recentChangesUpdate', $title, $params );
+
+               if ( !isset( $params['type'] ) ) {
+                       throw new Exception( "Missing 'type' parameter." );
+               }
+
+               $this->removeDuplicates = true;
+       }
+
+       /**
+        * @return RecentChangesUpdateJob
+        */
+       final public static function newPurgeJob() {
+               return new self(
+                       SpecialPage::getTitleFor( 'Recentchanges' ), array( 'type' => 'purge' )
+               );
+       }
+
+       public function run() {
+               if ( $this->params['type'] === 'purge' ) {
+                       $this->purgeExpiredRows();
+               } else {
+                       throw new Exception( "Invalid 'type' parameter '{$this->params['type']}'." );
+               }
+
+               return true;
+       }
+
+       protected function purgeExpiredRows() {
+               global $wgRCMaxAge;
+
+               $lockKey = wfWikiID() . ':recentchanges-prune';
+
+               $dbw = wfGetDB( DB_MASTER );
+               if ( !$dbw->lock( $lockKey, __METHOD__, 1 ) ) {
+                       return; // already in progress
+               }
+
+               $cutoff = $dbw->timestamp( time() - $wgRCMaxAge );
+               do {
+                       $rcIds = $dbw->selectFieldValues( 'recentchanges',
+                               'rc_id',
+                               array( 'rc_timestamp < ' . $dbw->addQuotes( $cutoff ) ),
+                               __METHOD__,
+                               array( 'LIMIT' => 100 ) // avoid slave lag
+                       );
+                       if ( $rcIds ) {
+                               $dbw->delete( 'recentchanges', array( 'rc_id' => $rcIds ), __METHOD__ );
+                       }
+                       // No need for this to be in a transaction.
+                       $dbw->commit( __METHOD__, 'flush' );
+               } while ( $rcIds );
+
+               $dbw->unlock( $lockKey, __METHOD__ );
+       }
+}
index 5d95792..1252b0b 100644 (file)
@@ -39,6 +39,10 @@ class RefreshLinksJob extends Job {
 
        function __construct( $title, $params = '' ) {
                parent::__construct( 'refreshLinks', $title, $params );
+               // A separate type is used just for cascade-protected backlinks
+               if ( !empty( $this->params['prioritize'] ) ) {
+                       $this->command .= 'Prioritized';
+               }
                // Base backlink update jobs and per-title update jobs can be de-duplicated.
                // If template A changes twice before any jobs run, a clean queue will have:
                //              (A base, A base)
@@ -100,6 +104,10 @@ class RefreshLinksJob extends Job {
                return true;
        }
 
+       /**
+        * @param Title $title
+        * @return bool
+        */
        protected function runForTitle( Title $title = null ) {
                $linkCache = LinkCache::singleton();
                $linkCache->clear();
diff --git a/includes/jobqueue/jobs/RefreshLinksJob2.php b/includes/jobqueue/jobs/RefreshLinksJob2.php
deleted file mode 100644 (file)
index 97405ae..0000000
+++ /dev/null
@@ -1,141 +0,0 @@
-<?php
-/**
- * Job to update links for a given title.
- *
- * 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 JobQueue
- */
-
-/**
- * Background job to update links for titles in certain backlink range by page ID.
- * Newer version for high use templates. This is deprecated by RefreshLinksPartitionJob.
- *
- * @ingroup JobQueue
- * @deprecated since 1.23
- */
-class RefreshLinksJob2 extends Job {
-       function __construct( $title, $params ) {
-               parent::__construct( 'refreshLinks2', $title, $params );
-               // Base jobs for large templates can easily be de-duplicated
-               $this->removeDuplicates = !isset( $params['start'] ) && !isset( $params['end'] );
-       }
-
-       /**
-        * Run a refreshLinks2 job
-        * @return bool Success
-        */
-       function run() {
-               global $wgUpdateRowsPerJob;
-
-               $linkCache = LinkCache::singleton();
-               $linkCache->clear();
-
-               if ( is_null( $this->title ) ) {
-                       $this->error = "refreshLinks2: Invalid title";
-                       return false;
-               }
-
-               // Back compat for pre-r94435 jobs
-               $table = isset( $this->params['table'] ) ? $this->params['table'] : 'templatelinks';
-
-               // Avoid slave lag when fetching templates.
-               // When the outermost job is run, we know that the caller that enqueued it must have
-               // committed the relevant changes to the DB by now. At that point, record the master
-               // position and pass it along as the job recursively breaks into smaller range jobs.
-               // Hopefully, when leaf jobs are popped, the slaves will have reached that position.
-               if ( isset( $this->params['masterPos'] ) ) {
-                       $masterPos = $this->params['masterPos'];
-               } elseif ( wfGetLB()->getServerCount() > 1 ) {
-                       $masterPos = wfGetLB()->getMasterPos();
-               } else {
-                       $masterPos = false;
-               }
-
-               $tbc = $this->title->getBacklinkCache();
-
-               $jobs = array(); // jobs to insert
-               if ( isset( $this->params['start'] ) && isset( $this->params['end'] ) ) {
-                       # This is a partition job to trigger the insertion of leaf jobs...
-                       $jobs = array_merge( $jobs, $this->getSingleTitleJobs( $table, $masterPos ) );
-               } else {
-                       # This is a base job to trigger the insertion of partitioned jobs...
-                       if ( $tbc->getNumLinks( $table, $wgUpdateRowsPerJob + 1 ) <= $wgUpdateRowsPerJob ) {
-                               # Just directly insert the single per-title jobs
-                               $jobs = array_merge( $jobs, $this->getSingleTitleJobs( $table, $masterPos ) );
-                       } else {
-                               # Insert the partition jobs to make per-title jobs
-                               foreach ( $tbc->partition( $table, $wgUpdateRowsPerJob ) as $batch ) {
-                                       list( $start, $end ) = $batch;
-                                       $jobs[] = new RefreshLinksJob2( $this->title,
-                                               array(
-                                                       'table' => $table,
-                                                       'start' => $start,
-                                                       'end' => $end,
-                                                       'masterPos' => $masterPos,
-                                               ) + $this->getRootJobParams() // carry over information for de-duplication
-                                       );
-                               }
-                       }
-               }
-
-               if ( count( $jobs ) ) {
-                       JobQueueGroup::singleton()->push( $jobs );
-               }
-
-               return true;
-       }
-
-       /**
-        * @param string $table
-        * @param mixed $masterPos
-        * @return array
-        */
-       protected function getSingleTitleJobs( $table, $masterPos ) {
-               # The "start"/"end" fields are not set for the base jobs
-               $start = isset( $this->params['start'] ) ? $this->params['start'] : false;
-               $end = isset( $this->params['end'] ) ? $this->params['end'] : false;
-               $titles = $this->title->getBacklinkCache()->getLinks( $table, $start, $end );
-               # Convert into single page refresh links jobs.
-               # This handles well when in sapi mode and is useful in any case for job
-               # de-duplication. If many pages use template A, and that template itself
-               # uses template B, then an edit to both will create many duplicate jobs.
-               # Roughly speaking, for each page, one of the "RefreshLinksJob" jobs will
-               # get run first, and when it does, it will remove the duplicates. Of course,
-               # one page could have its job popped when the other page's job is still
-               # buried within the logic of a refreshLinks2 job.
-               $jobs = array();
-               foreach ( $titles as $title ) {
-                       $jobs[] = new RefreshLinksJob( $title,
-                               array( 'masterPos' => $masterPos ) + $this->getRootJobParams()
-                       ); // carry over information for de-duplication
-               }
-               return $jobs;
-       }
-
-       /**
-        * @return array
-        */
-       public function getDeduplicationInfo() {
-               $info = parent::getDeduplicationInfo();
-               // Don't let highly unique "masterPos" values ruin duplicate detection
-               if ( is_array( $info['params'] ) ) {
-                       unset( $info['params']['masterPos'] );
-               }
-               return $info;
-       }
-}
index a09db15..d15fd02 100644 (file)
@@ -81,7 +81,7 @@ class UploadFromUrlJob extends Job {
                        if ( $warnings ) {
 
                                # Stash the upload
-                               $key = $this->upload->stashFile();
+                               $key = $this->upload->stashFile( $this->user );
 
                                // @todo FIXME: This has been broken for a while.
                                // User::leaveUserMessage() does not exist.
index bea6ced..ffe26a9 100644 (file)
@@ -359,7 +359,7 @@ class CSSMin {
         * @return bool
         */
        public static function isLocalUrl( $maybeUrl ) {
-               if ( !self::isRemoteUrl( $maybeUrl ) && $maybeUrl !== '' && $maybeUrl[0] === '/' ) {
+               if ( $maybeUrl !== '' && $maybeUrl[0] === '/' && !self::isRemoteUrl( $maybeUrl ) ) {
                        return true;
                }
                return false;
index bd32949..a6fd11a 100644 (file)
 class DeferredStringifier {
        /** @var callable Callback used for result string generation */
        private $callback;
+
        /** @var array */
        private $params;
+
        /** @var string */
        private $result;
 
@@ -42,7 +44,7 @@ class DeferredStringifier {
        }
 
        /**
-        * Returns a string generated by callback
+        * Get the string generated from the callback
         *
         * @return string
         */
diff --git a/includes/libs/ExplodeIterator.php b/includes/libs/ExplodeIterator.php
new file mode 100644 (file)
index 0000000..3b34d9b
--- /dev/null
@@ -0,0 +1,116 @@
+<?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
+ */
+
+/**
+ * An iterator which works exactly like:
+ *
+ * foreach ( explode( $delim, $s ) as $element ) {
+ *    ...
+ * }
+ *
+ * Except it doesn't use 193 byte per element
+ */
+class ExplodeIterator implements Iterator {
+       // The subject string
+       private $subject, $subjectLength;
+
+       // The delimiter
+       private $delim, $delimLength;
+
+       // The position of the start of the line
+       private $curPos;
+
+       // The position after the end of the next delimiter
+       private $endPos;
+
+       // The current token
+       private $current;
+
+       /**
+        * Construct a DelimIterator
+        * @param string $delim
+        * @param string $subject
+        */
+       public function __construct( $delim, $subject ) {
+               $this->subject = $subject;
+               $this->delim = $delim;
+
+               // Micro-optimisation (theoretical)
+               $this->subjectLength = strlen( $subject );
+               $this->delimLength = strlen( $delim );
+
+               $this->rewind();
+       }
+
+       public function rewind() {
+               $this->curPos = 0;
+               $this->endPos = strpos( $this->subject, $this->delim );
+               $this->refreshCurrent();
+       }
+
+       public function refreshCurrent() {
+               if ( $this->curPos === false ) {
+                       $this->current = false;
+               } elseif ( $this->curPos >= $this->subjectLength ) {
+                       $this->current = '';
+               } elseif ( $this->endPos === false ) {
+                       $this->current = substr( $this->subject, $this->curPos );
+               } else {
+                       $this->current = substr( $this->subject, $this->curPos, $this->endPos - $this->curPos );
+               }
+       }
+
+       public function current() {
+               return $this->current;
+       }
+
+       /**
+        * @return int|bool Current position or boolean false if invalid
+        */
+       public function key() {
+               return $this->curPos;
+       }
+
+       /**
+        * @return string
+        */
+       public function next() {
+               if ( $this->endPos === false ) {
+                       $this->curPos = false;
+               } else {
+                       $this->curPos = $this->endPos + $this->delimLength;
+                       if ( $this->curPos >= $this->subjectLength ) {
+                               $this->endPos = false;
+                       } else {
+                               $this->endPos = strpos( $this->subject, $this->delim, $this->curPos );
+                       }
+               }
+               $this->refreshCurrent();
+
+               return $this->current;
+       }
+
+       /**
+        * @return bool
+        */
+       public function valid() {
+               return $this->curPos !== false;
+       }
+}
diff --git a/includes/libs/MessageSpecifier.php b/includes/libs/MessageSpecifier.php
new file mode 100644 (file)
index 0000000..b417f29
--- /dev/null
@@ -0,0 +1,39 @@
+<?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
+ */
+
+interface MessageSpecifier {
+       /**
+        * Returns the message key
+        *
+        * If a list of multiple possible keys was supplied to the constructor, this method may
+        * return any of these keys. After the message has been fetched, this method will return
+        * the key that was actually used to fetch the message.
+        *
+        * @return string
+        */
+       public function getKey();
+
+       /**
+        * Returns the message parameters
+        *
+        * @return array
+        */
+       public function getParams();
+}
index ce97142..8d80eb3 100644 (file)
 class ProcessCacheLRU {
        /** @var Array */
        protected $cache = array(); // (key => prop => value)
+
        /** @var Array */
        protected $cacheTimes = array(); // (key => prop => UNIX timestamp)
 
        protected $maxCacheKeys; // integer; max entries
 
        /**
-        * @param $maxKeys integer Maximum number of entries allowed (min 1).
+        * @param int $maxKeys Maximum number of entries allowed (min 1).
         * @throws UnexpectedValueException When $maxCacheKeys is not an int or =< 0.
         */
        public function __construct( $maxKeys ) {
@@ -46,9 +47,9 @@ class ProcessCacheLRU {
         * This will prune the cache if it gets too large based on LRU.
         * If the item is already set, it will be pushed to the top of the cache.
         *
-        * @param $key string
-        * @param $prop string
-        * @param $value mixed
+        * @param string $key
+        * @param string $prop
+        * @param mixed $value
         * @return void
         */
        public function set( $key, $prop, $value ) {
@@ -67,15 +68,16 @@ class ProcessCacheLRU {
        /**
         * Check if a property field exists for a cache entry.
         *
-        * @param $key string
-        * @param $prop string
-        * @param $maxAge float Ignore items older than this many seconds (since 1.21)
+        * @param string $key
+        * @param string $prop
+        * @param float $maxAge Ignore items older than this many seconds (since 1.21)
         * @return bool
         */
        public function has( $key, $prop, $maxAge = 0.0 ) {
                if ( isset( $this->cache[$key][$prop] ) ) {
                        return ( $maxAge <= 0 ||
-                               ( microtime( true ) - $this->cacheTimes[$key][$prop] ) <= $maxAge );
+                               ( microtime( true ) - $this->cacheTimes[$key][$prop] ) <= $maxAge
+                       );
                }
 
                return false;
@@ -86,13 +88,14 @@ class ProcessCacheLRU {
         * This returns null if the property is not set.
         * If the item is already set, it will be pushed to the top of the cache.
         *
-        * @param $key string
-        * @param $prop string
+        * @param string $key
+        * @param string $prop
         * @return mixed
         */
        public function get( $key, $prop ) {
                if ( isset( $this->cache[$key][$prop] ) ) {
-                       $this->ping( $key ); // push to top
+                       // push to top
+                       $this->ping( $key );
                        return $this->cache[$key][$prop];
                } else {
                        return null;
@@ -100,9 +103,9 @@ class ProcessCacheLRU {
        }
 
        /**
-        * Clear one or several cache entries, or all cache entries
+        * Clear one or several cache entries, or all cache entries.
         *
-        * @param $keys string|Array
+        * @param string|array $keys
         * @return void
         */
        public function clear( $keys = null ) {
@@ -120,7 +123,7 @@ class ProcessCacheLRU {
        /**
         * Resize the maximum number of cache entries, removing older entries as needed
         *
-        * @param $maxKeys integer
+        * @param int $maxKeys
         * @return void
         * @throws UnexpectedValueException
         */
@@ -140,7 +143,7 @@ class ProcessCacheLRU {
        /**
         * Push an entry to the top of the cache
         *
-        * @param $key string
+        * @param string $key
         */
        protected function ping( $key ) {
                $item = $this->cache[$key];
diff --git a/includes/libs/ReplacementArray.php b/includes/libs/ReplacementArray.php
new file mode 100644 (file)
index 0000000..7fdb309
--- /dev/null
@@ -0,0 +1,125 @@
+<?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
+ */
+
+/**
+ * Replacement array for FSS with fallback to strtr()
+ * Supports lazy initialisation of FSS resource
+ */
+class ReplacementArray {
+       private $data = false;
+       private $fss = false;
+
+       /**
+        * Create an object with the specified replacement array
+        * The array should have the same form as the replacement array for strtr()
+        * @param array $data
+        */
+       public function __construct( $data = array() ) {
+               $this->data = $data;
+       }
+
+       /**
+        * @return array
+        */
+       public function __sleep() {
+               return array( 'data' );
+       }
+
+       public function __wakeup() {
+               $this->fss = false;
+       }
+
+       /**
+        * Set the whole replacement array at once
+        * @param array $data
+        */
+       public function setArray( $data ) {
+               $this->data = $data;
+               $this->fss = false;
+       }
+
+       /**
+        * @return array|bool
+        */
+       public function getArray() {
+               return $this->data;
+       }
+
+       /**
+        * Set an element of the replacement array
+        * @param string $from
+        * @param string $to
+        */
+       public function setPair( $from, $to ) {
+               $this->data[$from] = $to;
+               $this->fss = false;
+       }
+
+       /**
+        * @param array $data
+        */
+       public function mergeArray( $data ) {
+               $this->data = array_merge( $this->data, $data );
+               $this->fss = false;
+       }
+
+       /**
+        * @param ReplacementArray $other
+        */
+       public function merge( ReplacementArray $other ) {
+               $this->data = array_merge( $this->data, $other->data );
+               $this->fss = false;
+       }
+
+       /**
+        * @param string $from
+        */
+       public function removePair( $from ) {
+               unset( $this->data[$from] );
+               $this->fss = false;
+       }
+
+       /**
+        * @param array $data
+        */
+       public function removeArray( $data ) {
+               foreach ( $data as $from => $to ) {
+                       $this->removePair( $from );
+               }
+               $this->fss = false;
+       }
+
+       /**
+        * @param string $subject
+        * @return string
+        */
+       public function replace( $subject ) {
+               if ( function_exists( 'fss_prep_replace' ) ) {
+                       if ( $this->fss === false ) {
+                               $this->fss = fss_prep_replace( $this->data );
+                       }
+                       $result = fss_exec_replace( $this->fss, $subject );
+               } else {
+                       $result = strtr( $subject, $this->data );
+               }
+
+               return $result;
+       }
+}
diff --git a/includes/libs/StatusValue.php b/includes/libs/StatusValue.php
new file mode 100644 (file)
index 0000000..3c2dd40
--- /dev/null
@@ -0,0 +1,316 @@
+<?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
+ */
+
+/**
+ * Generic operation result class
+ * Has warning/error list, boolean status and arbitrary value
+ *
+ * "Good" means the operation was completed with no warnings or errors.
+ *
+ * "OK" means the operation was partially or wholly completed.
+ *
+ * An operation which is not OK should have errors so that the user can be
+ * informed as to what went wrong. Calling the fatal() function sets an error
+ * message and simultaneously switches off the OK flag.
+ *
+ * The recommended pattern for Status objects is to return a StatusValue
+ * unconditionally, i.e. both on success and on failure -- so that the
+ * developer of the calling code is reminded that the function can fail, and
+ * so that a lack of error-handling will be explicit.
+ *
+ * The use of Message objects should be avoided when serializability is needed.
+ *
+ * @since 1.25
+ */
+class StatusValue {
+       /** @var bool */
+       protected $ok = true;
+       /** @var array */
+       protected $errors = array();
+
+       /** @var mixed */
+       public $value;
+       /** @var array Map of (key => bool) to indicate success of each part of batch operations */
+       public $success = array();
+       /** @var int Counter for batch operations */
+       public $successCount = 0;
+       /** @var int Counter for batch operations */
+       public $failCount = 0;
+
+       /**
+        * Factory function for fatal errors
+        *
+        * @param string|MessageSpecifier $message Message key or object
+        * @return Status
+        */
+       public static function newFatal( $message /*, parameters...*/ ) {
+               $params = func_get_args();
+               $result = new static();
+               call_user_func_array( array( &$result, 'fatal' ), $params );
+               return $result;
+       }
+
+       /**
+        * Factory function for good results
+        *
+        * @param mixed $value
+        * @return Status
+        */
+       public static function newGood( $value = null ) {
+               $result = new static();
+               $result->value = $value;
+               return $result;
+       }
+
+       /**
+        * Returns whether the operation completed and didn't have any error or
+        * warnings
+        *
+        * @return bool
+        */
+       public function isGood() {
+               return $this->ok && !$this->errors;
+       }
+
+       /**
+        * Returns whether the operation completed
+        *
+        * @return bool
+        */
+       public function isOK() {
+               return $this->ok;
+       }
+
+       /**
+        * @return mixed
+        */
+       public function getValue() {
+               return $this->value;
+       }
+
+       /**
+        * Get the list of errors
+        *
+        * Each error is a (message:string or MessageSpecifier,params:array) map
+        *
+        * @return array
+        */
+       public function getErrors() {
+               return $this->errors;
+       }
+
+       /**
+        * Change operation status
+        *
+        * @param bool $ok
+        */
+       public function setOK( $ok ) {
+               $this->ok = $ok;
+       }
+
+       /**
+        * Change operation resuklt
+        *
+        * @param bool $ok Whether the operation completed
+        * @param mixed $value
+        */
+       public function setResult( $ok, $value = null ) {
+               $this->ok = $ok;
+               $this->value = $value;
+       }
+
+       /**
+        * Add a new warning
+        *
+        * @param string|MessageSpecifier $message Message key or object
+        */
+       public function warning( $message /*, parameters... */ ) {
+               $this->errors[] = array(
+                       'type' => 'warning',
+                       'message' => $message,
+                       'params' => array_slice( func_get_args(), 1 )
+               );
+       }
+
+       /**
+        * Add an error, do not set fatal flag
+        * This can be used for non-fatal errors
+        *
+        * @param string|MessageSpecifier $message Message key or object
+        */
+       public function error( $message /*, parameters... */ ) {
+               $this->errors[] = array(
+                       'type' => 'error',
+                       'message' => $message,
+                       'params' => array_slice( func_get_args(), 1 )
+               );
+       }
+
+       /**
+        * Add an error and set OK to false, indicating that the operation
+        * as a whole was fatal
+        *
+        * @param string|MessageSpecifier $message Message key or object
+        */
+       public function fatal( $message /*, parameters... */ ) {
+               $this->errors[] = array(
+                       'type' => 'error',
+                       'message' => $message,
+                       'params' => array_slice( func_get_args(), 1 )
+               );
+               $this->ok = false;
+       }
+
+       /**
+        * Merge another status object into this one
+        *
+        * @param Status $other Other Status object
+        * @param bool $overwriteValue Whether to override the "value" member
+        */
+       public function merge( $other, $overwriteValue = false ) {
+               $this->errors = array_merge( $this->errors, $other->errors );
+               $this->ok = $this->ok && $other->ok;
+               if ( $overwriteValue ) {
+                       $this->value = $other->value;
+               }
+               $this->successCount += $other->successCount;
+               $this->failCount += $other->failCount;
+       }
+
+       /**
+        * Returns a list of status messages of the given type
+        *
+        * Each entry is a map of (message:string or MessageSpecifier,params:array))
+        *
+        * @param string $type
+        * @return array
+        */
+       public function getErrorsByType( $type ) {
+               $result = array();
+               foreach ( $this->errors as $error ) {
+                       if ( $error['type'] === $type ) {
+                               $result[] = $error;
+                       }
+               }
+
+               return $result;
+       }
+
+       /**
+        * Returns true if the specified message is present as a warning or error
+        *
+        * @param string|MessageSpecifier $message Message key or object to search for
+        *
+        * @return bool
+        */
+       public function hasMessage( $message ) {
+               if ( $message instanceof MessageSpecifier ) {
+                       $message = $message->getKey();
+               }
+               foreach ( $this->errors as $error ) {
+                       if ( $error['message'] instanceof MessageSpecifier
+                               && $error['message']->getKey() === $message
+                       ) {
+                               return true;
+                       } elseif ( $error['message'] === $message ) {
+                               return true;
+                       }
+               }
+
+               return false;
+       }
+
+       /**
+        * If the specified source message exists, replace it with the specified
+        * destination message, but keep the same parameters as in the original error.
+        *
+        * Note, due to the lack of tools for comparing IStatusMessage objects, this
+        * function will not work when using such an object as the search parameter.
+        *
+        * @param IStatusMessage|string $source Message key or object to search for
+        * @param IStatusMessage|string $dest Replacement message key or object
+        * @return bool Return true if the replacement was done, false otherwise.
+        */
+       public function replaceMessage( $source, $dest ) {
+               $replaced = false;
+
+               foreach ( $this->errors as $index => $error ) {
+                       if ( $error['message'] === $source ) {
+                               $this->errors[$index]['message'] = $dest;
+                               $replaced = true;
+                       }
+               }
+
+               return $replaced;
+       }
+
+       /**
+        * @return string
+        */
+       public function __toString() {
+               $status = $this->isOK() ? "OK" : "Error";
+               if ( count( $this->errors ) ) {
+                       $errorcount = "collected " . ( count( $this->errors ) ) . " error(s) on the way";
+               } else {
+                       $errorcount = "no errors detected";
+               }
+               if ( isset( $this->value ) ) {
+                       $valstr = gettype( $this->value ) . " value set";
+                       if ( is_object( $this->value ) ) {
+                               $valstr .= "\"" . get_class( $this->value ) . "\" instance";
+                       }
+               } else {
+                       $valstr = "no value set";
+               }
+               $out = sprintf( "<%s, %s, %s>",
+                       $status,
+                       $errorcount,
+                       $valstr
+               );
+               if ( count( $this->errors ) > 0 ) {
+                       $hdr = sprintf( "+-%'-4s-+-%'-25s-+-%'-40s-+\n", "", "", "" );
+                       $i = 1;
+                       $out .= "\n";
+                       $out .= $hdr;
+                       foreach ( $this->errors as $error ) {
+                               if ( $error['message'] instanceof MessageSpecifier ) {
+                                       $key = $error['message']->getKey();
+                                       $params = $error['message']->getParams();
+                               } elseif ( $error['params'] ) {
+                                       $key = $error['message'];
+                                       $params = $error['params'];
+                               } else {
+                                       $key = $error['message'];
+                                       $params = array();
+                               }
+
+                               $out .= sprintf( "| %4d | %-25.25s | %-40.40s |\n",
+                                       $i,
+                                       $key,
+                                       implode( " ", $params )
+                               );
+                               $i += 1;
+                       }
+                       $out .= $hdr;
+               }
+
+               return $out;
+       }
+}
diff --git a/includes/libs/StringUtils.php b/includes/libs/StringUtils.php
new file mode 100644 (file)
index 0000000..11ae0b2
--- /dev/null
@@ -0,0 +1,317 @@
+<?php
+/**
+ * Methods to play with strings.
+ *
+ * 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 collection of static methods to play with strings.
+ */
+class StringUtils {
+       /**
+        * Test whether a string is valid UTF-8.
+        *
+        * The function check for invalid byte sequences, overlong encoding but
+        * not for different normalisations.
+        *
+        * This relies internally on the mbstring function mb_check_encoding()
+        * hardcoded to check against UTF-8. Whenever the function is not available
+        * we fallback to a pure PHP implementation. Setting $disableMbstring to
+        * true will skip the use of mb_check_encoding, this is mostly intended for
+        * unit testing our internal implementation.
+        *
+        * @since 1.21
+        * @note In MediaWiki 1.21, this function did not provide proper UTF-8 validation.
+        * In particular, the pure PHP code path did not in fact check for overlong forms.
+        * Beware of this when backporting code to that version of MediaWiki.
+        *
+        * @param string $value String to check
+        * @param bool $disableMbstring Whether to use the pure PHP
+        * implementation instead of trying mb_check_encoding. Intended for unit
+        * testing. Default: false
+        *
+        * @return bool Whether the given $value is a valid UTF-8 encoded string
+        */
+       static function isUtf8( $value, $disableMbstring = false ) {
+               $value = (string)$value;
+
+               // If the mbstring extension is loaded, use it. However, before PHP 5.4, values above
+               // U+10FFFF are incorrectly allowed, so we have to check for them separately.
+               if ( !$disableMbstring && function_exists( 'mb_check_encoding' ) ) {
+                       static $newPHP;
+                       if ( $newPHP === null ) {
+                               $newPHP = !mb_check_encoding( "\xf4\x90\x80\x80", 'UTF-8' );
+                       }
+
+                       return mb_check_encoding( $value, 'UTF-8' ) &&
+                               ( $newPHP || preg_match( "/\xf4[\x90-\xbf]|[\xf5-\xff]/S", $value ) === 0 );
+               }
+
+               if ( preg_match( "/[\x80-\xff]/S", $value ) === 0 ) {
+                       // String contains only ASCII characters, has to be valid
+                       return true;
+               }
+
+               // PCRE implements repetition using recursion; to avoid a stack overflow (and segfault)
+               // for large input, we check for invalid sequences (<= 5 bytes) rather than valid
+               // sequences, which can be as long as the input string is. Multiple short regexes are
+               // used rather than a single long regex for performance.
+               static $regexes;
+               if ( $regexes === null ) {
+                       $cont = "[\x80-\xbf]";
+                       $after = "(?!$cont)"; // "(?:[^\x80-\xbf]|$)" would work here
+                       $regexes = array(
+                               // Continuation byte at the start
+                               "/^$cont/",
+
+                               // ASCII byte followed by a continuation byte
+                               "/[\\x00-\x7f]$cont/S",
+
+                               // Illegal byte
+                               "/[\xc0\xc1\xf5-\xff]/S",
+
+                               // Invalid 2-byte sequence, or valid one then an extra continuation byte
+                               "/[\xc2-\xdf](?!$cont$after)/S",
+
+                               // Invalid 3-byte sequence, or valid one then an extra continuation byte
+                               "/\xe0(?![\xa0-\xbf]$cont$after)/",
+                               "/[\xe1-\xec\xee\xef](?!$cont{2}$after)/S",
+                               "/\xed(?![\x80-\x9f]$cont$after)/",
+
+                               // Invalid 4-byte sequence, or valid one then an extra continuation byte
+                               "/\xf0(?![\x90-\xbf]$cont{2}$after)/",
+                               "/[\xf1-\xf3](?!$cont{3}$after)/S",
+                               "/\xf4(?![\x80-\x8f]$cont{2}$after)/",
+                       );
+               }
+
+               foreach ( $regexes as $regex ) {
+                       if ( preg_match( $regex, $value ) !== 0 ) {
+                               return false;
+                       }
+               }
+
+               return true;
+       }
+
+       /**
+        * Perform an operation equivalent to
+        *
+        *     preg_replace( "!$startDelim(.*?)$endDelim!", $replace, $subject );
+        *
+        * except that it's worst-case O(N) instead of O(N^2)
+        *
+        * Compared to delimiterReplace(), this implementation is fast but memory-
+        * hungry and inflexible. The memory requirements are such that I don't
+        * recommend using it on anything but guaranteed small chunks of text.
+        *
+        * @param string $startDelim
+        * @param string $endDelim
+        * @param string $replace
+        * @param string $subject
+        *
+        * @return string
+        */
+       static function hungryDelimiterReplace( $startDelim, $endDelim, $replace, $subject ) {
+               $segments = explode( $startDelim, $subject );
+               $output = array_shift( $segments );
+               foreach ( $segments as $s ) {
+                       $endDelimPos = strpos( $s, $endDelim );
+                       if ( $endDelimPos === false ) {
+                               $output .= $startDelim . $s;
+                       } else {
+                               $output .= $replace . substr( $s, $endDelimPos + strlen( $endDelim ) );
+                       }
+               }
+
+               return $output;
+       }
+
+       /**
+        * Perform an operation equivalent to
+        *
+        *   preg_replace_callback( "!$startDelim(.*)$endDelim!s$flags", $callback, $subject )
+        *
+        * This implementation is slower than hungryDelimiterReplace but uses far less
+        * memory. The delimiters are literal strings, not regular expressions.
+        *
+        * If the start delimiter ends with an initial substring of the end delimiter,
+        * e.g. in the case of C-style comments, the behavior differs from the model
+        * regex. In this implementation, the end must share no characters with the
+        * start, so e.g. /*\/ is not considered to be both the start and end of a
+        * comment. /*\/xy/*\/ is considered to be a single comment with contents /xy/.
+        *
+        * @param string $startDelim Start delimiter
+        * @param string $endDelim End delimiter
+        * @param callable $callback Function to call on each match
+        * @param string $subject
+        * @param string $flags Regular expression flags
+        * @throws InvalidArgumentException
+        * @return string
+        */
+       static function delimiterReplaceCallback( $startDelim, $endDelim, $callback,
+               $subject, $flags = ''
+       ) {
+               $inputPos = 0;
+               $outputPos = 0;
+               $output = '';
+               $foundStart = false;
+               $encStart = preg_quote( $startDelim, '!' );
+               $encEnd = preg_quote( $endDelim, '!' );
+               $strcmp = strpos( $flags, 'i' ) === false ? 'strcmp' : 'strcasecmp';
+               $endLength = strlen( $endDelim );
+               $m = array();
+
+               while ( $inputPos < strlen( $subject ) &&
+                       preg_match( "!($encStart)|($encEnd)!S$flags", $subject, $m, PREG_OFFSET_CAPTURE, $inputPos )
+               ) {
+                       $tokenOffset = $m[0][1];
+                       if ( $m[1][0] != '' ) {
+                               if ( $foundStart &&
+                                       $strcmp( $endDelim, substr( $subject, $tokenOffset, $endLength ) ) == 0
+                               ) {
+                                       # An end match is present at the same location
+                                       $tokenType = 'end';
+                                       $tokenLength = $endLength;
+                               } else {
+                                       $tokenType = 'start';
+                                       $tokenLength = strlen( $m[0][0] );
+                               }
+                       } elseif ( $m[2][0] != '' ) {
+                               $tokenType = 'end';
+                               $tokenLength = strlen( $m[0][0] );
+                       } else {
+                               throw new InvalidArgumentException( 'Invalid delimiter given to ' . __METHOD__ );
+                       }
+
+                       if ( $tokenType == 'start' ) {
+                               # Only move the start position if we haven't already found a start
+                               # This means that START START END matches outer pair
+                               if ( !$foundStart ) {
+                                       # Found start
+                                       $inputPos = $tokenOffset + $tokenLength;
+                                       # Write out the non-matching section
+                                       $output .= substr( $subject, $outputPos, $tokenOffset - $outputPos );
+                                       $outputPos = $tokenOffset;
+                                       $contentPos = $inputPos;
+                                       $foundStart = true;
+                               } else {
+                                       # Move the input position past the *first character* of START,
+                                       # to protect against missing END when it overlaps with START
+                                       $inputPos = $tokenOffset + 1;
+                               }
+                       } elseif ( $tokenType == 'end' ) {
+                               if ( $foundStart ) {
+                                       # Found match
+                                       $output .= call_user_func( $callback, array(
+                                               substr( $subject, $outputPos, $tokenOffset + $tokenLength - $outputPos ),
+                                               substr( $subject, $contentPos, $tokenOffset - $contentPos )
+                                       ) );
+                                       $foundStart = false;
+                               } else {
+                                       # Non-matching end, write it out
+                                       $output .= substr( $subject, $inputPos, $tokenOffset + $tokenLength - $outputPos );
+                               }
+                               $inputPos = $outputPos = $tokenOffset + $tokenLength;
+                       } else {
+                               throw new InvalidArgumentException( 'Invalid delimiter given to ' . __METHOD__ );
+                       }
+               }
+               if ( $outputPos < strlen( $subject ) ) {
+                       $output .= substr( $subject, $outputPos );
+               }
+
+               return $output;
+       }
+
+       /**
+        * Perform an operation equivalent to
+        *
+        *   preg_replace( "!$startDelim(.*)$endDelim!$flags", $replace, $subject )
+        *
+        * @param string $startDelim Start delimiter regular expression
+        * @param string $endDelim End delimiter regular expression
+        * @param string $replace Replacement string. May contain $1, which will be
+        *                 replaced by the text between the delimiters
+        * @param string $subject String to search
+        * @param string $flags Regular expression flags
+        * @return string The string with the matches replaced
+        */
+       static function delimiterReplace( $startDelim, $endDelim, $replace, $subject, $flags = '' ) {
+               $replacer = new RegexlikeReplacer( $replace );
+
+               return self::delimiterReplaceCallback( $startDelim, $endDelim,
+                       $replacer->cb(), $subject, $flags );
+       }
+
+       /**
+        * More or less "markup-safe" explode()
+        * Ignores any instances of the separator inside <...>
+        * @param string $separator
+        * @param string $text
+        * @return array
+        */
+       static function explodeMarkup( $separator, $text ) {
+               $placeholder = "\x00";
+
+               // Remove placeholder instances
+               $text = str_replace( $placeholder, '', $text );
+
+               // Replace instances of the separator inside HTML-like tags with the placeholder
+               $replacer = new DoubleReplacer( $separator, $placeholder );
+               $cleaned = StringUtils::delimiterReplaceCallback( '<', '>', $replacer->cb(), $text );
+
+               // Explode, then put the replaced separators back in
+               $items = explode( $separator, $cleaned );
+               foreach ( $items as $i => $str ) {
+                       $items[$i] = str_replace( $placeholder, $separator, $str );
+               }
+
+               return $items;
+       }
+
+       /**
+        * Escape a string to make it suitable for inclusion in a preg_replace()
+        * replacement parameter.
+        *
+        * @param string $string
+        * @return string
+        */
+       static function escapeRegexReplacement( $string ) {
+               $string = str_replace( '\\', '\\\\', $string );
+               $string = str_replace( '$', '\\$', $string );
+
+               return $string;
+       }
+
+       /**
+        * Workalike for explode() with limited memory usage.
+        * Returns an Iterator
+        * @param string $separator
+        * @param string $subject
+        * @return ArrayIterator|ExplodeIterator
+        */
+       static function explode( $separator, $subject ) {
+               if ( substr_count( $subject, $separator ) > 1000 ) {
+                       return new ExplodeIterator( $separator, $subject );
+               } else {
+                       return new ArrayIterator( explode( $separator, $subject ) );
+               }
+       }
+}
diff --git a/includes/libs/normal/.gitignore b/includes/libs/normal/.gitignore
new file mode 100644 (file)
index 0000000..5af0afa
--- /dev/null
@@ -0,0 +1,6 @@
+/CompositionExclusions.txt
+/DerivedNormalizationProps.txt
+/NormalizationCorrections.txt
+/NormalizationTest.txt
+/UnicodeData.txt
+/testdata
diff --git a/includes/libs/normal/Makefile b/includes/libs/normal/Makefile
new file mode 100644 (file)
index 0000000..b00154d
--- /dev/null
@@ -0,0 +1,72 @@
+.PHONY : all test testutf8 testclean icutest bench icubench clean distclean
+
+## Latest greatest version of Unicode
+## May cause confusion if running test suite from these files
+## when the data was generated from a previous version.
+#BASE=http://www.unicode.org/Public/UNIDATA
+
+# Explicitly using Unicode 6.0
+BASE=http://www.unicode.org/Public/6.0.0/ucd
+
+# Can override to php-cli or php5 or whatever
+PHP=php
+#PHP=php-cli
+
+# Some nice tool to grab URLs with
+FETCH=wget
+#FETCH=fetch
+
+all : UtfNormalData.inc
+
+UtfNormalData.inc : UtfNormalGenerate.php UtfNormalUtil.php UnicodeData.txt CompositionExclusions.txt NormalizationCorrections.txt DerivedNormalizationProps.txt
+       $(PHP) UtfNormalGenerate.php
+
+test : UtfNormalTest.php UtfNormalData.inc NormalizationTest.txt
+       $(PHP) UtfNormalTest.php
+
+bench : UtfNormalData.inc testdata/washington.txt testdata/berlin.txt testdata/tokyo.txt testdata/young.txt testdata/bulgakov.txt
+       $(PHP) UtfNormalBench.php
+
+icutest : UtfNormalData.inc NormalizationTest.txt
+       $(PHP) Utf8Test.php --icu
+       $(PHP) UtfNormalTest.php --icu
+
+icubench : UtfNormalData.inc testdata/washington.txt testdata/berlin.txt testdata/tokyo.txt testdata/young.txt testdata/bulgakov.txt
+       $(PHP) UtfNormalBench.php --icu
+
+clean :
+       rm -f UtfNormalData.inc UtfNormalDataK.inc
+
+distclean : clean
+       rm -f CompositionExclusions.txt NormalizationTest.txt NormalizationCorrections.txt UnicodeData.txt DerivedNormalizationProps.txt UTF-8-test.txt
+
+# The Unicode data files...
+CompositionExclusions.txt :
+       $(FETCH) $(BASE)/CompositionExclusions.txt
+
+NormalizationTest.txt :
+       $(FETCH) $(BASE)/NormalizationTest.txt
+
+NormalizationCorrections.txt :
+       $(FETCH) $(BASE)/NormalizationCorrections.txt
+
+DerivedNormalizationProps.txt :
+       $(FETCH) $(BASE)/DerivedNormalizationProps.txt
+
+UnicodeData.txt :
+       $(FETCH) $(BASE)/UnicodeData.txt
+
+testdata/berlin.txt :
+       mkdir -p testdata && wget -U MediaWiki/test -O testdata/berlin.txt "http://de.wikipedia.org/w/index.php?title=Berlin&oldid=2775712&action=raw"
+
+testdata/washington.txt :
+       mkdir -p testdata && wget -U MediaWiki/test -O testdata/washington.txt "http://en.wikipedia.org/w/index.php?title=Washington%2C_D.C.&oldid=6370218&action=raw"
+
+testdata/tokyo.txt :
+       mkdir -p testdata && wget -U MediaWiki/test -O testdata/tokyo.txt "http://ja.wikipedia.org/w/index.php?title=%E6%9D%B1%E4%BA%AC%E9%83%BD&oldid=940880&action=raw"
+
+testdata/young.txt :
+       mkdir -p testdata && wget -U MediaWiki/test -O testdata/young.txt "http://ko.wikipedia.org/w/index.php?title=%EC%9D%B4%EC%88%98%EC%98%81&oldid=627688&action=raw"
+
+testdata/bulgakov.txt :
+       mkdir -p testdata && wget -U MediaWiki/test -O testdata/bulgakov.txt "http://ru.wikipedia.org/w/index.php?title=%D0%91%D1%83%D0%BB%D0%B3%D0%B0%D0%BA%D0%BE%D0%B2%2C_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B9_%D0%9D%D0%B8%D0%BA%D0%BE%D0%BB%D0%B0%D0%B5%D0%B2%D0%B8%D1%87&oldid=17704&action=raw"
diff --git a/includes/libs/normal/README b/includes/libs/normal/README
new file mode 100644 (file)
index 0000000..fa70c63
--- /dev/null
@@ -0,0 +1,59 @@
+This directory contains some Unicode normalization routines. These routines
+are meant to be reusable in other projects, so I'm not tying them to the
+MediaWiki utility functions.
+
+The main function to care about is UtfNormal::toNFC(); this will convert
+a given UTF-8 string to Normalization Form C if it's not already such.
+The function assumes that the input string is already valid UTF-8; if there
+are corrupt characters this may produce erroneous results.
+
+To also check for illegal characters, use UtfNormal::cleanUp(). This will
+strip illegal UTF-8 sequences and characters that are illegal in XML, and
+if necessary convert to normalization form C.
+
+Performance is kind of stinky in absolute terms, though it should be speedy
+on pure ASCII text. ;) On text that can be determined quickly to already be
+in NFC it's not too awful but it can quickly get uncomfortably slow,
+particularly for Korean text (the hangul decomposition/composition code is
+extra slow).
+
+
+== Regenerating data tables ==
+
+UtfNormalData.inc and UtfNormalDataK.inc are generated from the Unicode
+Character Database by the script UtfNormalGenerate.php. On a *nix system
+'make' should fetch the necessary files and regenerate it if the scripts
+have been changed or you remove it.
+
+
+== Testing ==
+
+'make test' will run the conformance test (UtfNormalTest.php), fetching the
+data from the net if necessary. If it reports failure, something is
+going wrong!
+
+You may have to set up PHPUnit first.
+
+$ pear channel-discover pear.phpunit.de
+$ pear install phpunit/PHPUnit
+
+== Benchmarks ==
+
+Run 'make bench' to download some sample texts from Wikipedia and run some
+cheap benchmarks of some of the functions. Take all numbers with large
+grains of salt.
+
+
+== PHP module extension ==
+
+There's an experimental PHP extension module which wraps the ICU library's
+normalization functions. This is *MUCH* faster than doing this work in pure
+PHP code. This is at https://git.wikimedia.org/summary/mediawiki%2Fextensions%2Fnormal.git.
+It is used by the WMF, which currently runs PHP 5.3.10 on Linux.  It hasn't been
+thoroughly tested on other configurations, but may work.
+
+If the php_normal.so module is loaded in php.ini, the normalization functions
+will automatically use it. If you can't (or don't want to) load it in php.ini,
+you may be able to load it using the dl() function before the inclusion of
+UtfNormal.php, and it will be picked up.
+
diff --git a/includes/libs/normal/RandomTest.php b/includes/libs/normal/RandomTest.php
new file mode 100644 (file)
index 0000000..0604d7b
--- /dev/null
@@ -0,0 +1,102 @@
+<?php
+/**
+ * Test feeds random 16-byte strings to both the pure PHP and ICU-based
+ * UtfNormal::cleanUp() code paths, and checks to see if there's a
+ * difference. Will run forever until it finds one or you kill it.
+ *
+ * Copyright (C) 2004 Brion Vibber <brion@pobox.com>
+ * https://www.mediawiki.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup UtfNormal
+ */
+
+if ( PHP_SAPI != 'cli' ) {
+       die( "Run me from the command line please.\n" );
+}
+
+/** */
+require_once 'UtfNormal.php';
+require_once '../diff/DifferenceEngine.php';
+
+dl( 'php_utfnormal.so' );
+
+# mt_srand( 99999 );
+
+function randomString( $length, $nullOk, $ascii = false ) {
+       $out = '';
+       for ( $i = 0; $i < $length; $i++ )
+               $out .= chr( mt_rand( $nullOk ? 0 : 1, $ascii ? 127 : 255 ) );
+
+       return $out;
+}
+
+/* Duplicate of the cleanUp() path for ICU usage */
+function donorm( $str ) {
+       # We exclude a few chars that ICU would not.
+       $str = preg_replace( '/[\x00-\x08\x0b\x0c\x0e-\x1f]/', UTF8_REPLACEMENT, $str );
+       $str = str_replace( UTF8_FFFE, UTF8_REPLACEMENT, $str );
+       $str = str_replace( UTF8_FFFF, UTF8_REPLACEMENT, $str );
+
+       # UnicodeString constructor fails if the string ends with a head byte.
+       # Add a junk char at the end, we'll strip it off
+       return rtrim( utf8_normalize( $str . "\x01", UtfNormal::UNORM_NFC ), "\x01" );
+}
+
+function showDiffs( $a, $b ) {
+       $ota = explode( "\n", str_replace( "\r\n", "\n", $a ) );
+       $nta = explode( "\n", str_replace( "\r\n", "\n", $b ) );
+
+       $diffs = new Diff( $ota, $nta );
+       $formatter = new TableDiffFormatter();
+       $funky = $formatter->format( $diffs );
+       $matches = array();
+       preg_match_all( '/<(?:ins|del) class="diffchange">(.*?)<\/(?:ins|del)>/', $funky, $matches );
+       foreach ( $matches[1] as $bit ) {
+               $hex = bin2hex( $bit );
+               echo "\t$hex\n";
+       }
+}
+
+$size = 16;
+$n = 0;
+while ( true ) {
+       $n++;
+       echo "$n\n";
+
+       $str = randomString( $size, true );
+       $clean = UtfNormal::cleanUp( $str );
+       $norm = donorm( $str );
+
+       echo strlen( $clean ) . ", " . strlen( $norm );
+       if ( $clean == $norm ) {
+               echo " (match)\n";
+       } else {
+               echo " (FAIL)\n";
+               echo "\traw: " . bin2hex( $str ) . "\n" .
+                       "\tphp: " . bin2hex( $clean ) . "\n" .
+                       "\ticu: " . bin2hex( $norm ) . "\n";
+               echo "\n\tdiffs:\n";
+               showDiffs( $clean, $norm );
+               die();
+       }
+
+       $str = '';
+       $clean = '';
+       $norm = '';
+}
diff --git a/includes/libs/normal/UtfNormal.php b/includes/libs/normal/UtfNormal.php
new file mode 100644 (file)
index 0000000..8204f97
--- /dev/null
@@ -0,0 +1,790 @@
+<?php
+/**
+ * Unicode normalization routines
+ *
+ * Copyright © 2004 Brion Vibber <brion@pobox.com>
+ * https://www.mediawiki.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup UtfNormal
+ */
+
+/**
+ * @defgroup UtfNormal UtfNormal
+ */
+
+define( 'NORMALIZE_ICU', function_exists( 'utf8_normalize' ) );
+define( 'NORMALIZE_INTL', function_exists( 'normalizer_normalize' ) );
+
+/**
+ * Unicode normalization routines for working with UTF-8 strings.
+ * Currently assumes that input strings are valid UTF-8!
+ *
+ * Not as fast as I'd like, but should be usable for most purposes.
+ * UtfNormal::toNFC() will bail early if given ASCII text or text
+ * it can quickly determine is already normalized.
+ *
+ * All functions can be called static.
+ *
+ * See description of forms at http://www.unicode.org/reports/tr15/
+ *
+ * @ingroup UtfNormal
+ */
+class UtfNormal {
+       /**
+        * For using the ICU wrapper
+        */
+       const UNORM_NONE = 1;
+       const UNORM_NFD = 2;
+       const UNORM_NFKD = 3;
+       const UNORM_NFC = 4;
+       const UNORM_NFKC = 5;
+       const UNORM_FCD = 6;
+       const UNORM_DEFAULT = self::UNORM_NFC;
+
+       public static $utfCombiningClass = null;
+       public static $utfCanonicalComp = null;
+       public static $utfCanonicalDecomp = null;
+
+       # Load compatibility decompositions on demand if they are needed.
+       public static $utfCompatibilityDecomp = null;
+       public static $utfCheckNFC;
+
+       /**
+        * The ultimate convenience function! Clean up invalid UTF-8 sequences,
+        * and convert to normal form C, canonical composition.
+        *
+        * Fast return for pure ASCII strings; some lesser optimizations for
+        * strings containing only known-good characters. Not as fast as toNFC().
+        *
+        * @param string $string a UTF-8 string
+        * @return string a clean, shiny, normalized UTF-8 string
+        */
+       static function cleanUp( $string ) {
+               if ( NORMALIZE_ICU ) {
+                       $string = self::replaceForNativeNormalize( $string );
+
+                       # UnicodeString constructor fails if the string ends with a
+                       # head byte. Add a junk char at the end, we'll strip it off.
+                       return rtrim( utf8_normalize( $string . "\x01", self::UNORM_NFC ), "\x01" );
+               } elseif ( NORMALIZE_INTL ) {
+                       $string = self::replaceForNativeNormalize( $string );
+                       $norm = normalizer_normalize( $string, Normalizer::FORM_C );
+                       if ( $norm === null || $norm === false ) {
+                               # normalizer_normalize will either return false or null
+                               # (depending on which doc you read) if invalid utf8 string.
+                               # quickIsNFCVerify cleans up invalid sequences.
+
+                               if ( UtfNormal::quickIsNFCVerify( $string ) ) {
+                                       # if that's true, the string is actually already normal.
+                                       return $string;
+                               } else {
+                                       # Now we are valid but non-normal
+                                       return normalizer_normalize( $string, Normalizer::FORM_C );
+                               }
+                       } else {
+                               return $norm;
+                       }
+               } elseif ( UtfNormal::quickIsNFCVerify( $string ) ) {
+                       # Side effect -- $string has had UTF-8 errors cleaned up.
+                       return $string;
+               } else {
+                       return UtfNormal::NFC( $string );
+               }
+       }
+
+       /**
+        * Convert a UTF-8 string to normal form C, canonical composition.
+        * Fast return for pure ASCII strings; some lesser optimizations for
+        * strings containing only known-good characters.
+        *
+        * @param string $string a valid UTF-8 string. Input is not validated.
+        * @return string a UTF-8 string in normal form C
+        */
+       static function toNFC( $string ) {
+               if ( NORMALIZE_INTL )
+                       return normalizer_normalize( $string, Normalizer::FORM_C );
+               elseif ( NORMALIZE_ICU )
+                       return utf8_normalize( $string, self::UNORM_NFC );
+               elseif ( UtfNormal::quickIsNFC( $string ) )
+                       return $string;
+               else
+                       return UtfNormal::NFC( $string );
+       }
+
+       /**
+        * Convert a UTF-8 string to normal form D, canonical decomposition.
+        * Fast return for pure ASCII strings.
+        *
+        * @param string $string a valid UTF-8 string. Input is not validated.
+        * @return string a UTF-8 string in normal form D
+        */
+       static function toNFD( $string ) {
+               if ( NORMALIZE_INTL )
+                       return normalizer_normalize( $string, Normalizer::FORM_D );
+               elseif ( NORMALIZE_ICU )
+                       return utf8_normalize( $string, self::UNORM_NFD );
+               elseif ( preg_match( '/[\x80-\xff]/', $string ) )
+                       return UtfNormal::NFD( $string );
+               else
+                       return $string;
+       }
+
+       /**
+        * Convert a UTF-8 string to normal form KC, compatibility composition.
+        * This may cause irreversible information loss, use judiciously.
+        * Fast return for pure ASCII strings.
+        *
+        * @param string $string a valid UTF-8 string. Input is not validated.
+        * @return string a UTF-8 string in normal form KC
+        */
+       static function toNFKC( $string ) {
+               if ( NORMALIZE_INTL )
+                       return normalizer_normalize( $string, Normalizer::FORM_KC );
+               elseif ( NORMALIZE_ICU )
+                       return utf8_normalize( $string, self::UNORM_NFKC );
+               elseif ( preg_match( '/[\x80-\xff]/', $string ) )
+                       return UtfNormal::NFKC( $string );
+               else
+                       return $string;
+       }
+
+       /**
+        * Convert a UTF-8 string to normal form KD, compatibility decomposition.
+        * This may cause irreversible information loss, use judiciously.
+        * Fast return for pure ASCII strings.
+        *
+        * @param string $string a valid UTF-8 string. Input is not validated.
+        * @return string a UTF-8 string in normal form KD
+        */
+       static function toNFKD( $string ) {
+               if ( NORMALIZE_INTL )
+                       return normalizer_normalize( $string, Normalizer::FORM_KD );
+               elseif ( NORMALIZE_ICU )
+                       return utf8_normalize( $string, self::UNORM_NFKD );
+               elseif ( preg_match( '/[\x80-\xff]/', $string ) )
+                       return UtfNormal::NFKD( $string );
+               else
+                       return $string;
+       }
+
+       /**
+        * Load the basic composition data if necessary
+        * @private
+        */
+       static function loadData() {
+               if ( !isset( self::$utfCombiningClass ) ) {
+                       require_once __DIR__ . '/UtfNormalData.inc';
+               }
+       }
+
+       /**
+        * Returns true if the string is _definitely_ in NFC.
+        * Returns false if not or uncertain.
+        * @param string $string a valid UTF-8 string. Input is not validated.
+        * @return bool
+        */
+       static function quickIsNFC( $string ) {
+               # ASCII is always valid NFC!
+               # If it's pure ASCII, let it through.
+               if ( !preg_match( '/[\x80-\xff]/', $string ) ) return true;
+
+               UtfNormal::loadData();
+               $len = strlen( $string );
+               for ( $i = 0; $i < $len; $i++ ) {
+                       $c = $string[$i];
+                       $n = ord( $c );
+                       if ( $n < 0x80 ) {
+                               continue;
+                       } elseif ( $n >= 0xf0 ) {
+                               $c = substr( $string, $i, 4 );
+                               $i += 3;
+                       } elseif ( $n >= 0xe0 ) {
+                               $c = substr( $string, $i, 3 );
+                               $i += 2;
+                       } elseif ( $n >= 0xc0 ) {
+                               $c = substr( $string, $i, 2 );
+                               $i++;
+                       }
+                       if ( isset( self::$utfCheckNFC[$c] ) ) {
+                               # If it's NO or MAYBE, bail and do the slow check.
+                               return false;
+                       }
+                       if ( isset( self::$utfCombiningClass[$c] ) ) {
+                               # Combining character? We might have to do sorting, at least.
+                               return false;
+                       }
+               }
+
+               return true;
+       }
+
+       /**
+        * Returns true if the string is _definitely_ in NFC.
+        * Returns false if not or uncertain.
+        * @param string $string a UTF-8 string, altered on output to be valid UTF-8 safe for XML.
+        * @return bool
+        */
+       static function quickIsNFCVerify( &$string ) {
+               # Screen out some characters that eg won't be allowed in XML
+               $string = preg_replace( '/[\x00-\x08\x0b\x0c\x0e-\x1f]/', UTF8_REPLACEMENT, $string );
+
+               # ASCII is always valid NFC!
+               # If we're only ever given plain ASCII, we can avoid the overhead
+               # of initializing the decomposition tables by skipping out early.
+               if ( !preg_match( '/[\x80-\xff]/', $string ) ) return true;
+
+               static $checkit = null, $tailBytes = null, $utfCheckOrCombining = null;
+               if ( !isset( $checkit ) ) {
+                       # Load/build some scary lookup tables...
+                       UtfNormal::loadData();
+
+                       $utfCheckOrCombining = array_merge( self::$utfCheckNFC, self::$utfCombiningClass );
+
+                       # Head bytes for sequences which we should do further validity checks
+                       $checkit = array_flip( array_map( 'chr',
+                               array( 0xc0, 0xc1, 0xe0, 0xed, 0xef,
+                                       0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
+                                       0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff ) ) );
+
+                       # Each UTF-8 head byte is followed by a certain
+                       # number of tail bytes.
+                       $tailBytes = array();
+                       for ( $n = 0; $n < 256; $n++ ) {
+                               if ( $n < 0xc0 ) {
+                                       $remaining = 0;
+                               } elseif ( $n < 0xe0 ) {
+                                       $remaining = 1;
+                               } elseif ( $n < 0xf0 ) {
+                                       $remaining = 2;
+                               } elseif ( $n < 0xf8 ) {
+                                       $remaining = 3;
+                               } elseif ( $n < 0xfc ) {
+                                       $remaining = 4;
+                               } elseif ( $n < 0xfe ) {
+                                       $remaining = 5;
+                               } else {
+                                       $remaining = 0;
+                               }
+                               $tailBytes[chr( $n )] = $remaining;
+                       }
+               }
+
+               # Chop the text into pure-ASCII and non-ASCII areas;
+               # large ASCII parts can be handled much more quickly.
+               # Don't chop up Unicode areas for punctuation, though,
+               # that wastes energy.
+               $matches = array();
+               preg_match_all(
+                       '/([\x00-\x7f]+|[\x80-\xff][\x00-\x40\x5b-\x5f\x7b-\xff]*)/',
+                       $string, $matches );
+
+               $looksNormal = true;
+               $base = 0;
+               $replace = array();
+               foreach ( $matches[1] as $str ) {
+                       $chunk = strlen( $str );
+
+                       if ( $str[0] < "\x80" ) {
+                               # ASCII chunk: guaranteed to be valid UTF-8
+                               # and in normal form C, so skip over it.
+                               $base += $chunk;
+                               continue;
+                       }
+
+                       # We'll have to examine the chunk byte by byte to ensure
+                       # that it consists of valid UTF-8 sequences, and to see
+                       # if any of them might not be normalized.
+                       #
+                       # Since PHP is not the fastest language on earth, some of
+                       # this code is a little ugly with inner loop optimizations.
+
+                       $head = '';
+                       $len = $chunk + 1; # Counting down is faster. I'm *so* sorry.
+
+                       for ( $i = -1; --$len; ) {
+                               $remaining = $tailBytes[$c = $str[++$i]];
+                               if ( $remaining ) {
+                                       # UTF-8 head byte!
+                                       $sequence = $head = $c;
+                                       do {
+                                               # Look for the defined number of tail bytes...
+                                               if ( --$len && ( $c = $str[++$i] ) >= "\x80" && $c < "\xc0" ) {
+                                                       # Legal tail bytes are nice.
+                                                       $sequence .= $c;
+                                               } else {
+                                                       if ( 0 == $len ) {
+                                                               # Premature end of string!
+                                                               # Drop a replacement character into output to
+                                                               # represent the invalid UTF-8 sequence.
+                                                               $replace[] = array( UTF8_REPLACEMENT,
+                                                                       $base + $i + 1 - strlen( $sequence ),
+                                                                       strlen( $sequence ) );
+                                                               break 2;
+                                                       } else {
+                                                               # Illegal tail byte; abandon the sequence.
+                                                               $replace[] = array( UTF8_REPLACEMENT,
+                                                                       $base + $i - strlen( $sequence ),
+                                                                       strlen( $sequence ) );
+                                                               # Back up and reprocess this byte; it may itself
+                                                               # be a legal ASCII or UTF-8 sequence head.
+                                                               --$i;
+                                                               ++$len;
+                                                               continue 2;
+                                                       }
+                                               }
+                                       } while ( --$remaining );
+
+                                       if ( isset( $checkit[$head] ) ) {
+                                               # Do some more detailed validity checks, for
+                                               # invalid characters and illegal sequences.
+                                               if ( $head == "\xed" ) {
+                                                       # 0xed is relatively frequent in Korean, which
+                                                       # abuts the surrogate area, so we're doing
+                                                       # this check separately to speed things up.
+
+                                                       if ( $sequence >= UTF8_SURROGATE_FIRST ) {
+                                                               # Surrogates are legal only in UTF-16 code.
+                                                               # They are totally forbidden here in UTF-8
+                                                               # utopia.
+                                                               $replace[] = array( UTF8_REPLACEMENT,
+                                                                       $base + $i + 1 - strlen( $sequence ),
+                                                                       strlen( $sequence ) );
+                                                               $head = '';
+                                                               continue;
+                                                       }
+                                               } else {
+                                                       # Slower, but rarer checks...
+                                                       $n = ord( $head );
+                                                       if (
+                                                               # "Overlong sequences" are those that are syntactically
+                                                               # correct but use more UTF-8 bytes than are necessary to
+                                                               # encode a character. Naïve string comparisons can be
+                                                               # tricked into failing to see a match for an ASCII
+                                                               # character, for instance, which can be a security hole
+                                                               # if blacklist checks are being used.
+                                                               ( $n < 0xc2 && $sequence <= UTF8_OVERLONG_A )
+                                                               || ( $n == 0xe0 && $sequence <= UTF8_OVERLONG_B )
+                                                               || ( $n == 0xf0 && $sequence <= UTF8_OVERLONG_C )
+
+                                                               # U+FFFE and U+FFFF are explicitly forbidden in Unicode.
+                                                               || ( $n == 0xef &&
+                                                                       ( $sequence == UTF8_FFFE )
+                                                                       || ( $sequence == UTF8_FFFF ) )
+
+                                                               # Unicode has been limited to 21 bits; longer
+                                                               # sequences are not allowed.
+                                                               || ( $n >= 0xf0 && $sequence > UTF8_MAX )
+                                                       ) {
+
+                                                               $replace[] = array( UTF8_REPLACEMENT,
+                                                                       $base + $i + 1 - strlen( $sequence ),
+                                                                       strlen( $sequence ) );
+                                                               $head = '';
+                                                               continue;
+                                                       }
+                                               }
+                                       }
+
+                                       if ( isset( $utfCheckOrCombining[$sequence] ) ) {
+                                               # If it's NO or MAYBE, we'll have to rip
+                                               # the string apart and put it back together.
+                                               # That's going to be mighty slow.
+                                               $looksNormal = false;
+                                       }
+
+                                       # The sequence is legal!
+                                       $head = '';
+                               } elseif ( $c < "\x80" ) {
+                                       # ASCII byte.
+                                       $head = '';
+                               } elseif ( $c < "\xc0" ) {
+                                       # Illegal tail bytes
+                                       if ( $head == '' ) {
+                                               # Out of the blue!
+                                               $replace[] = array( UTF8_REPLACEMENT, $base + $i, 1 );
+                                       } else {
+                                               # Don't add if we're continuing a broken sequence;
+                                               # we already put a replacement character when we looked
+                                               # at the broken sequence.
+                                               $replace[] = array( '', $base + $i, 1 );
+                                       }
+                               } else {
+                                       # Miscellaneous freaks.
+                                       $replace[] = array( UTF8_REPLACEMENT, $base + $i, 1 );
+                                       $head = '';
+                               }
+                       }
+                       $base += $chunk;
+               }
+               if ( count( $replace ) ) {
+                       # There were illegal UTF-8 sequences we need to fix up.
+                       $out = '';
+                       $last = 0;
+                       foreach ( $replace as $rep ) {
+                               list( $replacement, $start, $length ) = $rep;
+                               if ( $last < $start ) {
+                                       $out .= substr( $string, $last, $start - $last );
+                               }
+                               $out .= $replacement;
+                               $last = $start + $length;
+                       }
+                       if ( $last < strlen( $string ) ) {
+                               $out .= substr( $string, $last );
+                       }
+                       $string = $out;
+               }
+
+               return $looksNormal;
+       }
+
+       # These take a string and run the normalization on them, without
+       # checking for validity or any optimization etc. Input must be
+       # VALID UTF-8!
+       /**
+        * @param $string string
+        * @return string
+        * @private
+        */
+       static function NFC( $string ) {
+               return UtfNormal::fastCompose( UtfNormal::NFD( $string ) );
+       }
+
+       /**
+        * @param $string string
+        * @return string
+        * @private
+        */
+       static function NFD( $string ) {
+               UtfNormal::loadData();
+
+               return UtfNormal::fastCombiningSort(
+                       UtfNormal::fastDecompose( $string, self::$utfCanonicalDecomp ) );
+       }
+
+       /**
+        * @param $string string
+        * @return string
+        * @private
+        */
+       static function NFKC( $string ) {
+               return UtfNormal::fastCompose( UtfNormal::NFKD( $string ) );
+       }
+
+       /**
+        * @param $string string
+        * @return string
+        * @private
+        */
+       static function NFKD( $string ) {
+               if ( !isset( self::$utfCompatibilityDecomp ) ) {
+                       require_once 'UtfNormalDataK.inc';
+               }
+
+               return self::fastCombiningSort(
+                       self::fastDecompose( $string, self::$utfCompatibilityDecomp ) );
+       }
+
+       /**
+        * Perform decomposition of a UTF-8 string into either D or KD form
+        * (depending on which decomposition map is passed to us).
+        * Input is assumed to be *valid* UTF-8. Invalid code will break.
+        * @private
+        * @param string $string valid UTF-8 string
+        * @param array $map hash of expanded decomposition map
+        * @return string a UTF-8 string decomposed, not yet normalized (needs sorting)
+        */
+       static function fastDecompose( $string, $map ) {
+               UtfNormal::loadData();
+               $len = strlen( $string );
+               $out = '';
+               for ( $i = 0; $i < $len; $i++ ) {
+                       $c = $string[$i];
+                       $n = ord( $c );
+                       if ( $n < 0x80 ) {
+                               # ASCII chars never decompose
+                               # THEY ARE IMMORTAL
+                               $out .= $c;
+                               continue;
+                       } elseif ( $n >= 0xf0 ) {
+                               $c = substr( $string, $i, 4 );
+                               $i += 3;
+                       } elseif ( $n >= 0xe0 ) {
+                               $c = substr( $string, $i, 3 );
+                               $i += 2;
+                       } elseif ( $n >= 0xc0 ) {
+                               $c = substr( $string, $i, 2 );
+                               $i++;
+                       }
+                       if ( isset( $map[$c] ) ) {
+                               $out .= $map[$c];
+                               continue;
+                       } else {
+                               if ( $c >= UTF8_HANGUL_FIRST && $c <= UTF8_HANGUL_LAST ) {
+                                       # Decompose a hangul syllable into jamo;
+                                       # hardcoded for three-byte UTF-8 sequence.
+                                       # A lookup table would be slightly faster,
+                                       # but adds a lot of memory & disk needs.
+                                       #
+                                       $index = ( ( ord( $c[0] ) & 0x0f ) << 12
+                                                       | ( ord( $c[1] ) & 0x3f ) << 6
+                                                       | ( ord( $c[2] ) & 0x3f ) )
+                                               - UNICODE_HANGUL_FIRST;
+                                       $l = intval( $index / UNICODE_HANGUL_NCOUNT );
+                                       $v = intval( ( $index % UNICODE_HANGUL_NCOUNT ) / UNICODE_HANGUL_TCOUNT );
+                                       $t = $index % UNICODE_HANGUL_TCOUNT;
+                                       $out .= "\xe1\x84" . chr( 0x80 + $l ) . "\xe1\x85" . chr( 0xa1 + $v );
+                                       if ( $t >= 25 ) {
+                                               $out .= "\xe1\x87" . chr( 0x80 + $t - 25 );
+                                       } elseif ( $t ) {
+                                               $out .= "\xe1\x86" . chr( 0xa7 + $t );
+                                       }
+                                       continue;
+                               }
+                       }
+                       $out .= $c;
+               }
+
+               return $out;
+       }
+
+       /**
+        * Sorts combining characters into canonical order. This is the
+        * final step in creating decomposed normal forms D and KD.
+        * @private
+        * @param string $string a valid, decomposed UTF-8 string. Input is not validated.
+        * @return string a UTF-8 string with combining characters sorted in canonical order
+        */
+       static function fastCombiningSort( $string ) {
+               UtfNormal::loadData();
+               $len = strlen( $string );
+               $out = '';
+               $combiners = array();
+               $lastClass = -1;
+               for ( $i = 0; $i < $len; $i++ ) {
+                       $c = $string[$i];
+                       $n = ord( $c );
+                       if ( $n >= 0x80 ) {
+                               if ( $n >= 0xf0 ) {
+                                       $c = substr( $string, $i, 4 );
+                                       $i += 3;
+                               } elseif ( $n >= 0xe0 ) {
+                                       $c = substr( $string, $i, 3 );
+                                       $i += 2;
+                               } elseif ( $n >= 0xc0 ) {
+                                       $c = substr( $string, $i, 2 );
+                                       $i++;
+                               }
+                               if ( isset( self::$utfCombiningClass[$c] ) ) {
+                                       $lastClass = self::$utfCombiningClass[$c];
+                                       if ( isset( $combiners[$lastClass] ) ) {
+                                               $combiners[$lastClass] .= $c;
+                                       } else {
+                                               $combiners[$lastClass] = $c;
+                                       }
+                                       continue;
+                               }
+                       }
+                       if ( $lastClass ) {
+                               ksort( $combiners );
+                               $out .= implode( '', $combiners );
+                               $combiners = array();
+                       }
+                       $out .= $c;
+                       $lastClass = 0;
+               }
+               if ( $lastClass ) {
+                       ksort( $combiners );
+                       $out .= implode( '', $combiners );
+               }
+
+               return $out;
+       }
+
+       /**
+        * Produces canonically composed sequences, i.e. normal form C or KC.
+        *
+        * @private
+        * @param string $string a valid UTF-8 string in sorted normal form D or KD.
+        *   Input is not validated.
+        * @return string a UTF-8 string with canonical precomposed characters used
+        *   where possible.
+        */
+       static function fastCompose( $string ) {
+               UtfNormal::loadData();
+               $len = strlen( $string );
+               $out = '';
+               $lastClass = -1;
+               $lastHangul = 0;
+               $startChar = '';
+               $combining = '';
+               $x1 = ord( substr( UTF8_HANGUL_VBASE, 0, 1 ) );
+               $x2 = ord( substr( UTF8_HANGUL_TEND, 0, 1 ) );
+               for ( $i = 0; $i < $len; $i++ ) {
+                       $c = $string[$i];
+                       $n = ord( $c );
+                       if ( $n < 0x80 ) {
+                               # No combining characters here...
+                               $out .= $startChar;
+                               $out .= $combining;
+                               $startChar = $c;
+                               $combining = '';
+                               $lastClass = 0;
+                               continue;
+                       } elseif ( $n >= 0xf0 ) {
+                               $c = substr( $string, $i, 4 );
+                               $i += 3;
+                       } elseif ( $n >= 0xe0 ) {
+                               $c = substr( $string, $i, 3 );
+                               $i += 2;
+                       } elseif ( $n >= 0xc0 ) {
+                               $c = substr( $string, $i, 2 );
+                               $i++;
+                       }
+                       $pair = $startChar . $c;
+                       if ( $n > 0x80 ) {
+                               if ( isset( self::$utfCombiningClass[$c] ) ) {
+                                       # A combining char; see what we can do with it
+                                       $class = self::$utfCombiningClass[$c];
+                                       if ( !empty( $startChar ) &&
+                                               $lastClass < $class &&
+                                               $class > 0 &&
+                                               isset( self::$utfCanonicalComp[$pair] )
+                                       ) {
+                                               $startChar = self::$utfCanonicalComp[$pair];
+                                               $class = 0;
+                                       } else {
+                                               $combining .= $c;
+                                       }
+                                       $lastClass = $class;
+                                       $lastHangul = 0;
+                                       continue;
+                               }
+                       }
+                       # New start char
+                       if ( $lastClass == 0 ) {
+                               if ( isset( self::$utfCanonicalComp[$pair] ) ) {
+                                       $startChar = self::$utfCanonicalComp[$pair];
+                                       $lastHangul = 0;
+                                       continue;
+                               }
+                               if ( $n >= $x1 && $n <= $x2 ) {
+                                       # WARNING: Hangul code is painfully slow.
+                                       # I apologize for this ugly, ugly code; however
+                                       # performance is even more teh suck if we call
+                                       # out to nice clean functions. Lookup tables are
+                                       # marginally faster, but require a lot of space.
+                                       #
+                                       if ( $c >= UTF8_HANGUL_VBASE &&
+                                               $c <= UTF8_HANGUL_VEND &&
+                                               $startChar >= UTF8_HANGUL_LBASE &&
+                                               $startChar <= UTF8_HANGUL_LEND
+                                       ) {
+                                               #
+                                               #$lIndex = utf8ToCodepoint( $startChar ) - UNICODE_HANGUL_LBASE;
+                                               #$vIndex = utf8ToCodepoint( $c ) - UNICODE_HANGUL_VBASE;
+                                               $lIndex = ord( $startChar[2] ) - 0x80;
+                                               $vIndex = ord( $c[2] ) - 0xa1;
+
+                                               $hangulPoint = UNICODE_HANGUL_FIRST +
+                                                       UNICODE_HANGUL_TCOUNT *
+                                                       ( UNICODE_HANGUL_VCOUNT * $lIndex + $vIndex );
+
+                                               # Hardcode the limited-range UTF-8 conversion:
+                                               $startChar = chr( $hangulPoint >> 12 & 0x0f | 0xe0 ) .
+                                                       chr( $hangulPoint >> 6 & 0x3f | 0x80 ) .
+                                                       chr( $hangulPoint & 0x3f | 0x80 );
+                                               $lastHangul = 0;
+                                               continue;
+                                       } elseif ( $c >= UTF8_HANGUL_TBASE &&
+                                               $c <= UTF8_HANGUL_TEND &&
+                                               $startChar >= UTF8_HANGUL_FIRST &&
+                                               $startChar <= UTF8_HANGUL_LAST &&
+                                               !$lastHangul
+                                       ) {
+                                               # $tIndex = utf8ToCodepoint( $c ) - UNICODE_HANGUL_TBASE;
+                                               $tIndex = ord( $c[2] ) - 0xa7;
+                                               if ( $tIndex < 0 ) $tIndex = ord( $c[2] ) - 0x80 + ( 0x11c0 - 0x11a7 );
+
+                                               # Increment the code point by $tIndex, without
+                                               # the function overhead of decoding and recoding UTF-8
+                                               #
+                                               $tail = ord( $startChar[2] ) + $tIndex;
+                                               if ( $tail > 0xbf ) {
+                                                       $tail -= 0x40;
+                                                       $mid = ord( $startChar[1] ) + 1;
+                                                       if ( $mid > 0xbf ) {
+                                                               $startChar[0] = chr( ord( $startChar[0] ) + 1 );
+                                                               $mid -= 0x40;
+                                                       }
+                                                       $startChar[1] = chr( $mid );
+                                               }
+                                               $startChar[2] = chr( $tail );
+
+                                               # If there's another jamo char after this, *don't* try to merge it.
+                                               $lastHangul = 1;
+                                               continue;
+                                       }
+                               }
+                       }
+                       $out .= $startChar;
+                       $out .= $combining;
+                       $startChar = $c;
+                       $combining = '';
+                       $lastClass = 0;
+                       $lastHangul = 0;
+               }
+               $out .= $startChar . $combining;
+
+               return $out;
+       }
+
+       /**
+        * This is just used for the benchmark, comparing how long it takes to
+        * interate through a string without really doing anything of substance.
+        * @param $string string
+        * @return string
+        */
+       static function placebo( $string ) {
+               $len = strlen( $string );
+               $out = '';
+               for ( $i = 0; $i < $len; $i++ ) {
+                       $out .= $string[$i];
+               }
+
+               return $out;
+       }
+
+       /**
+        * Function to replace some characters that we don't want
+        * but most of the native normalize functions keep.
+        *
+        * @param string $string The string
+        * @return String String with the character codes replaced.
+        */
+       private static function replaceForNativeNormalize( $string ) {
+               $string = preg_replace(
+                       '/[\x00-\x08\x0b\x0c\x0e-\x1f]/',
+                       UTF8_REPLACEMENT,
+                       $string );
+               $string = str_replace( UTF8_FFFE, UTF8_REPLACEMENT, $string );
+               $string = str_replace( UTF8_FFFF, UTF8_REPLACEMENT, $string );
+
+               return $string;
+       }
+}
diff --git a/includes/libs/normal/UtfNormalBench.php b/includes/libs/normal/UtfNormalBench.php
new file mode 100644 (file)
index 0000000..bd2bc4e
--- /dev/null
@@ -0,0 +1,105 @@
+<?php
+/**
+ * Approximate benchmark for some basic operations.
+ *
+ * Copyright © 2004 Brion Vibber <brion@pobox.com>
+ * https://www.mediawiki.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup UtfNormal
+ */
+
+if ( PHP_SAPI != 'cli' ) {
+       die( "Run me from the command line please.\n" );
+}
+
+if ( isset( $_SERVER['argv'] ) && in_array( '--icu', $_SERVER['argv'] ) ) {
+       dl( 'php_utfnormal.so' );
+}
+
+require_once 'UtfNormalDefines.php';
+require_once 'UtfNormalUtil.php';
+require_once 'UtfNormal.php';
+
+define( 'BENCH_CYCLES', 5 );
+
+$testfiles = array(
+       'testdata/washington.txt' => 'English text',
+       'testdata/berlin.txt' => 'German text',
+       'testdata/bulgakov.txt' => 'Russian text',
+       'testdata/tokyo.txt' => 'Japanese text',
+       'testdata/young.txt' => 'Korean text'
+);
+$normalizer = new UtfNormal;
+UtfNormal::loadData();
+foreach ( $testfiles as $file => $desc ) {
+       benchmarkTest( $normalizer, $file, $desc );
+}
+
+# -------
+
+function benchmarkTest( &$u, $filename, $desc ) {
+       print "Testing $filename ($desc)...\n";
+       $data = file_get_contents( $filename );
+       $forms = array(
+#              'placebo',
+               'cleanUp',
+               'toNFC',
+#              'toNFKC',
+#              'toNFD', 'toNFKD',
+               'NFC',
+#              'NFKC',
+#              'NFD', 'NFKD',
+               array( 'fastDecompose', 'fastCombiningSort', 'fastCompose' ),
+#              'quickIsNFC', 'quickIsNFCVerify',
+       );
+
+       foreach ( $forms as $form ) {
+               if ( is_array( $form ) ) {
+                       $str = $data;
+                       foreach ( $form as $step ) {
+                               $str = benchmarkForm( $u, $str, $step );
+                       }
+               } else {
+                       benchmarkForm( $u, $data, $form );
+               }
+       }
+}
+
+function benchmarkForm( &$u, &$data, $form ) {
+       #$start = microtime( true );
+       for ( $i = 0; $i < BENCH_CYCLES; $i++ ) {
+               $start = microtime( true );
+               $out = $u->$form( $data, UtfNormal::$utfCanonicalDecomp );
+               $deltas[] = ( microtime( true ) - $start );
+       }
+       #$delta = (microtime( true ) - $start) / BENCH_CYCLES;
+       sort( $deltas );
+       $delta = $deltas[0]; # Take shortest time
+
+       $rate = intval( strlen( $data ) / $delta );
+       $same = ( 0 == strcmp( $data, $out ) );
+
+       printf( " %20s %6.1fms %12s bytes/s (%s)\n",
+               $form,
+               $delta * 1000.0,
+               number_format( $rate ),
+               ( $same ? 'no change' : 'changed' ) );
+
+       return $out;
+}
diff --git a/includes/libs/normal/UtfNormalData.inc b/includes/libs/normal/UtfNormalData.inc
new file mode 100644 (file)
index 0000000..5755f6b
--- /dev/null
@@ -0,0 +1,14 @@
+<?php
+/**
+ * This file was automatically generated -- do not edit!
+ * Run UtfNormalGenerate.php to create this file again (make clean && make)
+ *
+ * @file
+ */
+// @codingStandardsIgnoreFile
+
+UtfNormal::$utfCombiningClass = unserialize( 'a:606:{s:2:"̀";i:230;s:2:"́";i:230;s:2:"̂";i:230;s:2:"̃";i:230;s:2:"̄";i:230;s:2:"̅";i:230;s:2:"̆";i:230;s:2:"̇";i:230;s:2:"̈";i:230;s:2:"̉";i:230;s:2:"̊";i:230;s:2:"̋";i:230;s:2:"̌";i:230;s:2:"̍";i:230;s:2:"̎";i:230;s:2:"̏";i:230;s:2:"̐";i:230;s:2:"̑";i:230;s:2:"̒";i:230;s:2:"̓";i:230;s:2:"̔";i:230;s:2:"̕";i:232;s:2:"̖";i:220;s:2:"̗";i:220;s:2:"̘";i:220;s:2:"̙";i:220;s:2:"̚";i:232;s:2:"̛";i:216;s:2:"̜";i:220;s:2:"̝";i:220;s:2:"̞";i:220;s:2:"̟";i:220;s:2:"̠";i:220;s:2:"̡";i:202;s:2:"̢";i:202;s:2:"̣";i:220;s:2:"̤";i:220;s:2:"̥";i:220;s:2:"̦";i:220;s:2:"̧";i:202;s:2:"̨";i:202;s:2:"̩";i:220;s:2:"̪";i:220;s:2:"̫";i:220;s:2:"̬";i:220;s:2:"̭";i:220;s:2:"̮";i:220;s:2:"̯";i:220;s:2:"̰";i:220;s:2:"̱";i:220;s:2:"̲";i:220;s:2:"̳";i:220;s:2:"̴";i:1;s:2:"̵";i:1;s:2:"̶";i:1;s:2:"̷";i:1;s:2:"̸";i:1;s:2:"̹";i:220;s:2:"̺";i:220;s:2:"̻";i:220;s:2:"̼";i:220;s:2:"̽";i:230;s:2:"̾";i:230;s:2:"̿";i:230;s:2:"̀";i:230;s:2:"́";i:230;s:2:"͂";i:230;s:2:"̓";i:230;s:2:"̈́";i:230;s:2:"ͅ";i:240;s:2:"͆";i:230;s:2:"͇";i:220;s:2:"͈";i:220;s:2:"͉";i:220;s:2:"͊";i:230;s:2:"͋";i:230;s:2:"͌";i:230;s:2:"͍";i:220;s:2:"͎";i:220;s:2:"͐";i:230;s:2:"͑";i:230;s:2:"͒";i:230;s:2:"͓";i:220;s:2:"͔";i:220;s:2:"͕";i:220;s:2:"͖";i:220;s:2:"͗";i:230;s:2:"͘";i:232;s:2:"͙";i:220;s:2:"͚";i:220;s:2:"͛";i:230;s:2:"͜";i:233;s:2:"͝";i:234;s:2:"͞";i:234;s:2:"͟";i:233;s:2:"͠";i:234;s:2:"͡";i:234;s:2:"͢";i:233;s:2:"ͣ";i:230;s:2:"ͤ";i:230;s:2:"ͥ";i:230;s:2:"ͦ";i:230;s:2:"ͧ";i:230;s:2:"ͨ";i:230;s:2:"ͩ";i:230;s:2:"ͪ";i:230;s:2:"ͫ";i:230;s:2:"ͬ";i:230;s:2:"ͭ";i:230;s:2:"ͮ";i:230;s:2:"ͯ";i:230;s:2:"҃";i:230;s:2:"҄";i:230;s:2:"҅";i:230;s:2:"҆";i:230;s:2:"҇";i:230;s:2:"֑";i:220;s:2:"֒";i:230;s:2:"֓";i:230;s:2:"֔";i:230;s:2:"֕";i:230;s:2:"֖";i:220;s:2:"֗";i:230;s:2:"֘";i:230;s:2:"֙";i:230;s:2:"֚";i:222;s:2:"֛";i:220;s:2:"֜";i:230;s:2:"֝";i:230;s:2:"֞";i:230;s:2:"֟";i:230;s:2:"֠";i:230;s:2:"֡";i:230;s:2:"֢";i:220;s:2:"֣";i:220;s:2:"֤";i:220;s:2:"֥";i:220;s:2:"֦";i:220;s:2:"֧";i:220;s:2:"֨";i:230;s:2:"֩";i:230;s:2:"֪";i:220;s:2:"֫";i:230;s:2:"֬";i:230;s:2:"֭";i:222;s:2:"֮";i:228;s:2:"֯";i:230;s:2:"ְ";i:10;s:2:"ֱ";i:11;s:2:"ֲ";i:12;s:2:"ֳ";i:13;s:2:"ִ";i:14;s:2:"ֵ";i:15;s:2:"ֶ";i:16;s:2:"ַ";i:17;s:2:"ָ";i:18;s:2:"ֹ";i:19;s:2:"ֺ";i:19;s:2:"ֻ";i:20;s:2:"ּ";i:21;s:2:"ֽ";i:22;s:2:"ֿ";i:23;s:2:"ׁ";i:24;s:2:"ׂ";i:25;s:2:"ׄ";i:230;s:2:"ׅ";i:220;s:2:"ׇ";i:18;s:2:"ؐ";i:230;s:2:"ؑ";i:230;s:2:"ؒ";i:230;s:2:"ؓ";i:230;s:2:"ؔ";i:230;s:2:"ؕ";i:230;s:2:"ؖ";i:230;s:2:"ؗ";i:230;s:2:"ؘ";i:30;s:2:"ؙ";i:31;s:2:"ؚ";i:32;s:2:"ً";i:27;s:2:"ٌ";i:28;s:2:"ٍ";i:29;s:2:"َ";i:30;s:2:"ُ";i:31;s:2:"ِ";i:32;s:2:"ّ";i:33;s:2:"ْ";i:34;s:2:"ٓ";i:230;s:2:"ٔ";i:230;s:2:"ٕ";i:220;s:2:"ٖ";i:220;s:2:"ٗ";i:230;s:2:"٘";i:230;s:2:"ٙ";i:230;s:2:"ٚ";i:230;s:2:"ٛ";i:230;s:2:"ٜ";i:220;s:2:"ٝ";i:230;s:2:"ٞ";i:230;s:2:"ٟ";i:220;s:2:"ٰ";i:35;s:2:"ۖ";i:230;s:2:"ۗ";i:230;s:2:"ۘ";i:230;s:2:"ۙ";i:230;s:2:"ۚ";i:230;s:2:"ۛ";i:230;s:2:"ۜ";i:230;s:2:"۟";i:230;s:2:"۠";i:230;s:2:"ۡ";i:230;s:2:"ۢ";i:230;s:2:"ۣ";i:220;s:2:"ۤ";i:230;s:2:"ۧ";i:230;s:2:"ۨ";i:230;s:2:"۪";i:220;s:2:"۫";i:230;s:2:"۬";i:230;s:2:"ۭ";i:220;s:2:"ܑ";i:36;s:2:"ܰ";i:230;s:2:"ܱ";i:220;s:2:"ܲ";i:230;s:2:"ܳ";i:230;s:2:"ܴ";i:220;s:2:"ܵ";i:230;s:2:"ܶ";i:230;s:2:"ܷ";i:220;s:2:"ܸ";i:220;s:2:"ܹ";i:220;s:2:"ܺ";i:230;s:2:"ܻ";i:220;s:2:"ܼ";i:220;s:2:"ܽ";i:230;s:2:"ܾ";i:220;s:2:"ܿ";i:230;s:2:"݀";i:230;s:2:"݁";i:230;s:2:"݂";i:220;s:2:"݃";i:230;s:2:"݄";i:220;s:2:"݅";i:230;s:2:"݆";i:220;s:2:"݇";i:230;s:2:"݈";i:220;s:2:"݉";i:230;s:2:"݊";i:230;s:2:"߫";i:230;s:2:"߬";i:230;s:2:"߭";i:230;s:2:"߮";i:230;s:2:"߯";i:230;s:2:"߰";i:230;s:2:"߱";i:230;s:2:"߲";i:220;s:2:"߳";i:230;s:3:"ࠖ";i:230;s:3:"ࠗ";i:230;s:3:"࠘";i:230;s:3:"࠙";i:230;s:3:"ࠛ";i:230;s:3:"ࠜ";i:230;s:3:"ࠝ";i:230;s:3:"ࠞ";i:230;s:3:"ࠟ";i:230;s:3:"ࠠ";i:230;s:3:"ࠡ";i:230;s:3:"ࠢ";i:230;s:3:"ࠣ";i:230;s:3:"ࠥ";i:230;s:3:"ࠦ";i:230;s:3:"ࠧ";i:230;s:3:"ࠩ";i:230;s:3:"ࠪ";i:230;s:3:"ࠫ";i:230;s:3:"ࠬ";i:230;s:3:"࠭";i:230;s:3:"࡙";i:220;s:3:"࡚";i:220;s:3:"࡛";i:220;s:3:"़";i:7;s:3:"्";i:9;s:3:"॑";i:230;s:3:"॒";i:220;s:3:"॓";i:230;s:3:"॔";i:230;s:3:"়";i:7;s:3:"্";i:9;s:3:"਼";i:7;s:3:"੍";i:9;s:3:"઼";i:7;s:3:"્";i:9;s:3:"଼";i:7;s:3:"୍";i:9;s:3:"்";i:9;s:3:"్";i:9;s:3:"ౕ";i:84;s:3:"ౖ";i:91;s:3:"಼";i:7;s:3:"್";i:9;s:3:"്";i:9;s:3:"්";i:9;s:3:"ุ";i:103;s:3:"ู";i:103;s:3:"ฺ";i:9;s:3:"่";i:107;s:3:"้";i:107;s:3:"๊";i:107;s:3:"๋";i:107;s:3:"ຸ";i:118;s:3:"ູ";i:118;s:3:"່";i:122;s:3:"້";i:122;s:3:"໊";i:122;s:3:"໋";i:122;s:3:"༘";i:220;s:3:"༙";i:220;s:3:"༵";i:220;s:3:"༷";i:220;s:3:"༹";i:216;s:3:"ཱ";i:129;s:3:"ི";i:130;s:3:"ུ";i:132;s:3:"ེ";i:130;s:3:"ཻ";i:130;s:3:"ོ";i:130;s:3:"ཽ";i:130;s:3:"ྀ";i:130;s:3:"ྂ";i:230;s:3:"ྃ";i:230;s:3:"྄";i:9;s:3:"྆";i:230;s:3:"྇";i:230;s:3:"࿆";i:220;s:3:"့";i:7;s:3:"္";i:9;s:3:"်";i:9;s:3:"ႍ";i:220;s:3:"፝";i:230;s:3:"፞";i:230;s:3:"፟";i:230;s:3:"᜔";i:9;s:3:"᜴";i:9;s:3:"្";i:9;s:3:"៝";i:230;s:3:"ᢩ";i:228;s:3:"᤹";i:222;s:3:"᤺";i:230;s:3:"᤻";i:220;s:3:"ᨗ";i:230;s:3:"ᨘ";i:220;s:3:"᩠";i:9;s:3:"᩵";i:230;s:3:"᩶";i:230;s:3:"᩷";i:230;s:3:"᩸";i:230;s:3:"᩹";i:230;s:3:"᩺";i:230;s:3:"᩻";i:230;s:3:"᩼";i:230;s:3:"᩿";i:220;s:3:"᬴";i:7;s:3:"᭄";i:9;s:3:"᭫";i:230;s:3:"᭬";i:220;s:3:"᭭";i:230;s:3:"᭮";i:230;s:3:"᭯";i:230;s:3:"᭰";i:230;s:3:"᭱";i:230;s:3:"᭲";i:230;s:3:"᭳";i:230;s:3:"᮪";i:9;s:3:"᯦";i:7;s:3:"᯲";i:9;s:3:"᯳";i:9;s:3:"᰷";i:7;s:3:"᳐";i:230;s:3:"᳑";i:230;s:3:"᳒";i:230;s:3:"᳔";i:1;s:3:"᳕";i:220;s:3:"᳖";i:220;s:3:"᳗";i:220;s:3:"᳘";i:220;s:3:"᳙";i:220;s:3:"᳚";i:230;s:3:"᳛";i:230;s:3:"᳜";i:220;s:3:"᳝";i:220;s:3:"᳞";i:220;s:3:"᳟";i:220;s:3:"᳠";i:230;s:3:"᳢";i:1;s:3:"᳣";i:1;s:3:"᳤";i:1;s:3:"᳥";i:1;s:3:"᳦";i:1;s:3:"᳧";i:1;s:3:"᳨";i:1;s:3:"᳭";i:220;s:3:"᷀";i:230;s:3:"᷁";i:230;s:3:"᷂";i:220;s:3:"᷃";i:230;s:3:"᷄";i:230;s:3:"᷅";i:230;s:3:"᷆";i:230;s:3:"᷇";i:230;s:3:"᷈";i:230;s:3:"᷉";i:230;s:3:"᷊";i:220;s:3:"᷋";i:230;s:3:"᷌";i:230;s:3:"᷍";i:234;s:3:"᷎";i:214;s:3:"᷏";i:220;s:3:"᷐";i:202;s:3:"᷑";i:230;s:3:"᷒";i:230;s:3:"ᷓ";i:230;s:3:"ᷔ";i:230;s:3:"ᷕ";i:230;s:3:"ᷖ";i:230;s:3:"ᷗ";i:230;s:3:"ᷘ";i:230;s:3:"ᷙ";i:230;s:3:"ᷚ";i:230;s:3:"ᷛ";i:230;s:3:"ᷜ";i:230;s:3:"ᷝ";i:230;s:3:"ᷞ";i:230;s:3:"ᷟ";i:230;s:3:"ᷠ";i:230;s:3:"ᷡ";i:230;s:3:"ᷢ";i:230;s:3:"ᷣ";i:230;s:3:"ᷤ";i:230;s:3:"ᷥ";i:230;s:3:"ᷦ";i:230;s:3:"᷼";i:233;s:3:"᷽";i:220;s:3:"᷾";i:230;s:3:"᷿";i:220;s:3:"⃐";i:230;s:3:"⃑";i:230;s:3:"⃒";i:1;s:3:"⃓";i:1;s:3:"⃔";i:230;s:3:"⃕";i:230;s:3:"⃖";i:230;s:3:"⃗";i:230;s:3:"⃘";i:1;s:3:"⃙";i:1;s:3:"⃚";i:1;s:3:"⃛";i:230;s:3:"⃜";i:230;s:3:"⃡";i:230;s:3:"⃥";i:1;s:3:"⃦";i:1;s:3:"⃧";i:230;s:3:"⃨";i:220;s:3:"⃩";i:230;s:3:"⃪";i:1;s:3:"⃫";i:1;s:3:"⃬";i:220;s:3:"⃭";i:220;s:3:"⃮";i:220;s:3:"⃯";i:220;s:3:"⃰";i:230;s:3:"⳯";i:230;s:3:"⳰";i:230;s:3:"⳱";i:230;s:3:"⵿";i:9;s:3:"ⷠ";i:230;s:3:"ⷡ";i:230;s:3:"ⷢ";i:230;s:3:"ⷣ";i:230;s:3:"ⷤ";i:230;s:3:"ⷥ";i:230;s:3:"ⷦ";i:230;s:3:"ⷧ";i:230;s:3:"ⷨ";i:230;s:3:"ⷩ";i:230;s:3:"ⷪ";i:230;s:3:"ⷫ";i:230;s:3:"ⷬ";i:230;s:3:"ⷭ";i:230;s:3:"ⷮ";i:230;s:3:"ⷯ";i:230;s:3:"ⷰ";i:230;s:3:"ⷱ";i:230;s:3:"ⷲ";i:230;s:3:"ⷳ";i:230;s:3:"ⷴ";i:230;s:3:"ⷵ";i:230;s:3:"ⷶ";i:230;s:3:"ⷷ";i:230;s:3:"ⷸ";i:230;s:3:"ⷹ";i:230;s:3:"ⷺ";i:230;s:3:"ⷻ";i:230;s:3:"ⷼ";i:230;s:3:"ⷽ";i:230;s:3:"ⷾ";i:230;s:3:"ⷿ";i:230;s:3:"〪";i:218;s:3:"〫";i:228;s:3:"〬";i:232;s:3:"〭";i:222;s:3:"〮";i:224;s:3:"〯";i:224;s:3:"゙";i:8;s:3:"゚";i:8;s:3:"꙯";i:230;s:3:"꙼";i:230;s:3:"꙽";i:230;s:3:"꛰";i:230;s:3:"꛱";i:230;s:3:"꠆";i:9;s:3:"꣄";i:9;s:3:"꣠";i:230;s:3:"꣡";i:230;s:3:"꣢";i:230;s:3:"꣣";i:230;s:3:"꣤";i:230;s:3:"꣥";i:230;s:3:"꣦";i:230;s:3:"꣧";i:230;s:3:"꣨";i:230;s:3:"꣩";i:230;s:3:"꣪";i:230;s:3:"꣫";i:230;s:3:"꣬";i:230;s:3:"꣭";i:230;s:3:"꣮";i:230;s:3:"꣯";i:230;s:3:"꣰";i:230;s:3:"꣱";i:230;s:3:"꤫";i:220;s:3:"꤬";i:220;s:3:"꤭";i:220;s:3:"꥓";i:9;s:3:"꦳";i:7;s:3:"꧀";i:9;s:3:"ꪰ";i:230;s:3:"ꪲ";i:230;s:3:"ꪳ";i:230;s:3:"ꪴ";i:220;s:3:"ꪷ";i:230;s:3:"ꪸ";i:230;s:3:"ꪾ";i:230;s:3:"꪿";i:230;s:3:"꫁";i:230;s:3:"꯭";i:9;s:3:"ﬞ";i:26;s:3:"︠";i:230;s:3:"︡";i:230;s:3:"︢";i:230;s:3:"︣";i:230;s:3:"︤";i:230;s:3:"︥";i:230;s:3:"︦";i:230;s:4:"𐇽";i:220;s:4:"𐨍";i:220;s:4:"𐨏";i:230;s:4:"𐨸";i:230;s:4:"𐨹";i:1;s:4:"𐨺";i:220;s:4:"𐨿";i:9;s:4:"𑁆";i:9;s:4:"𑂹";i:9;s:4:"𑂺";i:7;s:4:"𝅥";i:216;s:4:"𝅦";i:216;s:4:"𝅧";i:1;s:4:"𝅨";i:1;s:4:"𝅩";i:1;s:4:"𝅭";i:226;s:4:"𝅮";i:216;s:4:"𝅯";i:216;s:4:"𝅰";i:216;s:4:"𝅱";i:216;s:4:"𝅲";i:216;s:4:"𝅻";i:220;s:4:"𝅼";i:220;s:4:"𝅽";i:220;s:4:"𝅾";i:220;s:4:"𝅿";i:220;s:4:"𝆀";i:220;s:4:"𝆁";i:220;s:4:"𝆂";i:220;s:4:"𝆅";i:230;s:4:"𝆆";i:230;s:4:"𝆇";i:230;s:4:"𝆈";i:230;s:4:"𝆉";i:230;s:4:"𝆊";i:220;s:4:"𝆋";i:220;s:4:"𝆪";i:230;s:4:"𝆫";i:230;s:4:"𝆬";i:230;s:4:"𝆭";i:230;s:4:"𝉂";i:230;s:4:"𝉃";i:230;s:4:"𝉄";i:230;}' );
+UtfNormal::$utfCanonicalComp = unserialize( 'a:1868:{s:3:"À";s:2:"À";s:3:"Á";s:2:"Á";s:3:"Â";s:2:"Â";s:3:"Ã";s:2:"Ã";s:3:"Ä";s:2:"Ä";s:3:"Å";s:2:"Å";s:3:"Ç";s:2:"Ç";s:3:"È";s:2:"È";s:3:"É";s:2:"É";s:3:"Ê";s:2:"Ê";s:3:"Ë";s:2:"Ë";s:3:"Ì";s:2:"Ì";s:3:"Í";s:2:"Í";s:3:"Î";s:2:"Î";s:3:"Ï";s:2:"Ï";s:3:"Ñ";s:2:"Ñ";s:3:"Ò";s:2:"Ò";s:3:"Ó";s:2:"Ó";s:3:"Ô";s:2:"Ô";s:3:"Õ";s:2:"Õ";s:3:"Ö";s:2:"Ö";s:3:"Ù";s:2:"Ù";s:3:"Ú";s:2:"Ú";s:3:"Û";s:2:"Û";s:3:"Ü";s:2:"Ü";s:3:"Ý";s:2:"Ý";s:3:"à";s:2:"à";s:3:"á";s:2:"á";s:3:"â";s:2:"â";s:3:"ã";s:2:"ã";s:3:"ä";s:2:"ä";s:3:"å";s:2:"å";s:3:"ç";s:2:"ç";s:3:"è";s:2:"è";s:3:"é";s:2:"é";s:3:"ê";s:2:"ê";s:3:"ë";s:2:"ë";s:3:"ì";s:2:"ì";s:3:"í";s:2:"í";s:3:"î";s:2:"î";s:3:"ï";s:2:"ï";s:3:"ñ";s:2:"ñ";s:3:"ò";s:2:"ò";s:3:"ó";s:2:"ó";s:3:"ô";s:2:"ô";s:3:"õ";s:2:"õ";s:3:"ö";s:2:"ö";s:3:"ù";s:2:"ù";s:3:"ú";s:2:"ú";s:3:"û";s:2:"û";s:3:"ü";s:2:"ü";s:3:"ý";s:2:"ý";s:3:"ÿ";s:2:"ÿ";s:3:"Ā";s:2:"Ā";s:3:"ā";s:2:"ā";s:3:"Ă";s:2:"Ă";s:3:"ă";s:2:"ă";s:3:"Ą";s:2:"Ą";s:3:"ą";s:2:"ą";s:3:"Ć";s:2:"Ć";s:3:"ć";s:2:"ć";s:3:"Ĉ";s:2:"Ĉ";s:3:"ĉ";s:2:"ĉ";s:3:"Ċ";s:2:"Ċ";s:3:"ċ";s:2:"ċ";s:3:"Č";s:2:"Č";s:3:"č";s:2:"č";s:3:"Ď";s:2:"Ď";s:3:"ď";s:2:"ď";s:3:"Ē";s:2:"Ē";s:3:"ē";s:2:"ē";s:3:"Ĕ";s:2:"Ĕ";s:3:"ĕ";s:2:"ĕ";s:3:"Ė";s:2:"Ė";s:3:"ė";s:2:"ė";s:3:"Ę";s:2:"Ę";s:3:"ę";s:2:"ę";s:3:"Ě";s:2:"Ě";s:3:"ě";s:2:"ě";s:3:"Ĝ";s:2:"Ĝ";s:3:"ĝ";s:2:"ĝ";s:3:"Ğ";s:2:"Ğ";s:3:"ğ";s:2:"ğ";s:3:"Ġ";s:2:"Ġ";s:3:"ġ";s:2:"ġ";s:3:"Ģ";s:2:"Ģ";s:3:"ģ";s:2:"ģ";s:3:"Ĥ";s:2:"Ĥ";s:3:"ĥ";s:2:"ĥ";s:3:"Ĩ";s:2:"Ĩ";s:3:"ĩ";s:2:"ĩ";s:3:"Ī";s:2:"Ī";s:3:"ī";s:2:"ī";s:3:"Ĭ";s:2:"Ĭ";s:3:"ĭ";s:2:"ĭ";s:3:"Į";s:2:"Į";s:3:"į";s:2:"į";s:3:"İ";s:2:"İ";s:3:"Ĵ";s:2:"Ĵ";s:3:"ĵ";s:2:"ĵ";s:3:"Ķ";s:2:"Ķ";s:3:"ķ";s:2:"ķ";s:3:"Ĺ";s:2:"Ĺ";s:3:"ĺ";s:2:"ĺ";s:3:"Ļ";s:2:"Ļ";s:3:"ļ";s:2:"ļ";s:3:"Ľ";s:2:"Ľ";s:3:"ľ";s:2:"ľ";s:3:"Ń";s:2:"Ń";s:3:"ń";s:2:"ń";s:3:"Ņ";s:2:"Ņ";s:3:"ņ";s:2:"ņ";s:3:"Ň";s:2:"Ň";s:3:"ň";s:2:"ň";s:3:"Ō";s:2:"Ō";s:3:"ō";s:2:"ō";s:3:"Ŏ";s:2:"Ŏ";s:3:"ŏ";s:2:"ŏ";s:3:"Ő";s:2:"Ő";s:3:"ő";s:2:"ő";s:3:"Ŕ";s:2:"Ŕ";s:3:"ŕ";s:2:"ŕ";s:3:"Ŗ";s:2:"Ŗ";s:3:"ŗ";s:2:"ŗ";s:3:"Ř";s:2:"Ř";s:3:"ř";s:2:"ř";s:3:"Ś";s:2:"Ś";s:3:"ś";s:2:"ś";s:3:"Ŝ";s:2:"Ŝ";s:3:"ŝ";s:2:"ŝ";s:3:"Ş";s:2:"Ş";s:3:"ş";s:2:"ş";s:3:"Š";s:2:"Š";s:3:"š";s:2:"š";s:3:"Ţ";s:2:"Ţ";s:3:"ţ";s:2:"ţ";s:3:"Ť";s:2:"Ť";s:3:"ť";s:2:"ť";s:3:"Ũ";s:2:"Ũ";s:3:"ũ";s:2:"ũ";s:3:"Ū";s:2:"Ū";s:3:"ū";s:2:"ū";s:3:"Ŭ";s:2:"Ŭ";s:3:"ŭ";s:2:"ŭ";s:3:"Ů";s:2:"Ů";s:3:"ů";s:2:"ů";s:3:"Ű";s:2:"Ű";s:3:"ű";s:2:"ű";s:3:"Ų";s:2:"Ų";s:3:"ų";s:2:"ų";s:3:"Ŵ";s:2:"Ŵ";s:3:"ŵ";s:2:"ŵ";s:3:"Ŷ";s:2:"Ŷ";s:3:"ŷ";s:2:"ŷ";s:3:"Ÿ";s:2:"Ÿ";s:3:"Ź";s:2:"Ź";s:3:"ź";s:2:"ź";s:3:"Ż";s:2:"Ż";s:3:"ż";s:2:"ż";s:3:"Ž";s:2:"Ž";s:3:"ž";s:2:"ž";s:3:"Ơ";s:2:"Ơ";s:3:"ơ";s:2:"ơ";s:3:"Ư";s:2:"Ư";s:3:"ư";s:2:"ư";s:3:"Ǎ";s:2:"Ǎ";s:3:"ǎ";s:2:"ǎ";s:3:"Ǐ";s:2:"Ǐ";s:3:"ǐ";s:2:"ǐ";s:3:"Ǒ";s:2:"Ǒ";s:3:"ǒ";s:2:"ǒ";s:3:"Ǔ";s:2:"Ǔ";s:3:"ǔ";s:2:"ǔ";s:4:"Ǖ";s:2:"Ǖ";s:4:"ǖ";s:2:"ǖ";s:4:"Ǘ";s:2:"Ǘ";s:4:"ǘ";s:2:"ǘ";s:4:"Ǚ";s:2:"Ǚ";s:4:"ǚ";s:2:"ǚ";s:4:"Ǜ";s:2:"Ǜ";s:4:"ǜ";s:2:"ǜ";s:4:"Ǟ";s:2:"Ǟ";s:4:"ǟ";s:2:"ǟ";s:4:"Ǡ";s:2:"Ǡ";s:4:"ǡ";s:2:"ǡ";s:4:"Ǣ";s:2:"Ǣ";s:4:"ǣ";s:2:"ǣ";s:3:"Ǧ";s:2:"Ǧ";s:3:"ǧ";s:2:"ǧ";s:3:"Ǩ";s:2:"Ǩ";s:3:"ǩ";s:2:"ǩ";s:3:"Ǫ";s:2:"Ǫ";s:3:"ǫ";s:2:"ǫ";s:4:"Ǭ";s:2:"Ǭ";s:4:"ǭ";s:2:"ǭ";s:4:"Ǯ";s:2:"Ǯ";s:4:"ǯ";s:2:"ǯ";s:3:"ǰ";s:2:"ǰ";s:3:"Ǵ";s:2:"Ǵ";s:3:"ǵ";s:2:"ǵ";s:3:"Ǹ";s:2:"Ǹ";s:3:"ǹ";s:2:"ǹ";s:4:"Ǻ";s:2:"Ǻ";s:4:"ǻ";s:2:"ǻ";s:4:"Ǽ";s:2:"Ǽ";s:4:"ǽ";s:2:"ǽ";s:4:"Ǿ";s:2:"Ǿ";s:4:"ǿ";s:2:"ǿ";s:3:"Ȁ";s:2:"Ȁ";s:3:"ȁ";s:2:"ȁ";s:3:"Ȃ";s:2:"Ȃ";s:3:"ȃ";s:2:"ȃ";s:3:"Ȅ";s:2:"Ȅ";s:3:"ȅ";s:2:"ȅ";s:3:"Ȇ";s:2:"Ȇ";s:3:"ȇ";s:2:"ȇ";s:3:"Ȉ";s:2:"Ȉ";s:3:"ȉ";s:2:"ȉ";s:3:"Ȋ";s:2:"Ȋ";s:3:"ȋ";s:2:"ȋ";s:3:"Ȍ";s:2:"Ȍ";s:3:"ȍ";s:2:"ȍ";s:3:"Ȏ";s:2:"Ȏ";s:3:"ȏ";s:2:"ȏ";s:3:"Ȑ";s:2:"Ȑ";s:3:"ȑ";s:2:"ȑ";s:3:"Ȓ";s:2:"Ȓ";s:3:"ȓ";s:2:"ȓ";s:3:"Ȕ";s:2:"Ȕ";s:3:"ȕ";s:2:"ȕ";s:3:"Ȗ";s:2:"Ȗ";s:3:"ȗ";s:2:"ȗ";s:3:"Ș";s:2:"Ș";s:3:"ș";s:2:"ș";s:3:"Ț";s:2:"Ț";s:3:"ț";s:2:"ț";s:3:"Ȟ";s:2:"Ȟ";s:3:"ȟ";s:2:"ȟ";s:3:"Ȧ";s:2:"Ȧ";s:3:"ȧ";s:2:"ȧ";s:3:"Ȩ";s:2:"Ȩ";s:3:"ȩ";s:2:"ȩ";s:4:"Ȫ";s:2:"Ȫ";s:4:"ȫ";s:2:"ȫ";s:4:"Ȭ";s:2:"Ȭ";s:4:"ȭ";s:2:"ȭ";s:3:"Ȯ";s:2:"Ȯ";s:3:"ȯ";s:2:"ȯ";s:4:"Ȱ";s:2:"Ȱ";s:4:"ȱ";s:2:"ȱ";s:3:"Ȳ";s:2:"Ȳ";s:3:"ȳ";s:2:"ȳ";s:2:"̀";s:2:"̀";s:2:"́";s:2:"́";s:2:"̓";s:2:"̓";s:4:"̈́";s:2:"̈́";s:2:"ʹ";s:2:"ʹ";s:1:";";s:2:";";s:4:"΅";s:2:"΅";s:4:"Ά";s:2:"Ά";s:2:"·";s:2:"·";s:4:"Έ";s:2:"Έ";s:4:"Ή";s:2:"Ή";s:4:"Ί";s:2:"Ί";s:4:"Ό";s:2:"Ό";s:4:"Ύ";s:2:"Ύ";s:4:"Ώ";s:2:"Ώ";s:4:"ΐ";s:2:"ΐ";s:4:"Ϊ";s:2:"Ϊ";s:4:"Ϋ";s:2:"Ϋ";s:4:"ά";s:2:"ά";s:4:"έ";s:2:"έ";s:4:"ή";s:2:"ή";s:4:"ί";s:2:"ί";s:4:"ΰ";s:2:"ΰ";s:4:"ϊ";s:2:"ϊ";s:4:"ϋ";s:2:"ϋ";s:4:"ό";s:2:"ό";s:4:"ύ";s:2:"ύ";s:4:"ώ";s:2:"ώ";s:4:"ϓ";s:2:"ϓ";s:4:"ϔ";s:2:"ϔ";s:4:"Ѐ";s:2:"Ѐ";s:4:"Ё";s:2:"Ё";s:4:"Ѓ";s:2:"Ѓ";s:4:"Ї";s:2:"Ї";s:4:"Ќ";s:2:"Ќ";s:4:"Ѝ";s:2:"Ѝ";s:4:"Ў";s:2:"Ў";s:4:"Й";s:2:"Й";s:4:"й";s:2:"й";s:4:"ѐ";s:2:"ѐ";s:4:"ё";s:2:"ё";s:4:"ѓ";s:2:"ѓ";s:4:"ї";s:2:"ї";s:4:"ќ";s:2:"ќ";s:4:"ѝ";s:2:"ѝ";s:4:"ў";s:2:"ў";s:4:"Ѷ";s:2:"Ѷ";s:4:"ѷ";s:2:"ѷ";s:4:"Ӂ";s:2:"Ӂ";s:4:"ӂ";s:2:"ӂ";s:4:"Ӑ";s:2:"Ӑ";s:4:"ӑ";s:2:"ӑ";s:4:"Ӓ";s:2:"Ӓ";s:4:"ӓ";s:2:"ӓ";s:4:"Ӗ";s:2:"Ӗ";s:4:"ӗ";s:2:"ӗ";s:4:"Ӛ";s:2:"Ӛ";s:4:"ӛ";s:2:"ӛ";s:4:"Ӝ";s:2:"Ӝ";s:4:"ӝ";s:2:"ӝ";s:4:"Ӟ";s:2:"Ӟ";s:4:"ӟ";s:2:"ӟ";s:4:"Ӣ";s:2:"Ӣ";s:4:"ӣ";s:2:"ӣ";s:4:"Ӥ";s:2:"Ӥ";s:4:"ӥ";s:2:"ӥ";s:4:"Ӧ";s:2:"Ӧ";s:4:"ӧ";s:2:"ӧ";s:4:"Ӫ";s:2:"Ӫ";s:4:"ӫ";s:2:"ӫ";s:4:"Ӭ";s:2:"Ӭ";s:4:"ӭ";s:2:"ӭ";s:4:"Ӯ";s:2:"Ӯ";s:4:"ӯ";s:2:"ӯ";s:4:"Ӱ";s:2:"Ӱ";s:4:"ӱ";s:2:"ӱ";s:4:"Ӳ";s:2:"Ӳ";s:4:"ӳ";s:2:"ӳ";s:4:"Ӵ";s:2:"Ӵ";s:4:"ӵ";s:2:"ӵ";s:4:"Ӹ";s:2:"Ӹ";s:4:"ӹ";s:2:"ӹ";s:4:"آ";s:2:"آ";s:4:"أ";s:2:"أ";s:4:"ؤ";s:2:"ؤ";s:4:"إ";s:2:"إ";s:4:"ئ";s:2:"ئ";s:4:"ۀ";s:2:"ۀ";s:4:"ۂ";s:2:"ۂ";s:4:"ۓ";s:2:"ۓ";s:6:"ऩ";s:3:"ऩ";s:6:"ऱ";s:3:"ऱ";s:6:"ऴ";s:3:"ऴ";s:6:"ো";s:3:"ো";s:6:"ৌ";s:3:"ৌ";s:6:"ୈ";s:3:"ୈ";s:6:"ୋ";s:3:"ୋ";s:6:"ୌ";s:3:"ୌ";s:6:"ஔ";s:3:"ஔ";s:6:"ொ";s:3:"ொ";s:6:"ோ";s:3:"ோ";s:6:"ௌ";s:3:"ௌ";s:6:"ై";s:3:"ై";s:6:"ೀ";s:3:"ೀ";s:6:"ೇ";s:3:"ೇ";s:6:"ೈ";s:3:"ೈ";s:6:"ೊ";s:3:"ೊ";s:6:"ೋ";s:3:"ೋ";s:6:"ൊ";s:3:"ൊ";s:6:"ോ";s:3:"ോ";s:6:"ൌ";s:3:"ൌ";s:6:"ේ";s:3:"ේ";s:6:"ො";s:3:"ො";s:6:"ෝ";s:3:"ෝ";s:6:"ෞ";s:3:"ෞ";s:6:"ཱི";s:3:"ཱི";s:6:"ཱུ";s:3:"ཱུ";s:6:"ཱྀ";s:3:"ཱྀ";s:6:"ဦ";s:3:"ဦ";s:6:"ᬆ";s:3:"ᬆ";s:6:"ᬈ";s:3:"ᬈ";s:6:"ᬊ";s:3:"ᬊ";s:6:"ᬌ";s:3:"ᬌ";s:6:"ᬎ";s:3:"ᬎ";s:6:"ᬒ";s:3:"ᬒ";s:6:"ᬻ";s:3:"ᬻ";s:6:"ᬽ";s:3:"ᬽ";s:6:"ᭀ";s:3:"ᭀ";s:6:"ᭁ";s:3:"ᭁ";s:6:"ᭃ";s:3:"ᭃ";s:3:"Ḁ";s:3:"Ḁ";s:3:"ḁ";s:3:"ḁ";s:3:"Ḃ";s:3:"Ḃ";s:3:"ḃ";s:3:"ḃ";s:3:"Ḅ";s:3:"Ḅ";s:3:"ḅ";s:3:"ḅ";s:3:"Ḇ";s:3:"Ḇ";s:3:"ḇ";s:3:"ḇ";s:4:"Ḉ";s:3:"Ḉ";s:4:"ḉ";s:3:"ḉ";s:3:"Ḋ";s:3:"Ḋ";s:3:"ḋ";s:3:"ḋ";s:3:"Ḍ";s:3:"Ḍ";s:3:"ḍ";s:3:"ḍ";s:3:"Ḏ";s:3:"Ḏ";s:3:"ḏ";s:3:"ḏ";s:3:"Ḑ";s:3:"Ḑ";s:3:"ḑ";s:3:"ḑ";s:3:"Ḓ";s:3:"Ḓ";s:3:"ḓ";s:3:"ḓ";s:4:"Ḕ";s:3:"Ḕ";s:4:"ḕ";s:3:"ḕ";s:4:"Ḗ";s:3:"Ḗ";s:4:"ḗ";s:3:"ḗ";s:3:"Ḙ";s:3:"Ḙ";s:3:"ḙ";s:3:"ḙ";s:3:"Ḛ";s:3:"Ḛ";s:3:"ḛ";s:3:"ḛ";s:4:"Ḝ";s:3:"Ḝ";s:4:"ḝ";s:3:"ḝ";s:3:"Ḟ";s:3:"Ḟ";s:3:"ḟ";s:3:"ḟ";s:3:"Ḡ";s:3:"Ḡ";s:3:"ḡ";s:3:"ḡ";s:3:"Ḣ";s:3:"Ḣ";s:3:"ḣ";s:3:"ḣ";s:3:"Ḥ";s:3:"Ḥ";s:3:"ḥ";s:3:"ḥ";s:3:"Ḧ";s:3:"Ḧ";s:3:"ḧ";s:3:"ḧ";s:3:"Ḩ";s:3:"Ḩ";s:3:"ḩ";s:3:"ḩ";s:3:"Ḫ";s:3:"Ḫ";s:3:"ḫ";s:3:"ḫ";s:3:"Ḭ";s:3:"Ḭ";s:3:"ḭ";s:3:"ḭ";s:4:"Ḯ";s:3:"Ḯ";s:4:"ḯ";s:3:"ḯ";s:3:"Ḱ";s:3:"Ḱ";s:3:"ḱ";s:3:"ḱ";s:3:"Ḳ";s:3:"Ḳ";s:3:"ḳ";s:3:"ḳ";s:3:"Ḵ";s:3:"Ḵ";s:3:"ḵ";s:3:"ḵ";s:3:"Ḷ";s:3:"Ḷ";s:3:"ḷ";s:3:"ḷ";s:5:"Ḹ";s:3:"Ḹ";s:5:"ḹ";s:3:"ḹ";s:3:"Ḻ";s:3:"Ḻ";s:3:"ḻ";s:3:"ḻ";s:3:"Ḽ";s:3:"Ḽ";s:3:"ḽ";s:3:"ḽ";s:3:"Ḿ";s:3:"Ḿ";s:3:"ḿ";s:3:"ḿ";s:3:"Ṁ";s:3:"Ṁ";s:3:"ṁ";s:3:"ṁ";s:3:"Ṃ";s:3:"Ṃ";s:3:"ṃ";s:3:"ṃ";s:3:"Ṅ";s:3:"Ṅ";s:3:"ṅ";s:3:"ṅ";s:3:"Ṇ";s:3:"Ṇ";s:3:"ṇ";s:3:"ṇ";s:3:"Ṉ";s:3:"Ṉ";s:3:"ṉ";s:3:"ṉ";s:3:"Ṋ";s:3:"Ṋ";s:3:"ṋ";s:3:"ṋ";s:4:"Ṍ";s:3:"Ṍ";s:4:"ṍ";s:3:"ṍ";s:4:"Ṏ";s:3:"Ṏ";s:4:"ṏ";s:3:"ṏ";s:4:"Ṑ";s:3:"Ṑ";s:4:"ṑ";s:3:"ṑ";s:4:"Ṓ";s:3:"Ṓ";s:4:"ṓ";s:3:"ṓ";s:3:"Ṕ";s:3:"Ṕ";s:3:"ṕ";s:3:"ṕ";s:3:"Ṗ";s:3:"Ṗ";s:3:"ṗ";s:3:"ṗ";s:3:"Ṙ";s:3:"Ṙ";s:3:"ṙ";s:3:"ṙ";s:3:"Ṛ";s:3:"Ṛ";s:3:"ṛ";s:3:"ṛ";s:5:"Ṝ";s:3:"Ṝ";s:5:"ṝ";s:3:"ṝ";s:3:"Ṟ";s:3:"Ṟ";s:3:"ṟ";s:3:"ṟ";s:3:"Ṡ";s:3:"Ṡ";s:3:"ṡ";s:3:"ṡ";s:3:"Ṣ";s:3:"Ṣ";s:3:"ṣ";s:3:"ṣ";s:4:"Ṥ";s:3:"Ṥ";s:4:"ṥ";s:3:"ṥ";s:4:"Ṧ";s:3:"Ṧ";s:4:"ṧ";s:3:"ṧ";s:5:"Ṩ";s:3:"Ṩ";s:5:"ṩ";s:3:"ṩ";s:3:"Ṫ";s:3:"Ṫ";s:3:"ṫ";s:3:"ṫ";s:3:"Ṭ";s:3:"Ṭ";s:3:"ṭ";s:3:"ṭ";s:3:"Ṯ";s:3:"Ṯ";s:3:"ṯ";s:3:"ṯ";s:3:"Ṱ";s:3:"Ṱ";s:3:"ṱ";s:3:"ṱ";s:3:"Ṳ";s:3:"Ṳ";s:3:"ṳ";s:3:"ṳ";s:3:"Ṵ";s:3:"Ṵ";s:3:"ṵ";s:3:"ṵ";s:3:"Ṷ";s:3:"Ṷ";s:3:"ṷ";s:3:"ṷ";s:4:"Ṹ";s:3:"Ṹ";s:4:"ṹ";s:3:"ṹ";s:4:"Ṻ";s:3:"Ṻ";s:4:"ṻ";s:3:"ṻ";s:3:"Ṽ";s:3:"Ṽ";s:3:"ṽ";s:3:"ṽ";s:3:"Ṿ";s:3:"Ṿ";s:3:"ṿ";s:3:"ṿ";s:3:"Ẁ";s:3:"Ẁ";s:3:"ẁ";s:3:"ẁ";s:3:"Ẃ";s:3:"Ẃ";s:3:"ẃ";s:3:"ẃ";s:3:"Ẅ";s:3:"Ẅ";s:3:"ẅ";s:3:"ẅ";s:3:"Ẇ";s:3:"Ẇ";s:3:"ẇ";s:3:"ẇ";s:3:"Ẉ";s:3:"Ẉ";s:3:"ẉ";s:3:"ẉ";s:3:"Ẋ";s:3:"Ẋ";s:3:"ẋ";s:3:"ẋ";s:3:"Ẍ";s:3:"Ẍ";s:3:"ẍ";s:3:"ẍ";s:3:"Ẏ";s:3:"Ẏ";s:3:"ẏ";s:3:"ẏ";s:3:"Ẑ";s:3:"Ẑ";s:3:"ẑ";s:3:"ẑ";s:3:"Ẓ";s:3:"Ẓ";s:3:"ẓ";s:3:"ẓ";s:3:"Ẕ";s:3:"Ẕ";s:3:"ẕ";s:3:"ẕ";s:3:"ẖ";s:3:"ẖ";s:3:"ẗ";s:3:"ẗ";s:3:"ẘ";s:3:"ẘ";s:3:"ẙ";s:3:"ẙ";s:4:"ẛ";s:3:"ẛ";s:3:"Ạ";s:3:"Ạ";s:3:"ạ";s:3:"ạ";s:3:"Ả";s:3:"Ả";s:3:"ả";s:3:"ả";s:4:"Ấ";s:3:"Ấ";s:4:"ấ";s:3:"ấ";s:4:"Ầ";s:3:"Ầ";s:4:"ầ";s:3:"ầ";s:4:"Ẩ";s:3:"Ẩ";s:4:"ẩ";s:3:"ẩ";s:4:"Ẫ";s:3:"Ẫ";s:4:"ẫ";s:3:"ẫ";s:5:"Ậ";s:3:"Ậ";s:5:"ậ";s:3:"ậ";s:4:"Ắ";s:3:"Ắ";s:4:"ắ";s:3:"ắ";s:4:"Ằ";s:3:"Ằ";s:4:"ằ";s:3:"ằ";s:4:"Ẳ";s:3:"Ẳ";s:4:"ẳ";s:3:"ẳ";s:4:"Ẵ";s:3:"Ẵ";s:4:"ẵ";s:3:"ẵ";s:5:"Ặ";s:3:"Ặ";s:5:"ặ";s:3:"ặ";s:3:"Ẹ";s:3:"Ẹ";s:3:"ẹ";s:3:"ẹ";s:3:"Ẻ";s:3:"Ẻ";s:3:"ẻ";s:3:"ẻ";s:3:"Ẽ";s:3:"Ẽ";s:3:"ẽ";s:3:"ẽ";s:4:"Ế";s:3:"Ế";s:4:"ế";s:3:"ế";s:4:"Ề";s:3:"Ề";s:4:"ề";s:3:"ề";s:4:"Ể";s:3:"Ể";s:4:"ể";s:3:"ể";s:4:"Ễ";s:3:"Ễ";s:4:"ễ";s:3:"ễ";s:5:"Ệ";s:3:"Ệ";s:5:"ệ";s:3:"ệ";s:3:"Ỉ";s:3:"Ỉ";s:3:"ỉ";s:3:"ỉ";s:3:"Ị";s:3:"Ị";s:3:"ị";s:3:"ị";s:3:"Ọ";s:3:"Ọ";s:3:"ọ";s:3:"ọ";s:3:"Ỏ";s:3:"Ỏ";s:3:"ỏ";s:3:"ỏ";s:4:"Ố";s:3:"Ố";s:4:"ố";s:3:"ố";s:4:"Ồ";s:3:"Ồ";s:4:"ồ";s:3:"ồ";s:4:"Ổ";s:3:"Ổ";s:4:"ổ";s:3:"ổ";s:4:"Ỗ";s:3:"Ỗ";s:4:"ỗ";s:3:"ỗ";s:5:"Ộ";s:3:"Ộ";s:5:"ộ";s:3:"ộ";s:4:"Ớ";s:3:"Ớ";s:4:"ớ";s:3:"ớ";s:4:"Ờ";s:3:"Ờ";s:4:"ờ";s:3:"ờ";s:4:"Ở";s:3:"Ở";s:4:"ở";s:3:"ở";s:4:"Ỡ";s:3:"Ỡ";s:4:"ỡ";s:3:"ỡ";s:4:"Ợ";s:3:"Ợ";s:4:"ợ";s:3:"ợ";s:3:"Ụ";s:3:"Ụ";s:3:"ụ";s:3:"ụ";s:3:"Ủ";s:3:"Ủ";s:3:"ủ";s:3:"ủ";s:4:"Ứ";s:3:"Ứ";s:4:"ứ";s:3:"ứ";s:4:"Ừ";s:3:"Ừ";s:4:"ừ";s:3:"ừ";s:4:"Ử";s:3:"Ử";s:4:"ử";s:3:"ử";s:4:"Ữ";s:3:"Ữ";s:4:"ữ";s:3:"ữ";s:4:"Ự";s:3:"Ự";s:4:"ự";s:3:"ự";s:3:"Ỳ";s:3:"Ỳ";s:3:"ỳ";s:3:"ỳ";s:3:"Ỵ";s:3:"Ỵ";s:3:"ỵ";s:3:"ỵ";s:3:"Ỷ";s:3:"Ỷ";s:3:"ỷ";s:3:"ỷ";s:3:"Ỹ";s:3:"Ỹ";s:3:"ỹ";s:3:"ỹ";s:4:"ἀ";s:3:"ἀ";s:4:"ἁ";s:3:"ἁ";s:5:"ἂ";s:3:"ἂ";s:5:"ἃ";s:3:"ἃ";s:5:"ἄ";s:3:"ἄ";s:5:"ἅ";s:3:"ἅ";s:5:"ἆ";s:3:"ἆ";s:5:"ἇ";s:3:"ἇ";s:4:"Ἀ";s:3:"Ἀ";s:4:"Ἁ";s:3:"Ἁ";s:5:"Ἂ";s:3:"Ἂ";s:5:"Ἃ";s:3:"Ἃ";s:5:"Ἄ";s:3:"Ἄ";s:5:"Ἅ";s:3:"Ἅ";s:5:"Ἆ";s:3:"Ἆ";s:5:"Ἇ";s:3:"Ἇ";s:4:"ἐ";s:3:"ἐ";s:4:"ἑ";s:3:"ἑ";s:5:"ἒ";s:3:"ἒ";s:5:"ἓ";s:3:"ἓ";s:5:"ἔ";s:3:"ἔ";s:5:"ἕ";s:3:"ἕ";s:4:"Ἐ";s:3:"Ἐ";s:4:"Ἑ";s:3:"Ἑ";s:5:"Ἒ";s:3:"Ἒ";s:5:"Ἓ";s:3:"Ἓ";s:5:"Ἔ";s:3:"Ἔ";s:5:"Ἕ";s:3:"Ἕ";s:4:"ἠ";s:3:"ἠ";s:4:"ἡ";s:3:"ἡ";s:5:"ἢ";s:3:"ἢ";s:5:"ἣ";s:3:"ἣ";s:5:"ἤ";s:3:"ἤ";s:5:"ἥ";s:3:"ἥ";s:5:"ἦ";s:3:"ἦ";s:5:"ἧ";s:3:"ἧ";s:4:"Ἠ";s:3:"Ἠ";s:4:"Ἡ";s:3:"Ἡ";s:5:"Ἢ";s:3:"Ἢ";s:5:"Ἣ";s:3:"Ἣ";s:5:"Ἤ";s:3:"Ἤ";s:5:"Ἥ";s:3:"Ἥ";s:5:"Ἦ";s:3:"Ἦ";s:5:"Ἧ";s:3:"Ἧ";s:4:"ἰ";s:3:"ἰ";s:4:"ἱ";s:3:"ἱ";s:5:"ἲ";s:3:"ἲ";s:5:"ἳ";s:3:"ἳ";s:5:"ἴ";s:3:"ἴ";s:5:"ἵ";s:3:"ἵ";s:5:"ἶ";s:3:"ἶ";s:5:"ἷ";s:3:"ἷ";s:4:"Ἰ";s:3:"Ἰ";s:4:"Ἱ";s:3:"Ἱ";s:5:"Ἲ";s:3:"Ἲ";s:5:"Ἳ";s:3:"Ἳ";s:5:"Ἴ";s:3:"Ἴ";s:5:"Ἵ";s:3:"Ἵ";s:5:"Ἶ";s:3:"Ἶ";s:5:"Ἷ";s:3:"Ἷ";s:4:"ὀ";s:3:"ὀ";s:4:"ὁ";s:3:"ὁ";s:5:"ὂ";s:3:"ὂ";s:5:"ὃ";s:3:"ὃ";s:5:"ὄ";s:3:"ὄ";s:5:"ὅ";s:3:"ὅ";s:4:"Ὀ";s:3:"Ὀ";s:4:"Ὁ";s:3:"Ὁ";s:5:"Ὂ";s:3:"Ὂ";s:5:"Ὃ";s:3:"Ὃ";s:5:"Ὄ";s:3:"Ὄ";s:5:"Ὅ";s:3:"Ὅ";s:4:"ὐ";s:3:"ὐ";s:4:"ὑ";s:3:"ὑ";s:5:"ὒ";s:3:"ὒ";s:5:"ὓ";s:3:"ὓ";s:5:"ὔ";s:3:"ὔ";s:5:"ὕ";s:3:"ὕ";s:5:"ὖ";s:3:"ὖ";s:5:"ὗ";s:3:"ὗ";s:4:"Ὑ";s:3:"Ὑ";s:5:"Ὓ";s:3:"Ὓ";s:5:"Ὕ";s:3:"Ὕ";s:5:"Ὗ";s:3:"Ὗ";s:4:"ὠ";s:3:"ὠ";s:4:"ὡ";s:3:"ὡ";s:5:"ὢ";s:3:"ὢ";s:5:"ὣ";s:3:"ὣ";s:5:"ὤ";s:3:"ὤ";s:5:"ὥ";s:3:"ὥ";s:5:"ὦ";s:3:"ὦ";s:5:"ὧ";s:3:"ὧ";s:4:"Ὠ";s:3:"Ὠ";s:4:"Ὡ";s:3:"Ὡ";s:5:"Ὢ";s:3:"Ὢ";s:5:"Ὣ";s:3:"Ὣ";s:5:"Ὤ";s:3:"Ὤ";s:5:"Ὥ";s:3:"Ὥ";s:5:"Ὦ";s:3:"Ὦ";s:5:"Ὧ";s:3:"Ὧ";s:4:"ὰ";s:3:"ὰ";s:2:"ά";s:3:"ά";s:4:"ὲ";s:3:"ὲ";s:2:"έ";s:3:"έ";s:4:"ὴ";s:3:"ὴ";s:2:"ή";s:3:"ή";s:4:"ὶ";s:3:"ὶ";s:2:"ί";s:3:"ί";s:4:"ὸ";s:3:"ὸ";s:2:"ό";s:3:"ό";s:4:"ὺ";s:3:"ὺ";s:2:"ύ";s:3:"ύ";s:4:"ὼ";s:3:"ὼ";s:2:"ώ";s:3:"ώ";s:5:"ᾀ";s:3:"ᾀ";s:5:"ᾁ";s:3:"ᾁ";s:5:"ᾂ";s:3:"ᾂ";s:5:"ᾃ";s:3:"ᾃ";s:5:"ᾄ";s:3:"ᾄ";s:5:"ᾅ";s:3:"ᾅ";s:5:"ᾆ";s:3:"ᾆ";s:5:"ᾇ";s:3:"ᾇ";s:5:"ᾈ";s:3:"ᾈ";s:5:"ᾉ";s:3:"ᾉ";s:5:"ᾊ";s:3:"ᾊ";s:5:"ᾋ";s:3:"ᾋ";s:5:"ᾌ";s:3:"ᾌ";s:5:"ᾍ";s:3:"ᾍ";s:5:"ᾎ";s:3:"ᾎ";s:5:"ᾏ";s:3:"ᾏ";s:5:"ᾐ";s:3:"ᾐ";s:5:"ᾑ";s:3:"ᾑ";s:5:"ᾒ";s:3:"ᾒ";s:5:"ᾓ";s:3:"ᾓ";s:5:"ᾔ";s:3:"ᾔ";s:5:"ᾕ";s:3:"ᾕ";s:5:"ᾖ";s:3:"ᾖ";s:5:"ᾗ";s:3:"ᾗ";s:5:"ᾘ";s:3:"ᾘ";s:5:"ᾙ";s:3:"ᾙ";s:5:"ᾚ";s:3:"ᾚ";s:5:"ᾛ";s:3:"ᾛ";s:5:"ᾜ";s:3:"ᾜ";s:5:"ᾝ";s:3:"ᾝ";s:5:"ᾞ";s:3:"ᾞ";s:5:"ᾟ";s:3:"ᾟ";s:5:"ᾠ";s:3:"ᾠ";s:5:"ᾡ";s:3:"ᾡ";s:5:"ᾢ";s:3:"ᾢ";s:5:"ᾣ";s:3:"ᾣ";s:5:"ᾤ";s:3:"ᾤ";s:5:"ᾥ";s:3:"ᾥ";s:5:"ᾦ";s:3:"ᾦ";s:5:"ᾧ";s:3:"ᾧ";s:5:"ᾨ";s:3:"ᾨ";s:5:"ᾩ";s:3:"ᾩ";s:5:"ᾪ";s:3:"ᾪ";s:5:"ᾫ";s:3:"ᾫ";s:5:"ᾬ";s:3:"ᾬ";s:5:"ᾭ";s:3:"ᾭ";s:5:"ᾮ";s:3:"ᾮ";s:5:"ᾯ";s:3:"ᾯ";s:4:"ᾰ";s:3:"ᾰ";s:4:"ᾱ";s:3:"ᾱ";s:5:"ᾲ";s:3:"ᾲ";s:4:"ᾳ";s:3:"ᾳ";s:4:"ᾴ";s:3:"ᾴ";s:4:"ᾶ";s:3:"ᾶ";s:5:"ᾷ";s:3:"ᾷ";s:4:"Ᾰ";s:3:"Ᾰ";s:4:"Ᾱ";s:3:"Ᾱ";s:4:"Ὰ";s:3:"Ὰ";s:2:"Ά";s:3:"Ά";s:4:"ᾼ";s:3:"ᾼ";s:2:"ι";s:3:"ι";s:4:"῁";s:3:"῁";s:5:"ῂ";s:3:"ῂ";s:4:"ῃ";s:3:"ῃ";s:4:"ῄ";s:3:"ῄ";s:4:"ῆ";s:3:"ῆ";s:5:"ῇ";s:3:"ῇ";s:4:"Ὲ";s:3:"Ὲ";s:2:"Έ";s:3:"Έ";s:4:"Ὴ";s:3:"Ὴ";s:2:"Ή";s:3:"Ή";s:4:"ῌ";s:3:"ῌ";s:5:"῍";s:3:"῍";s:5:"῎";s:3:"῎";s:5:"῏";s:3:"῏";s:4:"ῐ";s:3:"ῐ";s:4:"ῑ";s:3:"ῑ";s:4:"ῒ";s:3:"ῒ";s:2:"ΐ";s:3:"ΐ";s:4:"ῖ";s:3:"ῖ";s:4:"ῗ";s:3:"ῗ";s:4:"Ῐ";s:3:"Ῐ";s:4:"Ῑ";s:3:"Ῑ";s:4:"Ὶ";s:3:"Ὶ";s:2:"Ί";s:3:"Ί";s:5:"῝";s:3:"῝";s:5:"῞";s:3:"῞";s:5:"῟";s:3:"῟";s:4:"ῠ";s:3:"ῠ";s:4:"ῡ";s:3:"ῡ";s:4:"ῢ";s:3:"ῢ";s:2:"ΰ";s:3:"ΰ";s:4:"ῤ";s:3:"ῤ";s:4:"ῥ";s:3:"ῥ";s:4:"ῦ";s:3:"ῦ";s:4:"ῧ";s:3:"ῧ";s:4:"Ῠ";s:3:"Ῠ";s:4:"Ῡ";s:3:"Ῡ";s:4:"Ὺ";s:3:"Ὺ";s:2:"Ύ";s:3:"Ύ";s:4:"Ῥ";s:3:"Ῥ";s:4:"῭";s:3:"῭";s:2:"΅";s:3:"΅";s:1:"`";s:3:"`";s:5:"ῲ";s:3:"ῲ";s:4:"ῳ";s:3:"ῳ";s:4:"ῴ";s:3:"ῴ";s:4:"ῶ";s:3:"ῶ";s:5:"ῷ";s:3:"ῷ";s:4:"Ὸ";s:3:"Ὸ";s:2:"Ό";s:3:"Ό";s:4:"Ὼ";s:3:"Ὼ";s:2:"Ώ";s:3:"Ώ";s:4:"ῼ";s:3:"ῼ";s:2:"´";s:3:"´";s:3:" ";s:3:" ";s:3:" ";s:3:" ";s:2:"Ω";s:3:"Ω";s:1:"K";s:3:"K";s:2:"Å";s:3:"Å";s:5:"↚";s:3:"↚";s:5:"↛";s:3:"↛";s:5:"↮";s:3:"↮";s:5:"⇍";s:3:"⇍";s:5:"⇎";s:3:"⇎";s:5:"⇏";s:3:"⇏";s:5:"∄";s:3:"∄";s:5:"∉";s:3:"∉";s:5:"∌";s:3:"∌";s:5:"∤";s:3:"∤";s:5:"∦";s:3:"∦";s:5:"≁";s:3:"≁";s:5:"≄";s:3:"≄";s:5:"≇";s:3:"≇";s:5:"≉";s:3:"≉";s:3:"≠";s:3:"≠";s:5:"≢";s:3:"≢";s:5:"≭";s:3:"≭";s:3:"≮";s:3:"≮";s:3:"≯";s:3:"≯";s:5:"≰";s:3:"≰";s:5:"≱";s:3:"≱";s:5:"≴";s:3:"≴";s:5:"≵";s:3:"≵";s:5:"≸";s:3:"≸";s:5:"≹";s:3:"≹";s:5:"⊀";s:3:"⊀";s:5:"⊁";s:3:"⊁";s:5:"⊄";s:3:"⊄";s:5:"⊅";s:3:"⊅";s:5:"⊈";s:3:"⊈";s:5:"⊉";s:3:"⊉";s:5:"⊬";s:3:"⊬";s:5:"⊭";s:3:"⊭";s:5:"⊮";s:3:"⊮";s:5:"⊯";s:3:"⊯";s:5:"⋠";s:3:"⋠";s:5:"⋡";s:3:"⋡";s:5:"⋢";s:3:"⋢";s:5:"⋣";s:3:"⋣";s:5:"⋪";s:3:"⋪";s:5:"⋫";s:3:"⋫";s:5:"⋬";s:3:"⋬";s:5:"⋭";s:3:"⋭";s:3:"〈";s:3:"〈";s:3:"〉";s:3:"〉";s:6:"が";s:3:"が";s:6:"ぎ";s:3:"ぎ";s:6:"ぐ";s:3:"ぐ";s:6:"げ";s:3:"げ";s:6:"ご";s:3:"ご";s:6:"ざ";s:3:"ざ";s:6:"じ";s:3:"じ";s:6:"ず";s:3:"ず";s:6:"ぜ";s:3:"ぜ";s:6:"ぞ";s:3:"ぞ";s:6:"だ";s:3:"だ";s:6:"ぢ";s:3:"ぢ";s:6:"づ";s:3:"づ";s:6:"で";s:3:"で";s:6:"ど";s:3:"ど";s:6:"ば";s:3:"ば";s:6:"ぱ";s:3:"ぱ";s:6:"び";s:3:"び";s:6:"ぴ";s:3:"ぴ";s:6:"ぶ";s:3:"ぶ";s:6:"ぷ";s:3:"ぷ";s:6:"べ";s:3:"べ";s:6:"ぺ";s:3:"ぺ";s:6:"ぼ";s:3:"ぼ";s:6:"ぽ";s:3:"ぽ";s:6:"ゔ";s:3:"ゔ";s:6:"ゞ";s:3:"ゞ";s:6:"ガ";s:3:"ガ";s:6:"ギ";s:3:"ギ";s:6:"グ";s:3:"グ";s:6:"ゲ";s:3:"ゲ";s:6:"ゴ";s:3:"ゴ";s:6:"ザ";s:3:"ザ";s:6:"ジ";s:3:"ジ";s:6:"ズ";s:3:"ズ";s:6:"ゼ";s:3:"ゼ";s:6:"ゾ";s:3:"ゾ";s:6:"ダ";s:3:"ダ";s:6:"ヂ";s:3:"ヂ";s:6:"ヅ";s:3:"ヅ";s:6:"デ";s:3:"デ";s:6:"ド";s:3:"ド";s:6:"バ";s:3:"バ";s:6:"パ";s:3:"パ";s:6:"ビ";s:3:"ビ";s:6:"ピ";s:3:"ピ";s:6:"ブ";s:3:"ブ";s:6:"プ";s:3:"プ";s:6:"ベ";s:3:"ベ";s:6:"ペ";s:3:"ペ";s:6:"ボ";s:3:"ボ";s:6:"ポ";s:3:"ポ";s:6:"ヴ";s:3:"ヴ";s:6:"ヷ";s:3:"ヷ";s:6:"ヸ";s:3:"ヸ";s:6:"ヹ";s:3:"ヹ";s:6:"ヺ";s:3:"ヺ";s:6:"ヾ";s:3:"ヾ";s:3:"豈";s:3:"豈";s:3:"更";s:3:"更";s:3:"車";s:3:"車";s:3:"賈";s:3:"賈";s:3:"滑";s:3:"滑";s:3:"串";s:3:"串";s:3:"句";s:3:"句";s:3:"龜";s:3:"龜";s:3:"契";s:3:"契";s:3:"金";s:3:"金";s:3:"喇";s:3:"喇";s:3:"奈";s:3:"奈";s:3:"懶";s:4:"懶";s:3:"癩";s:3:"癩";s:3:"羅";s:3:"羅";s:3:"蘿";s:3:"蘿";s:3:"螺";s:3:"螺";s:3:"裸";s:3:"裸";s:3:"邏";s:3:"邏";s:3:"樂";s:3:"樂";s:3:"洛";s:3:"洛";s:3:"烙";s:3:"烙";s:3:"珞";s:3:"珞";s:3:"落";s:3:"落";s:3:"酪";s:3:"酪";s:3:"駱";s:3:"駱";s:3:"亂";s:3:"亂";s:3:"卵";s:3:"卵";s:3:"欄";s:3:"欄";s:3:"爛";s:3:"爛";s:3:"蘭";s:3:"蘭";s:3:"鸞";s:3:"鸞";s:3:"嵐";s:3:"嵐";s:3:"濫";s:3:"濫";s:3:"藍";s:3:"藍";s:3:"襤";s:3:"襤";s:3:"拉";s:3:"拉";s:3:"臘";s:3:"臘";s:3:"蠟";s:3:"蠟";s:3:"廊";s:4:"廊";s:3:"朗";s:4:"朗";s:3:"浪";s:3:"浪";s:3:"狼";s:3:"狼";s:3:"郎";s:3:"郎";s:3:"來";s:3:"來";s:3:"冷";s:3:"冷";s:3:"勞";s:3:"勞";s:3:"擄";s:3:"擄";s:3:"櫓";s:3:"櫓";s:3:"爐";s:3:"爐";s:3:"盧";s:3:"盧";s:3:"老";s:3:"老";s:3:"蘆";s:3:"蘆";s:3:"虜";s:4:"虜";s:3:"路";s:3:"路";s:3:"露";s:3:"露";s:3:"魯";s:3:"魯";s:3:"鷺";s:3:"鷺";s:3:"碌";s:4:"碌";s:3:"祿";s:3:"祿";s:3:"綠";s:3:"綠";s:3:"菉";s:3:"菉";s:3:"錄";s:3:"錄";s:3:"鹿";s:3:"鹿";s:3:"論";s:3:"論";s:3:"壟";s:3:"壟";s:3:"弄";s:3:"弄";s:3:"籠";s:3:"籠";s:3:"聾";s:3:"聾";s:3:"牢";s:3:"牢";s:3:"磊";s:3:"磊";s:3:"賂";s:3:"賂";s:3:"雷";s:3:"雷";s:3:"壘";s:3:"壘";s:3:"屢";s:3:"屢";s:3:"樓";s:3:"樓";s:3:"淚";s:3:"淚";s:3:"漏";s:3:"漏";s:3:"累";s:3:"累";s:3:"縷";s:3:"縷";s:3:"陋";s:3:"陋";s:3:"勒";s:3:"勒";s:3:"肋";s:3:"肋";s:3:"凜";s:3:"凜";s:3:"凌";s:3:"凌";s:3:"稜";s:3:"稜";s:3:"綾";s:3:"綾";s:3:"菱";s:3:"菱";s:3:"陵";s:3:"陵";s:3:"讀";s:3:"讀";s:3:"拏";s:3:"拏";s:3:"諾";s:3:"諾";s:3:"丹";s:3:"丹";s:3:"寧";s:4:"寧";s:3:"怒";s:3:"怒";s:3:"率";s:3:"率";s:3:"異";s:4:"異";s:3:"北";s:4:"北";s:3:"磻";s:3:"磻";s:3:"便";s:3:"便";s:3:"復";s:3:"復";s:3:"不";s:3:"不";s:3:"泌";s:3:"泌";s:3:"數";s:3:"數";s:3:"索";s:3:"索";s:3:"參";s:3:"參";s:3:"塞";s:3:"塞";s:3:"省";s:3:"省";s:3:"葉";s:3:"葉";s:3:"說";s:3:"說";s:3:"殺";s:4:"殺";s:3:"辰";s:3:"辰";s:3:"沈";s:3:"沈";s:3:"拾";s:3:"拾";s:3:"若";s:4:"若";s:3:"掠";s:3:"掠";s:3:"略";s:3:"略";s:3:"亮";s:3:"亮";s:3:"兩";s:3:"兩";s:3:"凉";s:3:"凉";s:3:"梁";s:3:"梁";s:3:"糧";s:3:"糧";s:3:"良";s:3:"良";s:3:"諒";s:3:"諒";s:3:"量";s:3:"量";s:3:"勵";s:3:"勵";s:3:"呂";s:3:"呂";s:3:"女";s:3:"女";s:3:"廬";s:3:"廬";s:3:"旅";s:3:"旅";s:3:"濾";s:3:"濾";s:3:"礪";s:3:"礪";s:3:"閭";s:3:"閭";s:3:"驪";s:3:"驪";s:3:"麗";s:3:"麗";s:3:"黎";s:3:"黎";s:3:"力";s:3:"力";s:3:"曆";s:3:"曆";s:3:"歷";s:3:"歷";s:3:"轢";s:3:"轢";s:3:"年";s:3:"年";s:3:"憐";s:3:"憐";s:3:"戀";s:3:"戀";s:3:"撚";s:3:"撚";s:3:"漣";s:3:"漣";s:3:"煉";s:3:"煉";s:3:"璉";s:3:"璉";s:3:"秊";s:3:"秊";s:3:"練";s:3:"練";s:3:"聯";s:3:"聯";s:3:"輦";s:3:"輦";s:3:"蓮";s:3:"蓮";s:3:"連";s:3:"連";s:3:"鍊";s:3:"鍊";s:3:"列";s:3:"列";s:3:"劣";s:3:"劣";s:3:"咽";s:3:"咽";s:3:"烈";s:3:"烈";s:3:"裂";s:3:"裂";s:3:"廉";s:3:"廉";s:3:"念";s:3:"念";s:3:"捻";s:3:"捻";s:3:"殮";s:3:"殮";s:3:"簾";s:3:"簾";s:3:"獵";s:3:"獵";s:3:"令";s:3:"令";s:3:"囹";s:3:"囹";s:3:"嶺";s:3:"嶺";s:3:"怜";s:3:"怜";s:3:"玲";s:3:"玲";s:3:"瑩";s:3:"瑩";s:3:"羚";s:3:"羚";s:3:"聆";s:3:"聆";s:3:"鈴";s:3:"鈴";s:3:"零";s:3:"零";s:3:"靈";s:3:"靈";s:3:"領";s:3:"領";s:3:"例";s:3:"例";s:3:"禮";s:3:"禮";s:3:"醴";s:3:"醴";s:3:"隸";s:3:"隸";s:3:"惡";s:3:"惡";s:3:"了";s:3:"了";s:3:"僚";s:3:"僚";s:3:"寮";s:3:"寮";s:3:"尿";s:3:"尿";s:3:"料";s:3:"料";s:3:"燎";s:3:"燎";s:3:"療";s:3:"療";s:3:"蓼";s:3:"蓼";s:3:"遼";s:3:"遼";s:3:"龍";s:3:"龍";s:3:"暈";s:3:"暈";s:3:"阮";s:3:"阮";s:3:"劉";s:3:"劉";s:3:"杻";s:3:"杻";s:3:"柳";s:3:"柳";s:3:"流";s:4:"流";s:3:"溜";s:3:"溜";s:3:"琉";s:3:"琉";s:3:"留";s:3:"留";s:3:"硫";s:3:"硫";s:3:"紐";s:3:"紐";s:3:"類";s:3:"類";s:3:"六";s:3:"六";s:3:"戮";s:3:"戮";s:3:"陸";s:3:"陸";s:3:"倫";s:3:"倫";s:3:"崙";s:3:"崙";s:3:"淪";s:3:"淪";s:3:"輪";s:3:"輪";s:3:"律";s:3:"律";s:3:"慄";s:3:"慄";s:3:"栗";s:3:"栗";s:3:"隆";s:3:"隆";s:3:"利";s:3:"利";s:3:"吏";s:3:"吏";s:3:"履";s:3:"履";s:3:"易";s:3:"易";s:3:"李";s:3:"李";s:3:"梨";s:3:"梨";s:3:"泥";s:3:"泥";s:3:"理";s:3:"理";s:3:"痢";s:3:"痢";s:3:"罹";s:3:"罹";s:3:"裏";s:3:"裏";s:3:"裡";s:3:"裡";s:3:"里";s:3:"里";s:3:"離";s:3:"離";s:3:"匿";s:3:"匿";s:3:"溺";s:3:"溺";s:3:"吝";s:3:"吝";s:3:"燐";s:3:"燐";s:3:"璘";s:3:"璘";s:3:"藺";s:3:"藺";s:3:"隣";s:3:"隣";s:3:"鱗";s:3:"鱗";s:3:"麟";s:3:"麟";s:3:"林";s:3:"林";s:3:"淋";s:3:"淋";s:3:"臨";s:3:"臨";s:3:"立";s:3:"立";s:3:"笠";s:3:"笠";s:3:"粒";s:3:"粒";s:3:"狀";s:3:"狀";s:3:"炙";s:3:"炙";s:3:"識";s:3:"識";s:3:"什";s:3:"什";s:3:"茶";s:3:"茶";s:3:"刺";s:3:"刺";s:3:"切";s:4:"切";s:3:"度";s:3:"度";s:3:"拓";s:3:"拓";s:3:"糖";s:3:"糖";s:3:"宅";s:3:"宅";s:3:"洞";s:3:"洞";s:3:"暴";s:3:"暴";s:3:"輻";s:3:"輻";s:3:"行";s:3:"行";s:3:"降";s:3:"降";s:3:"見";s:3:"見";s:3:"廓";s:3:"廓";s:3:"兀";s:3:"兀";s:3:"嗀";s:3:"嗀";s:3:"塚";s:3:"塚";s:3:"晴";s:3:"晴";s:3:"凞";s:3:"凞";s:3:"猪";s:3:"猪";s:3:"益";s:3:"益";s:3:"礼";s:3:"礼";s:3:"神";s:3:"神";s:3:"祥";s:3:"祥";s:3:"福";s:4:"福";s:3:"靖";s:3:"靖";s:3:"精";s:3:"精";s:3:"羽";s:3:"羽";s:3:"蘒";s:3:"蘒";s:3:"諸";s:3:"諸";s:3:"逸";s:3:"逸";s:3:"都";s:3:"都";s:3:"飯";s:3:"飯";s:3:"飼";s:3:"飼";s:3:"館";s:3:"館";s:3:"鶴";s:3:"鶴";s:3:"侮";s:4:"侮";s:3:"僧";s:4:"僧";s:3:"免";s:4:"免";s:3:"勉";s:4:"勉";s:3:"勤";s:4:"勤";s:3:"卑";s:4:"卑";s:3:"喝";s:3:"喝";s:3:"嘆";s:4:"嘆";s:3:"器";s:3:"器";s:3:"塀";s:3:"塀";s:3:"墨";s:3:"墨";s:3:"層";s:3:"層";s:3:"屮";s:4:"屮";s:3:"悔";s:4:"悔";s:3:"慨";s:3:"慨";s:3:"憎";s:4:"憎";s:3:"懲";s:4:"懲";s:3:"敏";s:4:"敏";s:3:"既";s:3:"既";s:3:"暑";s:4:"暑";s:3:"梅";s:4:"梅";s:3:"海";s:4:"海";s:3:"渚";s:3:"渚";s:3:"漢";s:3:"漢";s:3:"煮";s:3:"煮";s:3:"爫";s:3:"爫";s:3:"琢";s:3:"琢";s:3:"碑";s:3:"碑";s:3:"社";s:3:"社";s:3:"祉";s:3:"祉";s:3:"祈";s:3:"祈";s:3:"祐";s:3:"祐";s:3:"祖";s:4:"祖";s:3:"祝";s:3:"祝";s:3:"禍";s:3:"禍";s:3:"禎";s:3:"禎";s:3:"穀";s:4:"穀";s:3:"突";s:3:"突";s:3:"節";s:3:"節";s:3:"縉";s:3:"縉";s:3:"繁";s:3:"繁";s:3:"署";s:3:"署";s:3:"者";s:4:"者";s:3:"臭";s:3:"臭";s:3:"艹";s:3:"艹";s:3:"著";s:4:"著";s:3:"褐";s:3:"褐";s:3:"視";s:3:"視";s:3:"謁";s:3:"謁";s:3:"謹";s:3:"謹";s:3:"賓";s:3:"賓";s:3:"贈";s:3:"贈";s:3:"辶";s:3:"辶";s:3:"難";s:3:"難";s:3:"響";s:3:"響";s:3:"頻";s:3:"頻";s:3:"恵";s:3:"恵";s:4:"𤋮";s:3:"𤋮";s:3:"舘";s:3:"舘";s:3:"並";s:3:"並";s:3:"况";s:4:"况";s:3:"全";s:3:"全";s:3:"侀";s:3:"侀";s:3:"充";s:3:"充";s:3:"冀";s:3:"冀";s:3:"勇";s:4:"勇";s:3:"勺";s:4:"勺";s:3:"啕";s:3:"啕";s:3:"喙";s:4:"喙";s:3:"嗢";s:3:"嗢";s:3:"墳";s:3:"墳";s:3:"奄";s:3:"奄";s:3:"奔";s:3:"奔";s:3:"婢";s:3:"婢";s:3:"嬨";s:3:"嬨";s:3:"廒";s:3:"廒";s:3:"廙";s:3:"廙";s:3:"彩";s:3:"彩";s:3:"徭";s:3:"徭";s:3:"惘";s:3:"惘";s:3:"慎";s:4:"慎";s:3:"愈";s:3:"愈";s:3:"慠";s:3:"慠";s:3:"戴";s:3:"戴";s:3:"揄";s:3:"揄";s:3:"搜";s:3:"搜";s:3:"摒";s:3:"摒";s:3:"敖";s:3:"敖";s:3:"望";s:4:"望";s:3:"杖";s:3:"杖";s:3:"歹";s:3:"歹";s:3:"滛";s:3:"滛";s:3:"滋";s:4:"滋";s:3:"瀞";s:4:"瀞";s:3:"瞧";s:3:"瞧";s:3:"爵";s:4:"爵";s:3:"犯";s:3:"犯";s:3:"瑱";s:4:"瑱";s:3:"甆";s:3:"甆";s:3:"画";s:3:"画";s:3:"瘝";s:3:"瘝";s:3:"瘟";s:3:"瘟";s:3:"盛";s:3:"盛";s:3:"直";s:4:"直";s:3:"睊";s:4:"睊";s:3:"着";s:3:"着";s:3:"磌";s:4:"磌";s:3:"窱";s:3:"窱";s:3:"类";s:3:"类";s:3:"絛";s:3:"絛";s:3:"缾";s:3:"缾";s:3:"荒";s:3:"荒";s:3:"華";s:3:"華";s:3:"蝹";s:4:"蝹";s:3:"襁";s:3:"襁";s:3:"覆";s:3:"覆";s:3:"調";s:3:"調";s:3:"請";s:3:"請";s:3:"諭";s:4:"諭";s:3:"變";s:4:"變";s:3:"輸";s:4:"輸";s:3:"遲";s:3:"遲";s:3:"醙";s:3:"醙";s:3:"鉶";s:3:"鉶";s:3:"陼";s:3:"陼";s:3:"韛";s:3:"韛";s:3:"頋";s:4:"頋";s:3:"鬒";s:4:"鬒";s:4:"𢡊";s:3:"𢡊";s:4:"𢡄";s:3:"𢡄";s:4:"𣏕";s:3:"𣏕";s:3:"㮝";s:4:"㮝";s:3:"䀘";s:3:"䀘";s:3:"䀹";s:4:"䀹";s:4:"𥉉";s:3:"𥉉";s:4:"𥳐";s:3:"𥳐";s:4:"𧻓";s:3:"𧻓";s:3:"齃";s:3:"齃";s:3:"龎";s:3:"龎";s:8:"𑂚";s:4:"𑂚";s:8:"𑂜";s:4:"𑂜";s:8:"𑂫";s:4:"𑂫";s:3:"丽";s:4:"丽";s:3:"丸";s:4:"丸";s:3:"乁";s:4:"乁";s:4:"𠄢";s:4:"𠄢";s:3:"你";s:4:"你";s:3:"侻";s:4:"侻";s:3:"倂";s:4:"倂";s:3:"偺";s:4:"偺";s:3:"備";s:4:"備";s:3:"像";s:4:"像";s:3:"㒞";s:4:"㒞";s:4:"𠘺";s:4:"𠘺";s:3:"兔";s:4:"兔";s:3:"兤";s:4:"兤";s:3:"具";s:4:"具";s:4:"𠔜";s:4:"𠔜";s:3:"㒹";s:4:"㒹";s:3:"內";s:4:"內";s:3:"再";s:4:"再";s:4:"𠕋";s:4:"𠕋";s:3:"冗";s:4:"冗";s:3:"冤";s:4:"冤";s:3:"仌";s:4:"仌";s:3:"冬";s:4:"冬";s:4:"𩇟";s:4:"𩇟";s:3:"凵";s:4:"凵";s:3:"刃";s:4:"刃";s:3:"㓟";s:4:"㓟";s:3:"刻";s:4:"刻";s:3:"剆";s:4:"剆";s:3:"割";s:4:"割";s:3:"剷";s:4:"剷";s:3:"㔕";s:4:"㔕";s:3:"包";s:4:"包";s:3:"匆";s:4:"匆";s:3:"卉";s:4:"卉";s:3:"博";s:4:"博";s:3:"即";s:4:"即";s:3:"卽";s:4:"卽";s:3:"卿";s:4:"卿";s:4:"𠨬";s:4:"𠨬";s:3:"灰";s:4:"灰";s:3:"及";s:4:"及";s:3:"叟";s:4:"叟";s:4:"𠭣";s:4:"𠭣";s:3:"叫";s:4:"叫";s:3:"叱";s:4:"叱";s:3:"吆";s:4:"吆";s:3:"咞";s:4:"咞";s:3:"吸";s:4:"吸";s:3:"呈";s:4:"呈";s:3:"周";s:4:"周";s:3:"咢";s:4:"咢";s:3:"哶";s:4:"哶";s:3:"唐";s:4:"唐";s:3:"啓";s:4:"啓";s:3:"啣";s:4:"啣";s:3:"善";s:4:"善";s:3:"喫";s:4:"喫";s:3:"喳";s:4:"喳";s:3:"嗂";s:4:"嗂";s:3:"圖";s:4:"圖";s:3:"圗";s:4:"圗";s:3:"噑";s:4:"噑";s:3:"噴";s:4:"噴";s:3:"壮";s:4:"壮";s:3:"城";s:4:"城";s:3:"埴";s:4:"埴";s:3:"堍";s:4:"堍";s:3:"型";s:4:"型";s:3:"堲";s:4:"堲";s:3:"報";s:4:"報";s:3:"墬";s:4:"墬";s:4:"𡓤";s:4:"𡓤";s:3:"売";s:4:"売";s:3:"壷";s:4:"壷";s:3:"夆";s:4:"夆";s:3:"多";s:4:"多";s:3:"夢";s:4:"夢";s:3:"奢";s:4:"奢";s:4:"𡚨";s:4:"𡚨";s:4:"𡛪";s:4:"𡛪";s:3:"姬";s:4:"姬";s:3:"娛";s:4:"娛";s:3:"娧";s:4:"娧";s:3:"姘";s:4:"姘";s:3:"婦";s:4:"婦";s:3:"㛮";s:4:"㛮";s:3:"㛼";s:4:"㛼";s:3:"嬈";s:4:"嬈";s:3:"嬾";s:4:"嬾";s:4:"𡧈";s:4:"𡧈";s:3:"寃";s:4:"寃";s:3:"寘";s:4:"寘";s:3:"寳";s:4:"寳";s:4:"𡬘";s:4:"𡬘";s:3:"寿";s:4:"寿";s:3:"将";s:4:"将";s:3:"当";s:4:"当";s:3:"尢";s:4:"尢";s:3:"㞁";s:4:"㞁";s:3:"屠";s:4:"屠";s:3:"峀";s:4:"峀";s:3:"岍";s:4:"岍";s:4:"𡷤";s:4:"𡷤";s:3:"嵃";s:4:"嵃";s:4:"𡷦";s:4:"𡷦";s:3:"嵮";s:4:"嵮";s:3:"嵫";s:4:"嵫";s:3:"嵼";s:4:"嵼";s:3:"巡";s:4:"巡";s:3:"巢";s:4:"巢";s:3:"㠯";s:4:"㠯";s:3:"巽";s:4:"巽";s:3:"帨";s:4:"帨";s:3:"帽";s:4:"帽";s:3:"幩";s:4:"幩";s:3:"㡢";s:4:"㡢";s:4:"𢆃";s:4:"𢆃";s:3:"㡼";s:4:"㡼";s:3:"庰";s:4:"庰";s:3:"庳";s:4:"庳";s:3:"庶";s:4:"庶";s:4:"𪎒";s:4:"𪎒";s:3:"廾";s:4:"廾";s:4:"𢌱";s:4:"𢌱";s:3:"舁";s:4:"舁";s:3:"弢";s:4:"弢";s:3:"㣇";s:4:"㣇";s:4:"𣊸";s:4:"𣊸";s:4:"𦇚";s:4:"𦇚";s:3:"形";s:4:"形";s:3:"彫";s:4:"彫";s:3:"㣣";s:4:"㣣";s:3:"徚";s:4:"徚";s:3:"忍";s:4:"忍";s:3:"志";s:4:"志";s:3:"忹";s:4:"忹";s:3:"悁";s:4:"悁";s:3:"㤺";s:4:"㤺";s:3:"㤜";s:4:"㤜";s:4:"𢛔";s:4:"𢛔";s:3:"惇";s:4:"惇";s:3:"慈";s:4:"慈";s:3:"慌";s:4:"慌";s:3:"慺";s:4:"慺";s:3:"憲";s:4:"憲";s:3:"憤";s:4:"憤";s:3:"憯";s:4:"憯";s:3:"懞";s:4:"懞";s:3:"成";s:4:"成";s:3:"戛";s:4:"戛";s:3:"扝";s:4:"扝";s:3:"抱";s:4:"抱";s:3:"拔";s:4:"拔";s:3:"捐";s:4:"捐";s:4:"𢬌";s:4:"𢬌";s:3:"挽";s:4:"挽";s:3:"拼";s:4:"拼";s:3:"捨";s:4:"捨";s:3:"掃";s:4:"掃";s:3:"揤";s:4:"揤";s:4:"𢯱";s:4:"𢯱";s:3:"搢";s:4:"搢";s:3:"揅";s:4:"揅";s:3:"掩";s:4:"掩";s:3:"㨮";s:4:"㨮";s:3:"摩";s:4:"摩";s:3:"摾";s:4:"摾";s:3:"撝";s:4:"撝";s:3:"摷";s:4:"摷";s:3:"㩬";s:4:"㩬";s:3:"敬";s:4:"敬";s:4:"𣀊";s:4:"𣀊";s:3:"旣";s:4:"旣";s:3:"書";s:4:"書";s:3:"晉";s:4:"晉";s:3:"㬙";s:4:"㬙";s:3:"㬈";s:4:"㬈";s:3:"㫤";s:4:"㫤";s:3:"冒";s:4:"冒";s:3:"冕";s:4:"冕";s:3:"最";s:4:"最";s:3:"暜";s:4:"暜";s:3:"肭";s:4:"肭";s:3:"䏙";s:4:"䏙";s:3:"朡";s:4:"朡";s:3:"杞";s:4:"杞";s:3:"杓";s:4:"杓";s:4:"𣏃";s:4:"𣏃";s:3:"㭉";s:4:"㭉";s:3:"柺";s:4:"柺";s:3:"枅";s:4:"枅";s:3:"桒";s:4:"桒";s:4:"𣑭";s:4:"𣑭";s:3:"梎";s:4:"梎";s:3:"栟";s:4:"栟";s:3:"椔";s:4:"椔";s:3:"楂";s:4:"楂";s:3:"榣";s:4:"榣";s:3:"槪";s:4:"槪";s:3:"檨";s:4:"檨";s:4:"𣚣";s:4:"𣚣";s:3:"櫛";s:4:"櫛";s:3:"㰘";s:4:"㰘";s:3:"次";s:4:"次";s:4:"𣢧";s:4:"𣢧";s:3:"歔";s:4:"歔";s:3:"㱎";s:4:"㱎";s:3:"歲";s:4:"歲";s:3:"殟";s:4:"殟";s:3:"殻";s:4:"殻";s:4:"𣪍";s:4:"𣪍";s:4:"𡴋";s:4:"𡴋";s:4:"𣫺";s:4:"𣫺";s:3:"汎";s:4:"汎";s:4:"𣲼";s:4:"𣲼";s:3:"沿";s:4:"沿";s:3:"泍";s:4:"泍";s:3:"汧";s:4:"汧";s:3:"洖";s:4:"洖";s:3:"派";s:4:"派";s:3:"浩";s:4:"浩";s:3:"浸";s:4:"浸";s:3:"涅";s:4:"涅";s:4:"𣴞";s:4:"𣴞";s:3:"洴";s:4:"洴";s:3:"港";s:4:"港";s:3:"湮";s:4:"湮";s:3:"㴳";s:4:"㴳";s:3:"滇";s:4:"滇";s:4:"𣻑";s:4:"𣻑";s:3:"淹";s:4:"淹";s:3:"潮";s:4:"潮";s:4:"𣽞";s:4:"𣽞";s:4:"𣾎";s:4:"𣾎";s:3:"濆";s:4:"濆";s:3:"瀹";s:4:"瀹";s:3:"瀛";s:4:"瀛";s:3:"㶖";s:4:"㶖";s:3:"灊";s:4:"灊";s:3:"災";s:4:"災";s:3:"灷";s:4:"灷";s:3:"炭";s:4:"炭";s:4:"𠔥";s:4:"𠔥";s:3:"煅";s:4:"煅";s:4:"𤉣";s:4:"𤉣";s:3:"熜";s:4:"熜";s:4:"𤎫";s:4:"𤎫";s:3:"爨";s:4:"爨";s:3:"牐";s:4:"牐";s:4:"𤘈";s:4:"𤘈";s:3:"犀";s:4:"犀";s:3:"犕";s:4:"犕";s:4:"𤜵";s:4:"𤜵";s:4:"𤠔";s:4:"𤠔";s:3:"獺";s:4:"獺";s:3:"王";s:4:"王";s:3:"㺬";s:4:"㺬";s:3:"玥";s:4:"玥";s:3:"㺸";s:4:"㺸";s:3:"瑇";s:4:"瑇";s:3:"瑜";s:4:"瑜";s:3:"璅";s:4:"璅";s:3:"瓊";s:4:"瓊";s:3:"㼛";s:4:"㼛";s:3:"甤";s:4:"甤";s:4:"𤰶";s:4:"𤰶";s:3:"甾";s:4:"甾";s:4:"𤲒";s:4:"𤲒";s:4:"𢆟";s:4:"𢆟";s:3:"瘐";s:4:"瘐";s:4:"𤾡";s:4:"𤾡";s:4:"𤾸";s:4:"𤾸";s:4:"𥁄";s:4:"𥁄";s:3:"㿼";s:4:"㿼";s:3:"䀈";s:4:"䀈";s:4:"𥃳";s:4:"𥃳";s:4:"𥃲";s:4:"𥃲";s:4:"𥄙";s:4:"𥄙";s:4:"𥄳";s:4:"𥄳";s:3:"眞";s:4:"眞";s:3:"真";s:4:"真";s:3:"瞋";s:4:"瞋";s:3:"䁆";s:4:"䁆";s:3:"䂖";s:4:"䂖";s:4:"𥐝";s:4:"𥐝";s:3:"硎";s:4:"硎";s:3:"䃣";s:4:"䃣";s:4:"𥘦";s:4:"𥘦";s:4:"𥚚";s:4:"𥚚";s:4:"𥛅";s:4:"𥛅";s:3:"秫";s:4:"秫";s:3:"䄯";s:4:"䄯";s:3:"穊";s:4:"穊";s:3:"穏";s:4:"穏";s:4:"𥥼";s:4:"𥥼";s:4:"𥪧";s:4:"𥪧";s:3:"竮";s:4:"竮";s:3:"䈂";s:4:"䈂";s:4:"𥮫";s:4:"𥮫";s:3:"篆";s:4:"篆";s:3:"築";s:4:"築";s:3:"䈧";s:4:"䈧";s:4:"𥲀";s:4:"𥲀";s:3:"糒";s:4:"糒";s:3:"䊠";s:4:"䊠";s:3:"糨";s:4:"糨";s:3:"糣";s:4:"糣";s:3:"紀";s:4:"紀";s:4:"𥾆";s:4:"𥾆";s:3:"絣";s:4:"絣";s:3:"䌁";s:4:"䌁";s:3:"緇";s:4:"緇";s:3:"縂";s:4:"縂";s:3:"繅";s:4:"繅";s:3:"䌴";s:4:"䌴";s:4:"𦈨";s:4:"𦈨";s:4:"𦉇";s:4:"𦉇";s:3:"䍙";s:4:"䍙";s:4:"𦋙";s:4:"𦋙";s:3:"罺";s:4:"罺";s:4:"𦌾";s:4:"𦌾";s:3:"羕";s:4:"羕";s:3:"翺";s:4:"翺";s:4:"𦓚";s:4:"𦓚";s:4:"𦔣";s:4:"𦔣";s:3:"聠";s:4:"聠";s:4:"𦖨";s:4:"𦖨";s:3:"聰";s:4:"聰";s:4:"𣍟";s:4:"𣍟";s:3:"䏕";s:4:"䏕";s:3:"育";s:4:"育";s:3:"脃";s:4:"脃";s:3:"䐋";s:4:"䐋";s:3:"脾";s:4:"脾";s:3:"媵";s:4:"媵";s:4:"𦞧";s:4:"𦞧";s:4:"𦞵";s:4:"𦞵";s:4:"𣎓";s:4:"𣎓";s:4:"𣎜";s:4:"𣎜";s:3:"舄";s:4:"舄";s:3:"辞";s:4:"辞";s:3:"䑫";s:4:"䑫";s:3:"芑";s:4:"芑";s:3:"芋";s:4:"芋";s:3:"芝";s:4:"芝";s:3:"劳";s:4:"劳";s:3:"花";s:4:"花";s:3:"芳";s:4:"芳";s:3:"芽";s:4:"芽";s:3:"苦";s:4:"苦";s:4:"𦬼";s:4:"𦬼";s:3:"茝";s:4:"茝";s:3:"荣";s:4:"荣";s:3:"莭";s:4:"莭";s:3:"茣";s:4:"茣";s:3:"莽";s:4:"莽";s:3:"菧";s:4:"菧";s:3:"荓";s:4:"荓";s:3:"菊";s:4:"菊";s:3:"菌";s:4:"菌";s:3:"菜";s:4:"菜";s:4:"𦰶";s:4:"𦰶";s:4:"𦵫";s:4:"𦵫";s:4:"𦳕";s:4:"𦳕";s:3:"䔫";s:4:"䔫";s:3:"蓱";s:4:"蓱";s:3:"蓳";s:4:"蓳";s:3:"蔖";s:4:"蔖";s:4:"𧏊";s:4:"𧏊";s:3:"蕤";s:4:"蕤";s:4:"𦼬";s:4:"𦼬";s:3:"䕝";s:4:"䕝";s:3:"䕡";s:4:"䕡";s:4:"𦾱";s:4:"𦾱";s:4:"𧃒";s:4:"𧃒";s:3:"䕫";s:4:"䕫";s:3:"虐";s:4:"虐";s:3:"虧";s:4:"虧";s:3:"虩";s:4:"虩";s:3:"蚩";s:4:"蚩";s:3:"蚈";s:4:"蚈";s:3:"蜎";s:4:"蜎";s:3:"蛢";s:4:"蛢";s:3:"蜨";s:4:"蜨";s:3:"蝫";s:4:"蝫";s:3:"螆";s:4:"螆";s:3:"䗗";s:4:"䗗";s:3:"蟡";s:4:"蟡";s:3:"蠁";s:4:"蠁";s:3:"䗹";s:4:"䗹";s:3:"衠";s:4:"衠";s:3:"衣";s:4:"衣";s:4:"𧙧";s:4:"𧙧";s:3:"裗";s:4:"裗";s:3:"裞";s:4:"裞";s:3:"䘵";s:4:"䘵";s:3:"裺";s:4:"裺";s:3:"㒻";s:4:"㒻";s:4:"𧢮";s:4:"𧢮";s:4:"𧥦";s:4:"𧥦";s:3:"䚾";s:4:"䚾";s:3:"䛇";s:4:"䛇";s:3:"誠";s:4:"誠";s:3:"豕";s:4:"豕";s:4:"𧲨";s:4:"𧲨";s:3:"貫";s:4:"貫";s:3:"賁";s:4:"賁";s:3:"贛";s:4:"贛";s:3:"起";s:4:"起";s:4:"𧼯";s:4:"𧼯";s:4:"𠠄";s:4:"𠠄";s:3:"跋";s:4:"跋";s:3:"趼";s:4:"趼";s:3:"跰";s:4:"跰";s:4:"𠣞";s:4:"𠣞";s:3:"軔";s:4:"軔";s:4:"𨗒";s:4:"𨗒";s:4:"𨗭";s:4:"𨗭";s:3:"邔";s:4:"邔";s:3:"郱";s:4:"郱";s:3:"鄑";s:4:"鄑";s:4:"𨜮";s:4:"𨜮";s:3:"鄛";s:4:"鄛";s:3:"鈸";s:4:"鈸";s:3:"鋗";s:4:"鋗";s:3:"鋘";s:4:"鋘";s:3:"鉼";s:4:"鉼";s:3:"鏹";s:4:"鏹";s:3:"鐕";s:4:"鐕";s:4:"𨯺";s:4:"𨯺";s:3:"開";s:4:"開";s:3:"䦕";s:4:"䦕";s:3:"閷";s:4:"閷";s:4:"𨵷";s:4:"𨵷";s:3:"䧦";s:4:"䧦";s:3:"雃";s:4:"雃";s:3:"嶲";s:4:"嶲";s:3:"霣";s:4:"霣";s:4:"𩅅";s:4:"𩅅";s:4:"𩈚";s:4:"𩈚";s:3:"䩮";s:4:"䩮";s:3:"䩶";s:4:"䩶";s:3:"韠";s:4:"韠";s:4:"𩐊";s:4:"𩐊";s:3:"䪲";s:4:"䪲";s:4:"𩒖";s:4:"𩒖";s:3:"頩";s:4:"頩";s:4:"𩖶";s:4:"𩖶";s:3:"飢";s:4:"飢";s:3:"䬳";s:4:"䬳";s:3:"餩";s:4:"餩";s:3:"馧";s:4:"馧";s:3:"駂";s:4:"駂";s:3:"駾";s:4:"駾";s:3:"䯎";s:4:"䯎";s:4:"𩬰";s:4:"𩬰";s:3:"鱀";s:4:"鱀";s:3:"鳽";s:4:"鳽";s:3:"䳎";s:4:"䳎";s:3:"䳭";s:4:"䳭";s:3:"鵧";s:4:"鵧";s:4:"𪃎";s:4:"𪃎";s:3:"䳸";s:4:"䳸";s:4:"𪄅";s:4:"𪄅";s:4:"𪈎";s:4:"𪈎";s:4:"𪊑";s:4:"𪊑";s:3:"麻";s:4:"麻";s:3:"䵖";s:4:"䵖";s:3:"黹";s:4:"黹";s:3:"黾";s:4:"黾";s:3:"鼅";s:4:"鼅";s:3:"鼏";s:4:"鼏";s:3:"鼖";s:4:"鼖";s:3:"鼻";s:4:"鼻";s:4:"𪘀";s:4:"𪘀";}' );
+UtfNormal::$utfCanonicalDecomp = unserialize( 'a:2049:{s:2:"À";s:3:"À";s:2:"Á";s:3:"Á";s:2:"Â";s:3:"Â";s:2:"Ã";s:3:"Ã";s:2:"Ä";s:3:"Ä";s:2:"Å";s:3:"Å";s:2:"Ç";s:3:"Ç";s:2:"È";s:3:"È";s:2:"É";s:3:"É";s:2:"Ê";s:3:"Ê";s:2:"Ë";s:3:"Ë";s:2:"Ì";s:3:"Ì";s:2:"Í";s:3:"Í";s:2:"Î";s:3:"Î";s:2:"Ï";s:3:"Ï";s:2:"Ñ";s:3:"Ñ";s:2:"Ò";s:3:"Ò";s:2:"Ó";s:3:"Ó";s:2:"Ô";s:3:"Ô";s:2:"Õ";s:3:"Õ";s:2:"Ö";s:3:"Ö";s:2:"Ù";s:3:"Ù";s:2:"Ú";s:3:"Ú";s:2:"Û";s:3:"Û";s:2:"Ü";s:3:"Ü";s:2:"Ý";s:3:"Ý";s:2:"à";s:3:"à";s:2:"á";s:3:"á";s:2:"â";s:3:"â";s:2:"ã";s:3:"ã";s:2:"ä";s:3:"ä";s:2:"å";s:3:"å";s:2:"ç";s:3:"ç";s:2:"è";s:3:"è";s:2:"é";s:3:"é";s:2:"ê";s:3:"ê";s:2:"ë";s:3:"ë";s:2:"ì";s:3:"ì";s:2:"í";s:3:"í";s:2:"î";s:3:"î";s:2:"ï";s:3:"ï";s:2:"ñ";s:3:"ñ";s:2:"ò";s:3:"ò";s:2:"ó";s:3:"ó";s:2:"ô";s:3:"ô";s:2:"õ";s:3:"õ";s:2:"ö";s:3:"ö";s:2:"ù";s:3:"ù";s:2:"ú";s:3:"ú";s:2:"û";s:3:"û";s:2:"ü";s:3:"ü";s:2:"ý";s:3:"ý";s:2:"ÿ";s:3:"ÿ";s:2:"Ā";s:3:"Ā";s:2:"ā";s:3:"ā";s:2:"Ă";s:3:"Ă";s:2:"ă";s:3:"ă";s:2:"Ą";s:3:"Ą";s:2:"ą";s:3:"ą";s:2:"Ć";s:3:"Ć";s:2:"ć";s:3:"ć";s:2:"Ĉ";s:3:"Ĉ";s:2:"ĉ";s:3:"ĉ";s:2:"Ċ";s:3:"Ċ";s:2:"ċ";s:3:"ċ";s:2:"Č";s:3:"Č";s:2:"č";s:3:"č";s:2:"Ď";s:3:"Ď";s:2:"ď";s:3:"ď";s:2:"Ē";s:3:"Ē";s:2:"ē";s:3:"ē";s:2:"Ĕ";s:3:"Ĕ";s:2:"ĕ";s:3:"ĕ";s:2:"Ė";s:3:"Ė";s:2:"ė";s:3:"ė";s:2:"Ę";s:3:"Ę";s:2:"ę";s:3:"ę";s:2:"Ě";s:3:"Ě";s:2:"ě";s:3:"ě";s:2:"Ĝ";s:3:"Ĝ";s:2:"ĝ";s:3:"ĝ";s:2:"Ğ";s:3:"Ğ";s:2:"ğ";s:3:"ğ";s:2:"Ġ";s:3:"Ġ";s:2:"ġ";s:3:"ġ";s:2:"Ģ";s:3:"Ģ";s:2:"ģ";s:3:"ģ";s:2:"Ĥ";s:3:"Ĥ";s:2:"ĥ";s:3:"ĥ";s:2:"Ĩ";s:3:"Ĩ";s:2:"ĩ";s:3:"ĩ";s:2:"Ī";s:3:"Ī";s:2:"ī";s:3:"ī";s:2:"Ĭ";s:3:"Ĭ";s:2:"ĭ";s:3:"ĭ";s:2:"Į";s:3:"Į";s:2:"į";s:3:"į";s:2:"İ";s:3:"İ";s:2:"Ĵ";s:3:"Ĵ";s:2:"ĵ";s:3:"ĵ";s:2:"Ķ";s:3:"Ķ";s:2:"ķ";s:3:"ķ";s:2:"Ĺ";s:3:"Ĺ";s:2:"ĺ";s:3:"ĺ";s:2:"Ļ";s:3:"Ļ";s:2:"ļ";s:3:"ļ";s:2:"Ľ";s:3:"Ľ";s:2:"ľ";s:3:"ľ";s:2:"Ń";s:3:"Ń";s:2:"ń";s:3:"ń";s:2:"Ņ";s:3:"Ņ";s:2:"ņ";s:3:"ņ";s:2:"Ň";s:3:"Ň";s:2:"ň";s:3:"ň";s:2:"Ō";s:3:"Ō";s:2:"ō";s:3:"ō";s:2:"Ŏ";s:3:"Ŏ";s:2:"ŏ";s:3:"ŏ";s:2:"Ő";s:3:"Ő";s:2:"ő";s:3:"ő";s:2:"Ŕ";s:3:"Ŕ";s:2:"ŕ";s:3:"ŕ";s:2:"Ŗ";s:3:"Ŗ";s:2:"ŗ";s:3:"ŗ";s:2:"Ř";s:3:"Ř";s:2:"ř";s:3:"ř";s:2:"Ś";s:3:"Ś";s:2:"ś";s:3:"ś";s:2:"Ŝ";s:3:"Ŝ";s:2:"ŝ";s:3:"ŝ";s:2:"Ş";s:3:"Ş";s:2:"ş";s:3:"ş";s:2:"Š";s:3:"Š";s:2:"š";s:3:"š";s:2:"Ţ";s:3:"Ţ";s:2:"ţ";s:3:"ţ";s:2:"Ť";s:3:"Ť";s:2:"ť";s:3:"ť";s:2:"Ũ";s:3:"Ũ";s:2:"ũ";s:3:"ũ";s:2:"Ū";s:3:"Ū";s:2:"ū";s:3:"ū";s:2:"Ŭ";s:3:"Ŭ";s:2:"ŭ";s:3:"ŭ";s:2:"Ů";s:3:"Ů";s:2:"ů";s:3:"ů";s:2:"Ű";s:3:"Ű";s:2:"ű";s:3:"ű";s:2:"Ų";s:3:"Ų";s:2:"ų";s:3:"ų";s:2:"Ŵ";s:3:"Ŵ";s:2:"ŵ";s:3:"ŵ";s:2:"Ŷ";s:3:"Ŷ";s:2:"ŷ";s:3:"ŷ";s:2:"Ÿ";s:3:"Ÿ";s:2:"Ź";s:3:"Ź";s:2:"ź";s:3:"ź";s:2:"Ż";s:3:"Ż";s:2:"ż";s:3:"ż";s:2:"Ž";s:3:"Ž";s:2:"ž";s:3:"ž";s:2:"Ơ";s:3:"Ơ";s:2:"ơ";s:3:"ơ";s:2:"Ư";s:3:"Ư";s:2:"ư";s:3:"ư";s:2:"Ǎ";s:3:"Ǎ";s:2:"ǎ";s:3:"ǎ";s:2:"Ǐ";s:3:"Ǐ";s:2:"ǐ";s:3:"ǐ";s:2:"Ǒ";s:3:"Ǒ";s:2:"ǒ";s:3:"ǒ";s:2:"Ǔ";s:3:"Ǔ";s:2:"ǔ";s:3:"ǔ";s:2:"Ǖ";s:5:"Ǖ";s:2:"ǖ";s:5:"ǖ";s:2:"Ǘ";s:5:"Ǘ";s:2:"ǘ";s:5:"ǘ";s:2:"Ǚ";s:5:"Ǚ";s:2:"ǚ";s:5:"ǚ";s:2:"Ǜ";s:5:"Ǜ";s:2:"ǜ";s:5:"ǜ";s:2:"Ǟ";s:5:"Ǟ";s:2:"ǟ";s:5:"ǟ";s:2:"Ǡ";s:5:"Ǡ";s:2:"ǡ";s:5:"ǡ";s:2:"Ǣ";s:4:"Ǣ";s:2:"ǣ";s:4:"ǣ";s:2:"Ǧ";s:3:"Ǧ";s:2:"ǧ";s:3:"ǧ";s:2:"Ǩ";s:3:"Ǩ";s:2:"ǩ";s:3:"ǩ";s:2:"Ǫ";s:3:"Ǫ";s:2:"ǫ";s:3:"ǫ";s:2:"Ǭ";s:5:"Ǭ";s:2:"ǭ";s:5:"ǭ";s:2:"Ǯ";s:4:"Ǯ";s:2:"ǯ";s:4:"ǯ";s:2:"ǰ";s:3:"ǰ";s:2:"Ǵ";s:3:"Ǵ";s:2:"ǵ";s:3:"ǵ";s:2:"Ǹ";s:3:"Ǹ";s:2:"ǹ";s:3:"ǹ";s:2:"Ǻ";s:5:"Ǻ";s:2:"ǻ";s:5:"ǻ";s:2:"Ǽ";s:4:"Ǽ";s:2:"ǽ";s:4:"ǽ";s:2:"Ǿ";s:4:"Ǿ";s:2:"ǿ";s:4:"ǿ";s:2:"Ȁ";s:3:"Ȁ";s:2:"ȁ";s:3:"ȁ";s:2:"Ȃ";s:3:"Ȃ";s:2:"ȃ";s:3:"ȃ";s:2:"Ȅ";s:3:"Ȅ";s:2:"ȅ";s:3:"ȅ";s:2:"Ȇ";s:3:"Ȇ";s:2:"ȇ";s:3:"ȇ";s:2:"Ȉ";s:3:"Ȉ";s:2:"ȉ";s:3:"ȉ";s:2:"Ȋ";s:3:"Ȋ";s:2:"ȋ";s:3:"ȋ";s:2:"Ȍ";s:3:"Ȍ";s:2:"ȍ";s:3:"ȍ";s:2:"Ȏ";s:3:"Ȏ";s:2:"ȏ";s:3:"ȏ";s:2:"Ȑ";s:3:"Ȑ";s:2:"ȑ";s:3:"ȑ";s:2:"Ȓ";s:3:"Ȓ";s:2:"ȓ";s:3:"ȓ";s:2:"Ȕ";s:3:"Ȕ";s:2:"ȕ";s:3:"ȕ";s:2:"Ȗ";s:3:"Ȗ";s:2:"ȗ";s:3:"ȗ";s:2:"Ș";s:3:"Ș";s:2:"ș";s:3:"ș";s:2:"Ț";s:3:"Ț";s:2:"ț";s:3:"ț";s:2:"Ȟ";s:3:"Ȟ";s:2:"ȟ";s:3:"ȟ";s:2:"Ȧ";s:3:"Ȧ";s:2:"ȧ";s:3:"ȧ";s:2:"Ȩ";s:3:"Ȩ";s:2:"ȩ";s:3:"ȩ";s:2:"Ȫ";s:5:"Ȫ";s:2:"ȫ";s:5:"ȫ";s:2:"Ȭ";s:5:"Ȭ";s:2:"ȭ";s:5:"ȭ";s:2:"Ȯ";s:3:"Ȯ";s:2:"ȯ";s:3:"ȯ";s:2:"Ȱ";s:5:"Ȱ";s:2:"ȱ";s:5:"ȱ";s:2:"Ȳ";s:3:"Ȳ";s:2:"ȳ";s:3:"ȳ";s:2:"̀";s:2:"̀";s:2:"́";s:2:"́";s:2:"̓";s:2:"̓";s:2:"̈́";s:4:"̈́";s:2:"ʹ";s:2:"ʹ";s:2:";";s:1:";";s:2:"΅";s:4:"΅";s:2:"Ά";s:4:"Ά";s:2:"·";s:2:"·";s:2:"Έ";s:4:"Έ";s:2:"Ή";s:4:"Ή";s:2:"Ί";s:4:"Ί";s:2:"Ό";s:4:"Ό";s:2:"Ύ";s:4:"Ύ";s:2:"Ώ";s:4:"Ώ";s:2:"ΐ";s:6:"ΐ";s:2:"Ϊ";s:4:"Ϊ";s:2:"Ϋ";s:4:"Ϋ";s:2:"ά";s:4:"ά";s:2:"έ";s:4:"έ";s:2:"ή";s:4:"ή";s:2:"ί";s:4:"ί";s:2:"ΰ";s:6:"ΰ";s:2:"ϊ";s:4:"ϊ";s:2:"ϋ";s:4:"ϋ";s:2:"ό";s:4:"ό";s:2:"ύ";s:4:"ύ";s:2:"ώ";s:4:"ώ";s:2:"ϓ";s:4:"ϓ";s:2:"ϔ";s:4:"ϔ";s:2:"Ѐ";s:4:"Ѐ";s:2:"Ё";s:4:"Ё";s:2:"Ѓ";s:4:"Ѓ";s:2:"Ї";s:4:"Ї";s:2:"Ќ";s:4:"Ќ";s:2:"Ѝ";s:4:"Ѝ";s:2:"Ў";s:4:"Ў";s:2:"Й";s:4:"Й";s:2:"й";s:4:"й";s:2:"ѐ";s:4:"ѐ";s:2:"ё";s:4:"ё";s:2:"ѓ";s:4:"ѓ";s:2:"ї";s:4:"ї";s:2:"ќ";s:4:"ќ";s:2:"ѝ";s:4:"ѝ";s:2:"ў";s:4:"ў";s:2:"Ѷ";s:4:"Ѷ";s:2:"ѷ";s:4:"ѷ";s:2:"Ӂ";s:4:"Ӂ";s:2:"ӂ";s:4:"ӂ";s:2:"Ӑ";s:4:"Ӑ";s:2:"ӑ";s:4:"ӑ";s:2:"Ӓ";s:4:"Ӓ";s:2:"ӓ";s:4:"ӓ";s:2:"Ӗ";s:4:"Ӗ";s:2:"ӗ";s:4:"ӗ";s:2:"Ӛ";s:4:"Ӛ";s:2:"ӛ";s:4:"ӛ";s:2:"Ӝ";s:4:"Ӝ";s:2:"ӝ";s:4:"ӝ";s:2:"Ӟ";s:4:"Ӟ";s:2:"ӟ";s:4:"ӟ";s:2:"Ӣ";s:4:"Ӣ";s:2:"ӣ";s:4:"ӣ";s:2:"Ӥ";s:4:"Ӥ";s:2:"ӥ";s:4:"ӥ";s:2:"Ӧ";s:4:"Ӧ";s:2:"ӧ";s:4:"ӧ";s:2:"Ӫ";s:4:"Ӫ";s:2:"ӫ";s:4:"ӫ";s:2:"Ӭ";s:4:"Ӭ";s:2:"ӭ";s:4:"ӭ";s:2:"Ӯ";s:4:"Ӯ";s:2:"ӯ";s:4:"ӯ";s:2:"Ӱ";s:4:"Ӱ";s:2:"ӱ";s:4:"ӱ";s:2:"Ӳ";s:4:"Ӳ";s:2:"ӳ";s:4:"ӳ";s:2:"Ӵ";s:4:"Ӵ";s:2:"ӵ";s:4:"ӵ";s:2:"Ӹ";s:4:"Ӹ";s:2:"ӹ";s:4:"ӹ";s:2:"آ";s:4:"آ";s:2:"أ";s:4:"أ";s:2:"ؤ";s:4:"ؤ";s:2:"إ";s:4:"إ";s:2:"ئ";s:4:"ئ";s:2:"ۀ";s:4:"ۀ";s:2:"ۂ";s:4:"ۂ";s:2:"ۓ";s:4:"ۓ";s:3:"ऩ";s:6:"ऩ";s:3:"ऱ";s:6:"ऱ";s:3:"ऴ";s:6:"ऴ";s:3:"क़";s:6:"क़";s:3:"ख़";s:6:"ख़";s:3:"ग़";s:6:"ग़";s:3:"ज़";s:6:"ज़";s:3:"ड़";s:6:"ड़";s:3:"ढ़";s:6:"ढ़";s:3:"फ़";s:6:"फ़";s:3:"य़";s:6:"य़";s:3:"ো";s:6:"ো";s:3:"ৌ";s:6:"ৌ";s:3:"ড়";s:6:"ড়";s:3:"ঢ়";s:6:"ঢ়";s:3:"য়";s:6:"য়";s:3:"ਲ਼";s:6:"ਲ਼";s:3:"ਸ਼";s:6:"ਸ਼";s:3:"ਖ਼";s:6:"ਖ਼";s:3:"ਗ਼";s:6:"ਗ਼";s:3:"ਜ਼";s:6:"ਜ਼";s:3:"ਫ਼";s:6:"ਫ਼";s:3:"ୈ";s:6:"ୈ";s:3:"ୋ";s:6:"ୋ";s:3:"ୌ";s:6:"ୌ";s:3:"ଡ଼";s:6:"ଡ଼";s:3:"ଢ଼";s:6:"ଢ଼";s:3:"ஔ";s:6:"ஔ";s:3:"ொ";s:6:"ொ";s:3:"ோ";s:6:"ோ";s:3:"ௌ";s:6:"ௌ";s:3:"ై";s:6:"ై";s:3:"ೀ";s:6:"ೀ";s:3:"ೇ";s:6:"ೇ";s:3:"ೈ";s:6:"ೈ";s:3:"ೊ";s:6:"ೊ";s:3:"ೋ";s:9:"ೋ";s:3:"ൊ";s:6:"ൊ";s:3:"ോ";s:6:"ോ";s:3:"ൌ";s:6:"ൌ";s:3:"ේ";s:6:"ේ";s:3:"ො";s:6:"ො";s:3:"ෝ";s:9:"ෝ";s:3:"ෞ";s:6:"ෞ";s:3:"གྷ";s:6:"གྷ";s:3:"ཌྷ";s:6:"ཌྷ";s:3:"དྷ";s:6:"དྷ";s:3:"བྷ";s:6:"བྷ";s:3:"ཛྷ";s:6:"ཛྷ";s:3:"ཀྵ";s:6:"ཀྵ";s:3:"ཱི";s:6:"ཱི";s:3:"ཱུ";s:6:"ཱུ";s:3:"ྲྀ";s:6:"ྲྀ";s:3:"ླྀ";s:6:"ླྀ";s:3:"ཱྀ";s:6:"ཱྀ";s:3:"ྒྷ";s:6:"ྒྷ";s:3:"ྜྷ";s:6:"ྜྷ";s:3:"ྡྷ";s:6:"ྡྷ";s:3:"ྦྷ";s:6:"ྦྷ";s:3:"ྫྷ";s:6:"ྫྷ";s:3:"ྐྵ";s:6:"ྐྵ";s:3:"ဦ";s:6:"ဦ";s:3:"ᬆ";s:6:"ᬆ";s:3:"ᬈ";s:6:"ᬈ";s:3:"ᬊ";s:6:"ᬊ";s:3:"ᬌ";s:6:"ᬌ";s:3:"ᬎ";s:6:"ᬎ";s:3:"ᬒ";s:6:"ᬒ";s:3:"ᬻ";s:6:"ᬻ";s:3:"ᬽ";s:6:"ᬽ";s:3:"ᭀ";s:6:"ᭀ";s:3:"ᭁ";s:6:"ᭁ";s:3:"ᭃ";s:6:"ᭃ";s:3:"Ḁ";s:3:"Ḁ";s:3:"ḁ";s:3:"ḁ";s:3:"Ḃ";s:3:"Ḃ";s:3:"ḃ";s:3:"ḃ";s:3:"Ḅ";s:3:"Ḅ";s:3:"ḅ";s:3:"ḅ";s:3:"Ḇ";s:3:"Ḇ";s:3:"ḇ";s:3:"ḇ";s:3:"Ḉ";s:5:"Ḉ";s:3:"ḉ";s:5:"ḉ";s:3:"Ḋ";s:3:"Ḋ";s:3:"ḋ";s:3:"ḋ";s:3:"Ḍ";s:3:"Ḍ";s:3:"ḍ";s:3:"ḍ";s:3:"Ḏ";s:3:"Ḏ";s:3:"ḏ";s:3:"ḏ";s:3:"Ḑ";s:3:"Ḑ";s:3:"ḑ";s:3:"ḑ";s:3:"Ḓ";s:3:"Ḓ";s:3:"ḓ";s:3:"ḓ";s:3:"Ḕ";s:5:"Ḕ";s:3:"ḕ";s:5:"ḕ";s:3:"Ḗ";s:5:"Ḗ";s:3:"ḗ";s:5:"ḗ";s:3:"Ḙ";s:3:"Ḙ";s:3:"ḙ";s:3:"ḙ";s:3:"Ḛ";s:3:"Ḛ";s:3:"ḛ";s:3:"ḛ";s:3:"Ḝ";s:5:"Ḝ";s:3:"ḝ";s:5:"ḝ";s:3:"Ḟ";s:3:"Ḟ";s:3:"ḟ";s:3:"ḟ";s:3:"Ḡ";s:3:"Ḡ";s:3:"ḡ";s:3:"ḡ";s:3:"Ḣ";s:3:"Ḣ";s:3:"ḣ";s:3:"ḣ";s:3:"Ḥ";s:3:"Ḥ";s:3:"ḥ";s:3:"ḥ";s:3:"Ḧ";s:3:"Ḧ";s:3:"ḧ";s:3:"ḧ";s:3:"Ḩ";s:3:"Ḩ";s:3:"ḩ";s:3:"ḩ";s:3:"Ḫ";s:3:"Ḫ";s:3:"ḫ";s:3:"ḫ";s:3:"Ḭ";s:3:"Ḭ";s:3:"ḭ";s:3:"ḭ";s:3:"Ḯ";s:5:"Ḯ";s:3:"ḯ";s:5:"ḯ";s:3:"Ḱ";s:3:"Ḱ";s:3:"ḱ";s:3:"ḱ";s:3:"Ḳ";s:3:"Ḳ";s:3:"ḳ";s:3:"ḳ";s:3:"Ḵ";s:3:"Ḵ";s:3:"ḵ";s:3:"ḵ";s:3:"Ḷ";s:3:"Ḷ";s:3:"ḷ";s:3:"ḷ";s:3:"Ḹ";s:5:"Ḹ";s:3:"ḹ";s:5:"ḹ";s:3:"Ḻ";s:3:"Ḻ";s:3:"ḻ";s:3:"ḻ";s:3:"Ḽ";s:3:"Ḽ";s:3:"ḽ";s:3:"ḽ";s:3:"Ḿ";s:3:"Ḿ";s:3:"ḿ";s:3:"ḿ";s:3:"Ṁ";s:3:"Ṁ";s:3:"ṁ";s:3:"ṁ";s:3:"Ṃ";s:3:"Ṃ";s:3:"ṃ";s:3:"ṃ";s:3:"Ṅ";s:3:"Ṅ";s:3:"ṅ";s:3:"ṅ";s:3:"Ṇ";s:3:"Ṇ";s:3:"ṇ";s:3:"ṇ";s:3:"Ṉ";s:3:"Ṉ";s:3:"ṉ";s:3:"ṉ";s:3:"Ṋ";s:3:"Ṋ";s:3:"ṋ";s:3:"ṋ";s:3:"Ṍ";s:5:"Ṍ";s:3:"ṍ";s:5:"ṍ";s:3:"Ṏ";s:5:"Ṏ";s:3:"ṏ";s:5:"ṏ";s:3:"Ṑ";s:5:"Ṑ";s:3:"ṑ";s:5:"ṑ";s:3:"Ṓ";s:5:"Ṓ";s:3:"ṓ";s:5:"ṓ";s:3:"Ṕ";s:3:"Ṕ";s:3:"ṕ";s:3:"ṕ";s:3:"Ṗ";s:3:"Ṗ";s:3:"ṗ";s:3:"ṗ";s:3:"Ṙ";s:3:"Ṙ";s:3:"ṙ";s:3:"ṙ";s:3:"Ṛ";s:3:"Ṛ";s:3:"ṛ";s:3:"ṛ";s:3:"Ṝ";s:5:"Ṝ";s:3:"ṝ";s:5:"ṝ";s:3:"Ṟ";s:3:"Ṟ";s:3:"ṟ";s:3:"ṟ";s:3:"Ṡ";s:3:"Ṡ";s:3:"ṡ";s:3:"ṡ";s:3:"Ṣ";s:3:"Ṣ";s:3:"ṣ";s:3:"ṣ";s:3:"Ṥ";s:5:"Ṥ";s:3:"ṥ";s:5:"ṥ";s:3:"Ṧ";s:5:"Ṧ";s:3:"ṧ";s:5:"ṧ";s:3:"Ṩ";s:5:"Ṩ";s:3:"ṩ";s:5:"ṩ";s:3:"Ṫ";s:3:"Ṫ";s:3:"ṫ";s:3:"ṫ";s:3:"Ṭ";s:3:"Ṭ";s:3:"ṭ";s:3:"ṭ";s:3:"Ṯ";s:3:"Ṯ";s:3:"ṯ";s:3:"ṯ";s:3:"Ṱ";s:3:"Ṱ";s:3:"ṱ";s:3:"ṱ";s:3:"Ṳ";s:3:"Ṳ";s:3:"ṳ";s:3:"ṳ";s:3:"Ṵ";s:3:"Ṵ";s:3:"ṵ";s:3:"ṵ";s:3:"Ṷ";s:3:"Ṷ";s:3:"ṷ";s:3:"ṷ";s:3:"Ṹ";s:5:"Ṹ";s:3:"ṹ";s:5:"ṹ";s:3:"Ṻ";s:5:"Ṻ";s:3:"ṻ";s:5:"ṻ";s:3:"Ṽ";s:3:"Ṽ";s:3:"ṽ";s:3:"ṽ";s:3:"Ṿ";s:3:"Ṿ";s:3:"ṿ";s:3:"ṿ";s:3:"Ẁ";s:3:"Ẁ";s:3:"ẁ";s:3:"ẁ";s:3:"Ẃ";s:3:"Ẃ";s:3:"ẃ";s:3:"ẃ";s:3:"Ẅ";s:3:"Ẅ";s:3:"ẅ";s:3:"ẅ";s:3:"Ẇ";s:3:"Ẇ";s:3:"ẇ";s:3:"ẇ";s:3:"Ẉ";s:3:"Ẉ";s:3:"ẉ";s:3:"ẉ";s:3:"Ẋ";s:3:"Ẋ";s:3:"ẋ";s:3:"ẋ";s:3:"Ẍ";s:3:"Ẍ";s:3:"ẍ";s:3:"ẍ";s:3:"Ẏ";s:3:"Ẏ";s:3:"ẏ";s:3:"ẏ";s:3:"Ẑ";s:3:"Ẑ";s:3:"ẑ";s:3:"ẑ";s:3:"Ẓ";s:3:"Ẓ";s:3:"ẓ";s:3:"ẓ";s:3:"Ẕ";s:3:"Ẕ";s:3:"ẕ";s:3:"ẕ";s:3:"ẖ";s:3:"ẖ";s:3:"ẗ";s:3:"ẗ";s:3:"ẘ";s:3:"ẘ";s:3:"ẙ";s:3:"ẙ";s:3:"ẛ";s:4:"ẛ";s:3:"Ạ";s:3:"Ạ";s:3:"ạ";s:3:"ạ";s:3:"Ả";s:3:"Ả";s:3:"ả";s:3:"ả";s:3:"Ấ";s:5:"Ấ";s:3:"ấ";s:5:"ấ";s:3:"Ầ";s:5:"Ầ";s:3:"ầ";s:5:"ầ";s:3:"Ẩ";s:5:"Ẩ";s:3:"ẩ";s:5:"ẩ";s:3:"Ẫ";s:5:"Ẫ";s:3:"ẫ";s:5:"ẫ";s:3:"Ậ";s:5:"Ậ";s:3:"ậ";s:5:"ậ";s:3:"Ắ";s:5:"Ắ";s:3:"ắ";s:5:"ắ";s:3:"Ằ";s:5:"Ằ";s:3:"ằ";s:5:"ằ";s:3:"Ẳ";s:5:"Ẳ";s:3:"ẳ";s:5:"ẳ";s:3:"Ẵ";s:5:"Ẵ";s:3:"ẵ";s:5:"ẵ";s:3:"Ặ";s:5:"Ặ";s:3:"ặ";s:5:"ặ";s:3:"Ẹ";s:3:"Ẹ";s:3:"ẹ";s:3:"ẹ";s:3:"Ẻ";s:3:"Ẻ";s:3:"ẻ";s:3:"ẻ";s:3:"Ẽ";s:3:"Ẽ";s:3:"ẽ";s:3:"ẽ";s:3:"Ế";s:5:"Ế";s:3:"ế";s:5:"ế";s:3:"Ề";s:5:"Ề";s:3:"ề";s:5:"ề";s:3:"Ể";s:5:"Ể";s:3:"ể";s:5:"ể";s:3:"Ễ";s:5:"Ễ";s:3:"ễ";s:5:"ễ";s:3:"Ệ";s:5:"Ệ";s:3:"ệ";s:5:"ệ";s:3:"Ỉ";s:3:"Ỉ";s:3:"ỉ";s:3:"ỉ";s:3:"Ị";s:3:"Ị";s:3:"ị";s:3:"ị";s:3:"Ọ";s:3:"Ọ";s:3:"ọ";s:3:"ọ";s:3:"Ỏ";s:3:"Ỏ";s:3:"ỏ";s:3:"ỏ";s:3:"Ố";s:5:"Ố";s:3:"ố";s:5:"ố";s:3:"Ồ";s:5:"Ồ";s:3:"ồ";s:5:"ồ";s:3:"Ổ";s:5:"Ổ";s:3:"ổ";s:5:"ổ";s:3:"Ỗ";s:5:"Ỗ";s:3:"ỗ";s:5:"ỗ";s:3:"Ộ";s:5:"Ộ";s:3:"ộ";s:5:"ộ";s:3:"Ớ";s:5:"Ớ";s:3:"ớ";s:5:"ớ";s:3:"Ờ";s:5:"Ờ";s:3:"ờ";s:5:"ờ";s:3:"Ở";s:5:"Ở";s:3:"ở";s:5:"ở";s:3:"Ỡ";s:5:"Ỡ";s:3:"ỡ";s:5:"ỡ";s:3:"Ợ";s:5:"Ợ";s:3:"ợ";s:5:"ợ";s:3:"Ụ";s:3:"Ụ";s:3:"ụ";s:3:"ụ";s:3:"Ủ";s:3:"Ủ";s:3:"ủ";s:3:"ủ";s:3:"Ứ";s:5:"Ứ";s:3:"ứ";s:5:"ứ";s:3:"Ừ";s:5:"Ừ";s:3:"ừ";s:5:"ừ";s:3:"Ử";s:5:"Ử";s:3:"ử";s:5:"ử";s:3:"Ữ";s:5:"Ữ";s:3:"ữ";s:5:"ữ";s:3:"Ự";s:5:"Ự";s:3:"ự";s:5:"ự";s:3:"Ỳ";s:3:"Ỳ";s:3:"ỳ";s:3:"ỳ";s:3:"Ỵ";s:3:"Ỵ";s:3:"ỵ";s:3:"ỵ";s:3:"Ỷ";s:3:"Ỷ";s:3:"ỷ";s:3:"ỷ";s:3:"Ỹ";s:3:"Ỹ";s:3:"ỹ";s:3:"ỹ";s:3:"ἀ";s:4:"ἀ";s:3:"ἁ";s:4:"ἁ";s:3:"ἂ";s:6:"ἂ";s:3:"ἃ";s:6:"ἃ";s:3:"ἄ";s:6:"ἄ";s:3:"ἅ";s:6:"ἅ";s:3:"ἆ";s:6:"ἆ";s:3:"ἇ";s:6:"ἇ";s:3:"Ἀ";s:4:"Ἀ";s:3:"Ἁ";s:4:"Ἁ";s:3:"Ἂ";s:6:"Ἂ";s:3:"Ἃ";s:6:"Ἃ";s:3:"Ἄ";s:6:"Ἄ";s:3:"Ἅ";s:6:"Ἅ";s:3:"Ἆ";s:6:"Ἆ";s:3:"Ἇ";s:6:"Ἇ";s:3:"ἐ";s:4:"ἐ";s:3:"ἑ";s:4:"ἑ";s:3:"ἒ";s:6:"ἒ";s:3:"ἓ";s:6:"ἓ";s:3:"ἔ";s:6:"ἔ";s:3:"ἕ";s:6:"ἕ";s:3:"Ἐ";s:4:"Ἐ";s:3:"Ἑ";s:4:"Ἑ";s:3:"Ἒ";s:6:"Ἒ";s:3:"Ἓ";s:6:"Ἓ";s:3:"Ἔ";s:6:"Ἔ";s:3:"Ἕ";s:6:"Ἕ";s:3:"ἠ";s:4:"ἠ";s:3:"ἡ";s:4:"ἡ";s:3:"ἢ";s:6:"ἢ";s:3:"ἣ";s:6:"ἣ";s:3:"ἤ";s:6:"ἤ";s:3:"ἥ";s:6:"ἥ";s:3:"ἦ";s:6:"ἦ";s:3:"ἧ";s:6:"ἧ";s:3:"Ἠ";s:4:"Ἠ";s:3:"Ἡ";s:4:"Ἡ";s:3:"Ἢ";s:6:"Ἢ";s:3:"Ἣ";s:6:"Ἣ";s:3:"Ἤ";s:6:"Ἤ";s:3:"Ἥ";s:6:"Ἥ";s:3:"Ἦ";s:6:"Ἦ";s:3:"Ἧ";s:6:"Ἧ";s:3:"ἰ";s:4:"ἰ";s:3:"ἱ";s:4:"ἱ";s:3:"ἲ";s:6:"ἲ";s:3:"ἳ";s:6:"ἳ";s:3:"ἴ";s:6:"ἴ";s:3:"ἵ";s:6:"ἵ";s:3:"ἶ";s:6:"ἶ";s:3:"ἷ";s:6:"ἷ";s:3:"Ἰ";s:4:"Ἰ";s:3:"Ἱ";s:4:"Ἱ";s:3:"Ἲ";s:6:"Ἲ";s:3:"Ἳ";s:6:"Ἳ";s:3:"Ἴ";s:6:"Ἴ";s:3:"Ἵ";s:6:"Ἵ";s:3:"Ἶ";s:6:"Ἶ";s:3:"Ἷ";s:6:"Ἷ";s:3:"ὀ";s:4:"ὀ";s:3:"ὁ";s:4:"ὁ";s:3:"ὂ";s:6:"ὂ";s:3:"ὃ";s:6:"ὃ";s:3:"ὄ";s:6:"ὄ";s:3:"ὅ";s:6:"ὅ";s:3:"Ὀ";s:4:"Ὀ";s:3:"Ὁ";s:4:"Ὁ";s:3:"Ὂ";s:6:"Ὂ";s:3:"Ὃ";s:6:"Ὃ";s:3:"Ὄ";s:6:"Ὄ";s:3:"Ὅ";s:6:"Ὅ";s:3:"ὐ";s:4:"ὐ";s:3:"ὑ";s:4:"ὑ";s:3:"ὒ";s:6:"ὒ";s:3:"ὓ";s:6:"ὓ";s:3:"ὔ";s:6:"ὔ";s:3:"ὕ";s:6:"ὕ";s:3:"ὖ";s:6:"ὖ";s:3:"ὗ";s:6:"ὗ";s:3:"Ὑ";s:4:"Ὑ";s:3:"Ὓ";s:6:"Ὓ";s:3:"Ὕ";s:6:"Ὕ";s:3:"Ὗ";s:6:"Ὗ";s:3:"ὠ";s:4:"ὠ";s:3:"ὡ";s:4:"ὡ";s:3:"ὢ";s:6:"ὢ";s:3:"ὣ";s:6:"ὣ";s:3:"ὤ";s:6:"ὤ";s:3:"ὥ";s:6:"ὥ";s:3:"ὦ";s:6:"ὦ";s:3:"ὧ";s:6:"ὧ";s:3:"Ὠ";s:4:"Ὠ";s:3:"Ὡ";s:4:"Ὡ";s:3:"Ὢ";s:6:"Ὢ";s:3:"Ὣ";s:6:"Ὣ";s:3:"Ὤ";s:6:"Ὤ";s:3:"Ὥ";s:6:"Ὥ";s:3:"Ὦ";s:6:"Ὦ";s:3:"Ὧ";s:6:"Ὧ";s:3:"ὰ";s:4:"ὰ";s:3:"ά";s:4:"ά";s:3:"ὲ";s:4:"ὲ";s:3:"έ";s:4:"έ";s:3:"ὴ";s:4:"ὴ";s:3:"ή";s:4:"ή";s:3:"ὶ";s:4:"ὶ";s:3:"ί";s:4:"ί";s:3:"ὸ";s:4:"ὸ";s:3:"ό";s:4:"ό";s:3:"ὺ";s:4:"ὺ";s:3:"ύ";s:4:"ύ";s:3:"ὼ";s:4:"ὼ";s:3:"ώ";s:4:"ώ";s:3:"ᾀ";s:6:"ᾀ";s:3:"ᾁ";s:6:"ᾁ";s:3:"ᾂ";s:8:"ᾂ";s:3:"ᾃ";s:8:"ᾃ";s:3:"ᾄ";s:8:"ᾄ";s:3:"ᾅ";s:8:"ᾅ";s:3:"ᾆ";s:8:"ᾆ";s:3:"ᾇ";s:8:"ᾇ";s:3:"ᾈ";s:6:"ᾈ";s:3:"ᾉ";s:6:"ᾉ";s:3:"ᾊ";s:8:"ᾊ";s:3:"ᾋ";s:8:"ᾋ";s:3:"ᾌ";s:8:"ᾌ";s:3:"ᾍ";s:8:"ᾍ";s:3:"ᾎ";s:8:"ᾎ";s:3:"ᾏ";s:8:"ᾏ";s:3:"ᾐ";s:6:"ᾐ";s:3:"ᾑ";s:6:"ᾑ";s:3:"ᾒ";s:8:"ᾒ";s:3:"ᾓ";s:8:"ᾓ";s:3:"ᾔ";s:8:"ᾔ";s:3:"ᾕ";s:8:"ᾕ";s:3:"ᾖ";s:8:"ᾖ";s:3:"ᾗ";s:8:"ᾗ";s:3:"ᾘ";s:6:"ᾘ";s:3:"ᾙ";s:6:"ᾙ";s:3:"ᾚ";s:8:"ᾚ";s:3:"ᾛ";s:8:"ᾛ";s:3:"ᾜ";s:8:"ᾜ";s:3:"ᾝ";s:8:"ᾝ";s:3:"ᾞ";s:8:"ᾞ";s:3:"ᾟ";s:8:"ᾟ";s:3:"ᾠ";s:6:"ᾠ";s:3:"ᾡ";s:6:"ᾡ";s:3:"ᾢ";s:8:"ᾢ";s:3:"ᾣ";s:8:"ᾣ";s:3:"ᾤ";s:8:"ᾤ";s:3:"ᾥ";s:8:"ᾥ";s:3:"ᾦ";s:8:"ᾦ";s:3:"ᾧ";s:8:"ᾧ";s:3:"ᾨ";s:6:"ᾨ";s:3:"ᾩ";s:6:"ᾩ";s:3:"ᾪ";s:8:"ᾪ";s:3:"ᾫ";s:8:"ᾫ";s:3:"ᾬ";s:8:"ᾬ";s:3:"ᾭ";s:8:"ᾭ";s:3:"ᾮ";s:8:"ᾮ";s:3:"ᾯ";s:8:"ᾯ";s:3:"ᾰ";s:4:"ᾰ";s:3:"ᾱ";s:4:"ᾱ";s:3:"ᾲ";s:6:"ᾲ";s:3:"ᾳ";s:4:"ᾳ";s:3:"ᾴ";s:6:"ᾴ";s:3:"ᾶ";s:4:"ᾶ";s:3:"ᾷ";s:6:"ᾷ";s:3:"Ᾰ";s:4:"Ᾰ";s:3:"Ᾱ";s:4:"Ᾱ";s:3:"Ὰ";s:4:"Ὰ";s:3:"Ά";s:4:"Ά";s:3:"ᾼ";s:4:"ᾼ";s:3:"ι";s:2:"ι";s:3:"῁";s:4:"῁";s:3:"ῂ";s:6:"ῂ";s:3:"ῃ";s:4:"ῃ";s:3:"ῄ";s:6:"ῄ";s:3:"ῆ";s:4:"ῆ";s:3:"ῇ";s:6:"ῇ";s:3:"Ὲ";s:4:"Ὲ";s:3:"Έ";s:4:"Έ";s:3:"Ὴ";s:4:"Ὴ";s:3:"Ή";s:4:"Ή";s:3:"ῌ";s:4:"ῌ";s:3:"῍";s:5:"῍";s:3:"῎";s:5:"῎";s:3:"῏";s:5:"῏";s:3:"ῐ";s:4:"ῐ";s:3:"ῑ";s:4:"ῑ";s:3:"ῒ";s:6:"ῒ";s:3:"ΐ";s:6:"ΐ";s:3:"ῖ";s:4:"ῖ";s:3:"ῗ";s:6:"ῗ";s:3:"Ῐ";s:4:"Ῐ";s:3:"Ῑ";s:4:"Ῑ";s:3:"Ὶ";s:4:"Ὶ";s:3:"Ί";s:4:"Ί";s:3:"῝";s:5:"῝";s:3:"῞";s:5:"῞";s:3:"῟";s:5:"῟";s:3:"ῠ";s:4:"ῠ";s:3:"ῡ";s:4:"ῡ";s:3:"ῢ";s:6:"ῢ";s:3:"ΰ";s:6:"ΰ";s:3:"ῤ";s:4:"ῤ";s:3:"ῥ";s:4:"ῥ";s:3:"ῦ";s:4:"ῦ";s:3:"ῧ";s:6:"ῧ";s:3:"Ῠ";s:4:"Ῠ";s:3:"Ῡ";s:4:"Ῡ";s:3:"Ὺ";s:4:"Ὺ";s:3:"Ύ";s:4:"Ύ";s:3:"Ῥ";s:4:"Ῥ";s:3:"῭";s:4:"῭";s:3:"΅";s:4:"΅";s:3:"`";s:1:"`";s:3:"ῲ";s:6:"ῲ";s:3:"ῳ";s:4:"ῳ";s:3:"ῴ";s:6:"ῴ";s:3:"ῶ";s:4:"ῶ";s:3:"ῷ";s:6:"ῷ";s:3:"Ὸ";s:4:"Ὸ";s:3:"Ό";s:4:"Ό";s:3:"Ὼ";s:4:"Ὼ";s:3:"Ώ";s:4:"Ώ";s:3:"ῼ";s:4:"ῼ";s:3:"´";s:2:"´";s:3:" ";s:3:" ";s:3:" ";s:3:" ";s:3:"Ω";s:2:"Ω";s:3:"K";s:1:"K";s:3:"Å";s:3:"Å";s:3:"↚";s:5:"↚";s:3:"↛";s:5:"↛";s:3:"↮";s:5:"↮";s:3:"⇍";s:5:"⇍";s:3:"⇎";s:5:"⇎";s:3:"⇏";s:5:"⇏";s:3:"∄";s:5:"∄";s:3:"∉";s:5:"∉";s:3:"∌";s:5:"∌";s:3:"∤";s:5:"∤";s:3:"∦";s:5:"∦";s:3:"≁";s:5:"≁";s:3:"≄";s:5:"≄";s:3:"≇";s:5:"≇";s:3:"≉";s:5:"≉";s:3:"≠";s:3:"≠";s:3:"≢";s:5:"≢";s:3:"≭";s:5:"≭";s:3:"≮";s:3:"≮";s:3:"≯";s:3:"≯";s:3:"≰";s:5:"≰";s:3:"≱";s:5:"≱";s:3:"≴";s:5:"≴";s:3:"≵";s:5:"≵";s:3:"≸";s:5:"≸";s:3:"≹";s:5:"≹";s:3:"⊀";s:5:"⊀";s:3:"⊁";s:5:"⊁";s:3:"⊄";s:5:"⊄";s:3:"⊅";s:5:"⊅";s:3:"⊈";s:5:"⊈";s:3:"⊉";s:5:"⊉";s:3:"⊬";s:5:"⊬";s:3:"⊭";s:5:"⊭";s:3:"⊮";s:5:"⊮";s:3:"⊯";s:5:"⊯";s:3:"⋠";s:5:"⋠";s:3:"⋡";s:5:"⋡";s:3:"⋢";s:5:"⋢";s:3:"⋣";s:5:"⋣";s:3:"⋪";s:5:"⋪";s:3:"⋫";s:5:"⋫";s:3:"⋬";s:5:"⋬";s:3:"⋭";s:5:"⋭";s:3:"〈";s:3:"〈";s:3:"〉";s:3:"〉";s:3:"⫝̸";s:5:"⫝̸";s:3:"が";s:6:"が";s:3:"ぎ";s:6:"ぎ";s:3:"ぐ";s:6:"ぐ";s:3:"げ";s:6:"げ";s:3:"ご";s:6:"ご";s:3:"ざ";s:6:"ざ";s:3:"じ";s:6:"じ";s:3:"ず";s:6:"ず";s:3:"ぜ";s:6:"ぜ";s:3:"ぞ";s:6:"ぞ";s:3:"だ";s:6:"だ";s:3:"ぢ";s:6:"ぢ";s:3:"づ";s:6:"づ";s:3:"で";s:6:"で";s:3:"ど";s:6:"ど";s:3:"ば";s:6:"ば";s:3:"ぱ";s:6:"ぱ";s:3:"び";s:6:"び";s:3:"ぴ";s:6:"ぴ";s:3:"ぶ";s:6:"ぶ";s:3:"ぷ";s:6:"ぷ";s:3:"べ";s:6:"べ";s:3:"ぺ";s:6:"ぺ";s:3:"ぼ";s:6:"ぼ";s:3:"ぽ";s:6:"ぽ";s:3:"ゔ";s:6:"ゔ";s:3:"ゞ";s:6:"ゞ";s:3:"ガ";s:6:"ガ";s:3:"ギ";s:6:"ギ";s:3:"グ";s:6:"グ";s:3:"ゲ";s:6:"ゲ";s:3:"ゴ";s:6:"ゴ";s:3:"ザ";s:6:"ザ";s:3:"ジ";s:6:"ジ";s:3:"ズ";s:6:"ズ";s:3:"ゼ";s:6:"ゼ";s:3:"ゾ";s:6:"ゾ";s:3:"ダ";s:6:"ダ";s:3:"ヂ";s:6:"ヂ";s:3:"ヅ";s:6:"ヅ";s:3:"デ";s:6:"デ";s:3:"ド";s:6:"ド";s:3:"バ";s:6:"バ";s:3:"パ";s:6:"パ";s:3:"ビ";s:6:"ビ";s:3:"ピ";s:6:"ピ";s:3:"ブ";s:6:"ブ";s:3:"プ";s:6:"プ";s:3:"ベ";s:6:"ベ";s:3:"ペ";s:6:"ペ";s:3:"ボ";s:6:"ボ";s:3:"ポ";s:6:"ポ";s:3:"ヴ";s:6:"ヴ";s:3:"ヷ";s:6:"ヷ";s:3:"ヸ";s:6:"ヸ";s:3:"ヹ";s:6:"ヹ";s:3:"ヺ";s:6:"ヺ";s:3:"ヾ";s:6:"ヾ";s:3:"豈";s:3:"豈";s:3:"更";s:3:"更";s:3:"車";s:3:"車";s:3:"賈";s:3:"賈";s:3:"滑";s:3:"滑";s:3:"串";s:3:"串";s:3:"句";s:3:"句";s:3:"龜";s:3:"龜";s:3:"龜";s:3:"龜";s:3:"契";s:3:"契";s:3:"金";s:3:"金";s:3:"喇";s:3:"喇";s:3:"奈";s:3:"奈";s:3:"懶";s:3:"懶";s:3:"癩";s:3:"癩";s:3:"羅";s:3:"羅";s:3:"蘿";s:3:"蘿";s:3:"螺";s:3:"螺";s:3:"裸";s:3:"裸";s:3:"邏";s:3:"邏";s:3:"樂";s:3:"樂";s:3:"洛";s:3:"洛";s:3:"烙";s:3:"烙";s:3:"珞";s:3:"珞";s:3:"落";s:3:"落";s:3:"酪";s:3:"酪";s:3:"駱";s:3:"駱";s:3:"亂";s:3:"亂";s:3:"卵";s:3:"卵";s:3:"欄";s:3:"欄";s:3:"爛";s:3:"爛";s:3:"蘭";s:3:"蘭";s:3:"鸞";s:3:"鸞";s:3:"嵐";s:3:"嵐";s:3:"濫";s:3:"濫";s:3:"藍";s:3:"藍";s:3:"襤";s:3:"襤";s:3:"拉";s:3:"拉";s:3:"臘";s:3:"臘";s:3:"蠟";s:3:"蠟";s:3:"廊";s:3:"廊";s:3:"朗";s:3:"朗";s:3:"浪";s:3:"浪";s:3:"狼";s:3:"狼";s:3:"郎";s:3:"郎";s:3:"來";s:3:"來";s:3:"冷";s:3:"冷";s:3:"勞";s:3:"勞";s:3:"擄";s:3:"擄";s:3:"櫓";s:3:"櫓";s:3:"爐";s:3:"爐";s:3:"盧";s:3:"盧";s:3:"老";s:3:"老";s:3:"蘆";s:3:"蘆";s:3:"虜";s:3:"虜";s:3:"路";s:3:"路";s:3:"露";s:3:"露";s:3:"魯";s:3:"魯";s:3:"鷺";s:3:"鷺";s:3:"碌";s:3:"碌";s:3:"祿";s:3:"祿";s:3:"綠";s:3:"綠";s:3:"菉";s:3:"菉";s:3:"錄";s:3:"錄";s:3:"鹿";s:3:"鹿";s:3:"論";s:3:"論";s:3:"壟";s:3:"壟";s:3:"弄";s:3:"弄";s:3:"籠";s:3:"籠";s:3:"聾";s:3:"聾";s:3:"牢";s:3:"牢";s:3:"磊";s:3:"磊";s:3:"賂";s:3:"賂";s:3:"雷";s:3:"雷";s:3:"壘";s:3:"壘";s:3:"屢";s:3:"屢";s:3:"樓";s:3:"樓";s:3:"淚";s:3:"淚";s:3:"漏";s:3:"漏";s:3:"累";s:3:"累";s:3:"縷";s:3:"縷";s:3:"陋";s:3:"陋";s:3:"勒";s:3:"勒";s:3:"肋";s:3:"肋";s:3:"凜";s:3:"凜";s:3:"凌";s:3:"凌";s:3:"稜";s:3:"稜";s:3:"綾";s:3:"綾";s:3:"菱";s:3:"菱";s:3:"陵";s:3:"陵";s:3:"讀";s:3:"讀";s:3:"拏";s:3:"拏";s:3:"樂";s:3:"樂";s:3:"諾";s:3:"諾";s:3:"丹";s:3:"丹";s:3:"寧";s:3:"寧";s:3:"怒";s:3:"怒";s:3:"率";s:3:"率";s:3:"異";s:3:"異";s:3:"北";s:3:"北";s:3:"磻";s:3:"磻";s:3:"便";s:3:"便";s:3:"復";s:3:"復";s:3:"不";s:3:"不";s:3:"泌";s:3:"泌";s:3:"數";s:3:"數";s:3:"索";s:3:"索";s:3:"參";s:3:"參";s:3:"塞";s:3:"塞";s:3:"省";s:3:"省";s:3:"葉";s:3:"葉";s:3:"說";s:3:"說";s:3:"殺";s:3:"殺";s:3:"辰";s:3:"辰";s:3:"沈";s:3:"沈";s:3:"拾";s:3:"拾";s:3:"若";s:3:"若";s:3:"掠";s:3:"掠";s:3:"略";s:3:"略";s:3:"亮";s:3:"亮";s:3:"兩";s:3:"兩";s:3:"凉";s:3:"凉";s:3:"梁";s:3:"梁";s:3:"糧";s:3:"糧";s:3:"良";s:3:"良";s:3:"諒";s:3:"諒";s:3:"量";s:3:"量";s:3:"勵";s:3:"勵";s:3:"呂";s:3:"呂";s:3:"女";s:3:"女";s:3:"廬";s:3:"廬";s:3:"旅";s:3:"旅";s:3:"濾";s:3:"濾";s:3:"礪";s:3:"礪";s:3:"閭";s:3:"閭";s:3:"驪";s:3:"驪";s:3:"麗";s:3:"麗";s:3:"黎";s:3:"黎";s:3:"力";s:3:"力";s:3:"曆";s:3:"曆";s:3:"歷";s:3:"歷";s:3:"轢";s:3:"轢";s:3:"年";s:3:"年";s:3:"憐";s:3:"憐";s:3:"戀";s:3:"戀";s:3:"撚";s:3:"撚";s:3:"漣";s:3:"漣";s:3:"煉";s:3:"煉";s:3:"璉";s:3:"璉";s:3:"秊";s:3:"秊";s:3:"練";s:3:"練";s:3:"聯";s:3:"聯";s:3:"輦";s:3:"輦";s:3:"蓮";s:3:"蓮";s:3:"連";s:3:"連";s:3:"鍊";s:3:"鍊";s:3:"列";s:3:"列";s:3:"劣";s:3:"劣";s:3:"咽";s:3:"咽";s:3:"烈";s:3:"烈";s:3:"裂";s:3:"裂";s:3:"說";s:3:"說";s:3:"廉";s:3:"廉";s:3:"念";s:3:"念";s:3:"捻";s:3:"捻";s:3:"殮";s:3:"殮";s:3:"簾";s:3:"簾";s:3:"獵";s:3:"獵";s:3:"令";s:3:"令";s:3:"囹";s:3:"囹";s:3:"寧";s:3:"寧";s:3:"嶺";s:3:"嶺";s:3:"怜";s:3:"怜";s:3:"玲";s:3:"玲";s:3:"瑩";s:3:"瑩";s:3:"羚";s:3:"羚";s:3:"聆";s:3:"聆";s:3:"鈴";s:3:"鈴";s:3:"零";s:3:"零";s:3:"靈";s:3:"靈";s:3:"領";s:3:"領";s:3:"例";s:3:"例";s:3:"禮";s:3:"禮";s:3:"醴";s:3:"醴";s:3:"隸";s:3:"隸";s:3:"惡";s:3:"惡";s:3:"了";s:3:"了";s:3:"僚";s:3:"僚";s:3:"寮";s:3:"寮";s:3:"尿";s:3:"尿";s:3:"料";s:3:"料";s:3:"樂";s:3:"樂";s:3:"燎";s:3:"燎";s:3:"療";s:3:"療";s:3:"蓼";s:3:"蓼";s:3:"遼";s:3:"遼";s:3:"龍";s:3:"龍";s:3:"暈";s:3:"暈";s:3:"阮";s:3:"阮";s:3:"劉";s:3:"劉";s:3:"杻";s:3:"杻";s:3:"柳";s:3:"柳";s:3:"流";s:3:"流";s:3:"溜";s:3:"溜";s:3:"琉";s:3:"琉";s:3:"留";s:3:"留";s:3:"硫";s:3:"硫";s:3:"紐";s:3:"紐";s:3:"類";s:3:"類";s:3:"六";s:3:"六";s:3:"戮";s:3:"戮";s:3:"陸";s:3:"陸";s:3:"倫";s:3:"倫";s:3:"崙";s:3:"崙";s:3:"淪";s:3:"淪";s:3:"輪";s:3:"輪";s:3:"律";s:3:"律";s:3:"慄";s:3:"慄";s:3:"栗";s:3:"栗";s:3:"率";s:3:"率";s:3:"隆";s:3:"隆";s:3:"利";s:3:"利";s:3:"吏";s:3:"吏";s:3:"履";s:3:"履";s:3:"易";s:3:"易";s:3:"李";s:3:"李";s:3:"梨";s:3:"梨";s:3:"泥";s:3:"泥";s:3:"理";s:3:"理";s:3:"痢";s:3:"痢";s:3:"罹";s:3:"罹";s:3:"裏";s:3:"裏";s:3:"裡";s:3:"裡";s:3:"里";s:3:"里";s:3:"離";s:3:"離";s:3:"匿";s:3:"匿";s:3:"溺";s:3:"溺";s:3:"吝";s:3:"吝";s:3:"燐";s:3:"燐";s:3:"璘";s:3:"璘";s:3:"藺";s:3:"藺";s:3:"隣";s:3:"隣";s:3:"鱗";s:3:"鱗";s:3:"麟";s:3:"麟";s:3:"林";s:3:"林";s:3:"淋";s:3:"淋";s:3:"臨";s:3:"臨";s:3:"立";s:3:"立";s:3:"笠";s:3:"笠";s:3:"粒";s:3:"粒";s:3:"狀";s:3:"狀";s:3:"炙";s:3:"炙";s:3:"識";s:3:"識";s:3:"什";s:3:"什";s:3:"茶";s:3:"茶";s:3:"刺";s:3:"刺";s:3:"切";s:3:"切";s:3:"度";s:3:"度";s:3:"拓";s:3:"拓";s:3:"糖";s:3:"糖";s:3:"宅";s:3:"宅";s:3:"洞";s:3:"洞";s:3:"暴";s:3:"暴";s:3:"輻";s:3:"輻";s:3:"行";s:3:"行";s:3:"降";s:3:"降";s:3:"見";s:3:"見";s:3:"廓";s:3:"廓";s:3:"兀";s:3:"兀";s:3:"嗀";s:3:"嗀";s:3:"塚";s:3:"塚";s:3:"晴";s:3:"晴";s:3:"凞";s:3:"凞";s:3:"猪";s:3:"猪";s:3:"益";s:3:"益";s:3:"礼";s:3:"礼";s:3:"神";s:3:"神";s:3:"祥";s:3:"祥";s:3:"福";s:3:"福";s:3:"靖";s:3:"靖";s:3:"精";s:3:"精";s:3:"羽";s:3:"羽";s:3:"蘒";s:3:"蘒";s:3:"諸";s:3:"諸";s:3:"逸";s:3:"逸";s:3:"都";s:3:"都";s:3:"飯";s:3:"飯";s:3:"飼";s:3:"飼";s:3:"館";s:3:"館";s:3:"鶴";s:3:"鶴";s:3:"侮";s:3:"侮";s:3:"僧";s:3:"僧";s:3:"免";s:3:"免";s:3:"勉";s:3:"勉";s:3:"勤";s:3:"勤";s:3:"卑";s:3:"卑";s:3:"喝";s:3:"喝";s:3:"嘆";s:3:"嘆";s:3:"器";s:3:"器";s:3:"塀";s:3:"塀";s:3:"墨";s:3:"墨";s:3:"層";s:3:"層";s:3:"屮";s:3:"屮";s:3:"悔";s:3:"悔";s:3:"慨";s:3:"慨";s:3:"憎";s:3:"憎";s:3:"懲";s:3:"懲";s:3:"敏";s:3:"敏";s:3:"既";s:3:"既";s:3:"暑";s:3:"暑";s:3:"梅";s:3:"梅";s:3:"海";s:3:"海";s:3:"渚";s:3:"渚";s:3:"漢";s:3:"漢";s:3:"煮";s:3:"煮";s:3:"爫";s:3:"爫";s:3:"琢";s:3:"琢";s:3:"碑";s:3:"碑";s:3:"社";s:3:"社";s:3:"祉";s:3:"祉";s:3:"祈";s:3:"祈";s:3:"祐";s:3:"祐";s:3:"祖";s:3:"祖";s:3:"祝";s:3:"祝";s:3:"禍";s:3:"禍";s:3:"禎";s:3:"禎";s:3:"穀";s:3:"穀";s:3:"突";s:3:"突";s:3:"節";s:3:"節";s:3:"練";s:3:"練";s:3:"縉";s:3:"縉";s:3:"繁";s:3:"繁";s:3:"署";s:3:"署";s:3:"者";s:3:"者";s:3:"臭";s:3:"臭";s:3:"艹";s:3:"艹";s:3:"艹";s:3:"艹";s:3:"著";s:3:"著";s:3:"褐";s:3:"褐";s:3:"視";s:3:"視";s:3:"謁";s:3:"謁";s:3:"謹";s:3:"謹";s:3:"賓";s:3:"賓";s:3:"贈";s:3:"贈";s:3:"辶";s:3:"辶";s:3:"逸";s:3:"逸";s:3:"難";s:3:"難";s:3:"響";s:3:"響";s:3:"頻";s:3:"頻";s:3:"恵";s:3:"恵";s:3:"𤋮";s:4:"𤋮";s:3:"舘";s:3:"舘";s:3:"並";s:3:"並";s:3:"况";s:3:"况";s:3:"全";s:3:"全";s:3:"侀";s:3:"侀";s:3:"充";s:3:"充";s:3:"冀";s:3:"冀";s:3:"勇";s:3:"勇";s:3:"勺";s:3:"勺";s:3:"喝";s:3:"喝";s:3:"啕";s:3:"啕";s:3:"喙";s:3:"喙";s:3:"嗢";s:3:"嗢";s:3:"塚";s:3:"塚";s:3:"墳";s:3:"墳";s:3:"奄";s:3:"奄";s:3:"奔";s:3:"奔";s:3:"婢";s:3:"婢";s:3:"嬨";s:3:"嬨";s:3:"廒";s:3:"廒";s:3:"廙";s:3:"廙";s:3:"彩";s:3:"彩";s:3:"徭";s:3:"徭";s:3:"惘";s:3:"惘";s:3:"慎";s:3:"慎";s:3:"愈";s:3:"愈";s:3:"憎";s:3:"憎";s:3:"慠";s:3:"慠";s:3:"懲";s:3:"懲";s:3:"戴";s:3:"戴";s:3:"揄";s:3:"揄";s:3:"搜";s:3:"搜";s:3:"摒";s:3:"摒";s:3:"敖";s:3:"敖";s:3:"晴";s:3:"晴";s:3:"朗";s:3:"朗";s:3:"望";s:3:"望";s:3:"杖";s:3:"杖";s:3:"歹";s:3:"歹";s:3:"殺";s:3:"殺";s:3:"流";s:3:"流";s:3:"滛";s:3:"滛";s:3:"滋";s:3:"滋";s:3:"漢";s:3:"漢";s:3:"瀞";s:3:"瀞";s:3:"煮";s:3:"煮";s:3:"瞧";s:3:"瞧";s:3:"爵";s:3:"爵";s:3:"犯";s:3:"犯";s:3:"猪";s:3:"猪";s:3:"瑱";s:3:"瑱";s:3:"甆";s:3:"甆";s:3:"画";s:3:"画";s:3:"瘝";s:3:"瘝";s:3:"瘟";s:3:"瘟";s:3:"益";s:3:"益";s:3:"盛";s:3:"盛";s:3:"直";s:3:"直";s:3:"睊";s:3:"睊";s:3:"着";s:3:"着";s:3:"磌";s:3:"磌";s:3:"窱";s:3:"窱";s:3:"節";s:3:"節";s:3:"类";s:3:"类";s:3:"絛";s:3:"絛";s:3:"練";s:3:"練";s:3:"缾";s:3:"缾";s:3:"者";s:3:"者";s:3:"荒";s:3:"荒";s:3:"華";s:3:"華";s:3:"蝹";s:3:"蝹";s:3:"襁";s:3:"襁";s:3:"覆";s:3:"覆";s:3:"視";s:3:"視";s:3:"調";s:3:"調";s:3:"諸";s:3:"諸";s:3:"請";s:3:"請";s:3:"謁";s:3:"謁";s:3:"諾";s:3:"諾";s:3:"諭";s:3:"諭";s:3:"謹";s:3:"謹";s:3:"變";s:3:"變";s:3:"贈";s:3:"贈";s:3:"輸";s:3:"輸";s:3:"遲";s:3:"遲";s:3:"醙";s:3:"醙";s:3:"鉶";s:3:"鉶";s:3:"陼";s:3:"陼";s:3:"難";s:3:"難";s:3:"靖";s:3:"靖";s:3:"韛";s:3:"韛";s:3:"響";s:3:"響";s:3:"頋";s:3:"頋";s:3:"頻";s:3:"頻";s:3:"鬒";s:3:"鬒";s:3:"龜";s:3:"龜";s:3:"𢡊";s:4:"𢡊";s:3:"𢡄";s:4:"𢡄";s:3:"𣏕";s:4:"𣏕";s:3:"㮝";s:3:"㮝";s:3:"䀘";s:3:"䀘";s:3:"䀹";s:3:"䀹";s:3:"𥉉";s:4:"𥉉";s:3:"𥳐";s:4:"𥳐";s:3:"𧻓";s:4:"𧻓";s:3:"齃";s:3:"齃";s:3:"龎";s:3:"龎";s:3:"יִ";s:4:"יִ";s:3:"ײַ";s:4:"ײַ";s:3:"שׁ";s:4:"שׁ";s:3:"שׂ";s:4:"שׂ";s:3:"שּׁ";s:6:"שּׁ";s:3:"שּׂ";s:6:"שּׂ";s:3:"אַ";s:4:"אַ";s:3:"אָ";s:4:"אָ";s:3:"אּ";s:4:"אּ";s:3:"בּ";s:4:"בּ";s:3:"גּ";s:4:"גּ";s:3:"דּ";s:4:"דּ";s:3:"הּ";s:4:"הּ";s:3:"וּ";s:4:"וּ";s:3:"זּ";s:4:"זּ";s:3:"טּ";s:4:"טּ";s:3:"יּ";s:4:"יּ";s:3:"ךּ";s:4:"ךּ";s:3:"כּ";s:4:"כּ";s:3:"לּ";s:4:"לּ";s:3:"מּ";s:4:"מּ";s:3:"נּ";s:4:"נּ";s:3:"סּ";s:4:"סּ";s:3:"ףּ";s:4:"ףּ";s:3:"פּ";s:4:"פּ";s:3:"צּ";s:4:"צּ";s:3:"קּ";s:4:"קּ";s:3:"רּ";s:4:"רּ";s:3:"שּ";s:4:"שּ";s:3:"תּ";s:4:"תּ";s:3:"וֹ";s:4:"וֹ";s:3:"בֿ";s:4:"בֿ";s:3:"כֿ";s:4:"כֿ";s:3:"פֿ";s:4:"פֿ";s:4:"𑂚";s:8:"𑂚";s:4:"𑂜";s:8:"𑂜";s:4:"𑂫";s:8:"𑂫";s:4:"𝅗𝅥";s:8:"𝅗𝅥";s:4:"𝅘𝅥";s:8:"𝅘𝅥";s:4:"𝅘𝅥𝅮";s:12:"𝅘𝅥𝅮";s:4:"𝅘𝅥𝅯";s:12:"𝅘𝅥𝅯";s:4:"𝅘𝅥𝅰";s:12:"𝅘𝅥𝅰";s:4:"𝅘𝅥𝅱";s:12:"𝅘𝅥𝅱";s:4:"𝅘𝅥𝅲";s:12:"𝅘𝅥𝅲";s:4:"𝆹𝅥";s:8:"𝆹𝅥";s:4:"𝆺𝅥";s:8:"𝆺𝅥";s:4:"𝆹𝅥𝅮";s:12:"𝆹𝅥𝅮";s:4:"𝆺𝅥𝅮";s:12:"𝆺𝅥𝅮";s:4:"𝆹𝅥𝅯";s:12:"𝆹𝅥𝅯";s:4:"𝆺𝅥𝅯";s:12:"𝆺𝅥𝅯";s:4:"丽";s:3:"丽";s:4:"丸";s:3:"丸";s:4:"乁";s:3:"乁";s:4:"𠄢";s:4:"𠄢";s:4:"你";s:3:"你";s:4:"侮";s:3:"侮";s:4:"侻";s:3:"侻";s:4:"倂";s:3:"倂";s:4:"偺";s:3:"偺";s:4:"備";s:3:"備";s:4:"僧";s:3:"僧";s:4:"像";s:3:"像";s:4:"㒞";s:3:"㒞";s:4:"𠘺";s:4:"𠘺";s:4:"免";s:3:"免";s:4:"兔";s:3:"兔";s:4:"兤";s:3:"兤";s:4:"具";s:3:"具";s:4:"𠔜";s:4:"𠔜";s:4:"㒹";s:3:"㒹";s:4:"內";s:3:"內";s:4:"再";s:3:"再";s:4:"𠕋";s:4:"𠕋";s:4:"冗";s:3:"冗";s:4:"冤";s:3:"冤";s:4:"仌";s:3:"仌";s:4:"冬";s:3:"冬";s:4:"况";s:3:"况";s:4:"𩇟";s:4:"𩇟";s:4:"凵";s:3:"凵";s:4:"刃";s:3:"刃";s:4:"㓟";s:3:"㓟";s:4:"刻";s:3:"刻";s:4:"剆";s:3:"剆";s:4:"割";s:3:"割";s:4:"剷";s:3:"剷";s:4:"㔕";s:3:"㔕";s:4:"勇";s:3:"勇";s:4:"勉";s:3:"勉";s:4:"勤";s:3:"勤";s:4:"勺";s:3:"勺";s:4:"包";s:3:"包";s:4:"匆";s:3:"匆";s:4:"北";s:3:"北";s:4:"卉";s:3:"卉";s:4:"卑";s:3:"卑";s:4:"博";s:3:"博";s:4:"即";s:3:"即";s:4:"卽";s:3:"卽";s:4:"卿";s:3:"卿";s:4:"卿";s:3:"卿";s:4:"卿";s:3:"卿";s:4:"𠨬";s:4:"𠨬";s:4:"灰";s:3:"灰";s:4:"及";s:3:"及";s:4:"叟";s:3:"叟";s:4:"𠭣";s:4:"𠭣";s:4:"叫";s:3:"叫";s:4:"叱";s:3:"叱";s:4:"吆";s:3:"吆";s:4:"咞";s:3:"咞";s:4:"吸";s:3:"吸";s:4:"呈";s:3:"呈";s:4:"周";s:3:"周";s:4:"咢";s:3:"咢";s:4:"哶";s:3:"哶";s:4:"唐";s:3:"唐";s:4:"啓";s:3:"啓";s:4:"啣";s:3:"啣";s:4:"善";s:3:"善";s:4:"善";s:3:"善";s:4:"喙";s:3:"喙";s:4:"喫";s:3:"喫";s:4:"喳";s:3:"喳";s:4:"嗂";s:3:"嗂";s:4:"圖";s:3:"圖";s:4:"嘆";s:3:"嘆";s:4:"圗";s:3:"圗";s:4:"噑";s:3:"噑";s:4:"噴";s:3:"噴";s:4:"切";s:3:"切";s:4:"壮";s:3:"壮";s:4:"城";s:3:"城";s:4:"埴";s:3:"埴";s:4:"堍";s:3:"堍";s:4:"型";s:3:"型";s:4:"堲";s:3:"堲";s:4:"報";s:3:"報";s:4:"墬";s:3:"墬";s:4:"𡓤";s:4:"𡓤";s:4:"売";s:3:"売";s:4:"壷";s:3:"壷";s:4:"夆";s:3:"夆";s:4:"多";s:3:"多";s:4:"夢";s:3:"夢";s:4:"奢";s:3:"奢";s:4:"𡚨";s:4:"𡚨";s:4:"𡛪";s:4:"𡛪";s:4:"姬";s:3:"姬";s:4:"娛";s:3:"娛";s:4:"娧";s:3:"娧";s:4:"姘";s:3:"姘";s:4:"婦";s:3:"婦";s:4:"㛮";s:3:"㛮";s:4:"㛼";s:3:"㛼";s:4:"嬈";s:3:"嬈";s:4:"嬾";s:3:"嬾";s:4:"嬾";s:3:"嬾";s:4:"𡧈";s:4:"𡧈";s:4:"寃";s:3:"寃";s:4:"寘";s:3:"寘";s:4:"寧";s:3:"寧";s:4:"寳";s:3:"寳";s:4:"𡬘";s:4:"𡬘";s:4:"寿";s:3:"寿";s:4:"将";s:3:"将";s:4:"当";s:3:"当";s:4:"尢";s:3:"尢";s:4:"㞁";s:3:"㞁";s:4:"屠";s:3:"屠";s:4:"屮";s:3:"屮";s:4:"峀";s:3:"峀";s:4:"岍";s:3:"岍";s:4:"𡷤";s:4:"𡷤";s:4:"嵃";s:3:"嵃";s:4:"𡷦";s:4:"𡷦";s:4:"嵮";s:3:"嵮";s:4:"嵫";s:3:"嵫";s:4:"嵼";s:3:"嵼";s:4:"巡";s:3:"巡";s:4:"巢";s:3:"巢";s:4:"㠯";s:3:"㠯";s:4:"巽";s:3:"巽";s:4:"帨";s:3:"帨";s:4:"帽";s:3:"帽";s:4:"幩";s:3:"幩";s:4:"㡢";s:3:"㡢";s:4:"𢆃";s:4:"𢆃";s:4:"㡼";s:3:"㡼";s:4:"庰";s:3:"庰";s:4:"庳";s:3:"庳";s:4:"庶";s:3:"庶";s:4:"廊";s:3:"廊";s:4:"𪎒";s:4:"𪎒";s:4:"廾";s:3:"廾";s:4:"𢌱";s:4:"𢌱";s:4:"𢌱";s:4:"𢌱";s:4:"舁";s:3:"舁";s:4:"弢";s:3:"弢";s:4:"弢";s:3:"弢";s:4:"㣇";s:3:"㣇";s:4:"𣊸";s:4:"𣊸";s:4:"𦇚";s:4:"𦇚";s:4:"形";s:3:"形";s:4:"彫";s:3:"彫";s:4:"㣣";s:3:"㣣";s:4:"徚";s:3:"徚";s:4:"忍";s:3:"忍";s:4:"志";s:3:"志";s:4:"忹";s:3:"忹";s:4:"悁";s:3:"悁";s:4:"㤺";s:3:"㤺";s:4:"㤜";s:3:"㤜";s:4:"悔";s:3:"悔";s:4:"𢛔";s:4:"𢛔";s:4:"惇";s:3:"惇";s:4:"慈";s:3:"慈";s:4:"慌";s:3:"慌";s:4:"慎";s:3:"慎";s:4:"慌";s:3:"慌";s:4:"慺";s:3:"慺";s:4:"憎";s:3:"憎";s:4:"憲";s:3:"憲";s:4:"憤";s:3:"憤";s:4:"憯";s:3:"憯";s:4:"懞";s:3:"懞";s:4:"懲";s:3:"懲";s:4:"懶";s:3:"懶";s:4:"成";s:3:"成";s:4:"戛";s:3:"戛";s:4:"扝";s:3:"扝";s:4:"抱";s:3:"抱";s:4:"拔";s:3:"拔";s:4:"捐";s:3:"捐";s:4:"𢬌";s:4:"𢬌";s:4:"挽";s:3:"挽";s:4:"拼";s:3:"拼";s:4:"捨";s:3:"捨";s:4:"掃";s:3:"掃";s:4:"揤";s:3:"揤";s:4:"𢯱";s:4:"𢯱";s:4:"搢";s:3:"搢";s:4:"揅";s:3:"揅";s:4:"掩";s:3:"掩";s:4:"㨮";s:3:"㨮";s:4:"摩";s:3:"摩";s:4:"摾";s:3:"摾";s:4:"撝";s:3:"撝";s:4:"摷";s:3:"摷";s:4:"㩬";s:3:"㩬";s:4:"敏";s:3:"敏";s:4:"敬";s:3:"敬";s:4:"𣀊";s:4:"𣀊";s:4:"旣";s:3:"旣";s:4:"書";s:3:"書";s:4:"晉";s:3:"晉";s:4:"㬙";s:3:"㬙";s:4:"暑";s:3:"暑";s:4:"㬈";s:3:"㬈";s:4:"㫤";s:3:"㫤";s:4:"冒";s:3:"冒";s:4:"冕";s:3:"冕";s:4:"最";s:3:"最";s:4:"暜";s:3:"暜";s:4:"肭";s:3:"肭";s:4:"䏙";s:3:"䏙";s:4:"朗";s:3:"朗";s:4:"望";s:3:"望";s:4:"朡";s:3:"朡";s:4:"杞";s:3:"杞";s:4:"杓";s:3:"杓";s:4:"𣏃";s:4:"𣏃";s:4:"㭉";s:3:"㭉";s:4:"柺";s:3:"柺";s:4:"枅";s:3:"枅";s:4:"桒";s:3:"桒";s:4:"梅";s:3:"梅";s:4:"𣑭";s:4:"𣑭";s:4:"梎";s:3:"梎";s:4:"栟";s:3:"栟";s:4:"椔";s:3:"椔";s:4:"㮝";s:3:"㮝";s:4:"楂";s:3:"楂";s:4:"榣";s:3:"榣";s:4:"槪";s:3:"槪";s:4:"檨";s:3:"檨";s:4:"𣚣";s:4:"𣚣";s:4:"櫛";s:3:"櫛";s:4:"㰘";s:3:"㰘";s:4:"次";s:3:"次";s:4:"𣢧";s:4:"𣢧";s:4:"歔";s:3:"歔";s:4:"㱎";s:3:"㱎";s:4:"歲";s:3:"歲";s:4:"殟";s:3:"殟";s:4:"殺";s:3:"殺";s:4:"殻";s:3:"殻";s:4:"𣪍";s:4:"𣪍";s:4:"𡴋";s:4:"𡴋";s:4:"𣫺";s:4:"𣫺";s:4:"汎";s:3:"汎";s:4:"𣲼";s:4:"𣲼";s:4:"沿";s:3:"沿";s:4:"泍";s:3:"泍";s:4:"汧";s:3:"汧";s:4:"洖";s:3:"洖";s:4:"派";s:3:"派";s:4:"海";s:3:"海";s:4:"流";s:3:"流";s:4:"浩";s:3:"浩";s:4:"浸";s:3:"浸";s:4:"涅";s:3:"涅";s:4:"𣴞";s:4:"𣴞";s:4:"洴";s:3:"洴";s:4:"港";s:3:"港";s:4:"湮";s:3:"湮";s:4:"㴳";s:3:"㴳";s:4:"滋";s:3:"滋";s:4:"滇";s:3:"滇";s:4:"𣻑";s:4:"𣻑";s:4:"淹";s:3:"淹";s:4:"潮";s:3:"潮";s:4:"𣽞";s:4:"𣽞";s:4:"𣾎";s:4:"𣾎";s:4:"濆";s:3:"濆";s:4:"瀹";s:3:"瀹";s:4:"瀞";s:3:"瀞";s:4:"瀛";s:3:"瀛";s:4:"㶖";s:3:"㶖";s:4:"灊";s:3:"灊";s:4:"災";s:3:"災";s:4:"灷";s:3:"灷";s:4:"炭";s:3:"炭";s:4:"𠔥";s:4:"𠔥";s:4:"煅";s:3:"煅";s:4:"𤉣";s:4:"𤉣";s:4:"熜";s:3:"熜";s:4:"𤎫";s:4:"𤎫";s:4:"爨";s:3:"爨";s:4:"爵";s:3:"爵";s:4:"牐";s:3:"牐";s:4:"𤘈";s:4:"𤘈";s:4:"犀";s:3:"犀";s:4:"犕";s:3:"犕";s:4:"𤜵";s:4:"𤜵";s:4:"𤠔";s:4:"𤠔";s:4:"獺";s:3:"獺";s:4:"王";s:3:"王";s:4:"㺬";s:3:"㺬";s:4:"玥";s:3:"玥";s:4:"㺸";s:3:"㺸";s:4:"㺸";s:3:"㺸";s:4:"瑇";s:3:"瑇";s:4:"瑜";s:3:"瑜";s:4:"瑱";s:3:"瑱";s:4:"璅";s:3:"璅";s:4:"瓊";s:3:"瓊";s:4:"㼛";s:3:"㼛";s:4:"甤";s:3:"甤";s:4:"𤰶";s:4:"𤰶";s:4:"甾";s:3:"甾";s:4:"𤲒";s:4:"𤲒";s:4:"異";s:3:"異";s:4:"𢆟";s:4:"𢆟";s:4:"瘐";s:3:"瘐";s:4:"𤾡";s:4:"𤾡";s:4:"𤾸";s:4:"𤾸";s:4:"𥁄";s:4:"𥁄";s:4:"㿼";s:3:"㿼";s:4:"䀈";s:3:"䀈";s:4:"直";s:3:"直";s:4:"𥃳";s:4:"𥃳";s:4:"𥃲";s:4:"𥃲";s:4:"𥄙";s:4:"𥄙";s:4:"𥄳";s:4:"𥄳";s:4:"眞";s:3:"眞";s:4:"真";s:3:"真";s:4:"真";s:3:"真";s:4:"睊";s:3:"睊";s:4:"䀹";s:3:"䀹";s:4:"瞋";s:3:"瞋";s:4:"䁆";s:3:"䁆";s:4:"䂖";s:3:"䂖";s:4:"𥐝";s:4:"𥐝";s:4:"硎";s:3:"硎";s:4:"碌";s:3:"碌";s:4:"磌";s:3:"磌";s:4:"䃣";s:3:"䃣";s:4:"𥘦";s:4:"𥘦";s:4:"祖";s:3:"祖";s:4:"𥚚";s:4:"𥚚";s:4:"𥛅";s:4:"𥛅";s:4:"福";s:3:"福";s:4:"秫";s:3:"秫";s:4:"䄯";s:3:"䄯";s:4:"穀";s:3:"穀";s:4:"穊";s:3:"穊";s:4:"穏";s:3:"穏";s:4:"𥥼";s:4:"𥥼";s:4:"𥪧";s:4:"𥪧";s:4:"𥪧";s:4:"𥪧";s:4:"竮";s:3:"竮";s:4:"䈂";s:3:"䈂";s:4:"𥮫";s:4:"𥮫";s:4:"篆";s:3:"篆";s:4:"築";s:3:"築";s:4:"䈧";s:3:"䈧";s:4:"𥲀";s:4:"𥲀";s:4:"糒";s:3:"糒";s:4:"䊠";s:3:"䊠";s:4:"糨";s:3:"糨";s:4:"糣";s:3:"糣";s:4:"紀";s:3:"紀";s:4:"𥾆";s:4:"𥾆";s:4:"絣";s:3:"絣";s:4:"䌁";s:3:"䌁";s:4:"緇";s:3:"緇";s:4:"縂";s:3:"縂";s:4:"繅";s:3:"繅";s:4:"䌴";s:3:"䌴";s:4:"𦈨";s:4:"𦈨";s:4:"𦉇";s:4:"𦉇";s:4:"䍙";s:3:"䍙";s:4:"𦋙";s:4:"𦋙";s:4:"罺";s:3:"罺";s:4:"𦌾";s:4:"𦌾";s:4:"羕";s:3:"羕";s:4:"翺";s:3:"翺";s:4:"者";s:3:"者";s:4:"𦓚";s:4:"𦓚";s:4:"𦔣";s:4:"𦔣";s:4:"聠";s:3:"聠";s:4:"𦖨";s:4:"𦖨";s:4:"聰";s:3:"聰";s:4:"𣍟";s:4:"𣍟";s:4:"䏕";s:3:"䏕";s:4:"育";s:3:"育";s:4:"脃";s:3:"脃";s:4:"䐋";s:3:"䐋";s:4:"脾";s:3:"脾";s:4:"媵";s:3:"媵";s:4:"𦞧";s:4:"𦞧";s:4:"𦞵";s:4:"𦞵";s:4:"𣎓";s:4:"𣎓";s:4:"𣎜";s:4:"𣎜";s:4:"舁";s:3:"舁";s:4:"舄";s:3:"舄";s:4:"辞";s:3:"辞";s:4:"䑫";s:3:"䑫";s:4:"芑";s:3:"芑";s:4:"芋";s:3:"芋";s:4:"芝";s:3:"芝";s:4:"劳";s:3:"劳";s:4:"花";s:3:"花";s:4:"芳";s:3:"芳";s:4:"芽";s:3:"芽";s:4:"苦";s:3:"苦";s:4:"𦬼";s:4:"𦬼";s:4:"若";s:3:"若";s:4:"茝";s:3:"茝";s:4:"荣";s:3:"荣";s:4:"莭";s:3:"莭";s:4:"茣";s:3:"茣";s:4:"莽";s:3:"莽";s:4:"菧";s:3:"菧";s:4:"著";s:3:"著";s:4:"荓";s:3:"荓";s:4:"菊";s:3:"菊";s:4:"菌";s:3:"菌";s:4:"菜";s:3:"菜";s:4:"𦰶";s:4:"𦰶";s:4:"𦵫";s:4:"𦵫";s:4:"𦳕";s:4:"𦳕";s:4:"䔫";s:3:"䔫";s:4:"蓱";s:3:"蓱";s:4:"蓳";s:3:"蓳";s:4:"蔖";s:3:"蔖";s:4:"𧏊";s:4:"𧏊";s:4:"蕤";s:3:"蕤";s:4:"𦼬";s:4:"𦼬";s:4:"䕝";s:3:"䕝";s:4:"䕡";s:3:"䕡";s:4:"𦾱";s:4:"𦾱";s:4:"𧃒";s:4:"𧃒";s:4:"䕫";s:3:"䕫";s:4:"虐";s:3:"虐";s:4:"虜";s:3:"虜";s:4:"虧";s:3:"虧";s:4:"虩";s:3:"虩";s:4:"蚩";s:3:"蚩";s:4:"蚈";s:3:"蚈";s:4:"蜎";s:3:"蜎";s:4:"蛢";s:3:"蛢";s:4:"蝹";s:3:"蝹";s:4:"蜨";s:3:"蜨";s:4:"蝫";s:3:"蝫";s:4:"螆";s:3:"螆";s:4:"䗗";s:3:"䗗";s:4:"蟡";s:3:"蟡";s:4:"蠁";s:3:"蠁";s:4:"䗹";s:3:"䗹";s:4:"衠";s:3:"衠";s:4:"衣";s:3:"衣";s:4:"𧙧";s:4:"𧙧";s:4:"裗";s:3:"裗";s:4:"裞";s:3:"裞";s:4:"䘵";s:3:"䘵";s:4:"裺";s:3:"裺";s:4:"㒻";s:3:"㒻";s:4:"𧢮";s:4:"𧢮";s:4:"𧥦";s:4:"𧥦";s:4:"䚾";s:3:"䚾";s:4:"䛇";s:3:"䛇";s:4:"誠";s:3:"誠";s:4:"諭";s:3:"諭";s:4:"變";s:3:"變";s:4:"豕";s:3:"豕";s:4:"𧲨";s:4:"𧲨";s:4:"貫";s:3:"貫";s:4:"賁";s:3:"賁";s:4:"贛";s:3:"贛";s:4:"起";s:3:"起";s:4:"𧼯";s:4:"𧼯";s:4:"𠠄";s:4:"𠠄";s:4:"跋";s:3:"跋";s:4:"趼";s:3:"趼";s:4:"跰";s:3:"跰";s:4:"𠣞";s:4:"𠣞";s:4:"軔";s:3:"軔";s:4:"輸";s:3:"輸";s:4:"𨗒";s:4:"𨗒";s:4:"𨗭";s:4:"𨗭";s:4:"邔";s:3:"邔";s:4:"郱";s:3:"郱";s:4:"鄑";s:3:"鄑";s:4:"𨜮";s:4:"𨜮";s:4:"鄛";s:3:"鄛";s:4:"鈸";s:3:"鈸";s:4:"鋗";s:3:"鋗";s:4:"鋘";s:3:"鋘";s:4:"鉼";s:3:"鉼";s:4:"鏹";s:3:"鏹";s:4:"鐕";s:3:"鐕";s:4:"𨯺";s:4:"𨯺";s:4:"開";s:3:"開";s:4:"䦕";s:3:"䦕";s:4:"閷";s:3:"閷";s:4:"𨵷";s:4:"𨵷";s:4:"䧦";s:3:"䧦";s:4:"雃";s:3:"雃";s:4:"嶲";s:3:"嶲";s:4:"霣";s:3:"霣";s:4:"𩅅";s:4:"𩅅";s:4:"𩈚";s:4:"𩈚";s:4:"䩮";s:3:"䩮";s:4:"䩶";s:3:"䩶";s:4:"韠";s:3:"韠";s:4:"𩐊";s:4:"𩐊";s:4:"䪲";s:3:"䪲";s:4:"𩒖";s:4:"𩒖";s:4:"頋";s:3:"頋";s:4:"頋";s:3:"頋";s:4:"頩";s:3:"頩";s:4:"𩖶";s:4:"𩖶";s:4:"飢";s:3:"飢";s:4:"䬳";s:3:"䬳";s:4:"餩";s:3:"餩";s:4:"馧";s:3:"馧";s:4:"駂";s:3:"駂";s:4:"駾";s:3:"駾";s:4:"䯎";s:3:"䯎";s:4:"𩬰";s:4:"𩬰";s:4:"鬒";s:3:"鬒";s:4:"鱀";s:3:"鱀";s:4:"鳽";s:3:"鳽";s:4:"䳎";s:3:"䳎";s:4:"䳭";s:3:"䳭";s:4:"鵧";s:3:"鵧";s:4:"𪃎";s:4:"𪃎";s:4:"䳸";s:3:"䳸";s:4:"𪄅";s:4:"𪄅";s:4:"𪈎";s:4:"𪈎";s:4:"𪊑";s:4:"𪊑";s:4:"麻";s:3:"麻";s:4:"䵖";s:3:"䵖";s:4:"黹";s:3:"黹";s:4:"黾";s:3:"黾";s:4:"鼅";s:3:"鼅";s:4:"鼏";s:3:"鼏";s:4:"鼖";s:3:"鼖";s:4:"鼻";s:3:"鼻";s:4:"𪘀";s:4:"𪘀";}' );
+UtfNormal::$utfCheckNFC = unserialize( 'a:1221:{s:2:"̀";s:1:"N";s:2:"́";s:1:"N";s:2:"̓";s:1:"N";s:2:"̈́";s:1:"N";s:2:"ʹ";s:1:"N";s:2:";";s:1:"N";s:2:"·";s:1:"N";s:3:"क़";s:1:"N";s:3:"ख़";s:1:"N";s:3:"ग़";s:1:"N";s:3:"ज़";s:1:"N";s:3:"ड़";s:1:"N";s:3:"ढ़";s:1:"N";s:3:"फ़";s:1:"N";s:3:"य़";s:1:"N";s:3:"ড়";s:1:"N";s:3:"ঢ়";s:1:"N";s:3:"য়";s:1:"N";s:3:"ਲ਼";s:1:"N";s:3:"ਸ਼";s:1:"N";s:3:"ਖ਼";s:1:"N";s:3:"ਗ਼";s:1:"N";s:3:"ਜ਼";s:1:"N";s:3:"ਫ਼";s:1:"N";s:3:"ଡ଼";s:1:"N";s:3:"ଢ଼";s:1:"N";s:3:"གྷ";s:1:"N";s:3:"ཌྷ";s:1:"N";s:3:"དྷ";s:1:"N";s:3:"བྷ";s:1:"N";s:3:"ཛྷ";s:1:"N";s:3:"ཀྵ";s:1:"N";s:3:"ཱི";s:1:"N";s:3:"ཱུ";s:1:"N";s:3:"ྲྀ";s:1:"N";s:3:"ླྀ";s:1:"N";s:3:"ཱྀ";s:1:"N";s:3:"ྒྷ";s:1:"N";s:3:"ྜྷ";s:1:"N";s:3:"ྡྷ";s:1:"N";s:3:"ྦྷ";s:1:"N";s:3:"ྫྷ";s:1:"N";s:3:"ྐྵ";s:1:"N";s:3:"ά";s:1:"N";s:3:"έ";s:1:"N";s:3:"ή";s:1:"N";s:3:"ί";s:1:"N";s:3:"ό";s:1:"N";s:3:"ύ";s:1:"N";s:3:"ώ";s:1:"N";s:3:"Ά";s:1:"N";s:3:"ι";s:1:"N";s:3:"Έ";s:1:"N";s:3:"Ή";s:1:"N";s:3:"ΐ";s:1:"N";s:3:"Ί";s:1:"N";s:3:"ΰ";s:1:"N";s:3:"Ύ";s:1:"N";s:3:"΅";s:1:"N";s:3:"`";s:1:"N";s:3:"Ό";s:1:"N";s:3:"Ώ";s:1:"N";s:3:"´";s:1:"N";s:3:" ";s:1:"N";s:3:" ";s:1:"N";s:3:"Ω";s:1:"N";s:3:"K";s:1:"N";s:3:"Å";s:1:"N";s:3:"〈";s:1:"N";s:3:"〉";s:1:"N";s:3:"⫝̸";s:1:"N";s:3:"豈";s:1:"N";s:3:"更";s:1:"N";s:3:"車";s:1:"N";s:3:"賈";s:1:"N";s:3:"滑";s:1:"N";s:3:"串";s:1:"N";s:3:"句";s:1:"N";s:3:"龜";s:1:"N";s:3:"龜";s:1:"N";s:3:"契";s:1:"N";s:3:"金";s:1:"N";s:3:"喇";s:1:"N";s:3:"奈";s:1:"N";s:3:"懶";s:1:"N";s:3:"癩";s:1:"N";s:3:"羅";s:1:"N";s:3:"蘿";s:1:"N";s:3:"螺";s:1:"N";s:3:"裸";s:1:"N";s:3:"邏";s:1:"N";s:3:"樂";s:1:"N";s:3:"洛";s:1:"N";s:3:"烙";s:1:"N";s:3:"珞";s:1:"N";s:3:"落";s:1:"N";s:3:"酪";s:1:"N";s:3:"駱";s:1:"N";s:3:"亂";s:1:"N";s:3:"卵";s:1:"N";s:3:"欄";s:1:"N";s:3:"爛";s:1:"N";s:3:"蘭";s:1:"N";s:3:"鸞";s:1:"N";s:3:"嵐";s:1:"N";s:3:"濫";s:1:"N";s:3:"藍";s:1:"N";s:3:"襤";s:1:"N";s:3:"拉";s:1:"N";s:3:"臘";s:1:"N";s:3:"蠟";s:1:"N";s:3:"廊";s:1:"N";s:3:"朗";s:1:"N";s:3:"浪";s:1:"N";s:3:"狼";s:1:"N";s:3:"郎";s:1:"N";s:3:"來";s:1:"N";s:3:"冷";s:1:"N";s:3:"勞";s:1:"N";s:3:"擄";s:1:"N";s:3:"櫓";s:1:"N";s:3:"爐";s:1:"N";s:3:"盧";s:1:"N";s:3:"老";s:1:"N";s:3:"蘆";s:1:"N";s:3:"虜";s:1:"N";s:3:"路";s:1:"N";s:3:"露";s:1:"N";s:3:"魯";s:1:"N";s:3:"鷺";s:1:"N";s:3:"碌";s:1:"N";s:3:"祿";s:1:"N";s:3:"綠";s:1:"N";s:3:"菉";s:1:"N";s:3:"錄";s:1:"N";s:3:"鹿";s:1:"N";s:3:"論";s:1:"N";s:3:"壟";s:1:"N";s:3:"弄";s:1:"N";s:3:"籠";s:1:"N";s:3:"聾";s:1:"N";s:3:"牢";s:1:"N";s:3:"磊";s:1:"N";s:3:"賂";s:1:"N";s:3:"雷";s:1:"N";s:3:"壘";s:1:"N";s:3:"屢";s:1:"N";s:3:"樓";s:1:"N";s:3:"淚";s:1:"N";s:3:"漏";s:1:"N";s:3:"累";s:1:"N";s:3:"縷";s:1:"N";s:3:"陋";s:1:"N";s:3:"勒";s:1:"N";s:3:"肋";s:1:"N";s:3:"凜";s:1:"N";s:3:"凌";s:1:"N";s:3:"稜";s:1:"N";s:3:"綾";s:1:"N";s:3:"菱";s:1:"N";s:3:"陵";s:1:"N";s:3:"讀";s:1:"N";s:3:"拏";s:1:"N";s:3:"樂";s:1:"N";s:3:"諾";s:1:"N";s:3:"丹";s:1:"N";s:3:"寧";s:1:"N";s:3:"怒";s:1:"N";s:3:"率";s:1:"N";s:3:"異";s:1:"N";s:3:"北";s:1:"N";s:3:"磻";s:1:"N";s:3:"便";s:1:"N";s:3:"復";s:1:"N";s:3:"不";s:1:"N";s:3:"泌";s:1:"N";s:3:"數";s:1:"N";s:3:"索";s:1:"N";s:3:"參";s:1:"N";s:3:"塞";s:1:"N";s:3:"省";s:1:"N";s:3:"葉";s:1:"N";s:3:"說";s:1:"N";s:3:"殺";s:1:"N";s:3:"辰";s:1:"N";s:3:"沈";s:1:"N";s:3:"拾";s:1:"N";s:3:"若";s:1:"N";s:3:"掠";s:1:"N";s:3:"略";s:1:"N";s:3:"亮";s:1:"N";s:3:"兩";s:1:"N";s:3:"凉";s:1:"N";s:3:"梁";s:1:"N";s:3:"糧";s:1:"N";s:3:"良";s:1:"N";s:3:"諒";s:1:"N";s:3:"量";s:1:"N";s:3:"勵";s:1:"N";s:3:"呂";s:1:"N";s:3:"女";s:1:"N";s:3:"廬";s:1:"N";s:3:"旅";s:1:"N";s:3:"濾";s:1:"N";s:3:"礪";s:1:"N";s:3:"閭";s:1:"N";s:3:"驪";s:1:"N";s:3:"麗";s:1:"N";s:3:"黎";s:1:"N";s:3:"力";s:1:"N";s:3:"曆";s:1:"N";s:3:"歷";s:1:"N";s:3:"轢";s:1:"N";s:3:"年";s:1:"N";s:3:"憐";s:1:"N";s:3:"戀";s:1:"N";s:3:"撚";s:1:"N";s:3:"漣";s:1:"N";s:3:"煉";s:1:"N";s:3:"璉";s:1:"N";s:3:"秊";s:1:"N";s:3:"練";s:1:"N";s:3:"聯";s:1:"N";s:3:"輦";s:1:"N";s:3:"蓮";s:1:"N";s:3:"連";s:1:"N";s:3:"鍊";s:1:"N";s:3:"列";s:1:"N";s:3:"劣";s:1:"N";s:3:"咽";s:1:"N";s:3:"烈";s:1:"N";s:3:"裂";s:1:"N";s:3:"說";s:1:"N";s:3:"廉";s:1:"N";s:3:"念";s:1:"N";s:3:"捻";s:1:"N";s:3:"殮";s:1:"N";s:3:"簾";s:1:"N";s:3:"獵";s:1:"N";s:3:"令";s:1:"N";s:3:"囹";s:1:"N";s:3:"寧";s:1:"N";s:3:"嶺";s:1:"N";s:3:"怜";s:1:"N";s:3:"玲";s:1:"N";s:3:"瑩";s:1:"N";s:3:"羚";s:1:"N";s:3:"聆";s:1:"N";s:3:"鈴";s:1:"N";s:3:"零";s:1:"N";s:3:"靈";s:1:"N";s:3:"領";s:1:"N";s:3:"例";s:1:"N";s:3:"禮";s:1:"N";s:3:"醴";s:1:"N";s:3:"隸";s:1:"N";s:3:"惡";s:1:"N";s:3:"了";s:1:"N";s:3:"僚";s:1:"N";s:3:"寮";s:1:"N";s:3:"尿";s:1:"N";s:3:"料";s:1:"N";s:3:"樂";s:1:"N";s:3:"燎";s:1:"N";s:3:"療";s:1:"N";s:3:"蓼";s:1:"N";s:3:"遼";s:1:"N";s:3:"龍";s:1:"N";s:3:"暈";s:1:"N";s:3:"阮";s:1:"N";s:3:"劉";s:1:"N";s:3:"杻";s:1:"N";s:3:"柳";s:1:"N";s:3:"流";s:1:"N";s:3:"溜";s:1:"N";s:3:"琉";s:1:"N";s:3:"留";s:1:"N";s:3:"硫";s:1:"N";s:3:"紐";s:1:"N";s:3:"類";s:1:"N";s:3:"六";s:1:"N";s:3:"戮";s:1:"N";s:3:"陸";s:1:"N";s:3:"倫";s:1:"N";s:3:"崙";s:1:"N";s:3:"淪";s:1:"N";s:3:"輪";s:1:"N";s:3:"律";s:1:"N";s:3:"慄";s:1:"N";s:3:"栗";s:1:"N";s:3:"率";s:1:"N";s:3:"隆";s:1:"N";s:3:"利";s:1:"N";s:3:"吏";s:1:"N";s:3:"履";s:1:"N";s:3:"易";s:1:"N";s:3:"李";s:1:"N";s:3:"梨";s:1:"N";s:3:"泥";s:1:"N";s:3:"理";s:1:"N";s:3:"痢";s:1:"N";s:3:"罹";s:1:"N";s:3:"裏";s:1:"N";s:3:"裡";s:1:"N";s:3:"里";s:1:"N";s:3:"離";s:1:"N";s:3:"匿";s:1:"N";s:3:"溺";s:1:"N";s:3:"吝";s:1:"N";s:3:"燐";s:1:"N";s:3:"璘";s:1:"N";s:3:"藺";s:1:"N";s:3:"隣";s:1:"N";s:3:"鱗";s:1:"N";s:3:"麟";s:1:"N";s:3:"林";s:1:"N";s:3:"淋";s:1:"N";s:3:"臨";s:1:"N";s:3:"立";s:1:"N";s:3:"笠";s:1:"N";s:3:"粒";s:1:"N";s:3:"狀";s:1:"N";s:3:"炙";s:1:"N";s:3:"識";s:1:"N";s:3:"什";s:1:"N";s:3:"茶";s:1:"N";s:3:"刺";s:1:"N";s:3:"切";s:1:"N";s:3:"度";s:1:"N";s:3:"拓";s:1:"N";s:3:"糖";s:1:"N";s:3:"宅";s:1:"N";s:3:"洞";s:1:"N";s:3:"暴";s:1:"N";s:3:"輻";s:1:"N";s:3:"行";s:1:"N";s:3:"降";s:1:"N";s:3:"見";s:1:"N";s:3:"廓";s:1:"N";s:3:"兀";s:1:"N";s:3:"嗀";s:1:"N";s:3:"塚";s:1:"N";s:3:"晴";s:1:"N";s:3:"凞";s:1:"N";s:3:"猪";s:1:"N";s:3:"益";s:1:"N";s:3:"礼";s:1:"N";s:3:"神";s:1:"N";s:3:"祥";s:1:"N";s:3:"福";s:1:"N";s:3:"靖";s:1:"N";s:3:"精";s:1:"N";s:3:"羽";s:1:"N";s:3:"蘒";s:1:"N";s:3:"諸";s:1:"N";s:3:"逸";s:1:"N";s:3:"都";s:1:"N";s:3:"飯";s:1:"N";s:3:"飼";s:1:"N";s:3:"館";s:1:"N";s:3:"鶴";s:1:"N";s:3:"侮";s:1:"N";s:3:"僧";s:1:"N";s:3:"免";s:1:"N";s:3:"勉";s:1:"N";s:3:"勤";s:1:"N";s:3:"卑";s:1:"N";s:3:"喝";s:1:"N";s:3:"嘆";s:1:"N";s:3:"器";s:1:"N";s:3:"塀";s:1:"N";s:3:"墨";s:1:"N";s:3:"層";s:1:"N";s:3:"屮";s:1:"N";s:3:"悔";s:1:"N";s:3:"慨";s:1:"N";s:3:"憎";s:1:"N";s:3:"懲";s:1:"N";s:3:"敏";s:1:"N";s:3:"既";s:1:"N";s:3:"暑";s:1:"N";s:3:"梅";s:1:"N";s:3:"海";s:1:"N";s:3:"渚";s:1:"N";s:3:"漢";s:1:"N";s:3:"煮";s:1:"N";s:3:"爫";s:1:"N";s:3:"琢";s:1:"N";s:3:"碑";s:1:"N";s:3:"社";s:1:"N";s:3:"祉";s:1:"N";s:3:"祈";s:1:"N";s:3:"祐";s:1:"N";s:3:"祖";s:1:"N";s:3:"祝";s:1:"N";s:3:"禍";s:1:"N";s:3:"禎";s:1:"N";s:3:"穀";s:1:"N";s:3:"突";s:1:"N";s:3:"節";s:1:"N";s:3:"練";s:1:"N";s:3:"縉";s:1:"N";s:3:"繁";s:1:"N";s:3:"署";s:1:"N";s:3:"者";s:1:"N";s:3:"臭";s:1:"N";s:3:"艹";s:1:"N";s:3:"艹";s:1:"N";s:3:"著";s:1:"N";s:3:"褐";s:1:"N";s:3:"視";s:1:"N";s:3:"謁";s:1:"N";s:3:"謹";s:1:"N";s:3:"賓";s:1:"N";s:3:"贈";s:1:"N";s:3:"辶";s:1:"N";s:3:"逸";s:1:"N";s:3:"難";s:1:"N";s:3:"響";s:1:"N";s:3:"頻";s:1:"N";s:3:"恵";s:1:"N";s:3:"𤋮";s:1:"N";s:3:"舘";s:1:"N";s:3:"並";s:1:"N";s:3:"况";s:1:"N";s:3:"全";s:1:"N";s:3:"侀";s:1:"N";s:3:"充";s:1:"N";s:3:"冀";s:1:"N";s:3:"勇";s:1:"N";s:3:"勺";s:1:"N";s:3:"喝";s:1:"N";s:3:"啕";s:1:"N";s:3:"喙";s:1:"N";s:3:"嗢";s:1:"N";s:3:"塚";s:1:"N";s:3:"墳";s:1:"N";s:3:"奄";s:1:"N";s:3:"奔";s:1:"N";s:3:"婢";s:1:"N";s:3:"嬨";s:1:"N";s:3:"廒";s:1:"N";s:3:"廙";s:1:"N";s:3:"彩";s:1:"N";s:3:"徭";s:1:"N";s:3:"惘";s:1:"N";s:3:"慎";s:1:"N";s:3:"愈";s:1:"N";s:3:"憎";s:1:"N";s:3:"慠";s:1:"N";s:3:"懲";s:1:"N";s:3:"戴";s:1:"N";s:3:"揄";s:1:"N";s:3:"搜";s:1:"N";s:3:"摒";s:1:"N";s:3:"敖";s:1:"N";s:3:"晴";s:1:"N";s:3:"朗";s:1:"N";s:3:"望";s:1:"N";s:3:"杖";s:1:"N";s:3:"歹";s:1:"N";s:3:"殺";s:1:"N";s:3:"流";s:1:"N";s:3:"滛";s:1:"N";s:3:"滋";s:1:"N";s:3:"漢";s:1:"N";s:3:"瀞";s:1:"N";s:3:"煮";s:1:"N";s:3:"瞧";s:1:"N";s:3:"爵";s:1:"N";s:3:"犯";s:1:"N";s:3:"猪";s:1:"N";s:3:"瑱";s:1:"N";s:3:"甆";s:1:"N";s:3:"画";s:1:"N";s:3:"瘝";s:1:"N";s:3:"瘟";s:1:"N";s:3:"益";s:1:"N";s:3:"盛";s:1:"N";s:3:"直";s:1:"N";s:3:"睊";s:1:"N";s:3:"着";s:1:"N";s:3:"磌";s:1:"N";s:3:"窱";s:1:"N";s:3:"節";s:1:"N";s:3:"类";s:1:"N";s:3:"絛";s:1:"N";s:3:"練";s:1:"N";s:3:"缾";s:1:"N";s:3:"者";s:1:"N";s:3:"荒";s:1:"N";s:3:"華";s:1:"N";s:3:"蝹";s:1:"N";s:3:"襁";s:1:"N";s:3:"覆";s:1:"N";s:3:"視";s:1:"N";s:3:"調";s:1:"N";s:3:"諸";s:1:"N";s:3:"請";s:1:"N";s:3:"謁";s:1:"N";s:3:"諾";s:1:"N";s:3:"諭";s:1:"N";s:3:"謹";s:1:"N";s:3:"變";s:1:"N";s:3:"贈";s:1:"N";s:3:"輸";s:1:"N";s:3:"遲";s:1:"N";s:3:"醙";s:1:"N";s:3:"鉶";s:1:"N";s:3:"陼";s:1:"N";s:3:"難";s:1:"N";s:3:"靖";s:1:"N";s:3:"韛";s:1:"N";s:3:"響";s:1:"N";s:3:"頋";s:1:"N";s:3:"頻";s:1:"N";s:3:"鬒";s:1:"N";s:3:"龜";s:1:"N";s:3:"𢡊";s:1:"N";s:3:"𢡄";s:1:"N";s:3:"𣏕";s:1:"N";s:3:"㮝";s:1:"N";s:3:"䀘";s:1:"N";s:3:"䀹";s:1:"N";s:3:"𥉉";s:1:"N";s:3:"𥳐";s:1:"N";s:3:"𧻓";s:1:"N";s:3:"齃";s:1:"N";s:3:"龎";s:1:"N";s:3:"יִ";s:1:"N";s:3:"ײַ";s:1:"N";s:3:"שׁ";s:1:"N";s:3:"שׂ";s:1:"N";s:3:"שּׁ";s:1:"N";s:3:"שּׂ";s:1:"N";s:3:"אַ";s:1:"N";s:3:"אָ";s:1:"N";s:3:"אּ";s:1:"N";s:3:"בּ";s:1:"N";s:3:"גּ";s:1:"N";s:3:"דּ";s:1:"N";s:3:"הּ";s:1:"N";s:3:"וּ";s:1:"N";s:3:"זּ";s:1:"N";s:3:"טּ";s:1:"N";s:3:"יּ";s:1:"N";s:3:"ךּ";s:1:"N";s:3:"כּ";s:1:"N";s:3:"לּ";s:1:"N";s:3:"מּ";s:1:"N";s:3:"נּ";s:1:"N";s:3:"סּ";s:1:"N";s:3:"ףּ";s:1:"N";s:3:"פּ";s:1:"N";s:3:"צּ";s:1:"N";s:3:"קּ";s:1:"N";s:3:"רּ";s:1:"N";s:3:"שּ";s:1:"N";s:3:"תּ";s:1:"N";s:3:"וֹ";s:1:"N";s:3:"בֿ";s:1:"N";s:3:"כֿ";s:1:"N";s:3:"פֿ";s:1:"N";s:4:"𝅗𝅥";s:1:"N";s:4:"𝅘𝅥";s:1:"N";s:4:"𝅘𝅥𝅮";s:1:"N";s:4:"𝅘𝅥𝅯";s:1:"N";s:4:"𝅘𝅥𝅰";s:1:"N";s:4:"𝅘𝅥𝅱";s:1:"N";s:4:"𝅘𝅥𝅲";s:1:"N";s:4:"𝆹𝅥";s:1:"N";s:4:"𝆺𝅥";s:1:"N";s:4:"𝆹𝅥𝅮";s:1:"N";s:4:"𝆺𝅥𝅮";s:1:"N";s:4:"𝆹𝅥𝅯";s:1:"N";s:4:"𝆺𝅥𝅯";s:1:"N";s:4:"丽";s:1:"N";s:4:"丸";s:1:"N";s:4:"乁";s:1:"N";s:4:"𠄢";s:1:"N";s:4:"你";s:1:"N";s:4:"侮";s:1:"N";s:4:"侻";s:1:"N";s:4:"倂";s:1:"N";s:4:"偺";s:1:"N";s:4:"備";s:1:"N";s:4:"僧";s:1:"N";s:4:"像";s:1:"N";s:4:"㒞";s:1:"N";s:4:"𠘺";s:1:"N";s:4:"免";s:1:"N";s:4:"兔";s:1:"N";s:4:"兤";s:1:"N";s:4:"具";s:1:"N";s:4:"𠔜";s:1:"N";s:4:"㒹";s:1:"N";s:4:"內";s:1:"N";s:4:"再";s:1:"N";s:4:"𠕋";s:1:"N";s:4:"冗";s:1:"N";s:4:"冤";s:1:"N";s:4:"仌";s:1:"N";s:4:"冬";s:1:"N";s:4:"况";s:1:"N";s:4:"𩇟";s:1:"N";s:4:"凵";s:1:"N";s:4:"刃";s:1:"N";s:4:"㓟";s:1:"N";s:4:"刻";s:1:"N";s:4:"剆";s:1:"N";s:4:"割";s:1:"N";s:4:"剷";s:1:"N";s:4:"㔕";s:1:"N";s:4:"勇";s:1:"N";s:4:"勉";s:1:"N";s:4:"勤";s:1:"N";s:4:"勺";s:1:"N";s:4:"包";s:1:"N";s:4:"匆";s:1:"N";s:4:"北";s:1:"N";s:4:"卉";s:1:"N";s:4:"卑";s:1:"N";s:4:"博";s:1:"N";s:4:"即";s:1:"N";s:4:"卽";s:1:"N";s:4:"卿";s:1:"N";s:4:"卿";s:1:"N";s:4:"卿";s:1:"N";s:4:"𠨬";s:1:"N";s:4:"灰";s:1:"N";s:4:"及";s:1:"N";s:4:"叟";s:1:"N";s:4:"𠭣";s:1:"N";s:4:"叫";s:1:"N";s:4:"叱";s:1:"N";s:4:"吆";s:1:"N";s:4:"咞";s:1:"N";s:4:"吸";s:1:"N";s:4:"呈";s:1:"N";s:4:"周";s:1:"N";s:4:"咢";s:1:"N";s:4:"哶";s:1:"N";s:4:"唐";s:1:"N";s:4:"啓";s:1:"N";s:4:"啣";s:1:"N";s:4:"善";s:1:"N";s:4:"善";s:1:"N";s:4:"喙";s:1:"N";s:4:"喫";s:1:"N";s:4:"喳";s:1:"N";s:4:"嗂";s:1:"N";s:4:"圖";s:1:"N";s:4:"嘆";s:1:"N";s:4:"圗";s:1:"N";s:4:"噑";s:1:"N";s:4:"噴";s:1:"N";s:4:"切";s:1:"N";s:4:"壮";s:1:"N";s:4:"城";s:1:"N";s:4:"埴";s:1:"N";s:4:"堍";s:1:"N";s:4:"型";s:1:"N";s:4:"堲";s:1:"N";s:4:"報";s:1:"N";s:4:"墬";s:1:"N";s:4:"𡓤";s:1:"N";s:4:"売";s:1:"N";s:4:"壷";s:1:"N";s:4:"夆";s:1:"N";s:4:"多";s:1:"N";s:4:"夢";s:1:"N";s:4:"奢";s:1:"N";s:4:"𡚨";s:1:"N";s:4:"𡛪";s:1:"N";s:4:"姬";s:1:"N";s:4:"娛";s:1:"N";s:4:"娧";s:1:"N";s:4:"姘";s:1:"N";s:4:"婦";s:1:"N";s:4:"㛮";s:1:"N";s:4:"㛼";s:1:"N";s:4:"嬈";s:1:"N";s:4:"嬾";s:1:"N";s:4:"嬾";s:1:"N";s:4:"𡧈";s:1:"N";s:4:"寃";s:1:"N";s:4:"寘";s:1:"N";s:4:"寧";s:1:"N";s:4:"寳";s:1:"N";s:4:"𡬘";s:1:"N";s:4:"寿";s:1:"N";s:4:"将";s:1:"N";s:4:"当";s:1:"N";s:4:"尢";s:1:"N";s:4:"㞁";s:1:"N";s:4:"屠";s:1:"N";s:4:"屮";s:1:"N";s:4:"峀";s:1:"N";s:4:"岍";s:1:"N";s:4:"𡷤";s:1:"N";s:4:"嵃";s:1:"N";s:4:"𡷦";s:1:"N";s:4:"嵮";s:1:"N";s:4:"嵫";s:1:"N";s:4:"嵼";s:1:"N";s:4:"巡";s:1:"N";s:4:"巢";s:1:"N";s:4:"㠯";s:1:"N";s:4:"巽";s:1:"N";s:4:"帨";s:1:"N";s:4:"帽";s:1:"N";s:4:"幩";s:1:"N";s:4:"㡢";s:1:"N";s:4:"𢆃";s:1:"N";s:4:"㡼";s:1:"N";s:4:"庰";s:1:"N";s:4:"庳";s:1:"N";s:4:"庶";s:1:"N";s:4:"廊";s:1:"N";s:4:"𪎒";s:1:"N";s:4:"廾";s:1:"N";s:4:"𢌱";s:1:"N";s:4:"𢌱";s:1:"N";s:4:"舁";s:1:"N";s:4:"弢";s:1:"N";s:4:"弢";s:1:"N";s:4:"㣇";s:1:"N";s:4:"𣊸";s:1:"N";s:4:"𦇚";s:1:"N";s:4:"形";s:1:"N";s:4:"彫";s:1:"N";s:4:"㣣";s:1:"N";s:4:"徚";s:1:"N";s:4:"忍";s:1:"N";s:4:"志";s:1:"N";s:4:"忹";s:1:"N";s:4:"悁";s:1:"N";s:4:"㤺";s:1:"N";s:4:"㤜";s:1:"N";s:4:"悔";s:1:"N";s:4:"𢛔";s:1:"N";s:4:"惇";s:1:"N";s:4:"慈";s:1:"N";s:4:"慌";s:1:"N";s:4:"慎";s:1:"N";s:4:"慌";s:1:"N";s:4:"慺";s:1:"N";s:4:"憎";s:1:"N";s:4:"憲";s:1:"N";s:4:"憤";s:1:"N";s:4:"憯";s:1:"N";s:4:"懞";s:1:"N";s:4:"懲";s:1:"N";s:4:"懶";s:1:"N";s:4:"成";s:1:"N";s:4:"戛";s:1:"N";s:4:"扝";s:1:"N";s:4:"抱";s:1:"N";s:4:"拔";s:1:"N";s:4:"捐";s:1:"N";s:4:"𢬌";s:1:"N";s:4:"挽";s:1:"N";s:4:"拼";s:1:"N";s:4:"捨";s:1:"N";s:4:"掃";s:1:"N";s:4:"揤";s:1:"N";s:4:"𢯱";s:1:"N";s:4:"搢";s:1:"N";s:4:"揅";s:1:"N";s:4:"掩";s:1:"N";s:4:"㨮";s:1:"N";s:4:"摩";s:1:"N";s:4:"摾";s:1:"N";s:4:"撝";s:1:"N";s:4:"摷";s:1:"N";s:4:"㩬";s:1:"N";s:4:"敏";s:1:"N";s:4:"敬";s:1:"N";s:4:"𣀊";s:1:"N";s:4:"旣";s:1:"N";s:4:"書";s:1:"N";s:4:"晉";s:1:"N";s:4:"㬙";s:1:"N";s:4:"暑";s:1:"N";s:4:"㬈";s:1:"N";s:4:"㫤";s:1:"N";s:4:"冒";s:1:"N";s:4:"冕";s:1:"N";s:4:"最";s:1:"N";s:4:"暜";s:1:"N";s:4:"肭";s:1:"N";s:4:"䏙";s:1:"N";s:4:"朗";s:1:"N";s:4:"望";s:1:"N";s:4:"朡";s:1:"N";s:4:"杞";s:1:"N";s:4:"杓";s:1:"N";s:4:"𣏃";s:1:"N";s:4:"㭉";s:1:"N";s:4:"柺";s:1:"N";s:4:"枅";s:1:"N";s:4:"桒";s:1:"N";s:4:"梅";s:1:"N";s:4:"𣑭";s:1:"N";s:4:"梎";s:1:"N";s:4:"栟";s:1:"N";s:4:"椔";s:1:"N";s:4:"㮝";s:1:"N";s:4:"楂";s:1:"N";s:4:"榣";s:1:"N";s:4:"槪";s:1:"N";s:4:"檨";s:1:"N";s:4:"𣚣";s:1:"N";s:4:"櫛";s:1:"N";s:4:"㰘";s:1:"N";s:4:"次";s:1:"N";s:4:"𣢧";s:1:"N";s:4:"歔";s:1:"N";s:4:"㱎";s:1:"N";s:4:"歲";s:1:"N";s:4:"殟";s:1:"N";s:4:"殺";s:1:"N";s:4:"殻";s:1:"N";s:4:"𣪍";s:1:"N";s:4:"𡴋";s:1:"N";s:4:"𣫺";s:1:"N";s:4:"汎";s:1:"N";s:4:"𣲼";s:1:"N";s:4:"沿";s:1:"N";s:4:"泍";s:1:"N";s:4:"汧";s:1:"N";s:4:"洖";s:1:"N";s:4:"派";s:1:"N";s:4:"海";s:1:"N";s:4:"流";s:1:"N";s:4:"浩";s:1:"N";s:4:"浸";s:1:"N";s:4:"涅";s:1:"N";s:4:"𣴞";s:1:"N";s:4:"洴";s:1:"N";s:4:"港";s:1:"N";s:4:"湮";s:1:"N";s:4:"㴳";s:1:"N";s:4:"滋";s:1:"N";s:4:"滇";s:1:"N";s:4:"𣻑";s:1:"N";s:4:"淹";s:1:"N";s:4:"潮";s:1:"N";s:4:"𣽞";s:1:"N";s:4:"𣾎";s:1:"N";s:4:"濆";s:1:"N";s:4:"瀹";s:1:"N";s:4:"瀞";s:1:"N";s:4:"瀛";s:1:"N";s:4:"㶖";s:1:"N";s:4:"灊";s:1:"N";s:4:"災";s:1:"N";s:4:"灷";s:1:"N";s:4:"炭";s:1:"N";s:4:"𠔥";s:1:"N";s:4:"煅";s:1:"N";s:4:"𤉣";s:1:"N";s:4:"熜";s:1:"N";s:4:"𤎫";s:1:"N";s:4:"爨";s:1:"N";s:4:"爵";s:1:"N";s:4:"牐";s:1:"N";s:4:"𤘈";s:1:"N";s:4:"犀";s:1:"N";s:4:"犕";s:1:"N";s:4:"𤜵";s:1:"N";s:4:"𤠔";s:1:"N";s:4:"獺";s:1:"N";s:4:"王";s:1:"N";s:4:"㺬";s:1:"N";s:4:"玥";s:1:"N";s:4:"㺸";s:1:"N";s:4:"㺸";s:1:"N";s:4:"瑇";s:1:"N";s:4:"瑜";s:1:"N";s:4:"瑱";s:1:"N";s:4:"璅";s:1:"N";s:4:"瓊";s:1:"N";s:4:"㼛";s:1:"N";s:4:"甤";s:1:"N";s:4:"𤰶";s:1:"N";s:4:"甾";s:1:"N";s:4:"𤲒";s:1:"N";s:4:"異";s:1:"N";s:4:"𢆟";s:1:"N";s:4:"瘐";s:1:"N";s:4:"𤾡";s:1:"N";s:4:"𤾸";s:1:"N";s:4:"𥁄";s:1:"N";s:4:"㿼";s:1:"N";s:4:"䀈";s:1:"N";s:4:"直";s:1:"N";s:4:"𥃳";s:1:"N";s:4:"𥃲";s:1:"N";s:4:"𥄙";s:1:"N";s:4:"𥄳";s:1:"N";s:4:"眞";s:1:"N";s:4:"真";s:1:"N";s:4:"真";s:1:"N";s:4:"睊";s:1:"N";s:4:"䀹";s:1:"N";s:4:"瞋";s:1:"N";s:4:"䁆";s:1:"N";s:4:"䂖";s:1:"N";s:4:"𥐝";s:1:"N";s:4:"硎";s:1:"N";s:4:"碌";s:1:"N";s:4:"磌";s:1:"N";s:4:"䃣";s:1:"N";s:4:"𥘦";s:1:"N";s:4:"祖";s:1:"N";s:4:"𥚚";s:1:"N";s:4:"𥛅";s:1:"N";s:4:"福";s:1:"N";s:4:"秫";s:1:"N";s:4:"䄯";s:1:"N";s:4:"穀";s:1:"N";s:4:"穊";s:1:"N";s:4:"穏";s:1:"N";s:4:"𥥼";s:1:"N";s:4:"𥪧";s:1:"N";s:4:"𥪧";s:1:"N";s:4:"竮";s:1:"N";s:4:"䈂";s:1:"N";s:4:"𥮫";s:1:"N";s:4:"篆";s:1:"N";s:4:"築";s:1:"N";s:4:"䈧";s:1:"N";s:4:"𥲀";s:1:"N";s:4:"糒";s:1:"N";s:4:"䊠";s:1:"N";s:4:"糨";s:1:"N";s:4:"糣";s:1:"N";s:4:"紀";s:1:"N";s:4:"𥾆";s:1:"N";s:4:"絣";s:1:"N";s:4:"䌁";s:1:"N";s:4:"緇";s:1:"N";s:4:"縂";s:1:"N";s:4:"繅";s:1:"N";s:4:"䌴";s:1:"N";s:4:"𦈨";s:1:"N";s:4:"𦉇";s:1:"N";s:4:"䍙";s:1:"N";s:4:"𦋙";s:1:"N";s:4:"罺";s:1:"N";s:4:"𦌾";s:1:"N";s:4:"羕";s:1:"N";s:4:"翺";s:1:"N";s:4:"者";s:1:"N";s:4:"𦓚";s:1:"N";s:4:"𦔣";s:1:"N";s:4:"聠";s:1:"N";s:4:"𦖨";s:1:"N";s:4:"聰";s:1:"N";s:4:"𣍟";s:1:"N";s:4:"䏕";s:1:"N";s:4:"育";s:1:"N";s:4:"脃";s:1:"N";s:4:"䐋";s:1:"N";s:4:"脾";s:1:"N";s:4:"媵";s:1:"N";s:4:"𦞧";s:1:"N";s:4:"𦞵";s:1:"N";s:4:"𣎓";s:1:"N";s:4:"𣎜";s:1:"N";s:4:"舁";s:1:"N";s:4:"舄";s:1:"N";s:4:"辞";s:1:"N";s:4:"䑫";s:1:"N";s:4:"芑";s:1:"N";s:4:"芋";s:1:"N";s:4:"芝";s:1:"N";s:4:"劳";s:1:"N";s:4:"花";s:1:"N";s:4:"芳";s:1:"N";s:4:"芽";s:1:"N";s:4:"苦";s:1:"N";s:4:"𦬼";s:1:"N";s:4:"若";s:1:"N";s:4:"茝";s:1:"N";s:4:"荣";s:1:"N";s:4:"莭";s:1:"N";s:4:"茣";s:1:"N";s:4:"莽";s:1:"N";s:4:"菧";s:1:"N";s:4:"著";s:1:"N";s:4:"荓";s:1:"N";s:4:"菊";s:1:"N";s:4:"菌";s:1:"N";s:4:"菜";s:1:"N";s:4:"𦰶";s:1:"N";s:4:"𦵫";s:1:"N";s:4:"𦳕";s:1:"N";s:4:"䔫";s:1:"N";s:4:"蓱";s:1:"N";s:4:"蓳";s:1:"N";s:4:"蔖";s:1:"N";s:4:"𧏊";s:1:"N";s:4:"蕤";s:1:"N";s:4:"𦼬";s:1:"N";s:4:"䕝";s:1:"N";s:4:"䕡";s:1:"N";s:4:"𦾱";s:1:"N";s:4:"𧃒";s:1:"N";s:4:"䕫";s:1:"N";s:4:"虐";s:1:"N";s:4:"虜";s:1:"N";s:4:"虧";s:1:"N";s:4:"虩";s:1:"N";s:4:"蚩";s:1:"N";s:4:"蚈";s:1:"N";s:4:"蜎";s:1:"N";s:4:"蛢";s:1:"N";s:4:"蝹";s:1:"N";s:4:"蜨";s:1:"N";s:4:"蝫";s:1:"N";s:4:"螆";s:1:"N";s:4:"䗗";s:1:"N";s:4:"蟡";s:1:"N";s:4:"蠁";s:1:"N";s:4:"䗹";s:1:"N";s:4:"衠";s:1:"N";s:4:"衣";s:1:"N";s:4:"𧙧";s:1:"N";s:4:"裗";s:1:"N";s:4:"裞";s:1:"N";s:4:"䘵";s:1:"N";s:4:"裺";s:1:"N";s:4:"㒻";s:1:"N";s:4:"𧢮";s:1:"N";s:4:"𧥦";s:1:"N";s:4:"䚾";s:1:"N";s:4:"䛇";s:1:"N";s:4:"誠";s:1:"N";s:4:"諭";s:1:"N";s:4:"變";s:1:"N";s:4:"豕";s:1:"N";s:4:"𧲨";s:1:"N";s:4:"貫";s:1:"N";s:4:"賁";s:1:"N";s:4:"贛";s:1:"N";s:4:"起";s:1:"N";s:4:"𧼯";s:1:"N";s:4:"𠠄";s:1:"N";s:4:"跋";s:1:"N";s:4:"趼";s:1:"N";s:4:"跰";s:1:"N";s:4:"𠣞";s:1:"N";s:4:"軔";s:1:"N";s:4:"輸";s:1:"N";s:4:"𨗒";s:1:"N";s:4:"𨗭";s:1:"N";s:4:"邔";s:1:"N";s:4:"郱";s:1:"N";s:4:"鄑";s:1:"N";s:4:"𨜮";s:1:"N";s:4:"鄛";s:1:"N";s:4:"鈸";s:1:"N";s:4:"鋗";s:1:"N";s:4:"鋘";s:1:"N";s:4:"鉼";s:1:"N";s:4:"鏹";s:1:"N";s:4:"鐕";s:1:"N";s:4:"𨯺";s:1:"N";s:4:"開";s:1:"N";s:4:"䦕";s:1:"N";s:4:"閷";s:1:"N";s:4:"𨵷";s:1:"N";s:4:"䧦";s:1:"N";s:4:"雃";s:1:"N";s:4:"嶲";s:1:"N";s:4:"霣";s:1:"N";s:4:"𩅅";s:1:"N";s:4:"𩈚";s:1:"N";s:4:"䩮";s:1:"N";s:4:"䩶";s:1:"N";s:4:"韠";s:1:"N";s:4:"𩐊";s:1:"N";s:4:"䪲";s:1:"N";s:4:"𩒖";s:1:"N";s:4:"頋";s:1:"N";s:4:"頋";s:1:"N";s:4:"頩";s:1:"N";s:4:"𩖶";s:1:"N";s:4:"飢";s:1:"N";s:4:"䬳";s:1:"N";s:4:"餩";s:1:"N";s:4:"馧";s:1:"N";s:4:"駂";s:1:"N";s:4:"駾";s:1:"N";s:4:"䯎";s:1:"N";s:4:"𩬰";s:1:"N";s:4:"鬒";s:1:"N";s:4:"鱀";s:1:"N";s:4:"鳽";s:1:"N";s:4:"䳎";s:1:"N";s:4:"䳭";s:1:"N";s:4:"鵧";s:1:"N";s:4:"𪃎";s:1:"N";s:4:"䳸";s:1:"N";s:4:"𪄅";s:1:"N";s:4:"𪈎";s:1:"N";s:4:"𪊑";s:1:"N";s:4:"麻";s:1:"N";s:4:"䵖";s:1:"N";s:4:"黹";s:1:"N";s:4:"黾";s:1:"N";s:4:"鼅";s:1:"N";s:4:"鼏";s:1:"N";s:4:"鼖";s:1:"N";s:4:"鼻";s:1:"N";s:4:"𪘀";s:1:"N";s:2:"̀";s:1:"M";s:2:"́";s:1:"M";s:2:"̂";s:1:"M";s:2:"̃";s:1:"M";s:2:"̄";s:1:"M";s:2:"̆";s:1:"M";s:2:"̇";s:1:"M";s:2:"̈";s:1:"M";s:2:"̉";s:1:"M";s:2:"̊";s:1:"M";s:2:"̋";s:1:"M";s:2:"̌";s:1:"M";s:2:"̏";s:1:"M";s:2:"̑";s:1:"M";s:2:"̓";s:1:"M";s:2:"̔";s:1:"M";s:2:"̛";s:1:"M";s:2:"̣";s:1:"M";s:2:"̤";s:1:"M";s:2:"̥";s:1:"M";s:2:"̦";s:1:"M";s:2:"̧";s:1:"M";s:2:"̨";s:1:"M";s:2:"̭";s:1:"M";s:2:"̮";s:1:"M";s:2:"̰";s:1:"M";s:2:"̱";s:1:"M";s:2:"̸";s:1:"M";s:2:"͂";s:1:"M";s:2:"ͅ";s:1:"M";s:2:"ٓ";s:1:"M";s:2:"ٔ";s:1:"M";s:2:"ٕ";s:1:"M";s:3:"़";s:1:"M";s:3:"া";s:1:"M";s:3:"ৗ";s:1:"M";s:3:"ା";s:1:"M";s:3:"ୖ";s:1:"M";s:3:"ୗ";s:1:"M";s:3:"ா";s:1:"M";s:3:"ௗ";s:1:"M";s:3:"ౖ";s:1:"M";s:3:"ೂ";s:1:"M";s:3:"ೕ";s:1:"M";s:3:"ೖ";s:1:"M";s:3:"ാ";s:1:"M";s:3:"ൗ";s:1:"M";s:3:"්";s:1:"M";s:3:"ා";s:1:"M";s:3:"ෟ";s:1:"M";s:3:"ီ";s:1:"M";s:3:"ᅡ";s:1:"M";s:3:"ᅢ";s:1:"M";s:3:"ᅣ";s:1:"M";s:3:"ᅤ";s:1:"M";s:3:"ᅥ";s:1:"M";s:3:"ᅦ";s:1:"M";s:3:"ᅧ";s:1:"M";s:3:"ᅨ";s:1:"M";s:3:"ᅩ";s:1:"M";s:3:"ᅪ";s:1:"M";s:3:"ᅫ";s:1:"M";s:3:"ᅬ";s:1:"M";s:3:"ᅭ";s:1:"M";s:3:"ᅮ";s:1:"M";s:3:"ᅯ";s:1:"M";s:3:"ᅰ";s:1:"M";s:3:"ᅱ";s:1:"M";s:3:"ᅲ";s:1:"M";s:3:"ᅳ";s:1:"M";s:3:"ᅴ";s:1:"M";s:3:"ᅵ";s:1:"M";s:3:"ᆨ";s:1:"M";s:3:"ᆩ";s:1:"M";s:3:"ᆪ";s:1:"M";s:3:"ᆫ";s:1:"M";s:3:"ᆬ";s:1:"M";s:3:"ᆭ";s:1:"M";s:3:"ᆮ";s:1:"M";s:3:"ᆯ";s:1:"M";s:3:"ᆰ";s:1:"M";s:3:"ᆱ";s:1:"M";s:3:"ᆲ";s:1:"M";s:3:"ᆳ";s:1:"M";s:3:"ᆴ";s:1:"M";s:3:"ᆵ";s:1:"M";s:3:"ᆶ";s:1:"M";s:3:"ᆷ";s:1:"M";s:3:"ᆸ";s:1:"M";s:3:"ᆹ";s:1:"M";s:3:"ᆺ";s:1:"M";s:3:"ᆻ";s:1:"M";s:3:"ᆼ";s:1:"M";s:3:"ᆽ";s:1:"M";s:3:"ᆾ";s:1:"M";s:3:"ᆿ";s:1:"M";s:3:"ᇀ";s:1:"M";s:3:"ᇁ";s:1:"M";s:3:"ᇂ";s:1:"M";s:3:"ᬵ";s:1:"M";s:3:"゙";s:1:"M";s:3:"゚";s:1:"M";s:4:"𑂺";s:1:"M";}' );
+
diff --git a/includes/libs/normal/UtfNormalDataK.inc b/includes/libs/normal/UtfNormalDataK.inc
new file mode 100644 (file)
index 0000000..dde3eff
--- /dev/null
@@ -0,0 +1,11 @@
+<?php
+/**
+ * This file was automatically generated -- do not edit!
+ * Run UtfNormalGenerate.php to create this file again (make clean && make)
+ *
+ * @file
+ */
+// @codingStandardsIgnoreFile
+
+UtfNormal::$utfCompatibilityDecomp = unserialize( 'a:5559:{s:2:" ";s:1:" ";s:2:"¨";s:3:" ̈";s:2:"ª";s:1:"a";s:2:"¯";s:3:" ̄";s:2:"²";s:1:"2";s:2:"³";s:1:"3";s:2:"´";s:3:" ́";s:2:"µ";s:2:"μ";s:2:"¸";s:3:" ̧";s:2:"¹";s:1:"1";s:2:"º";s:1:"o";s:2:"¼";s:5:"1⁄4";s:2:"½";s:5:"1⁄2";s:2:"¾";s:5:"3⁄4";s:2:"À";s:3:"À";s:2:"Á";s:3:"Á";s:2:"Â";s:3:"Â";s:2:"Ã";s:3:"Ã";s:2:"Ä";s:3:"Ä";s:2:"Å";s:3:"Å";s:2:"Ç";s:3:"Ç";s:2:"È";s:3:"È";s:2:"É";s:3:"É";s:2:"Ê";s:3:"Ê";s:2:"Ë";s:3:"Ë";s:2:"Ì";s:3:"Ì";s:2:"Í";s:3:"Í";s:2:"Î";s:3:"Î";s:2:"Ï";s:3:"Ï";s:2:"Ñ";s:3:"Ñ";s:2:"Ò";s:3:"Ò";s:2:"Ó";s:3:"Ó";s:2:"Ô";s:3:"Ô";s:2:"Õ";s:3:"Õ";s:2:"Ö";s:3:"Ö";s:2:"Ù";s:3:"Ù";s:2:"Ú";s:3:"Ú";s:2:"Û";s:3:"Û";s:2:"Ü";s:3:"Ü";s:2:"Ý";s:3:"Ý";s:2:"à";s:3:"à";s:2:"á";s:3:"á";s:2:"â";s:3:"â";s:2:"ã";s:3:"ã";s:2:"ä";s:3:"ä";s:2:"å";s:3:"å";s:2:"ç";s:3:"ç";s:2:"è";s:3:"è";s:2:"é";s:3:"é";s:2:"ê";s:3:"ê";s:2:"ë";s:3:"ë";s:2:"ì";s:3:"ì";s:2:"í";s:3:"í";s:2:"î";s:3:"î";s:2:"ï";s:3:"ï";s:2:"ñ";s:3:"ñ";s:2:"ò";s:3:"ò";s:2:"ó";s:3:"ó";s:2:"ô";s:3:"ô";s:2:"õ";s:3:"õ";s:2:"ö";s:3:"ö";s:2:"ù";s:3:"ù";s:2:"ú";s:3:"ú";s:2:"û";s:3:"û";s:2:"ü";s:3:"ü";s:2:"ý";s:3:"ý";s:2:"ÿ";s:3:"ÿ";s:2:"Ā";s:3:"Ā";s:2:"ā";s:3:"ā";s:2:"Ă";s:3:"Ă";s:2:"ă";s:3:"ă";s:2:"Ą";s:3:"Ą";s:2:"ą";s:3:"ą";s:2:"Ć";s:3:"Ć";s:2:"ć";s:3:"ć";s:2:"Ĉ";s:3:"Ĉ";s:2:"ĉ";s:3:"ĉ";s:2:"Ċ";s:3:"Ċ";s:2:"ċ";s:3:"ċ";s:2:"Č";s:3:"Č";s:2:"č";s:3:"č";s:2:"Ď";s:3:"Ď";s:2:"ď";s:3:"ď";s:2:"Ē";s:3:"Ē";s:2:"ē";s:3:"ē";s:2:"Ĕ";s:3:"Ĕ";s:2:"ĕ";s:3:"ĕ";s:2:"Ė";s:3:"Ė";s:2:"ė";s:3:"ė";s:2:"Ę";s:3:"Ę";s:2:"ę";s:3:"ę";s:2:"Ě";s:3:"Ě";s:2:"ě";s:3:"ě";s:2:"Ĝ";s:3:"Ĝ";s:2:"ĝ";s:3:"ĝ";s:2:"Ğ";s:3:"Ğ";s:2:"ğ";s:3:"ğ";s:2:"Ġ";s:3:"Ġ";s:2:"ġ";s:3:"ġ";s:2:"Ģ";s:3:"Ģ";s:2:"ģ";s:3:"ģ";s:2:"Ĥ";s:3:"Ĥ";s:2:"ĥ";s:3:"ĥ";s:2:"Ĩ";s:3:"Ĩ";s:2:"ĩ";s:3:"ĩ";s:2:"Ī";s:3:"Ī";s:2:"ī";s:3:"ī";s:2:"Ĭ";s:3:"Ĭ";s:2:"ĭ";s:3:"ĭ";s:2:"Į";s:3:"Į";s:2:"į";s:3:"į";s:2:"İ";s:3:"İ";s:2:"IJ";s:2:"IJ";s:2:"ij";s:2:"ij";s:2:"Ĵ";s:3:"Ĵ";s:2:"ĵ";s:3:"ĵ";s:2:"Ķ";s:3:"Ķ";s:2:"ķ";s:3:"ķ";s:2:"Ĺ";s:3:"Ĺ";s:2:"ĺ";s:3:"ĺ";s:2:"Ļ";s:3:"Ļ";s:2:"ļ";s:3:"ļ";s:2:"Ľ";s:3:"Ľ";s:2:"ľ";s:3:"ľ";s:2:"Ŀ";s:3:"L·";s:2:"ŀ";s:3:"l·";s:2:"Ń";s:3:"Ń";s:2:"ń";s:3:"ń";s:2:"Ņ";s:3:"Ņ";s:2:"ņ";s:3:"ņ";s:2:"Ň";s:3:"Ň";s:2:"ň";s:3:"ň";s:2:"ʼn";s:3:"ʼn";s:2:"Ō";s:3:"Ō";s:2:"ō";s:3:"ō";s:2:"Ŏ";s:3:"Ŏ";s:2:"ŏ";s:3:"ŏ";s:2:"Ő";s:3:"Ő";s:2:"ő";s:3:"ő";s:2:"Ŕ";s:3:"Ŕ";s:2:"ŕ";s:3:"ŕ";s:2:"Ŗ";s:3:"Ŗ";s:2:"ŗ";s:3:"ŗ";s:2:"Ř";s:3:"Ř";s:2:"ř";s:3:"ř";s:2:"Ś";s:3:"Ś";s:2:"ś";s:3:"ś";s:2:"Ŝ";s:3:"Ŝ";s:2:"ŝ";s:3:"ŝ";s:2:"Ş";s:3:"Ş";s:2:"ş";s:3:"ş";s:2:"Š";s:3:"Š";s:2:"š";s:3:"š";s:2:"Ţ";s:3:"Ţ";s:2:"ţ";s:3:"ţ";s:2:"Ť";s:3:"Ť";s:2:"ť";s:3:"ť";s:2:"Ũ";s:3:"Ũ";s:2:"ũ";s:3:"ũ";s:2:"Ū";s:3:"Ū";s:2:"ū";s:3:"ū";s:2:"Ŭ";s:3:"Ŭ";s:2:"ŭ";s:3:"ŭ";s:2:"Ů";s:3:"Ů";s:2:"ů";s:3:"ů";s:2:"Ű";s:3:"Ű";s:2:"ű";s:3:"ű";s:2:"Ų";s:3:"Ų";s:2:"ų";s:3:"ų";s:2:"Ŵ";s:3:"Ŵ";s:2:"ŵ";s:3:"ŵ";s:2:"Ŷ";s:3:"Ŷ";s:2:"ŷ";s:3:"ŷ";s:2:"Ÿ";s:3:"Ÿ";s:2:"Ź";s:3:"Ź";s:2:"ź";s:3:"ź";s:2:"Ż";s:3:"Ż";s:2:"ż";s:3:"ż";s:2:"Ž";s:3:"Ž";s:2:"ž";s:3:"ž";s:2:"ſ";s:1:"s";s:2:"Ơ";s:3:"Ơ";s:2:"ơ";s:3:"ơ";s:2:"Ư";s:3:"Ư";s:2:"ư";s:3:"ư";s:2:"DŽ";s:4:"DŽ";s:2:"Dž";s:4:"Dž";s:2:"dž";s:4:"dž";s:2:"LJ";s:2:"LJ";s:2:"Lj";s:2:"Lj";s:2:"lj";s:2:"lj";s:2:"NJ";s:2:"NJ";s:2:"Nj";s:2:"Nj";s:2:"nj";s:2:"nj";s:2:"Ǎ";s:3:"Ǎ";s:2:"ǎ";s:3:"ǎ";s:2:"Ǐ";s:3:"Ǐ";s:2:"ǐ";s:3:"ǐ";s:2:"Ǒ";s:3:"Ǒ";s:2:"ǒ";s:3:"ǒ";s:2:"Ǔ";s:3:"Ǔ";s:2:"ǔ";s:3:"ǔ";s:2:"Ǖ";s:5:"Ǖ";s:2:"ǖ";s:5:"ǖ";s:2:"Ǘ";s:5:"Ǘ";s:2:"ǘ";s:5:"ǘ";s:2:"Ǚ";s:5:"Ǚ";s:2:"ǚ";s:5:"ǚ";s:2:"Ǜ";s:5:"Ǜ";s:2:"ǜ";s:5:"ǜ";s:2:"Ǟ";s:5:"Ǟ";s:2:"ǟ";s:5:"ǟ";s:2:"Ǡ";s:5:"Ǡ";s:2:"ǡ";s:5:"ǡ";s:2:"Ǣ";s:4:"Ǣ";s:2:"ǣ";s:4:"ǣ";s:2:"Ǧ";s:3:"Ǧ";s:2:"ǧ";s:3:"ǧ";s:2:"Ǩ";s:3:"Ǩ";s:2:"ǩ";s:3:"ǩ";s:2:"Ǫ";s:3:"Ǫ";s:2:"ǫ";s:3:"ǫ";s:2:"Ǭ";s:5:"Ǭ";s:2:"ǭ";s:5:"ǭ";s:2:"Ǯ";s:4:"Ǯ";s:2:"ǯ";s:4:"ǯ";s:2:"ǰ";s:3:"ǰ";s:2:"DZ";s:2:"DZ";s:2:"Dz";s:2:"Dz";s:2:"dz";s:2:"dz";s:2:"Ǵ";s:3:"Ǵ";s:2:"ǵ";s:3:"ǵ";s:2:"Ǹ";s:3:"Ǹ";s:2:"ǹ";s:3:"ǹ";s:2:"Ǻ";s:5:"Ǻ";s:2:"ǻ";s:5:"ǻ";s:2:"Ǽ";s:4:"Ǽ";s:2:"ǽ";s:4:"ǽ";s:2:"Ǿ";s:4:"Ǿ";s:2:"ǿ";s:4:"ǿ";s:2:"Ȁ";s:3:"Ȁ";s:2:"ȁ";s:3:"ȁ";s:2:"Ȃ";s:3:"Ȃ";s:2:"ȃ";s:3:"ȃ";s:2:"Ȅ";s:3:"Ȅ";s:2:"ȅ";s:3:"ȅ";s:2:"Ȇ";s:3:"Ȇ";s:2:"ȇ";s:3:"ȇ";s:2:"Ȉ";s:3:"Ȉ";s:2:"ȉ";s:3:"ȉ";s:2:"Ȋ";s:3:"Ȋ";s:2:"ȋ";s:3:"ȋ";s:2:"Ȍ";s:3:"Ȍ";s:2:"ȍ";s:3:"ȍ";s:2:"Ȏ";s:3:"Ȏ";s:2:"ȏ";s:3:"ȏ";s:2:"Ȑ";s:3:"Ȑ";s:2:"ȑ";s:3:"ȑ";s:2:"Ȓ";s:3:"Ȓ";s:2:"ȓ";s:3:"ȓ";s:2:"Ȕ";s:3:"Ȕ";s:2:"ȕ";s:3:"ȕ";s:2:"Ȗ";s:3:"Ȗ";s:2:"ȗ";s:3:"ȗ";s:2:"Ș";s:3:"Ș";s:2:"ș";s:3:"ș";s:2:"Ț";s:3:"Ț";s:2:"ț";s:3:"ț";s:2:"Ȟ";s:3:"Ȟ";s:2:"ȟ";s:3:"ȟ";s:2:"Ȧ";s:3:"Ȧ";s:2:"ȧ";s:3:"ȧ";s:2:"Ȩ";s:3:"Ȩ";s:2:"ȩ";s:3:"ȩ";s:2:"Ȫ";s:5:"Ȫ";s:2:"ȫ";s:5:"ȫ";s:2:"Ȭ";s:5:"Ȭ";s:2:"ȭ";s:5:"ȭ";s:2:"Ȯ";s:3:"Ȯ";s:2:"ȯ";s:3:"ȯ";s:2:"Ȱ";s:5:"Ȱ";s:2:"ȱ";s:5:"ȱ";s:2:"Ȳ";s:3:"Ȳ";s:2:"ȳ";s:3:"ȳ";s:2:"ʰ";s:1:"h";s:2:"ʱ";s:2:"ɦ";s:2:"ʲ";s:1:"j";s:2:"ʳ";s:1:"r";s:2:"ʴ";s:2:"ɹ";s:2:"ʵ";s:2:"ɻ";s:2:"ʶ";s:2:"ʁ";s:2:"ʷ";s:1:"w";s:2:"ʸ";s:1:"y";s:2:"˘";s:3:" ̆";s:2:"˙";s:3:" ̇";s:2:"˚";s:3:" ̊";s:2:"˛";s:3:" ̨";s:2:"˜";s:3:" ̃";s:2:"˝";s:3:" ̋";s:2:"ˠ";s:2:"ɣ";s:2:"ˡ";s:1:"l";s:2:"ˢ";s:1:"s";s:2:"ˣ";s:1:"x";s:2:"ˤ";s:2:"ʕ";s:2:"̀";s:2:"̀";s:2:"́";s:2:"́";s:2:"̓";s:2:"̓";s:2:"̈́";s:4:"̈́";s:2:"ʹ";s:2:"ʹ";s:2:"ͺ";s:3:" ͅ";s:2:";";s:1:";";s:2:"΄";s:3:" ́";s:2:"΅";s:5:" ̈́";s:2:"Ά";s:4:"Ά";s:2:"·";s:2:"·";s:2:"Έ";s:4:"Έ";s:2:"Ή";s:4:"Ή";s:2:"Ί";s:4:"Ί";s:2:"Ό";s:4:"Ό";s:2:"Ύ";s:4:"Ύ";s:2:"Ώ";s:4:"Ώ";s:2:"ΐ";s:6:"ΐ";s:2:"Ϊ";s:4:"Ϊ";s:2:"Ϋ";s:4:"Ϋ";s:2:"ά";s:4:"ά";s:2:"έ";s:4:"έ";s:2:"ή";s:4:"ή";s:2:"ί";s:4:"ί";s:2:"ΰ";s:6:"ΰ";s:2:"ϊ";s:4:"ϊ";s:2:"ϋ";s:4:"ϋ";s:2:"ό";s:4:"ό";s:2:"ύ";s:4:"ύ";s:2:"ώ";s:4:"ώ";s:2:"ϐ";s:2:"β";s:2:"ϑ";s:2:"θ";s:2:"ϒ";s:2:"Υ";s:2:"ϓ";s:4:"Ύ";s:2:"ϔ";s:4:"Ϋ";s:2:"ϕ";s:2:"φ";s:2:"ϖ";s:2:"π";s:2:"ϰ";s:2:"κ";s:2:"ϱ";s:2:"ρ";s:2:"ϲ";s:2:"ς";s:2:"ϴ";s:2:"Θ";s:2:"ϵ";s:2:"ε";s:2:"Ϲ";s:2:"Σ";s:2:"Ѐ";s:4:"Ѐ";s:2:"Ё";s:4:"Ё";s:2:"Ѓ";s:4:"Ѓ";s:2:"Ї";s:4:"Ї";s:2:"Ќ";s:4:"Ќ";s:2:"Ѝ";s:4:"Ѝ";s:2:"Ў";s:4:"Ў";s:2:"Й";s:4:"Й";s:2:"й";s:4:"й";s:2:"ѐ";s:4:"ѐ";s:2:"ё";s:4:"ё";s:2:"ѓ";s:4:"ѓ";s:2:"ї";s:4:"ї";s:2:"ќ";s:4:"ќ";s:2:"ѝ";s:4:"ѝ";s:2:"ў";s:4:"ў";s:2:"Ѷ";s:4:"Ѷ";s:2:"ѷ";s:4:"ѷ";s:2:"Ӂ";s:4:"Ӂ";s:2:"ӂ";s:4:"ӂ";s:2:"Ӑ";s:4:"Ӑ";s:2:"ӑ";s:4:"ӑ";s:2:"Ӓ";s:4:"Ӓ";s:2:"ӓ";s:4:"ӓ";s:2:"Ӗ";s:4:"Ӗ";s:2:"ӗ";s:4:"ӗ";s:2:"Ӛ";s:4:"Ӛ";s:2:"ӛ";s:4:"ӛ";s:2:"Ӝ";s:4:"Ӝ";s:2:"ӝ";s:4:"ӝ";s:2:"Ӟ";s:4:"Ӟ";s:2:"ӟ";s:4:"ӟ";s:2:"Ӣ";s:4:"Ӣ";s:2:"ӣ";s:4:"ӣ";s:2:"Ӥ";s:4:"Ӥ";s:2:"ӥ";s:4:"ӥ";s:2:"Ӧ";s:4:"Ӧ";s:2:"ӧ";s:4:"ӧ";s:2:"Ӫ";s:4:"Ӫ";s:2:"ӫ";s:4:"ӫ";s:2:"Ӭ";s:4:"Ӭ";s:2:"ӭ";s:4:"ӭ";s:2:"Ӯ";s:4:"Ӯ";s:2:"ӯ";s:4:"ӯ";s:2:"Ӱ";s:4:"Ӱ";s:2:"ӱ";s:4:"ӱ";s:2:"Ӳ";s:4:"Ӳ";s:2:"ӳ";s:4:"ӳ";s:2:"Ӵ";s:4:"Ӵ";s:2:"ӵ";s:4:"ӵ";s:2:"Ӹ";s:4:"Ӹ";s:2:"ӹ";s:4:"ӹ";s:2:"և";s:4:"եւ";s:2:"آ";s:4:"آ";s:2:"أ";s:4:"أ";s:2:"ؤ";s:4:"ؤ";s:2:"إ";s:4:"إ";s:2:"ئ";s:4:"ئ";s:2:"ٵ";s:4:"اٴ";s:2:"ٶ";s:4:"وٴ";s:2:"ٷ";s:4:"ۇٴ";s:2:"ٸ";s:4:"يٴ";s:2:"ۀ";s:4:"ۀ";s:2:"ۂ";s:4:"ۂ";s:2:"ۓ";s:4:"ۓ";s:3:"ऩ";s:6:"ऩ";s:3:"ऱ";s:6:"ऱ";s:3:"ऴ";s:6:"ऴ";s:3:"क़";s:6:"क़";s:3:"ख़";s:6:"ख़";s:3:"ग़";s:6:"ग़";s:3:"ज़";s:6:"ज़";s:3:"ड़";s:6:"ड़";s:3:"ढ़";s:6:"ढ़";s:3:"फ़";s:6:"फ़";s:3:"य़";s:6:"य़";s:3:"ো";s:6:"ো";s:3:"ৌ";s:6:"ৌ";s:3:"ড়";s:6:"ড়";s:3:"ঢ়";s:6:"ঢ়";s:3:"য়";s:6:"য়";s:3:"ਲ਼";s:6:"ਲ਼";s:3:"ਸ਼";s:6:"ਸ਼";s:3:"ਖ਼";s:6:"ਖ਼";s:3:"ਗ਼";s:6:"ਗ਼";s:3:"ਜ਼";s:6:"ਜ਼";s:3:"ਫ਼";s:6:"ਫ਼";s:3:"ୈ";s:6:"ୈ";s:3:"ୋ";s:6:"ୋ";s:3:"ୌ";s:6:"ୌ";s:3:"ଡ଼";s:6:"ଡ଼";s:3:"ଢ଼";s:6:"ଢ଼";s:3:"ஔ";s:6:"ஔ";s:3:"ொ";s:6:"ொ";s:3:"ோ";s:6:"ோ";s:3:"ௌ";s:6:"ௌ";s:3:"ై";s:6:"ై";s:3:"ೀ";s:6:"ೀ";s:3:"ೇ";s:6:"ೇ";s:3:"ೈ";s:6:"ೈ";s:3:"ೊ";s:6:"ೊ";s:3:"ೋ";s:9:"ೋ";s:3:"ൊ";s:6:"ൊ";s:3:"ോ";s:6:"ോ";s:3:"ൌ";s:6:"ൌ";s:3:"ේ";s:6:"ේ";s:3:"ො";s:6:"ො";s:3:"ෝ";s:9:"ෝ";s:3:"ෞ";s:6:"ෞ";s:3:"ำ";s:6:"ํา";s:3:"ຳ";s:6:"ໍາ";s:3:"ໜ";s:6:"ຫນ";s:3:"ໝ";s:6:"ຫມ";s:3:"༌";s:3:"་";s:3:"གྷ";s:6:"གྷ";s:3:"ཌྷ";s:6:"ཌྷ";s:3:"དྷ";s:6:"དྷ";s:3:"བྷ";s:6:"བྷ";s:3:"ཛྷ";s:6:"ཛྷ";s:3:"ཀྵ";s:6:"ཀྵ";s:3:"ཱི";s:6:"ཱི";s:3:"ཱུ";s:6:"ཱུ";s:3:"ྲྀ";s:6:"ྲྀ";s:3:"ཷ";s:9:"ྲཱྀ";s:3:"ླྀ";s:6:"ླྀ";s:3:"ཹ";s:9:"ླཱྀ";s:3:"ཱྀ";s:6:"ཱྀ";s:3:"ྒྷ";s:6:"ྒྷ";s:3:"ྜྷ";s:6:"ྜྷ";s:3:"ྡྷ";s:6:"ྡྷ";s:3:"ྦྷ";s:6:"ྦྷ";s:3:"ྫྷ";s:6:"ྫྷ";s:3:"ྐྵ";s:6:"ྐྵ";s:3:"ဦ";s:6:"ဦ";s:3:"ჼ";s:3:"ნ";s:3:"ᬆ";s:6:"ᬆ";s:3:"ᬈ";s:6:"ᬈ";s:3:"ᬊ";s:6:"ᬊ";s:3:"ᬌ";s:6:"ᬌ";s:3:"ᬎ";s:6:"ᬎ";s:3:"ᬒ";s:6:"ᬒ";s:3:"ᬻ";s:6:"ᬻ";s:3:"ᬽ";s:6:"ᬽ";s:3:"ᭀ";s:6:"ᭀ";s:3:"ᭁ";s:6:"ᭁ";s:3:"ᭃ";s:6:"ᭃ";s:3:"ᴬ";s:1:"A";s:3:"ᴭ";s:2:"Æ";s:3:"ᴮ";s:1:"B";s:3:"ᴰ";s:1:"D";s:3:"ᴱ";s:1:"E";s:3:"ᴲ";s:2:"Ǝ";s:3:"ᴳ";s:1:"G";s:3:"ᴴ";s:1:"H";s:3:"ᴵ";s:1:"I";s:3:"ᴶ";s:1:"J";s:3:"ᴷ";s:1:"K";s:3:"ᴸ";s:1:"L";s:3:"ᴹ";s:1:"M";s:3:"ᴺ";s:1:"N";s:3:"ᴼ";s:1:"O";s:3:"ᴽ";s:2:"Ȣ";s:3:"ᴾ";s:1:"P";s:3:"ᴿ";s:1:"R";s:3:"ᵀ";s:1:"T";s:3:"ᵁ";s:1:"U";s:3:"ᵂ";s:1:"W";s:3:"ᵃ";s:1:"a";s:3:"ᵄ";s:2:"ɐ";s:3:"ᵅ";s:2:"ɑ";s:3:"ᵆ";s:3:"ᴂ";s:3:"ᵇ";s:1:"b";s:3:"ᵈ";s:1:"d";s:3:"ᵉ";s:1:"e";s:3:"ᵊ";s:2:"ə";s:3:"ᵋ";s:2:"ɛ";s:3:"ᵌ";s:2:"ɜ";s:3:"ᵍ";s:1:"g";s:3:"ᵏ";s:1:"k";s:3:"ᵐ";s:1:"m";s:3:"ᵑ";s:2:"ŋ";s:3:"ᵒ";s:1:"o";s:3:"ᵓ";s:2:"ɔ";s:3:"ᵔ";s:3:"ᴖ";s:3:"ᵕ";s:3:"ᴗ";s:3:"ᵖ";s:1:"p";s:3:"ᵗ";s:1:"t";s:3:"ᵘ";s:1:"u";s:3:"ᵙ";s:3:"ᴝ";s:3:"ᵚ";s:2:"ɯ";s:3:"ᵛ";s:1:"v";s:3:"ᵜ";s:3:"ᴥ";s:3:"ᵝ";s:2:"β";s:3:"ᵞ";s:2:"γ";s:3:"ᵟ";s:2:"δ";s:3:"ᵠ";s:2:"φ";s:3:"ᵡ";s:2:"χ";s:3:"ᵢ";s:1:"i";s:3:"ᵣ";s:1:"r";s:3:"ᵤ";s:1:"u";s:3:"ᵥ";s:1:"v";s:3:"ᵦ";s:2:"β";s:3:"ᵧ";s:2:"γ";s:3:"ᵨ";s:2:"ρ";s:3:"ᵩ";s:2:"φ";s:3:"ᵪ";s:2:"χ";s:3:"ᵸ";s:2:"н";s:3:"ᶛ";s:2:"ɒ";s:3:"ᶜ";s:1:"c";s:3:"ᶝ";s:2:"ɕ";s:3:"ᶞ";s:2:"ð";s:3:"ᶟ";s:2:"ɜ";s:3:"ᶠ";s:1:"f";s:3:"ᶡ";s:2:"ɟ";s:3:"ᶢ";s:2:"ɡ";s:3:"ᶣ";s:2:"ɥ";s:3:"ᶤ";s:2:"ɨ";s:3:"ᶥ";s:2:"ɩ";s:3:"ᶦ";s:2:"ɪ";s:3:"ᶧ";s:3:"ᵻ";s:3:"ᶨ";s:2:"ʝ";s:3:"ᶩ";s:2:"ɭ";s:3:"ᶪ";s:3:"ᶅ";s:3:"ᶫ";s:2:"ʟ";s:3:"ᶬ";s:2:"ɱ";s:3:"ᶭ";s:2:"ɰ";s:3:"ᶮ";s:2:"ɲ";s:3:"ᶯ";s:2:"ɳ";s:3:"ᶰ";s:2:"ɴ";s:3:"ᶱ";s:2:"ɵ";s:3:"ᶲ";s:2:"ɸ";s:3:"ᶳ";s:2:"ʂ";s:3:"ᶴ";s:2:"ʃ";s:3:"ᶵ";s:2:"ƫ";s:3:"ᶶ";s:2:"ʉ";s:3:"ᶷ";s:2:"ʊ";s:3:"ᶸ";s:3:"ᴜ";s:3:"ᶹ";s:2:"ʋ";s:3:"ᶺ";s:2:"ʌ";s:3:"ᶻ";s:1:"z";s:3:"ᶼ";s:2:"ʐ";s:3:"ᶽ";s:2:"ʑ";s:3:"ᶾ";s:2:"ʒ";s:3:"ᶿ";s:2:"θ";s:3:"Ḁ";s:3:"Ḁ";s:3:"ḁ";s:3:"ḁ";s:3:"Ḃ";s:3:"Ḃ";s:3:"ḃ";s:3:"ḃ";s:3:"Ḅ";s:3:"Ḅ";s:3:"ḅ";s:3:"ḅ";s:3:"Ḇ";s:3:"Ḇ";s:3:"ḇ";s:3:"ḇ";s:3:"Ḉ";s:5:"Ḉ";s:3:"ḉ";s:5:"ḉ";s:3:"Ḋ";s:3:"Ḋ";s:3:"ḋ";s:3:"ḋ";s:3:"Ḍ";s:3:"Ḍ";s:3:"ḍ";s:3:"ḍ";s:3:"Ḏ";s:3:"Ḏ";s:3:"ḏ";s:3:"ḏ";s:3:"Ḑ";s:3:"Ḑ";s:3:"ḑ";s:3:"ḑ";s:3:"Ḓ";s:3:"Ḓ";s:3:"ḓ";s:3:"ḓ";s:3:"Ḕ";s:5:"Ḕ";s:3:"ḕ";s:5:"ḕ";s:3:"Ḗ";s:5:"Ḗ";s:3:"ḗ";s:5:"ḗ";s:3:"Ḙ";s:3:"Ḙ";s:3:"ḙ";s:3:"ḙ";s:3:"Ḛ";s:3:"Ḛ";s:3:"ḛ";s:3:"ḛ";s:3:"Ḝ";s:5:"Ḝ";s:3:"ḝ";s:5:"ḝ";s:3:"Ḟ";s:3:"Ḟ";s:3:"ḟ";s:3:"ḟ";s:3:"Ḡ";s:3:"Ḡ";s:3:"ḡ";s:3:"ḡ";s:3:"Ḣ";s:3:"Ḣ";s:3:"ḣ";s:3:"ḣ";s:3:"Ḥ";s:3:"Ḥ";s:3:"ḥ";s:3:"ḥ";s:3:"Ḧ";s:3:"Ḧ";s:3:"ḧ";s:3:"ḧ";s:3:"Ḩ";s:3:"Ḩ";s:3:"ḩ";s:3:"ḩ";s:3:"Ḫ";s:3:"Ḫ";s:3:"ḫ";s:3:"ḫ";s:3:"Ḭ";s:3:"Ḭ";s:3:"ḭ";s:3:"ḭ";s:3:"Ḯ";s:5:"Ḯ";s:3:"ḯ";s:5:"ḯ";s:3:"Ḱ";s:3:"Ḱ";s:3:"ḱ";s:3:"ḱ";s:3:"Ḳ";s:3:"Ḳ";s:3:"ḳ";s:3:"ḳ";s:3:"Ḵ";s:3:"Ḵ";s:3:"ḵ";s:3:"ḵ";s:3:"Ḷ";s:3:"Ḷ";s:3:"ḷ";s:3:"ḷ";s:3:"Ḹ";s:5:"Ḹ";s:3:"ḹ";s:5:"ḹ";s:3:"Ḻ";s:3:"Ḻ";s:3:"ḻ";s:3:"ḻ";s:3:"Ḽ";s:3:"Ḽ";s:3:"ḽ";s:3:"ḽ";s:3:"Ḿ";s:3:"Ḿ";s:3:"ḿ";s:3:"ḿ";s:3:"Ṁ";s:3:"Ṁ";s:3:"ṁ";s:3:"ṁ";s:3:"Ṃ";s:3:"Ṃ";s:3:"ṃ";s:3:"ṃ";s:3:"Ṅ";s:3:"Ṅ";s:3:"ṅ";s:3:"ṅ";s:3:"Ṇ";s:3:"Ṇ";s:3:"ṇ";s:3:"ṇ";s:3:"Ṉ";s:3:"Ṉ";s:3:"ṉ";s:3:"ṉ";s:3:"Ṋ";s:3:"Ṋ";s:3:"ṋ";s:3:"ṋ";s:3:"Ṍ";s:5:"Ṍ";s:3:"ṍ";s:5:"ṍ";s:3:"Ṏ";s:5:"Ṏ";s:3:"ṏ";s:5:"ṏ";s:3:"Ṑ";s:5:"Ṑ";s:3:"ṑ";s:5:"ṑ";s:3:"Ṓ";s:5:"Ṓ";s:3:"ṓ";s:5:"ṓ";s:3:"Ṕ";s:3:"Ṕ";s:3:"ṕ";s:3:"ṕ";s:3:"Ṗ";s:3:"Ṗ";s:3:"ṗ";s:3:"ṗ";s:3:"Ṙ";s:3:"Ṙ";s:3:"ṙ";s:3:"ṙ";s:3:"Ṛ";s:3:"Ṛ";s:3:"ṛ";s:3:"ṛ";s:3:"Ṝ";s:5:"Ṝ";s:3:"ṝ";s:5:"ṝ";s:3:"Ṟ";s:3:"Ṟ";s:3:"ṟ";s:3:"ṟ";s:3:"Ṡ";s:3:"Ṡ";s:3:"ṡ";s:3:"ṡ";s:3:"Ṣ";s:3:"Ṣ";s:3:"ṣ";s:3:"ṣ";s:3:"Ṥ";s:5:"Ṥ";s:3:"ṥ";s:5:"ṥ";s:3:"Ṧ";s:5:"Ṧ";s:3:"ṧ";s:5:"ṧ";s:3:"Ṩ";s:5:"Ṩ";s:3:"ṩ";s:5:"ṩ";s:3:"Ṫ";s:3:"Ṫ";s:3:"ṫ";s:3:"ṫ";s:3:"Ṭ";s:3:"Ṭ";s:3:"ṭ";s:3:"ṭ";s:3:"Ṯ";s:3:"Ṯ";s:3:"ṯ";s:3:"ṯ";s:3:"Ṱ";s:3:"Ṱ";s:3:"ṱ";s:3:"ṱ";s:3:"Ṳ";s:3:"Ṳ";s:3:"ṳ";s:3:"ṳ";s:3:"Ṵ";s:3:"Ṵ";s:3:"ṵ";s:3:"ṵ";s:3:"Ṷ";s:3:"Ṷ";s:3:"ṷ";s:3:"ṷ";s:3:"Ṹ";s:5:"Ṹ";s:3:"ṹ";s:5:"ṹ";s:3:"Ṻ";s:5:"Ṻ";s:3:"ṻ";s:5:"ṻ";s:3:"Ṽ";s:3:"Ṽ";s:3:"ṽ";s:3:"ṽ";s:3:"Ṿ";s:3:"Ṿ";s:3:"ṿ";s:3:"ṿ";s:3:"Ẁ";s:3:"Ẁ";s:3:"ẁ";s:3:"ẁ";s:3:"Ẃ";s:3:"Ẃ";s:3:"ẃ";s:3:"ẃ";s:3:"Ẅ";s:3:"Ẅ";s:3:"ẅ";s:3:"ẅ";s:3:"Ẇ";s:3:"Ẇ";s:3:"ẇ";s:3:"ẇ";s:3:"Ẉ";s:3:"Ẉ";s:3:"ẉ";s:3:"ẉ";s:3:"Ẋ";s:3:"Ẋ";s:3:"ẋ";s:3:"ẋ";s:3:"Ẍ";s:3:"Ẍ";s:3:"ẍ";s:3:"ẍ";s:3:"Ẏ";s:3:"Ẏ";s:3:"ẏ";s:3:"ẏ";s:3:"Ẑ";s:3:"Ẑ";s:3:"ẑ";s:3:"ẑ";s:3:"Ẓ";s:3:"Ẓ";s:3:"ẓ";s:3:"ẓ";s:3:"Ẕ";s:3:"Ẕ";s:3:"ẕ";s:3:"ẕ";s:3:"ẖ";s:3:"ẖ";s:3:"ẗ";s:3:"ẗ";s:3:"ẘ";s:3:"ẘ";s:3:"ẙ";s:3:"ẙ";s:3:"ẚ";s:3:"aʾ";s:3:"ẛ";s:3:"ṡ";s:3:"Ạ";s:3:"Ạ";s:3:"ạ";s:3:"ạ";s:3:"Ả";s:3:"Ả";s:3:"ả";s:3:"ả";s:3:"Ấ";s:5:"Ấ";s:3:"ấ";s:5:"ấ";s:3:"Ầ";s:5:"Ầ";s:3:"ầ";s:5:"ầ";s:3:"Ẩ";s:5:"Ẩ";s:3:"ẩ";s:5:"ẩ";s:3:"Ẫ";s:5:"Ẫ";s:3:"ẫ";s:5:"ẫ";s:3:"Ậ";s:5:"Ậ";s:3:"ậ";s:5:"ậ";s:3:"Ắ";s:5:"Ắ";s:3:"ắ";s:5:"ắ";s:3:"Ằ";s:5:"Ằ";s:3:"ằ";s:5:"ằ";s:3:"Ẳ";s:5:"Ẳ";s:3:"ẳ";s:5:"ẳ";s:3:"Ẵ";s:5:"Ẵ";s:3:"ẵ";s:5:"ẵ";s:3:"Ặ";s:5:"Ặ";s:3:"ặ";s:5:"ặ";s:3:"Ẹ";s:3:"Ẹ";s:3:"ẹ";s:3:"ẹ";s:3:"Ẻ";s:3:"Ẻ";s:3:"ẻ";s:3:"ẻ";s:3:"Ẽ";s:3:"Ẽ";s:3:"ẽ";s:3:"ẽ";s:3:"Ế";s:5:"Ế";s:3:"ế";s:5:"ế";s:3:"Ề";s:5:"Ề";s:3:"ề";s:5:"ề";s:3:"Ể";s:5:"Ể";s:3:"ể";s:5:"ể";s:3:"Ễ";s:5:"Ễ";s:3:"ễ";s:5:"ễ";s:3:"Ệ";s:5:"Ệ";s:3:"ệ";s:5:"ệ";s:3:"Ỉ";s:3:"Ỉ";s:3:"ỉ";s:3:"ỉ";s:3:"Ị";s:3:"Ị";s:3:"ị";s:3:"ị";s:3:"Ọ";s:3:"Ọ";s:3:"ọ";s:3:"ọ";s:3:"Ỏ";s:3:"Ỏ";s:3:"ỏ";s:3:"ỏ";s:3:"Ố";s:5:"Ố";s:3:"ố";s:5:"ố";s:3:"Ồ";s:5:"Ồ";s:3:"ồ";s:5:"ồ";s:3:"Ổ";s:5:"Ổ";s:3:"ổ";s:5:"ổ";s:3:"Ỗ";s:5:"Ỗ";s:3:"ỗ";s:5:"ỗ";s:3:"Ộ";s:5:"Ộ";s:3:"ộ";s:5:"ộ";s:3:"Ớ";s:5:"Ớ";s:3:"ớ";s:5:"ớ";s:3:"Ờ";s:5:"Ờ";s:3:"ờ";s:5:"ờ";s:3:"Ở";s:5:"Ở";s:3:"ở";s:5:"ở";s:3:"Ỡ";s:5:"Ỡ";s:3:"ỡ";s:5:"ỡ";s:3:"Ợ";s:5:"Ợ";s:3:"ợ";s:5:"ợ";s:3:"Ụ";s:3:"Ụ";s:3:"ụ";s:3:"ụ";s:3:"Ủ";s:3:"Ủ";s:3:"ủ";s:3:"ủ";s:3:"Ứ";s:5:"Ứ";s:3:"ứ";s:5:"ứ";s:3:"Ừ";s:5:"Ừ";s:3:"ừ";s:5:"ừ";s:3:"Ử";s:5:"Ử";s:3:"ử";s:5:"ử";s:3:"Ữ";s:5:"Ữ";s:3:"ữ";s:5:"ữ";s:3:"Ự";s:5:"Ự";s:3:"ự";s:5:"ự";s:3:"Ỳ";s:3:"Ỳ";s:3:"ỳ";s:3:"ỳ";s:3:"Ỵ";s:3:"Ỵ";s:3:"ỵ";s:3:"ỵ";s:3:"Ỷ";s:3:"Ỷ";s:3:"ỷ";s:3:"ỷ";s:3:"Ỹ";s:3:"Ỹ";s:3:"ỹ";s:3:"ỹ";s:3:"ἀ";s:4:"ἀ";s:3:"ἁ";s:4:"ἁ";s:3:"ἂ";s:6:"ἂ";s:3:"ἃ";s:6:"ἃ";s:3:"ἄ";s:6:"ἄ";s:3:"ἅ";s:6:"ἅ";s:3:"ἆ";s:6:"ἆ";s:3:"ἇ";s:6:"ἇ";s:3:"Ἀ";s:4:"Ἀ";s:3:"Ἁ";s:4:"Ἁ";s:3:"Ἂ";s:6:"Ἂ";s:3:"Ἃ";s:6:"Ἃ";s:3:"Ἄ";s:6:"Ἄ";s:3:"Ἅ";s:6:"Ἅ";s:3:"Ἆ";s:6:"Ἆ";s:3:"Ἇ";s:6:"Ἇ";s:3:"ἐ";s:4:"ἐ";s:3:"ἑ";s:4:"ἑ";s:3:"ἒ";s:6:"ἒ";s:3:"ἓ";s:6:"ἓ";s:3:"ἔ";s:6:"ἔ";s:3:"ἕ";s:6:"ἕ";s:3:"Ἐ";s:4:"Ἐ";s:3:"Ἑ";s:4:"Ἑ";s:3:"Ἒ";s:6:"Ἒ";s:3:"Ἓ";s:6:"Ἓ";s:3:"Ἔ";s:6:"Ἔ";s:3:"Ἕ";s:6:"Ἕ";s:3:"ἠ";s:4:"ἠ";s:3:"ἡ";s:4:"ἡ";s:3:"ἢ";s:6:"ἢ";s:3:"ἣ";s:6:"ἣ";s:3:"ἤ";s:6:"ἤ";s:3:"ἥ";s:6:"ἥ";s:3:"ἦ";s:6:"ἦ";s:3:"ἧ";s:6:"ἧ";s:3:"Ἠ";s:4:"Ἠ";s:3:"Ἡ";s:4:"Ἡ";s:3:"Ἢ";s:6:"Ἢ";s:3:"Ἣ";s:6:"Ἣ";s:3:"Ἤ";s:6:"Ἤ";s:3:"Ἥ";s:6:"Ἥ";s:3:"Ἦ";s:6:"Ἦ";s:3:"Ἧ";s:6:"Ἧ";s:3:"ἰ";s:4:"ἰ";s:3:"ἱ";s:4:"ἱ";s:3:"ἲ";s:6:"ἲ";s:3:"ἳ";s:6:"ἳ";s:3:"ἴ";s:6:"ἴ";s:3:"ἵ";s:6:"ἵ";s:3:"ἶ";s:6:"ἶ";s:3:"ἷ";s:6:"ἷ";s:3:"Ἰ";s:4:"Ἰ";s:3:"Ἱ";s:4:"Ἱ";s:3:"Ἲ";s:6:"Ἲ";s:3:"Ἳ";s:6:"Ἳ";s:3:"Ἴ";s:6:"Ἴ";s:3:"Ἵ";s:6:"Ἵ";s:3:"Ἶ";s:6:"Ἶ";s:3:"Ἷ";s:6:"Ἷ";s:3:"ὀ";s:4:"ὀ";s:3:"ὁ";s:4:"ὁ";s:3:"ὂ";s:6:"ὂ";s:3:"ὃ";s:6:"ὃ";s:3:"ὄ";s:6:"ὄ";s:3:"ὅ";s:6:"ὅ";s:3:"Ὀ";s:4:"Ὀ";s:3:"Ὁ";s:4:"Ὁ";s:3:"Ὂ";s:6:"Ὂ";s:3:"Ὃ";s:6:"Ὃ";s:3:"Ὄ";s:6:"Ὄ";s:3:"Ὅ";s:6:"Ὅ";s:3:"ὐ";s:4:"ὐ";s:3:"ὑ";s:4:"ὑ";s:3:"ὒ";s:6:"ὒ";s:3:"ὓ";s:6:"ὓ";s:3:"ὔ";s:6:"ὔ";s:3:"ὕ";s:6:"ὕ";s:3:"ὖ";s:6:"ὖ";s:3:"ὗ";s:6:"ὗ";s:3:"Ὑ";s:4:"Ὑ";s:3:"Ὓ";s:6:"Ὓ";s:3:"Ὕ";s:6:"Ὕ";s:3:"Ὗ";s:6:"Ὗ";s:3:"ὠ";s:4:"ὠ";s:3:"ὡ";s:4:"ὡ";s:3:"ὢ";s:6:"ὢ";s:3:"ὣ";s:6:"ὣ";s:3:"ὤ";s:6:"ὤ";s:3:"ὥ";s:6:"ὥ";s:3:"ὦ";s:6:"ὦ";s:3:"ὧ";s:6:"ὧ";s:3:"Ὠ";s:4:"Ὠ";s:3:"Ὡ";s:4:"Ὡ";s:3:"Ὢ";s:6:"Ὢ";s:3:"Ὣ";s:6:"Ὣ";s:3:"Ὤ";s:6:"Ὤ";s:3:"Ὥ";s:6:"Ὥ";s:3:"Ὦ";s:6:"Ὦ";s:3:"Ὧ";s:6:"Ὧ";s:3:"ὰ";s:4:"ὰ";s:3:"ά";s:4:"ά";s:3:"ὲ";s:4:"ὲ";s:3:"έ";s:4:"έ";s:3:"ὴ";s:4:"ὴ";s:3:"ή";s:4:"ή";s:3:"ὶ";s:4:"ὶ";s:3:"ί";s:4:"ί";s:3:"ὸ";s:4:"ὸ";s:3:"ό";s:4:"ό";s:3:"ὺ";s:4:"ὺ";s:3:"ύ";s:4:"ύ";s:3:"ὼ";s:4:"ὼ";s:3:"ώ";s:4:"ώ";s:3:"ᾀ";s:6:"ᾀ";s:3:"ᾁ";s:6:"ᾁ";s:3:"ᾂ";s:8:"ᾂ";s:3:"ᾃ";s:8:"ᾃ";s:3:"ᾄ";s:8:"ᾄ";s:3:"ᾅ";s:8:"ᾅ";s:3:"ᾆ";s:8:"ᾆ";s:3:"ᾇ";s:8:"ᾇ";s:3:"ᾈ";s:6:"ᾈ";s:3:"ᾉ";s:6:"ᾉ";s:3:"ᾊ";s:8:"ᾊ";s:3:"ᾋ";s:8:"ᾋ";s:3:"ᾌ";s:8:"ᾌ";s:3:"ᾍ";s:8:"ᾍ";s:3:"ᾎ";s:8:"ᾎ";s:3:"ᾏ";s:8:"ᾏ";s:3:"ᾐ";s:6:"ᾐ";s:3:"ᾑ";s:6:"ᾑ";s:3:"ᾒ";s:8:"ᾒ";s:3:"ᾓ";s:8:"ᾓ";s:3:"ᾔ";s:8:"ᾔ";s:3:"ᾕ";s:8:"ᾕ";s:3:"ᾖ";s:8:"ᾖ";s:3:"ᾗ";s:8:"ᾗ";s:3:"ᾘ";s:6:"ᾘ";s:3:"ᾙ";s:6:"ᾙ";s:3:"ᾚ";s:8:"ᾚ";s:3:"ᾛ";s:8:"ᾛ";s:3:"ᾜ";s:8:"ᾜ";s:3:"ᾝ";s:8:"ᾝ";s:3:"ᾞ";s:8:"ᾞ";s:3:"ᾟ";s:8:"ᾟ";s:3:"ᾠ";s:6:"ᾠ";s:3:"ᾡ";s:6:"ᾡ";s:3:"ᾢ";s:8:"ᾢ";s:3:"ᾣ";s:8:"ᾣ";s:3:"ᾤ";s:8:"ᾤ";s:3:"ᾥ";s:8:"ᾥ";s:3:"ᾦ";s:8:"ᾦ";s:3:"ᾧ";s:8:"ᾧ";s:3:"ᾨ";s:6:"ᾨ";s:3:"ᾩ";s:6:"ᾩ";s:3:"ᾪ";s:8:"ᾪ";s:3:"ᾫ";s:8:"ᾫ";s:3:"ᾬ";s:8:"ᾬ";s:3:"ᾭ";s:8:"ᾭ";s:3:"ᾮ";s:8:"ᾮ";s:3:"ᾯ";s:8:"ᾯ";s:3:"ᾰ";s:4:"ᾰ";s:3:"ᾱ";s:4:"ᾱ";s:3:"ᾲ";s:6:"ᾲ";s:3:"ᾳ";s:4:"ᾳ";s:3:"ᾴ";s:6:"ᾴ";s:3:"ᾶ";s:4:"ᾶ";s:3:"ᾷ";s:6:"ᾷ";s:3:"Ᾰ";s:4:"Ᾰ";s:3:"Ᾱ";s:4:"Ᾱ";s:3:"Ὰ";s:4:"Ὰ";s:3:"Ά";s:4:"Ά";s:3:"ᾼ";s:4:"ᾼ";s:3:"᾽";s:3:" ̓";s:3:"ι";s:2:"ι";s:3:"᾿";s:3:" ̓";s:3:"῀";s:3:" ͂";s:3:"῁";s:5:" ̈͂";s:3:"ῂ";s:6:"ῂ";s:3:"ῃ";s:4:"ῃ";s:3:"ῄ";s:6:"ῄ";s:3:"ῆ";s:4:"ῆ";s:3:"ῇ";s:6:"ῇ";s:3:"Ὲ";s:4:"Ὲ";s:3:"Έ";s:4:"Έ";s:3:"Ὴ";s:4:"Ὴ";s:3:"Ή";s:4:"Ή";s:3:"ῌ";s:4:"ῌ";s:3:"῍";s:5:" ̓̀";s:3:"῎";s:5:" ̓́";s:3:"῏";s:5:" ̓͂";s:3:"ῐ";s:4:"ῐ";s:3:"ῑ";s:4:"ῑ";s:3:"ῒ";s:6:"ῒ";s:3:"ΐ";s:6:"ΐ";s:3:"ῖ";s:4:"ῖ";s:3:"ῗ";s:6:"ῗ";s:3:"Ῐ";s:4:"Ῐ";s:3:"Ῑ";s:4:"Ῑ";s:3:"Ὶ";s:4:"Ὶ";s:3:"Ί";s:4:"Ί";s:3:"῝";s:5:" ̔̀";s:3:"῞";s:5:" ̔́";s:3:"῟";s:5:" ̔͂";s:3:"ῠ";s:4:"ῠ";s:3:"ῡ";s:4:"ῡ";s:3:"ῢ";s:6:"ῢ";s:3:"ΰ";s:6:"ΰ";s:3:"ῤ";s:4:"ῤ";s:3:"ῥ";s:4:"ῥ";s:3:"ῦ";s:4:"ῦ";s:3:"ῧ";s:6:"ῧ";s:3:"Ῠ";s:4:"Ῠ";s:3:"Ῡ";s:4:"Ῡ";s:3:"Ὺ";s:4:"Ὺ";s:3:"Ύ";s:4:"Ύ";s:3:"Ῥ";s:4:"Ῥ";s:3:"῭";s:5:" ̈̀";s:3:"΅";s:5:" ̈́";s:3:"`";s:1:"`";s:3:"ῲ";s:6:"ῲ";s:3:"ῳ";s:4:"ῳ";s:3:"ῴ";s:6:"ῴ";s:3:"ῶ";s:4:"ῶ";s:3:"ῷ";s:6:"ῷ";s:3:"Ὸ";s:4:"Ὸ";s:3:"Ό";s:4:"Ό";s:3:"Ὼ";s:4:"Ὼ";s:3:"Ώ";s:4:"Ώ";s:3:"ῼ";s:4:"ῼ";s:3:"´";s:3:" ́";s:3:"῾";s:3:" ̔";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:"‑";s:3:"‐";s:3:"‗";s:3:" ̳";s:3:"․";s:1:".";s:3:"‥";s:2:"..";s:3:"…";s:3:"...";s:3:" ";s:1:" ";s:3:"″";s:6:"′′";s:3:"‴";s:9:"′′′";s:3:"‶";s:6:"‵‵";s:3:"‷";s:9:"‵‵‵";s:3:"‼";s:2:"!!";s:3:"‾";s:3:" ̅";s:3:"⁇";s:2:"??";s:3:"⁈";s:2:"?!";s:3:"⁉";s:2:"!?";s:3:"⁗";s:12:"′′′′";s:3:" ";s:1:" ";s:3:"⁰";s:1:"0";s:3:"ⁱ";s:1:"i";s:3:"⁴";s:1:"4";s:3:"⁵";s:1:"5";s:3:"⁶";s:1:"6";s:3:"⁷";s:1:"7";s:3:"⁸";s:1:"8";s:3:"⁹";s:1:"9";s:3:"⁺";s:1:"+";s:3:"⁻";s:3:"−";s:3:"⁼";s:1:"=";s:3:"⁽";s:1:"(";s:3:"⁾";s:1:")";s:3:"ⁿ";s:1:"n";s:3:"₀";s:1:"0";s:3:"₁";s:1:"1";s:3:"₂";s:1:"2";s:3:"₃";s:1:"3";s:3:"₄";s:1:"4";s:3:"₅";s:1:"5";s:3:"₆";s:1:"6";s:3:"₇";s:1:"7";s:3:"₈";s:1:"8";s:3:"₉";s:1:"9";s:3:"₊";s:1:"+";s:3:"₋";s:3:"−";s:3:"₌";s:1:"=";s:3:"₍";s:1:"(";s:3:"₎";s:1:")";s:3:"ₐ";s:1:"a";s:3:"ₑ";s:1:"e";s:3:"ₒ";s:1:"o";s:3:"ₓ";s:1:"x";s:3:"ₔ";s:2:"ə";s:3:"ₕ";s:1:"h";s:3:"ₖ";s:1:"k";s:3:"ₗ";s:1:"l";s:3:"ₘ";s:1:"m";s:3:"ₙ";s:1:"n";s:3:"ₚ";s:1:"p";s:3:"ₛ";s:1:"s";s:3:"ₜ";s:1:"t";s:3:"₨";s:2:"Rs";s:3:"℀";s:3:"a/c";s:3:"℁";s:3:"a/s";s:3:"ℂ";s:1:"C";s:3:"℃";s:3:"°C";s:3:"℅";s:3:"c/o";s:3:"℆";s:3:"c/u";s:3:"ℇ";s:2:"Ɛ";s:3:"℉";s:3:"°F";s:3:"ℊ";s:1:"g";s:3:"ℋ";s:1:"H";s:3:"ℌ";s:1:"H";s:3:"ℍ";s:1:"H";s:3:"ℎ";s:1:"h";s:3:"ℏ";s:2:"ħ";s:3:"ℐ";s:1:"I";s:3:"ℑ";s:1:"I";s:3:"ℒ";s:1:"L";s:3:"ℓ";s:1:"l";s:3:"ℕ";s:1:"N";s:3:"№";s:2:"No";s:3:"ℙ";s:1:"P";s:3:"ℚ";s:1:"Q";s:3:"ℛ";s:1:"R";s:3:"ℜ";s:1:"R";s:3:"ℝ";s:1:"R";s:3:"℠";s:2:"SM";s:3:"℡";s:3:"TEL";s:3:"™";s:2:"TM";s:3:"ℤ";s:1:"Z";s:3:"Ω";s:2:"Ω";s:3:"ℨ";s:1:"Z";s:3:"K";s:1:"K";s:3:"Å";s:3:"Å";s:3:"ℬ";s:1:"B";s:3:"ℭ";s:1:"C";s:3:"ℯ";s:1:"e";s:3:"ℰ";s:1:"E";s:3:"ℱ";s:1:"F";s:3:"ℳ";s:1:"M";s:3:"ℴ";s:1:"o";s:3:"ℵ";s:2:"א";s:3:"ℶ";s:2:"ב";s:3:"ℷ";s:2:"ג";s:3:"ℸ";s:2:"ד";s:3:"ℹ";s:1:"i";s:3:"℻";s:3:"FAX";s:3:"ℼ";s:2:"π";s:3:"ℽ";s:2:"γ";s:3:"ℾ";s:2:"Γ";s:3:"ℿ";s:2:"Π";s:3:"⅀";s:3:"∑";s:3:"ⅅ";s:1:"D";s:3:"ⅆ";s:1:"d";s:3:"ⅇ";s:1:"e";s:3:"ⅈ";s:1:"i";s:3:"ⅉ";s:1:"j";s:3:"⅐";s:5:"1⁄7";s:3:"⅑";s:5:"1⁄9";s:3:"⅒";s:6:"1⁄10";s:3:"⅓";s:5:"1⁄3";s:3:"⅔";s:5:"2⁄3";s:3:"⅕";s:5:"1⁄5";s:3:"⅖";s:5:"2⁄5";s:3:"⅗";s:5:"3⁄5";s:3:"⅘";s:5:"4⁄5";s:3:"⅙";s:5:"1⁄6";s:3:"⅚";s:5:"5⁄6";s:3:"⅛";s:5:"1⁄8";s:3:"⅜";s:5:"3⁄8";s:3:"⅝";s:5:"5⁄8";s:3:"⅞";s:5:"7⁄8";s:3:"⅟";s:4:"1⁄";s:3:"Ⅰ";s:1:"I";s:3:"Ⅱ";s:2:"II";s:3:"Ⅲ";s:3:"III";s:3:"Ⅳ";s:2:"IV";s:3:"Ⅴ";s:1:"V";s:3:"Ⅵ";s:2:"VI";s:3:"Ⅶ";s:3:"VII";s:3:"Ⅷ";s:4:"VIII";s:3:"Ⅸ";s:2:"IX";s:3:"Ⅹ";s:1:"X";s:3:"Ⅺ";s:2:"XI";s:3:"Ⅻ";s:3:"XII";s:3:"Ⅼ";s:1:"L";s:3:"Ⅽ";s:1:"C";s:3:"Ⅾ";s:1:"D";s:3:"Ⅿ";s:1:"M";s:3:"ⅰ";s:1:"i";s:3:"ⅱ";s:2:"ii";s:3:"ⅲ";s:3:"iii";s:3:"ⅳ";s:2:"iv";s:3:"ⅴ";s:1:"v";s:3:"ⅵ";s:2:"vi";s:3:"ⅶ";s:3:"vii";s:3:"ⅷ";s:4:"viii";s:3:"ⅸ";s:2:"ix";s:3:"ⅹ";s:1:"x";s:3:"ⅺ";s:2:"xi";s:3:"ⅻ";s:3:"xii";s:3:"ⅼ";s:1:"l";s:3:"ⅽ";s:1:"c";s:3:"ⅾ";s:1:"d";s:3:"ⅿ";s:1:"m";s:3:"↉";s:5:"0⁄3";s:3:"↚";s:5:"↚";s:3:"↛";s:5:"↛";s:3:"↮";s:5:"↮";s:3:"⇍";s:5:"⇍";s:3:"⇎";s:5:"⇎";s:3:"⇏";s:5:"⇏";s:3:"∄";s:5:"∄";s:3:"∉";s:5:"∉";s:3:"∌";s:5:"∌";s:3:"∤";s:5:"∤";s:3:"∦";s:5:"∦";s:3:"∬";s:6:"∫∫";s:3:"∭";s:9:"∫∫∫";s:3:"∯";s:6:"∮∮";s:3:"∰";s:9:"∮∮∮";s:3:"≁";s:5:"≁";s:3:"≄";s:5:"≄";s:3:"≇";s:5:"≇";s:3:"≉";s:5:"≉";s:3:"≠";s:3:"≠";s:3:"≢";s:5:"≢";s:3:"≭";s:5:"≭";s:3:"≮";s:3:"≮";s:3:"≯";s:3:"≯";s:3:"≰";s:5:"≰";s:3:"≱";s:5:"≱";s:3:"≴";s:5:"≴";s:3:"≵";s:5:"≵";s:3:"≸";s:5:"≸";s:3:"≹";s:5:"≹";s:3:"⊀";s:5:"⊀";s:3:"⊁";s:5:"⊁";s:3:"⊄";s:5:"⊄";s:3:"⊅";s:5:"⊅";s:3:"⊈";s:5:"⊈";s:3:"⊉";s:5:"⊉";s:3:"⊬";s:5:"⊬";s:3:"⊭";s:5:"⊭";s:3:"⊮";s:5:"⊮";s:3:"⊯";s:5:"⊯";s:3:"⋠";s:5:"⋠";s:3:"⋡";s:5:"⋡";s:3:"⋢";s:5:"⋢";s:3:"⋣";s:5:"⋣";s:3:"⋪";s:5:"⋪";s:3:"⋫";s:5:"⋫";s:3:"⋬";s:5:"⋬";s:3:"⋭";s:5:"⋭";s:3:"〈";s:3:"〈";s:3:"〉";s:3:"〉";s:3:"①";s:1:"1";s:3:"②";s:1:"2";s:3:"③";s:1:"3";s:3:"④";s:1:"4";s:3:"⑤";s:1:"5";s:3:"⑥";s:1:"6";s:3:"⑦";s:1:"7";s:3:"⑧";s:1:"8";s:3:"⑨";s:1:"9";s:3:"⑩";s:2:"10";s:3:"⑪";s:2:"11";s:3:"⑫";s:2:"12";s:3:"⑬";s:2:"13";s:3:"⑭";s:2:"14";s:3:"⑮";s:2:"15";s:3:"⑯";s:2:"16";s:3:"⑰";s:2:"17";s:3:"⑱";s:2:"18";s:3:"⑲";s:2:"19";s:3:"⑳";s:2:"20";s:3:"⑴";s:3:"(1)";s:3:"⑵";s:3:"(2)";s:3:"⑶";s:3:"(3)";s:3:"⑷";s:3:"(4)";s:3:"⑸";s:3:"(5)";s:3:"⑹";s:3:"(6)";s:3:"⑺";s:3:"(7)";s:3:"⑻";s:3:"(8)";s:3:"⑼";s:3:"(9)";s:3:"⑽";s:4:"(10)";s:3:"⑾";s:4:"(11)";s:3:"⑿";s:4:"(12)";s:3:"⒀";s:4:"(13)";s:3:"⒁";s:4:"(14)";s:3:"⒂";s:4:"(15)";s:3:"⒃";s:4:"(16)";s:3:"⒄";s:4:"(17)";s:3:"⒅";s:4:"(18)";s:3:"⒆";s:4:"(19)";s:3:"⒇";s:4:"(20)";s:3:"⒈";s:2:"1.";s:3:"⒉";s:2:"2.";s:3:"⒊";s:2:"3.";s:3:"⒋";s:2:"4.";s:3:"⒌";s:2:"5.";s:3:"⒍";s:2:"6.";s:3:"⒎";s:2:"7.";s:3:"⒏";s:2:"8.";s:3:"⒐";s:2:"9.";s:3:"⒑";s:3:"10.";s:3:"⒒";s:3:"11.";s:3:"⒓";s:3:"12.";s:3:"⒔";s:3:"13.";s:3:"⒕";s:3:"14.";s:3:"⒖";s:3:"15.";s:3:"⒗";s:3:"16.";s:3:"⒘";s:3:"17.";s:3:"⒙";s:3:"18.";s:3:"⒚";s:3:"19.";s:3:"⒛";s:3:"20.";s:3:"⒜";s:3:"(a)";s:3:"⒝";s:3:"(b)";s:3:"⒞";s:3:"(c)";s:3:"⒟";s:3:"(d)";s:3:"⒠";s:3:"(e)";s:3:"⒡";s:3:"(f)";s:3:"⒢";s:3:"(g)";s:3:"⒣";s:3:"(h)";s:3:"⒤";s:3:"(i)";s:3:"⒥";s:3:"(j)";s:3:"⒦";s:3:"(k)";s:3:"⒧";s:3:"(l)";s:3:"⒨";s:3:"(m)";s:3:"⒩";s:3:"(n)";s:3:"⒪";s:3:"(o)";s:3:"⒫";s:3:"(p)";s:3:"⒬";s:3:"(q)";s:3:"⒭";s:3:"(r)";s:3:"⒮";s:3:"(s)";s:3:"⒯";s:3:"(t)";s:3:"⒰";s:3:"(u)";s:3:"⒱";s:3:"(v)";s:3:"⒲";s:3:"(w)";s:3:"⒳";s:3:"(x)";s:3:"⒴";s:3:"(y)";s:3:"⒵";s:3:"(z)";s:3:"Ⓐ";s:1:"A";s:3:"Ⓑ";s:1:"B";s:3:"Ⓒ";s:1:"C";s:3:"Ⓓ";s:1:"D";s:3:"Ⓔ";s:1:"E";s:3:"Ⓕ";s:1:"F";s:3:"Ⓖ";s:1:"G";s:3:"Ⓗ";s:1:"H";s:3:"Ⓘ";s:1:"I";s:3:"Ⓙ";s:1:"J";s:3:"Ⓚ";s:1:"K";s:3:"Ⓛ";s:1:"L";s:3:"Ⓜ";s:1:"M";s:3:"Ⓝ";s:1:"N";s:3:"Ⓞ";s:1:"O";s:3:"Ⓟ";s:1:"P";s:3:"Ⓠ";s:1:"Q";s:3:"Ⓡ";s:1:"R";s:3:"Ⓢ";s:1:"S";s:3:"Ⓣ";s:1:"T";s:3:"Ⓤ";s:1:"U";s:3:"Ⓥ";s:1:"V";s:3:"Ⓦ";s:1:"W";s:3:"Ⓧ";s:1:"X";s:3:"Ⓨ";s:1:"Y";s:3:"Ⓩ";s:1:"Z";s:3:"ⓐ";s:1:"a";s:3:"ⓑ";s:1:"b";s:3:"ⓒ";s:1:"c";s:3:"ⓓ";s:1:"d";s:3:"ⓔ";s:1:"e";s:3:"ⓕ";s:1:"f";s:3:"ⓖ";s:1:"g";s:3:"ⓗ";s:1:"h";s:3:"ⓘ";s:1:"i";s:3:"ⓙ";s:1:"j";s:3:"ⓚ";s:1:"k";s:3:"ⓛ";s:1:"l";s:3:"ⓜ";s:1:"m";s:3:"ⓝ";s:1:"n";s:3:"ⓞ";s:1:"o";s:3:"ⓟ";s:1:"p";s:3:"ⓠ";s:1:"q";s:3:"ⓡ";s:1:"r";s:3:"ⓢ";s:1:"s";s:3:"ⓣ";s:1:"t";s:3:"ⓤ";s:1:"u";s:3:"ⓥ";s:1:"v";s:3:"ⓦ";s:1:"w";s:3:"ⓧ";s:1:"x";s:3:"ⓨ";s:1:"y";s:3:"ⓩ";s:1:"z";s:3:"⓪";s:1:"0";s:3:"⨌";s:12:"∫∫∫∫";s:3:"⩴";s:3:"::=";s:3:"⩵";s:2:"==";s:3:"⩶";s:3:"===";s:3:"⫝̸";s:5:"⫝̸";s:3:"ⱼ";s:1:"j";s:3:"ⱽ";s:1:"V";s:3:"ⵯ";s:3:"ⵡ";s:3:"⺟";s:3:"母";s:3:"⻳";s:3:"龟";s:3:"⼀";s:3:"一";s:3:"⼁";s:3:"丨";s:3:"⼂";s:3:"丶";s:3:"⼃";s:3:"丿";s:3:"⼄";s:3:"乙";s:3:"⼅";s:3:"亅";s:3:"⼆";s:3:"二";s:3:"⼇";s:3:"亠";s:3:"⼈";s:3:"人";s:3:"⼉";s:3:"儿";s:3:"⼊";s:3:"入";s:3:"⼋";s:3:"八";s:3:"⼌";s:3:"冂";s:3:"⼍";s:3:"冖";s:3:"⼎";s:3:"冫";s:3:"⼏";s:3:"几";s:3:"⼐";s:3:"凵";s:3:"⼑";s:3:"刀";s:3:"⼒";s:3:"力";s:3:"⼓";s:3:"勹";s:3:"⼔";s:3:"匕";s:3:"⼕";s:3:"匚";s:3:"⼖";s:3:"匸";s:3:"⼗";s:3:"十";s:3:"⼘";s:3:"卜";s:3:"⼙";s:3:"卩";s:3:"⼚";s:3:"厂";s:3:"⼛";s:3:"厶";s:3:"⼜";s:3:"又";s:3:"⼝";s:3:"口";s:3:"⼞";s:3:"囗";s:3:"⼟";s:3:"土";s:3:"⼠";s:3:"士";s:3:"⼡";s:3:"夂";s:3:"⼢";s:3:"夊";s:3:"⼣";s:3:"夕";s:3:"⼤";s:3:"大";s:3:"⼥";s:3:"女";s:3:"⼦";s:3:"子";s:3:"⼧";s:3:"宀";s:3:"⼨";s:3:"寸";s:3:"⼩";s:3:"小";s:3:"⼪";s:3:"尢";s:3:"⼫";s:3:"尸";s:3:"⼬";s:3:"屮";s:3:"⼭";s:3:"山";s:3:"⼮";s:3:"巛";s:3:"⼯";s:3:"工";s:3:"⼰";s:3:"己";s:3:"⼱";s:3:"巾";s:3:"⼲";s:3:"干";s:3:"⼳";s:3:"幺";s:3:"⼴";s:3:"广";s:3:"⼵";s:3:"廴";s:3:"⼶";s:3:"廾";s:3:"⼷";s:3:"弋";s:3:"⼸";s:3:"弓";s:3:"⼹";s:3:"彐";s:3:"⼺";s:3:"彡";s:3:"⼻";s:3:"彳";s:3:"⼼";s:3:"心";s:3:"⼽";s:3:"戈";s:3:"⼾";s:3:"戶";s:3:"⼿";s:3:"手";s:3:"⽀";s:3:"支";s:3:"⽁";s:3:"攴";s:3:"⽂";s:3:"文";s:3:"⽃";s:3:"斗";s:3:"⽄";s:3:"斤";s:3:"⽅";s:3:"方";s:3:"⽆";s:3:"无";s:3:"⽇";s:3:"日";s:3:"⽈";s:3:"曰";s:3:"⽉";s:3:"月";s:3:"⽊";s:3:"木";s:3:"⽋";s:3:"欠";s:3:"⽌";s:3:"止";s:3:"⽍";s:3:"歹";s:3:"⽎";s:3:"殳";s:3:"⽏";s:3:"毋";s:3:"⽐";s:3:"比";s:3:"⽑";s:3:"毛";s:3:"⽒";s:3:"氏";s:3:"⽓";s:3:"气";s:3:"⽔";s:3:"水";s:3:"⽕";s:3:"火";s:3:"⽖";s:3:"爪";s:3:"⽗";s:3:"父";s:3:"⽘";s:3:"爻";s:3:"⽙";s:3:"爿";s:3:"⽚";s:3:"片";s:3:"⽛";s:3:"牙";s:3:"⽜";s:3:"牛";s:3:"⽝";s:3:"犬";s:3:"⽞";s:3:"玄";s:3:"⽟";s:3:"玉";s:3:"⽠";s:3:"瓜";s:3:"⽡";s:3:"瓦";s:3:"⽢";s:3:"甘";s:3:"⽣";s:3:"生";s:3:"⽤";s:3:"用";s:3:"⽥";s:3:"田";s:3:"⽦";s:3:"疋";s:3:"⽧";s:3:"疒";s:3:"⽨";s:3:"癶";s:3:"⽩";s:3:"白";s:3:"⽪";s:3:"皮";s:3:"⽫";s:3:"皿";s:3:"⽬";s:3:"目";s:3:"⽭";s:3:"矛";s:3:"⽮";s:3:"矢";s:3:"⽯";s:3:"石";s:3:"⽰";s:3:"示";s:3:"⽱";s:3:"禸";s:3:"⽲";s:3:"禾";s:3:"⽳";s:3:"穴";s:3:"⽴";s:3:"立";s:3:"⽵";s:3:"竹";s:3:"⽶";s:3:"米";s:3:"⽷";s:3:"糸";s:3:"⽸";s:3:"缶";s:3:"⽹";s:3:"网";s:3:"⽺";s:3:"羊";s:3:"⽻";s:3:"羽";s:3:"⽼";s:3:"老";s:3:"⽽";s:3:"而";s:3:"⽾";s:3:"耒";s:3:"⽿";s:3:"耳";s:3:"⾀";s:3:"聿";s:3:"⾁";s:3:"肉";s:3:"⾂";s:3:"臣";s:3:"⾃";s:3:"自";s:3:"⾄";s:3:"至";s:3:"⾅";s:3:"臼";s:3:"⾆";s:3:"舌";s:3:"⾇";s:3:"舛";s:3:"⾈";s:3:"舟";s:3:"⾉";s:3:"艮";s:3:"⾊";s:3:"色";s:3:"⾋";s:3:"艸";s:3:"⾌";s:3:"虍";s:3:"⾍";s:3:"虫";s:3:"⾎";s:3:"血";s:3:"⾏";s:3:"行";s:3:"⾐";s:3:"衣";s:3:"⾑";s:3:"襾";s:3:"⾒";s:3:"見";s:3:"⾓";s:3:"角";s:3:"⾔";s:3:"言";s:3:"⾕";s:3:"谷";s:3:"⾖";s:3:"豆";s:3:"⾗";s:3:"豕";s:3:"⾘";s:3:"豸";s:3:"⾙";s:3:"貝";s:3:"⾚";s:3:"赤";s:3:"⾛";s:3:"走";s:3:"⾜";s:3:"足";s:3:"⾝";s:3:"身";s:3:"⾞";s:3:"車";s:3:"⾟";s:3:"辛";s:3:"⾠";s:3:"辰";s:3:"⾡";s:3:"辵";s:3:"⾢";s:3:"邑";s:3:"⾣";s:3:"酉";s:3:"⾤";s:3:"釆";s:3:"⾥";s:3:"里";s:3:"⾦";s:3:"金";s:3:"⾧";s:3:"長";s:3:"⾨";s:3:"門";s:3:"⾩";s:3:"阜";s:3:"⾪";s:3:"隶";s:3:"⾫";s:3:"隹";s:3:"⾬";s:3:"雨";s:3:"⾭";s:3:"靑";s:3:"⾮";s:3:"非";s:3:"⾯";s:3:"面";s:3:"⾰";s:3:"革";s:3:"⾱";s:3:"韋";s:3:"⾲";s:3:"韭";s:3:"⾳";s:3:"音";s:3:"⾴";s:3:"頁";s:3:"⾵";s:3:"風";s:3:"⾶";s:3:"飛";s:3:"⾷";s:3:"食";s:3:"⾸";s:3:"首";s:3:"⾹";s:3:"香";s:3:"⾺";s:3:"馬";s:3:"⾻";s:3:"骨";s:3:"⾼";s:3:"高";s:3:"⾽";s:3:"髟";s:3:"⾾";s:3:"鬥";s:3:"⾿";s:3:"鬯";s:3:"⿀";s:3:"鬲";s:3:"⿁";s:3:"鬼";s:3:"⿂";s:3:"魚";s:3:"⿃";s:3:"鳥";s:3:"⿄";s:3:"鹵";s:3:"⿅";s:3:"鹿";s:3:"⿆";s:3:"麥";s:3:"⿇";s:3:"麻";s:3:"⿈";s:3:"黃";s:3:"⿉";s:3:"黍";s:3:"⿊";s:3:"黑";s:3:"⿋";s:3:"黹";s:3:"⿌";s:3:"黽";s:3:"⿍";s:3:"鼎";s:3:"⿎";s:3:"鼓";s:3:"⿏";s:3:"鼠";s:3:"⿐";s:3:"鼻";s:3:"⿑";s:3:"齊";s:3:"⿒";s:3:"齒";s:3:"⿓";s:3:"龍";s:3:"⿔";s:3:"龜";s:3:"⿕";s:3:"龠";s:3:" ";s:1:" ";s:3:"〶";s:3:"〒";s:3:"〸";s:3:"十";s:3:"〹";s:3:"卄";s:3:"〺";s:3:"卅";s:3:"が";s:6:"が";s:3:"ぎ";s:6:"ぎ";s:3:"ぐ";s:6:"ぐ";s:3:"げ";s:6:"げ";s:3:"ご";s:6:"ご";s:3:"ざ";s:6:"ざ";s:3:"じ";s:6:"じ";s:3:"ず";s:6:"ず";s:3:"ぜ";s:6:"ぜ";s:3:"ぞ";s:6:"ぞ";s:3:"だ";s:6:"だ";s:3:"ぢ";s:6:"ぢ";s:3:"づ";s:6:"づ";s:3:"で";s:6:"で";s:3:"ど";s:6:"ど";s:3:"ば";s:6:"ば";s:3:"ぱ";s:6:"ぱ";s:3:"び";s:6:"び";s:3:"ぴ";s:6:"ぴ";s:3:"ぶ";s:6:"ぶ";s:3:"ぷ";s:6:"ぷ";s:3:"べ";s:6:"べ";s:3:"ぺ";s:6:"ぺ";s:3:"ぼ";s:6:"ぼ";s:3:"ぽ";s:6:"ぽ";s:3:"ゔ";s:6:"ゔ";s:3:"゛";s:4:" ゙";s:3:"゜";s:4:" ゚";s:3:"ゞ";s:6:"ゞ";s:3:"ゟ";s:6:"より";s:3:"ガ";s:6:"ガ";s:3:"ギ";s:6:"ギ";s:3:"グ";s:6:"グ";s:3:"ゲ";s:6:"ゲ";s:3:"ゴ";s:6:"ゴ";s:3:"ザ";s:6:"ザ";s:3:"ジ";s:6:"ジ";s:3:"ズ";s:6:"ズ";s:3:"ゼ";s:6:"ゼ";s:3:"ゾ";s:6:"ゾ";s:3:"ダ";s:6:"ダ";s:3:"ヂ";s:6:"ヂ";s:3:"ヅ";s:6:"ヅ";s:3:"デ";s:6:"デ";s:3:"ド";s:6:"ド";s:3:"バ";s:6:"バ";s:3:"パ";s:6:"パ";s:3:"ビ";s:6:"ビ";s:3:"ピ";s:6:"ピ";s:3:"ブ";s:6:"ブ";s:3:"プ";s:6:"プ";s:3:"ベ";s:6:"ベ";s:3:"ペ";s:6:"ペ";s:3:"ボ";s:6:"ボ";s:3:"ポ";s:6:"ポ";s:3:"ヴ";s:6:"ヴ";s:3:"ヷ";s:6:"ヷ";s:3:"ヸ";s:6:"ヸ";s:3:"ヹ";s:6:"ヹ";s:3:"ヺ";s:6:"ヺ";s:3:"ヾ";s:6:"ヾ";s:3:"ヿ";s:6:"コト";s:3:"ㄱ";s:3:"ᄀ";s:3:"ㄲ";s:3:"ᄁ";s:3:"ㄳ";s:3:"ᆪ";s:3:"ㄴ";s:3:"ᄂ";s:3:"ㄵ";s:3:"ᆬ";s:3:"ㄶ";s:3:"ᆭ";s:3:"ㄷ";s:3:"ᄃ";s:3:"ㄸ";s:3:"ᄄ";s:3:"ㄹ";s:3:"ᄅ";s:3:"ㄺ";s:3:"ᆰ";s:3:"ㄻ";s:3:"ᆱ";s:3:"ㄼ";s:3:"ᆲ";s:3:"ㄽ";s:3:"ᆳ";s:3:"ㄾ";s:3:"ᆴ";s:3:"ㄿ";s:3:"ᆵ";s:3:"ㅀ";s:3:"ᄚ";s:3:"ㅁ";s:3:"ᄆ";s:3:"ㅂ";s:3:"ᄇ";s:3:"ㅃ";s:3:"ᄈ";s:3:"ㅄ";s:3:"ᄡ";s:3:"ㅅ";s:3:"ᄉ";s:3:"ㅆ";s:3:"ᄊ";s:3:"ㅇ";s:3:"ᄋ";s:3:"ㅈ";s:3:"ᄌ";s:3:"ㅉ";s:3:"ᄍ";s:3:"ㅊ";s:3:"ᄎ";s:3:"ㅋ";s:3:"ᄏ";s:3:"ㅌ";s:3:"ᄐ";s:3:"ㅍ";s:3:"ᄑ";s:3:"ㅎ";s:3:"ᄒ";s:3:"ㅏ";s:3:"ᅡ";s:3:"ㅐ";s:3:"ᅢ";s:3:"ㅑ";s:3:"ᅣ";s:3:"ㅒ";s:3:"ᅤ";s:3:"ㅓ";s:3:"ᅥ";s:3:"ㅔ";s:3:"ᅦ";s:3:"ㅕ";s:3:"ᅧ";s:3:"ㅖ";s:3:"ᅨ";s:3:"ㅗ";s:3:"ᅩ";s:3:"ㅘ";s:3:"ᅪ";s:3:"ㅙ";s:3:"ᅫ";s:3:"ㅚ";s:3:"ᅬ";s:3:"ㅛ";s:3:"ᅭ";s:3:"ㅜ";s:3:"ᅮ";s:3:"ㅝ";s:3:"ᅯ";s:3:"ㅞ";s:3:"ᅰ";s:3:"ㅟ";s:3:"ᅱ";s:3:"ㅠ";s:3:"ᅲ";s:3:"ㅡ";s:3:"ᅳ";s:3:"ㅢ";s:3:"ᅴ";s:3:"ㅣ";s:3:"ᅵ";s:3:"ㅤ";s:3:"ᅠ";s:3:"ㅥ";s:3:"ᄔ";s:3:"ㅦ";s:3:"ᄕ";s:3:"ㅧ";s:3:"ᇇ";s:3:"ㅨ";s:3:"ᇈ";s:3:"ㅩ";s:3:"ᇌ";s:3:"ㅪ";s:3:"ᇎ";s:3:"ㅫ";s:3:"ᇓ";s:3:"ㅬ";s:3:"ᇗ";s:3:"ㅭ";s:3:"ᇙ";s:3:"ㅮ";s:3:"ᄜ";s:3:"ㅯ";s:3:"ᇝ";s:3:"ㅰ";s:3:"ᇟ";s:3:"ㅱ";s:3:"ᄝ";s:3:"ㅲ";s:3:"ᄞ";s:3:"ㅳ";s:3:"ᄠ";s:3:"ㅴ";s:3:"ᄢ";s:3:"ㅵ";s:3:"ᄣ";s:3:"ㅶ";s:3:"ᄧ";s:3:"ㅷ";s:3:"ᄩ";s:3:"ㅸ";s:3:"ᄫ";s:3:"ㅹ";s:3:"ᄬ";s:3:"ㅺ";s:3:"ᄭ";s:3:"ㅻ";s:3:"ᄮ";s:3:"ㅼ";s:3:"ᄯ";s:3:"ㅽ";s:3:"ᄲ";s:3:"ㅾ";s:3:"ᄶ";s:3:"ㅿ";s:3:"ᅀ";s:3:"ㆀ";s:3:"ᅇ";s:3:"ㆁ";s:3:"ᅌ";s:3:"ㆂ";s:3:"ᇱ";s:3:"ㆃ";s:3:"ᇲ";s:3:"ㆄ";s:3:"ᅗ";s:3:"ㆅ";s:3:"ᅘ";s:3:"ㆆ";s:3:"ᅙ";s:3:"ㆇ";s:3:"ᆄ";s:3:"ㆈ";s:3:"ᆅ";s:3:"ㆉ";s:3:"ᆈ";s:3:"ㆊ";s:3:"ᆑ";s:3:"ㆋ";s:3:"ᆒ";s:3:"ㆌ";s:3:"ᆔ";s:3:"ㆍ";s:3:"ᆞ";s:3:"ㆎ";s:3:"ᆡ";s:3:"㆒";s:3:"一";s:3:"㆓";s:3:"二";s:3:"㆔";s:3:"三";s:3:"㆕";s:3:"四";s:3:"㆖";s:3:"上";s:3:"㆗";s:3:"中";s:3:"㆘";s:3:"下";s:3:"㆙";s:3:"甲";s:3:"㆚";s:3:"乙";s:3:"㆛";s:3:"丙";s:3:"㆜";s:3:"丁";s:3:"㆝";s:3:"天";s:3:"㆞";s:3:"地";s:3:"㆟";s:3:"人";s:3:"㈀";s:5:"(ᄀ)";s:3:"㈁";s:5:"(ᄂ)";s:3:"㈂";s:5:"(ᄃ)";s:3:"㈃";s:5:"(ᄅ)";s:3:"㈄";s:5:"(ᄆ)";s:3:"㈅";s:5:"(ᄇ)";s:3:"㈆";s:5:"(ᄉ)";s:3:"㈇";s:5:"(ᄋ)";s:3:"㈈";s:5:"(ᄌ)";s:3:"㈉";s:5:"(ᄎ)";s:3:"㈊";s:5:"(ᄏ)";s:3:"㈋";s:5:"(ᄐ)";s:3:"㈌";s:5:"(ᄑ)";s:3:"㈍";s:5:"(ᄒ)";s:3:"㈎";s:8:"(가)";s:3:"㈏";s:8:"(나)";s:3:"㈐";s:8:"(다)";s:3:"㈑";s:8:"(라)";s:3:"㈒";s:8:"(마)";s:3:"㈓";s:8:"(바)";s:3:"㈔";s:8:"(사)";s:3:"㈕";s:8:"(아)";s:3:"㈖";s:8:"(자)";s:3:"㈗";s:8:"(차)";s:3:"㈘";s:8:"(카)";s:3:"㈙";s:8:"(타)";s:3:"㈚";s:8:"(파)";s:3:"㈛";s:8:"(하)";s:3:"㈜";s:8:"(주)";s:3:"㈝";s:17:"(오전)";s:3:"㈞";s:14:"(오후)";s:3:"㈠";s:5:"(一)";s:3:"㈡";s:5:"(二)";s:3:"㈢";s:5:"(三)";s:3:"㈣";s:5:"(四)";s:3:"㈤";s:5:"(五)";s:3:"㈥";s:5:"(六)";s:3:"㈦";s:5:"(七)";s:3:"㈧";s:5:"(八)";s:3:"㈨";s:5:"(九)";s:3:"㈩";s:5:"(十)";s:3:"㈪";s:5:"(月)";s:3:"㈫";s:5:"(火)";s:3:"㈬";s:5:"(水)";s:3:"㈭";s:5:"(木)";s:3:"㈮";s:5:"(金)";s:3:"㈯";s:5:"(土)";s:3:"㈰";s:5:"(日)";s:3:"㈱";s:5:"(株)";s:3:"㈲";s:5:"(有)";s:3:"㈳";s:5:"(社)";s:3:"㈴";s:5:"(名)";s:3:"㈵";s:5:"(特)";s:3:"㈶";s:5:"(財)";s:3:"㈷";s:5:"(祝)";s:3:"㈸";s:5:"(労)";s:3:"㈹";s:5:"(代)";s:3:"㈺";s:5:"(呼)";s:3:"㈻";s:5:"(学)";s:3:"㈼";s:5:"(監)";s:3:"㈽";s:5:"(企)";s:3:"㈾";s:5:"(資)";s:3:"㈿";s:5:"(協)";s:3:"㉀";s:5:"(祭)";s:3:"㉁";s:5:"(休)";s:3:"㉂";s:5:"(自)";s:3:"㉃";s:5:"(至)";s:3:"㉄";s:3:"問";s:3:"㉅";s:3:"幼";s:3:"㉆";s:3:"文";s:3:"㉇";s:3:"箏";s:3:"㉐";s:3:"PTE";s:3:"㉑";s:2:"21";s:3:"㉒";s:2:"22";s:3:"㉓";s:2:"23";s:3:"㉔";s:2:"24";s:3:"㉕";s:2:"25";s:3:"㉖";s:2:"26";s:3:"㉗";s:2:"27";s:3:"㉘";s:2:"28";s:3:"㉙";s:2:"29";s:3:"㉚";s:2:"30";s:3:"㉛";s:2:"31";s:3:"㉜";s:2:"32";s:3:"㉝";s:2:"33";s:3:"㉞";s:2:"34";s:3:"㉟";s:2:"35";s:3:"㉠";s:3:"ᄀ";s:3:"㉡";s:3:"ᄂ";s:3:"㉢";s:3:"ᄃ";s:3:"㉣";s:3:"ᄅ";s:3:"㉤";s:3:"ᄆ";s:3:"㉥";s:3:"ᄇ";s:3:"㉦";s:3:"ᄉ";s:3:"㉧";s:3:"ᄋ";s:3:"㉨";s:3:"ᄌ";s:3:"㉩";s:3:"ᄎ";s:3:"㉪";s:3:"ᄏ";s:3:"㉫";s:3:"ᄐ";s:3:"㉬";s:3:"ᄑ";s:3:"㉭";s:3:"ᄒ";s:3:"㉮";s:6:"가";s:3:"㉯";s:6:"나";s:3:"㉰";s:6:"다";s:3:"㉱";s:6:"라";s:3:"㉲";s:6:"마";s:3:"㉳";s:6:"바";s:3:"㉴";s:6:"사";s:3:"㉵";s:6:"아";s:3:"㉶";s:6:"자";s:3:"㉷";s:6:"차";s:3:"㉸";s:6:"카";s:3:"㉹";s:6:"타";s:3:"㉺";s:6:"파";s:3:"㉻";s:6:"하";s:3:"㉼";s:15:"참고";s:3:"㉽";s:12:"주의";s:3:"㉾";s:6:"우";s:3:"㊀";s:3:"一";s:3:"㊁";s:3:"二";s:3:"㊂";s:3:"三";s:3:"㊃";s:3:"四";s:3:"㊄";s:3:"五";s:3:"㊅";s:3:"六";s:3:"㊆";s:3:"七";s:3:"㊇";s:3:"八";s:3:"㊈";s:3:"九";s:3:"㊉";s:3:"十";s:3:"㊊";s:3:"月";s:3:"㊋";s:3:"火";s:3:"㊌";s:3:"水";s:3:"㊍";s:3:"木";s:3:"㊎";s:3:"金";s:3:"㊏";s:3:"土";s:3:"㊐";s:3:"日";s:3:"㊑";s:3:"株";s:3:"㊒";s:3:"有";s:3:"㊓";s:3:"社";s:3:"㊔";s:3:"名";s:3:"㊕";s:3:"特";s:3:"㊖";s:3:"財";s:3:"㊗";s:3:"祝";s:3:"㊘";s:3:"労";s:3:"㊙";s:3:"秘";s:3:"㊚";s:3:"男";s:3:"㊛";s:3:"女";s:3:"㊜";s:3:"適";s:3:"㊝";s:3:"優";s:3:"㊞";s:3:"印";s:3:"㊟";s:3:"注";s:3:"㊠";s:3:"項";s:3:"㊡";s:3:"休";s:3:"㊢";s:3:"写";s:3:"㊣";s:3:"正";s:3:"㊤";s:3:"上";s:3:"㊥";s:3:"中";s:3:"㊦";s:3:"下";s:3:"㊧";s:3:"左";s:3:"㊨";s:3:"右";s:3:"㊩";s:3:"医";s:3:"㊪";s:3:"宗";s:3:"㊫";s:3:"学";s:3:"㊬";s:3:"監";s:3:"㊭";s:3:"企";s:3:"㊮";s:3:"資";s:3:"㊯";s:3:"協";s:3:"㊰";s:3:"夜";s:3:"㊱";s:2:"36";s:3:"㊲";s:2:"37";s:3:"㊳";s:2:"38";s:3:"㊴";s:2:"39";s:3:"㊵";s:2:"40";s:3:"㊶";s:2:"41";s:3:"㊷";s:2:"42";s:3:"㊸";s:2:"43";s:3:"㊹";s:2:"44";s:3:"㊺";s:2:"45";s:3:"㊻";s:2:"46";s:3:"㊼";s:2:"47";s:3:"㊽";s:2:"48";s:3:"㊾";s:2:"49";s:3:"㊿";s:2:"50";s:3:"㋀";s:4:"1月";s:3:"㋁";s:4:"2月";s:3:"㋂";s:4:"3月";s:3:"㋃";s:4:"4月";s:3:"㋄";s:4:"5月";s:3:"㋅";s:4:"6月";s:3:"㋆";s:4:"7月";s:3:"㋇";s:4:"8月";s:3:"㋈";s:4:"9月";s:3:"㋉";s:5:"10月";s:3:"㋊";s:5:"11月";s:3:"㋋";s:5:"12月";s:3:"㋌";s:2:"Hg";s:3:"㋍";s:3:"erg";s:3:"㋎";s:2:"eV";s:3:"㋏";s:3:"LTD";s:3:"㋐";s:3:"ア";s:3:"㋑";s:3:"イ";s:3:"㋒";s:3:"ウ";s:3:"㋓";s:3:"エ";s:3:"㋔";s:3:"オ";s:3:"㋕";s:3:"カ";s:3:"㋖";s:3:"キ";s:3:"㋗";s:3:"ク";s:3:"㋘";s:3:"ケ";s:3:"㋙";s:3:"コ";s:3:"㋚";s:3:"サ";s:3:"㋛";s:3:"シ";s:3:"㋜";s:3:"ス";s:3:"㋝";s:3:"セ";s:3:"㋞";s:3:"ソ";s:3:"㋟";s:3:"タ";s:3:"㋠";s:3:"チ";s:3:"㋡";s:3:"ツ";s:3:"㋢";s:3:"テ";s:3:"㋣";s:3:"ト";s:3:"㋤";s:3:"ナ";s:3:"㋥";s:3:"ニ";s:3:"㋦";s:3:"ヌ";s:3:"㋧";s:3:"ネ";s:3:"㋨";s:3:"ノ";s:3:"㋩";s:3:"ハ";s:3:"㋪";s:3:"ヒ";s:3:"㋫";s:3:"フ";s:3:"㋬";s:3:"ヘ";s:3:"㋭";s:3:"ホ";s:3:"㋮";s:3:"マ";s:3:"㋯";s:3:"ミ";s:3:"㋰";s:3:"ム";s:3:"㋱";s:3:"メ";s:3:"㋲";s:3:"モ";s:3:"㋳";s:3:"ヤ";s:3:"㋴";s:3:"ユ";s:3:"㋵";s:3:"ヨ";s:3:"㋶";s:3:"ラ";s:3:"㋷";s:3:"リ";s:3:"㋸";s:3:"ル";s:3:"㋹";s:3:"レ";s:3:"㋺";s:3:"ロ";s:3:"㋻";s:3:"ワ";s:3:"㋼";s:3:"ヰ";s:3:"㋽";s:3:"ヱ";s:3:"㋾";s:3:"ヲ";s:3:"㌀";s:15:"アパート";s:3:"㌁";s:12:"アルファ";s:3:"㌂";s:15:"アンペア";s:3:"㌃";s:9:"アール";s:3:"㌄";s:15:"イニング";s:3:"㌅";s:9:"インチ";s:3:"㌆";s:9:"ウォン";s:3:"㌇";s:18:"エスクード";s:3:"㌈";s:12:"エーカー";s:3:"㌉";s:9:"オンス";s:3:"㌊";s:9:"オーム";s:3:"㌋";s:9:"カイリ";s:3:"㌌";s:12:"カラット";s:3:"㌍";s:12:"カロリー";s:3:"㌎";s:12:"ガロン";s:3:"㌏";s:12:"ガンマ";s:3:"㌐";s:12:"ギガ";s:3:"㌑";s:12:"ギニー";s:3:"㌒";s:12:"キュリー";s:3:"㌓";s:18:"ギルダー";s:3:"㌔";s:6:"キロ";s:3:"㌕";s:18:"キログラム";s:3:"㌖";s:18:"キロメートル";s:3:"㌗";s:15:"キロワット";s:3:"㌘";s:12:"グラム";s:3:"㌙";s:18:"グラムトン";s:3:"㌚";s:18:"クルゼイロ";s:3:"㌛";s:12:"クローネ";s:3:"㌜";s:9:"ケース";s:3:"㌝";s:9:"コルナ";s:3:"㌞";s:12:"コーポ";s:3:"㌟";s:12:"サイクル";s:3:"㌠";s:15:"サンチーム";s:3:"㌡";s:15:"シリング";s:3:"㌢";s:9:"センチ";s:3:"㌣";s:9:"セント";s:3:"㌤";s:12:"ダース";s:3:"㌥";s:9:"デシ";s:3:"㌦";s:9:"ドル";s:3:"㌧";s:6:"トン";s:3:"㌨";s:6:"ナノ";s:3:"㌩";s:9:"ノット";s:3:"㌪";s:9:"ハイツ";s:3:"㌫";s:18:"パーセント";s:3:"㌬";s:12:"パーツ";s:3:"㌭";s:15:"バーレル";s:3:"㌮";s:18:"ピアストル";s:3:"㌯";s:12:"ピクル";s:3:"㌰";s:9:"ピコ";s:3:"㌱";s:9:"ビル";s:3:"㌲";s:18:"ファラッド";s:3:"㌳";s:12:"フィート";s:3:"㌴";s:18:"ブッシェル";s:3:"㌵";s:9:"フラン";s:3:"㌶";s:15:"ヘクタール";s:3:"㌷";s:9:"ペソ";s:3:"㌸";s:12:"ペニヒ";s:3:"㌹";s:9:"ヘルツ";s:3:"㌺";s:12:"ペンス";s:3:"㌻";s:15:"ページ";s:3:"㌼";s:12:"ベータ";s:3:"㌽";s:15:"ポイント";s:3:"㌾";s:12:"ボルト";s:3:"㌿";s:6:"ホン";s:3:"㍀";s:15:"ポンド";s:3:"㍁";s:9:"ホール";s:3:"㍂";s:9:"ホーン";s:3:"㍃";s:12:"マイクロ";s:3:"㍄";s:9:"マイル";s:3:"㍅";s:9:"マッハ";s:3:"㍆";s:9:"マルク";s:3:"㍇";s:15:"マンション";s:3:"㍈";s:12:"ミクロン";s:3:"㍉";s:6:"ミリ";s:3:"㍊";s:18:"ミリバール";s:3:"㍋";s:9:"メガ";s:3:"㍌";s:15:"メガトン";s:3:"㍍";s:12:"メートル";s:3:"㍎";s:12:"ヤード";s:3:"㍏";s:9:"ヤール";s:3:"㍐";s:9:"ユアン";s:3:"㍑";s:12:"リットル";s:3:"㍒";s:6:"リラ";s:3:"㍓";s:12:"ルピー";s:3:"㍔";s:15:"ルーブル";s:3:"㍕";s:6:"レム";s:3:"㍖";s:18:"レントゲン";s:3:"㍗";s:9:"ワット";s:3:"㍘";s:4:"0点";s:3:"㍙";s:4:"1点";s:3:"㍚";s:4:"2点";s:3:"㍛";s:4:"3点";s:3:"㍜";s:4:"4点";s:3:"㍝";s:4:"5点";s:3:"㍞";s:4:"6点";s:3:"㍟";s:4:"7点";s:3:"㍠";s:4:"8点";s:3:"㍡";s:4:"9点";s:3:"㍢";s:5:"10点";s:3:"㍣";s:5:"11点";s:3:"㍤";s:5:"12点";s:3:"㍥";s:5:"13点";s:3:"㍦";s:5:"14点";s:3:"㍧";s:5:"15点";s:3:"㍨";s:5:"16点";s:3:"㍩";s:5:"17点";s:3:"㍪";s:5:"18点";s:3:"㍫";s:5:"19点";s:3:"㍬";s:5:"20点";s:3:"㍭";s:5:"21点";s:3:"㍮";s:5:"22点";s:3:"㍯";s:5:"23点";s:3:"㍰";s:5:"24点";s:3:"㍱";s:3:"hPa";s:3:"㍲";s:2:"da";s:3:"㍳";s:2:"AU";s:3:"㍴";s:3:"bar";s:3:"㍵";s:2:"oV";s:3:"㍶";s:2:"pc";s:3:"㍷";s:2:"dm";s:3:"㍸";s:3:"dm2";s:3:"㍹";s:3:"dm3";s:3:"㍺";s:2:"IU";s:3:"㍻";s:6:"平成";s:3:"㍼";s:6:"昭和";s:3:"㍽";s:6:"大正";s:3:"㍾";s:6:"明治";s:3:"㍿";s:12:"株式会社";s:3:"㎀";s:2:"pA";s:3:"㎁";s:2:"nA";s:3:"㎂";s:3:"μA";s:3:"㎃";s:2:"mA";s:3:"㎄";s:2:"kA";s:3:"㎅";s:2:"KB";s:3:"㎆";s:2:"MB";s:3:"㎇";s:2:"GB";s:3:"㎈";s:3:"cal";s:3:"㎉";s:4:"kcal";s:3:"㎊";s:2:"pF";s:3:"㎋";s:2:"nF";s:3:"㎌";s:3:"μF";s:3:"㎍";s:3:"μg";s:3:"㎎";s:2:"mg";s:3:"㎏";s:2:"kg";s:3:"㎐";s:2:"Hz";s:3:"㎑";s:3:"kHz";s:3:"㎒";s:3:"MHz";s:3:"㎓";s:3:"GHz";s:3:"㎔";s:3:"THz";s:3:"㎕";s:3:"μl";s:3:"㎖";s:2:"ml";s:3:"㎗";s:2:"dl";s:3:"㎘";s:2:"kl";s:3:"㎙";s:2:"fm";s:3:"㎚";s:2:"nm";s:3:"㎛";s:3:"μm";s:3:"㎜";s:2:"mm";s:3:"㎝";s:2:"cm";s:3:"㎞";s:2:"km";s:3:"㎟";s:3:"mm2";s:3:"㎠";s:3:"cm2";s:3:"㎡";s:2:"m2";s:3:"㎢";s:3:"km2";s:3:"㎣";s:3:"mm3";s:3:"㎤";s:3:"cm3";s:3:"㎥";s:2:"m3";s:3:"㎦";s:3:"km3";s:3:"㎧";s:5:"m∕s";s:3:"㎨";s:6:"m∕s2";s:3:"㎩";s:2:"Pa";s:3:"㎪";s:3:"kPa";s:3:"㎫";s:3:"MPa";s:3:"㎬";s:3:"GPa";s:3:"㎭";s:3:"rad";s:3:"㎮";s:7:"rad∕s";s:3:"㎯";s:8:"rad∕s2";s:3:"㎰";s:2:"ps";s:3:"㎱";s:2:"ns";s:3:"㎲";s:3:"μs";s:3:"㎳";s:2:"ms";s:3:"㎴";s:2:"pV";s:3:"㎵";s:2:"nV";s:3:"㎶";s:3:"μV";s:3:"㎷";s:2:"mV";s:3:"㎸";s:2:"kV";s:3:"㎹";s:2:"MV";s:3:"㎺";s:2:"pW";s:3:"㎻";s:2:"nW";s:3:"㎼";s:3:"μW";s:3:"㎽";s:2:"mW";s:3:"㎾";s:2:"kW";s:3:"㎿";s:2:"MW";s:3:"㏀";s:3:"kΩ";s:3:"㏁";s:3:"MΩ";s:3:"㏂";s:4:"a.m.";s:3:"㏃";s:2:"Bq";s:3:"㏄";s:2:"cc";s:3:"㏅";s:2:"cd";s:3:"㏆";s:6:"C∕kg";s:3:"㏇";s:3:"Co.";s:3:"㏈";s:2:"dB";s:3:"㏉";s:2:"Gy";s:3:"㏊";s:2:"ha";s:3:"㏋";s:2:"HP";s:3:"㏌";s:2:"in";s:3:"㏍";s:2:"KK";s:3:"㏎";s:2:"KM";s:3:"㏏";s:2:"kt";s:3:"㏐";s:2:"lm";s:3:"㏑";s:2:"ln";s:3:"㏒";s:3:"log";s:3:"㏓";s:2:"lx";s:3:"㏔";s:2:"mb";s:3:"㏕";s:3:"mil";s:3:"㏖";s:3:"mol";s:3:"㏗";s:2:"PH";s:3:"㏘";s:4:"p.m.";s:3:"㏙";s:3:"PPM";s:3:"㏚";s:2:"PR";s:3:"㏛";s:2:"sr";s:3:"㏜";s:2:"Sv";s:3:"㏝";s:2:"Wb";s:3:"㏞";s:5:"V∕m";s:3:"㏟";s:5:"A∕m";s:3:"㏠";s:4:"1日";s:3:"㏡";s:4:"2日";s:3:"㏢";s:4:"3日";s:3:"㏣";s:4:"4日";s:3:"㏤";s:4:"5日";s:3:"㏥";s:4:"6日";s:3:"㏦";s:4:"7日";s:3:"㏧";s:4:"8日";s:3:"㏨";s:4:"9日";s:3:"㏩";s:5:"10日";s:3:"㏪";s:5:"11日";s:3:"㏫";s:5:"12日";s:3:"㏬";s:5:"13日";s:3:"㏭";s:5:"14日";s:3:"㏮";s:5:"15日";s:3:"㏯";s:5:"16日";s:3:"㏰";s:5:"17日";s:3:"㏱";s:5:"18日";s:3:"㏲";s:5:"19日";s:3:"㏳";s:5:"20日";s:3:"㏴";s:5:"21日";s:3:"㏵";s:5:"22日";s:3:"㏶";s:5:"23日";s:3:"㏷";s:5:"24日";s:3:"㏸";s:5:"25日";s:3:"㏹";s:5:"26日";s:3:"㏺";s:5:"27日";s:3:"㏻";s:5:"28日";s:3:"㏼";s:5:"29日";s:3:"㏽";s:5:"30日";s:3:"㏾";s:5:"31日";s:3:"㏿";s:3:"gal";s:3:"ꝰ";s:3:"ꝯ";s:3:"豈";s:3:"豈";s:3:"更";s:3:"更";s:3:"車";s:3:"車";s:3:"賈";s:3:"賈";s:3:"滑";s:3:"滑";s:3:"串";s:3:"串";s:3:"句";s:3:"句";s:3:"龜";s:3:"龜";s:3:"龜";s:3:"龜";s:3:"契";s:3:"契";s:3:"金";s:3:"金";s:3:"喇";s:3:"喇";s:3:"奈";s:3:"奈";s:3:"懶";s:3:"懶";s:3:"癩";s:3:"癩";s:3:"羅";s:3:"羅";s:3:"蘿";s:3:"蘿";s:3:"螺";s:3:"螺";s:3:"裸";s:3:"裸";s:3:"邏";s:3:"邏";s:3:"樂";s:3:"樂";s:3:"洛";s:3:"洛";s:3:"烙";s:3:"烙";s:3:"珞";s:3:"珞";s:3:"落";s:3:"落";s:3:"酪";s:3:"酪";s:3:"駱";s:3:"駱";s:3:"亂";s:3:"亂";s:3:"卵";s:3:"卵";s:3:"欄";s:3:"欄";s:3:"爛";s:3:"爛";s:3:"蘭";s:3:"蘭";s:3:"鸞";s:3:"鸞";s:3:"嵐";s:3:"嵐";s:3:"濫";s:3:"濫";s:3:"藍";s:3:"藍";s:3:"襤";s:3:"襤";s:3:"拉";s:3:"拉";s:3:"臘";s:3:"臘";s:3:"蠟";s:3:"蠟";s:3:"廊";s:3:"廊";s:3:"朗";s:3:"朗";s:3:"浪";s:3:"浪";s:3:"狼";s:3:"狼";s:3:"郎";s:3:"郎";s:3:"來";s:3:"來";s:3:"冷";s:3:"冷";s:3:"勞";s:3:"勞";s:3:"擄";s:3:"擄";s:3:"櫓";s:3:"櫓";s:3:"爐";s:3:"爐";s:3:"盧";s:3:"盧";s:3:"老";s:3:"老";s:3:"蘆";s:3:"蘆";s:3:"虜";s:3:"虜";s:3:"路";s:3:"路";s:3:"露";s:3:"露";s:3:"魯";s:3:"魯";s:3:"鷺";s:3:"鷺";s:3:"碌";s:3:"碌";s:3:"祿";s:3:"祿";s:3:"綠";s:3:"綠";s:3:"菉";s:3:"菉";s:3:"錄";s:3:"錄";s:3:"鹿";s:3:"鹿";s:3:"論";s:3:"論";s:3:"壟";s:3:"壟";s:3:"弄";s:3:"弄";s:3:"籠";s:3:"籠";s:3:"聾";s:3:"聾";s:3:"牢";s:3:"牢";s:3:"磊";s:3:"磊";s:3:"賂";s:3:"賂";s:3:"雷";s:3:"雷";s:3:"壘";s:3:"壘";s:3:"屢";s:3:"屢";s:3:"樓";s:3:"樓";s:3:"淚";s:3:"淚";s:3:"漏";s:3:"漏";s:3:"累";s:3:"累";s:3:"縷";s:3:"縷";s:3:"陋";s:3:"陋";s:3:"勒";s:3:"勒";s:3:"肋";s:3:"肋";s:3:"凜";s:3:"凜";s:3:"凌";s:3:"凌";s:3:"稜";s:3:"稜";s:3:"綾";s:3:"綾";s:3:"菱";s:3:"菱";s:3:"陵";s:3:"陵";s:3:"讀";s:3:"讀";s:3:"拏";s:3:"拏";s:3:"樂";s:3:"樂";s:3:"諾";s:3:"諾";s:3:"丹";s:3:"丹";s:3:"寧";s:3:"寧";s:3:"怒";s:3:"怒";s:3:"率";s:3:"率";s:3:"異";s:3:"異";s:3:"北";s:3:"北";s:3:"磻";s:3:"磻";s:3:"便";s:3:"便";s:3:"復";s:3:"復";s:3:"不";s:3:"不";s:3:"泌";s:3:"泌";s:3:"數";s:3:"數";s:3:"索";s:3:"索";s:3:"參";s:3:"參";s:3:"塞";s:3:"塞";s:3:"省";s:3:"省";s:3:"葉";s:3:"葉";s:3:"說";s:3:"說";s:3:"殺";s:3:"殺";s:3:"辰";s:3:"辰";s:3:"沈";s:3:"沈";s:3:"拾";s:3:"拾";s:3:"若";s:3:"若";s:3:"掠";s:3:"掠";s:3:"略";s:3:"略";s:3:"亮";s:3:"亮";s:3:"兩";s:3:"兩";s:3:"凉";s:3:"凉";s:3:"梁";s:3:"梁";s:3:"糧";s:3:"糧";s:3:"良";s:3:"良";s:3:"諒";s:3:"諒";s:3:"量";s:3:"量";s:3:"勵";s:3:"勵";s:3:"呂";s:3:"呂";s:3:"女";s:3:"女";s:3:"廬";s:3:"廬";s:3:"旅";s:3:"旅";s:3:"濾";s:3:"濾";s:3:"礪";s:3:"礪";s:3:"閭";s:3:"閭";s:3:"驪";s:3:"驪";s:3:"麗";s:3:"麗";s:3:"黎";s:3:"黎";s:3:"力";s:3:"力";s:3:"曆";s:3:"曆";s:3:"歷";s:3:"歷";s:3:"轢";s:3:"轢";s:3:"年";s:3:"年";s:3:"憐";s:3:"憐";s:3:"戀";s:3:"戀";s:3:"撚";s:3:"撚";s:3:"漣";s:3:"漣";s:3:"煉";s:3:"煉";s:3:"璉";s:3:"璉";s:3:"秊";s:3:"秊";s:3:"練";s:3:"練";s:3:"聯";s:3:"聯";s:3:"輦";s:3:"輦";s:3:"蓮";s:3:"蓮";s:3:"連";s:3:"連";s:3:"鍊";s:3:"鍊";s:3:"列";s:3:"列";s:3:"劣";s:3:"劣";s:3:"咽";s:3:"咽";s:3:"烈";s:3:"烈";s:3:"裂";s:3:"裂";s:3:"說";s:3:"說";s:3:"廉";s:3:"廉";s:3:"念";s:3:"念";s:3:"捻";s:3:"捻";s:3:"殮";s:3:"殮";s:3:"簾";s:3:"簾";s:3:"獵";s:3:"獵";s:3:"令";s:3:"令";s:3:"囹";s:3:"囹";s:3:"寧";s:3:"寧";s:3:"嶺";s:3:"嶺";s:3:"怜";s:3:"怜";s:3:"玲";s:3:"玲";s:3:"瑩";s:3:"瑩";s:3:"羚";s:3:"羚";s:3:"聆";s:3:"聆";s:3:"鈴";s:3:"鈴";s:3:"零";s:3:"零";s:3:"靈";s:3:"靈";s:3:"領";s:3:"領";s:3:"例";s:3:"例";s:3:"禮";s:3:"禮";s:3:"醴";s:3:"醴";s:3:"隸";s:3:"隸";s:3:"惡";s:3:"惡";s:3:"了";s:3:"了";s:3:"僚";s:3:"僚";s:3:"寮";s:3:"寮";s:3:"尿";s:3:"尿";s:3:"料";s:3:"料";s:3:"樂";s:3:"樂";s:3:"燎";s:3:"燎";s:3:"療";s:3:"療";s:3:"蓼";s:3:"蓼";s:3:"遼";s:3:"遼";s:3:"龍";s:3:"龍";s:3:"暈";s:3:"暈";s:3:"阮";s:3:"阮";s:3:"劉";s:3:"劉";s:3:"杻";s:3:"杻";s:3:"柳";s:3:"柳";s:3:"流";s:3:"流";s:3:"溜";s:3:"溜";s:3:"琉";s:3:"琉";s:3:"留";s:3:"留";s:3:"硫";s:3:"硫";s:3:"紐";s:3:"紐";s:3:"類";s:3:"類";s:3:"六";s:3:"六";s:3:"戮";s:3:"戮";s:3:"陸";s:3:"陸";s:3:"倫";s:3:"倫";s:3:"崙";s:3:"崙";s:3:"淪";s:3:"淪";s:3:"輪";s:3:"輪";s:3:"律";s:3:"律";s:3:"慄";s:3:"慄";s:3:"栗";s:3:"栗";s:3:"率";s:3:"率";s:3:"隆";s:3:"隆";s:3:"利";s:3:"利";s:3:"吏";s:3:"吏";s:3:"履";s:3:"履";s:3:"易";s:3:"易";s:3:"李";s:3:"李";s:3:"梨";s:3:"梨";s:3:"泥";s:3:"泥";s:3:"理";s:3:"理";s:3:"痢";s:3:"痢";s:3:"罹";s:3:"罹";s:3:"裏";s:3:"裏";s:3:"裡";s:3:"裡";s:3:"里";s:3:"里";s:3:"離";s:3:"離";s:3:"匿";s:3:"匿";s:3:"溺";s:3:"溺";s:3:"吝";s:3:"吝";s:3:"燐";s:3:"燐";s:3:"璘";s:3:"璘";s:3:"藺";s:3:"藺";s:3:"隣";s:3:"隣";s:3:"鱗";s:3:"鱗";s:3:"麟";s:3:"麟";s:3:"林";s:3:"林";s:3:"淋";s:3:"淋";s:3:"臨";s:3:"臨";s:3:"立";s:3:"立";s:3:"笠";s:3:"笠";s:3:"粒";s:3:"粒";s:3:"狀";s:3:"狀";s:3:"炙";s:3:"炙";s:3:"識";s:3:"識";s:3:"什";s:3:"什";s:3:"茶";s:3:"茶";s:3:"刺";s:3:"刺";s:3:"切";s:3:"切";s:3:"度";s:3:"度";s:3:"拓";s:3:"拓";s:3:"糖";s:3:"糖";s:3:"宅";s:3:"宅";s:3:"洞";s:3:"洞";s:3:"暴";s:3:"暴";s:3:"輻";s:3:"輻";s:3:"行";s:3:"行";s:3:"降";s:3:"降";s:3:"見";s:3:"見";s:3:"廓";s:3:"廓";s:3:"兀";s:3:"兀";s:3:"嗀";s:3:"嗀";s:3:"塚";s:3:"塚";s:3:"晴";s:3:"晴";s:3:"凞";s:3:"凞";s:3:"猪";s:3:"猪";s:3:"益";s:3:"益";s:3:"礼";s:3:"礼";s:3:"神";s:3:"神";s:3:"祥";s:3:"祥";s:3:"福";s:3:"福";s:3:"靖";s:3:"靖";s:3:"精";s:3:"精";s:3:"羽";s:3:"羽";s:3:"蘒";s:3:"蘒";s:3:"諸";s:3:"諸";s:3:"逸";s:3:"逸";s:3:"都";s:3:"都";s:3:"飯";s:3:"飯";s:3:"飼";s:3:"飼";s:3:"館";s:3:"館";s:3:"鶴";s:3:"鶴";s:3:"侮";s:3:"侮";s:3:"僧";s:3:"僧";s:3:"免";s:3:"免";s:3:"勉";s:3:"勉";s:3:"勤";s:3:"勤";s:3:"卑";s:3:"卑";s:3:"喝";s:3:"喝";s:3:"嘆";s:3:"嘆";s:3:"器";s:3:"器";s:3:"塀";s:3:"塀";s:3:"墨";s:3:"墨";s:3:"層";s:3:"層";s:3:"屮";s:3:"屮";s:3:"悔";s:3:"悔";s:3:"慨";s:3:"慨";s:3:"憎";s:3:"憎";s:3:"懲";s:3:"懲";s:3:"敏";s:3:"敏";s:3:"既";s:3:"既";s:3:"暑";s:3:"暑";s:3:"梅";s:3:"梅";s:3:"海";s:3:"海";s:3:"渚";s:3:"渚";s:3:"漢";s:3:"漢";s:3:"煮";s:3:"煮";s:3:"爫";s:3:"爫";s:3:"琢";s:3:"琢";s:3:"碑";s:3:"碑";s:3:"社";s:3:"社";s:3:"祉";s:3:"祉";s:3:"祈";s:3:"祈";s:3:"祐";s:3:"祐";s:3:"祖";s:3:"祖";s:3:"祝";s:3:"祝";s:3:"禍";s:3:"禍";s:3:"禎";s:3:"禎";s:3:"穀";s:3:"穀";s:3:"突";s:3:"突";s:3:"節";s:3:"節";s:3:"練";s:3:"練";s:3:"縉";s:3:"縉";s:3:"繁";s:3:"繁";s:3:"署";s:3:"署";s:3:"者";s:3:"者";s:3:"臭";s:3:"臭";s:3:"艹";s:3:"艹";s:3:"艹";s:3:"艹";s:3:"著";s:3:"著";s:3:"褐";s:3:"褐";s:3:"視";s:3:"視";s:3:"謁";s:3:"謁";s:3:"謹";s:3:"謹";s:3:"賓";s:3:"賓";s:3:"贈";s:3:"贈";s:3:"辶";s:3:"辶";s:3:"逸";s:3:"逸";s:3:"難";s:3:"難";s:3:"響";s:3:"響";s:3:"頻";s:3:"頻";s:3:"恵";s:3:"恵";s:3:"𤋮";s:4:"𤋮";s:3:"舘";s:3:"舘";s:3:"並";s:3:"並";s:3:"况";s:3:"况";s:3:"全";s:3:"全";s:3:"侀";s:3:"侀";s:3:"充";s:3:"充";s:3:"冀";s:3:"冀";s:3:"勇";s:3:"勇";s:3:"勺";s:3:"勺";s:3:"喝";s:3:"喝";s:3:"啕";s:3:"啕";s:3:"喙";s:3:"喙";s:3:"嗢";s:3:"嗢";s:3:"塚";s:3:"塚";s:3:"墳";s:3:"墳";s:3:"奄";s:3:"奄";s:3:"奔";s:3:"奔";s:3:"婢";s:3:"婢";s:3:"嬨";s:3:"嬨";s:3:"廒";s:3:"廒";s:3:"廙";s:3:"廙";s:3:"彩";s:3:"彩";s:3:"徭";s:3:"徭";s:3:"惘";s:3:"惘";s:3:"慎";s:3:"慎";s:3:"愈";s:3:"愈";s:3:"憎";s:3:"憎";s:3:"慠";s:3:"慠";s:3:"懲";s:3:"懲";s:3:"戴";s:3:"戴";s:3:"揄";s:3:"揄";s:3:"搜";s:3:"搜";s:3:"摒";s:3:"摒";s:3:"敖";s:3:"敖";s:3:"晴";s:3:"晴";s:3:"朗";s:3:"朗";s:3:"望";s:3:"望";s:3:"杖";s:3:"杖";s:3:"歹";s:3:"歹";s:3:"殺";s:3:"殺";s:3:"流";s:3:"流";s:3:"滛";s:3:"滛";s:3:"滋";s:3:"滋";s:3:"漢";s:3:"漢";s:3:"瀞";s:3:"瀞";s:3:"煮";s:3:"煮";s:3:"瞧";s:3:"瞧";s:3:"爵";s:3:"爵";s:3:"犯";s:3:"犯";s:3:"猪";s:3:"猪";s:3:"瑱";s:3:"瑱";s:3:"甆";s:3:"甆";s:3:"画";s:3:"画";s:3:"瘝";s:3:"瘝";s:3:"瘟";s:3:"瘟";s:3:"益";s:3:"益";s:3:"盛";s:3:"盛";s:3:"直";s:3:"直";s:3:"睊";s:3:"睊";s:3:"着";s:3:"着";s:3:"磌";s:3:"磌";s:3:"窱";s:3:"窱";s:3:"節";s:3:"節";s:3:"类";s:3:"类";s:3:"絛";s:3:"絛";s:3:"練";s:3:"練";s:3:"缾";s:3:"缾";s:3:"者";s:3:"者";s:3:"荒";s:3:"荒";s:3:"華";s:3:"華";s:3:"蝹";s:3:"蝹";s:3:"襁";s:3:"襁";s:3:"覆";s:3:"覆";s:3:"視";s:3:"視";s:3:"調";s:3:"調";s:3:"諸";s:3:"諸";s:3:"請";s:3:"請";s:3:"謁";s:3:"謁";s:3:"諾";s:3:"諾";s:3:"諭";s:3:"諭";s:3:"謹";s:3:"謹";s:3:"變";s:3:"變";s:3:"贈";s:3:"贈";s:3:"輸";s:3:"輸";s:3:"遲";s:3:"遲";s:3:"醙";s:3:"醙";s:3:"鉶";s:3:"鉶";s:3:"陼";s:3:"陼";s:3:"難";s:3:"難";s:3:"靖";s:3:"靖";s:3:"韛";s:3:"韛";s:3:"響";s:3:"響";s:3:"頋";s:3:"頋";s:3:"頻";s:3:"頻";s:3:"鬒";s:3:"鬒";s:3:"龜";s:3:"龜";s:3:"𢡊";s:4:"𢡊";s:3:"𢡄";s:4:"𢡄";s:3:"𣏕";s:4:"𣏕";s:3:"㮝";s:3:"㮝";s:3:"䀘";s:3:"䀘";s:3:"䀹";s:3:"䀹";s:3:"𥉉";s:4:"𥉉";s:3:"𥳐";s:4:"𥳐";s:3:"𧻓";s:4:"𧻓";s:3:"齃";s:3:"齃";s:3:"龎";s:3:"龎";s:3:"ff";s:2:"ff";s:3:"fi";s:2:"fi";s:3:"fl";s:2:"fl";s:3:"ffi";s:3:"ffi";s:3:"ffl";s:3:"ffl";s:3:"ſt";s:2:"st";s:3:"st";s:2:"st";s:3:"ﬓ";s:4:"մն";s:3:"ﬔ";s:4:"մե";s:3:"ﬕ";s:4:"մի";s:3:"ﬖ";s:4:"վն";s:3:"ﬗ";s:4:"մխ";s:3:"יִ";s:4:"יִ";s:3:"ײַ";s:4:"ײַ";s:3:"ﬠ";s:2:"ע";s:3:"ﬡ";s:2:"א";s:3:"ﬢ";s:2:"ד";s:3:"ﬣ";s:2:"ה";s:3:"ﬤ";s:2:"כ";s:3:"ﬥ";s:2:"ל";s:3:"ﬦ";s:2:"ם";s:3:"ﬧ";s:2:"ר";s:3:"ﬨ";s:2:"ת";s:3:"﬩";s:1:"+";s:3:"שׁ";s:4:"שׁ";s:3:"שׂ";s:4:"שׂ";s:3:"שּׁ";s:6:"שּׁ";s:3:"שּׂ";s:6:"שּׂ";s:3:"אַ";s:4:"אַ";s:3:"אָ";s:4:"אָ";s:3:"אּ";s:4:"אּ";s:3:"בּ";s:4:"בּ";s:3:"גּ";s:4:"גּ";s:3:"דּ";s:4:"דּ";s:3:"הּ";s:4:"הּ";s:3:"וּ";s:4:"וּ";s:3:"זּ";s:4:"זּ";s:3:"טּ";s:4:"טּ";s:3:"יּ";s:4:"יּ";s:3:"ךּ";s:4:"ךּ";s:3:"כּ";s:4:"כּ";s:3:"לּ";s:4:"לּ";s:3:"מּ";s:4:"מּ";s:3:"נּ";s:4:"נּ";s:3:"סּ";s:4:"סּ";s:3:"ףּ";s:4:"ףּ";s:3:"פּ";s:4:"פּ";s:3:"צּ";s:4:"צּ";s:3:"קּ";s:4:"קּ";s:3:"רּ";s:4:"רּ";s:3:"שּ";s:4:"שּ";s:3:"תּ";s:4:"תּ";s:3:"וֹ";s:4:"וֹ";s:3:"בֿ";s:4:"בֿ";s:3:"כֿ";s:4:"כֿ";s:3:"פֿ";s:4:"פֿ";s:3:"ﭏ";s:4:"אל";s:3:"ﭐ";s:2:"ٱ";s:3:"ﭑ";s:2:"ٱ";s:3:"ﭒ";s:2:"ٻ";s:3:"ﭓ";s:2:"ٻ";s:3:"ﭔ";s:2:"ٻ";s:3:"ﭕ";s:2:"ٻ";s:3:"ﭖ";s:2:"پ";s:3:"ﭗ";s:2:"پ";s:3:"ﭘ";s:2:"پ";s:3:"ﭙ";s:2:"پ";s:3:"ﭚ";s:2:"ڀ";s:3:"ﭛ";s:2:"ڀ";s:3:"ﭜ";s:2:"ڀ";s:3:"ﭝ";s:2:"ڀ";s:3:"ﭞ";s:2:"ٺ";s:3:"ﭟ";s:2:"ٺ";s:3:"ﭠ";s:2:"ٺ";s:3:"ﭡ";s:2:"ٺ";s:3:"ﭢ";s:2:"ٿ";s:3:"ﭣ";s:2:"ٿ";s:3:"ﭤ";s:2:"ٿ";s:3:"ﭥ";s:2:"ٿ";s:3:"ﭦ";s:2:"ٹ";s:3:"ﭧ";s:2:"ٹ";s:3:"ﭨ";s:2:"ٹ";s:3:"ﭩ";s:2:"ٹ";s:3:"ﭪ";s:2:"ڤ";s:3:"ﭫ";s:2:"ڤ";s:3:"ﭬ";s:2:"ڤ";s:3:"ﭭ";s:2:"ڤ";s:3:"ﭮ";s:2:"ڦ";s:3:"ﭯ";s:2:"ڦ";s:3:"ﭰ";s:2:"ڦ";s:3:"ﭱ";s:2:"ڦ";s:3:"ﭲ";s:2:"ڄ";s:3:"ﭳ";s:2:"ڄ";s:3:"ﭴ";s:2:"ڄ";s:3:"ﭵ";s:2:"ڄ";s:3:"ﭶ";s:2:"ڃ";s:3:"ﭷ";s:2:"ڃ";s:3:"ﭸ";s:2:"ڃ";s:3:"ﭹ";s:2:"ڃ";s:3:"ﭺ";s:2:"چ";s:3:"ﭻ";s:2:"چ";s:3:"ﭼ";s:2:"چ";s:3:"ﭽ";s:2:"چ";s:3:"ﭾ";s:2:"ڇ";s:3:"ﭿ";s:2:"ڇ";s:3:"ﮀ";s:2:"ڇ";s:3:"ﮁ";s:2:"ڇ";s:3:"ﮂ";s:2:"ڍ";s:3:"ﮃ";s:2:"ڍ";s:3:"ﮄ";s:2:"ڌ";s:3:"ﮅ";s:2:"ڌ";s:3:"ﮆ";s:2:"ڎ";s:3:"ﮇ";s:2:"ڎ";s:3:"ﮈ";s:2:"ڈ";s:3:"ﮉ";s:2:"ڈ";s:3:"ﮊ";s:2:"ژ";s:3:"ﮋ";s:2:"ژ";s:3:"ﮌ";s:2:"ڑ";s:3:"ﮍ";s:2:"ڑ";s:3:"ﮎ";s:2:"ک";s:3:"ﮏ";s:2:"ک";s:3:"ﮐ";s:2:"ک";s:3:"ﮑ";s:2:"ک";s:3:"ﮒ";s:2:"گ";s:3:"ﮓ";s:2:"گ";s:3:"ﮔ";s:2:"گ";s:3:"ﮕ";s:2:"گ";s:3:"ﮖ";s:2:"ڳ";s:3:"ﮗ";s:2:"ڳ";s:3:"ﮘ";s:2:"ڳ";s:3:"ﮙ";s:2:"ڳ";s:3:"ﮚ";s:2:"ڱ";s:3:"ﮛ";s:2:"ڱ";s:3:"ﮜ";s:2:"ڱ";s:3:"ﮝ";s:2:"ڱ";s:3:"ﮞ";s:2:"ں";s:3:"ﮟ";s:2:"ں";s:3:"ﮠ";s:2:"ڻ";s:3:"ﮡ";s:2:"ڻ";s:3:"ﮢ";s:2:"ڻ";s:3:"ﮣ";s:2:"ڻ";s:3:"ﮤ";s:4:"ۀ";s:3:"ﮥ";s:4:"ۀ";s:3:"ﮦ";s:2:"ہ";s:3:"ﮧ";s:2:"ہ";s:3:"ﮨ";s:2:"ہ";s:3:"ﮩ";s:2:"ہ";s:3:"ﮪ";s:2:"ھ";s:3:"ﮫ";s:2:"ھ";s:3:"ﮬ";s:2:"ھ";s:3:"ﮭ";s:2:"ھ";s:3:"ﮮ";s:2:"ے";s:3:"ﮯ";s:2:"ے";s:3:"ﮰ";s:4:"ۓ";s:3:"ﮱ";s:4:"ۓ";s:3:"ﯓ";s:2:"ڭ";s:3:"ﯔ";s:2:"ڭ";s:3:"ﯕ";s:2:"ڭ";s:3:"ﯖ";s:2:"ڭ";s:3:"ﯗ";s:2:"ۇ";s:3:"ﯘ";s:2:"ۇ";s:3:"ﯙ";s:2:"ۆ";s:3:"ﯚ";s:2:"ۆ";s:3:"ﯛ";s:2:"ۈ";s:3:"ﯜ";s:2:"ۈ";s:3:"ﯝ";s:4:"ۇٴ";s:3:"ﯞ";s:2:"ۋ";s:3:"ﯟ";s:2:"ۋ";s:3:"ﯠ";s:2:"ۅ";s:3:"ﯡ";s:2:"ۅ";s:3:"ﯢ";s:2:"ۉ";s:3:"ﯣ";s:2:"ۉ";s:3:"ﯤ";s:2:"ې";s:3:"ﯥ";s:2:"ې";s:3:"ﯦ";s:2:"ې";s:3:"ﯧ";s:2:"ې";s:3:"ﯨ";s:2:"ى";s:3:"ﯩ";s:2:"ى";s:3:"ﯪ";s:6:"ئا";s:3:"ﯫ";s:6:"ئا";s:3:"ﯬ";s:6:"ئە";s:3:"ﯭ";s:6:"ئە";s:3:"ﯮ";s:6:"ئو";s:3:"ﯯ";s:6:"ئو";s:3:"ﯰ";s:6:"ئۇ";s:3:"ﯱ";s:6:"ئۇ";s:3:"ﯲ";s:6:"ئۆ";s:3:"ﯳ";s:6:"ئۆ";s:3:"ﯴ";s:6:"ئۈ";s:3:"ﯵ";s:6:"ئۈ";s:3:"ﯶ";s:6:"ئې";s:3:"ﯷ";s:6:"ئې";s:3:"ﯸ";s:6:"ئې";s:3:"ﯹ";s:6:"ئى";s:3:"ﯺ";s:6:"ئى";s:3:"ﯻ";s:6:"ئى";s:3:"ﯼ";s:2:"ی";s:3:"ﯽ";s:2:"ی";s:3:"ﯾ";s:2:"ی";s:3:"ﯿ";s:2:"ی";s:3:"ﰀ";s:6:"ئج";s:3:"ﰁ";s:6:"ئح";s:3:"ﰂ";s:6:"ئم";s:3:"ﰃ";s:6:"ئى";s:3:"ﰄ";s:6:"ئي";s:3:"ﰅ";s:4:"بج";s:3:"ﰆ";s:4:"بح";s:3:"ﰇ";s:4:"بخ";s:3:"ﰈ";s:4:"بم";s:3:"ﰉ";s:4:"بى";s:3:"ﰊ";s:4:"بي";s:3:"ﰋ";s:4:"تج";s:3:"ﰌ";s:4:"تح";s:3:"ﰍ";s:4:"تخ";s:3:"ﰎ";s:4:"تم";s:3:"ﰏ";s:4:"تى";s:3:"ﰐ";s:4:"تي";s:3:"ﰑ";s:4:"ثج";s:3:"ﰒ";s:4:"ثم";s:3:"ﰓ";s:4:"ثى";s:3:"ﰔ";s:4:"ثي";s:3:"ﰕ";s:4:"جح";s:3:"ﰖ";s:4:"جم";s:3:"ﰗ";s:4:"حج";s:3:"ﰘ";s:4:"حم";s:3:"ﰙ";s:4:"خج";s:3:"ﰚ";s:4:"خح";s:3:"ﰛ";s:4:"خم";s:3:"ﰜ";s:4:"سج";s:3:"ﰝ";s:4:"سح";s:3:"ﰞ";s:4:"سخ";s:3:"ﰟ";s:4:"سم";s:3:"ﰠ";s:4:"صح";s:3:"ﰡ";s:4:"صم";s:3:"ﰢ";s:4:"ضج";s:3:"ﰣ";s:4:"ضح";s:3:"ﰤ";s:4:"ضخ";s:3:"ﰥ";s:4:"ضم";s:3:"ﰦ";s:4:"طح";s:3:"ﰧ";s:4:"طم";s:3:"ﰨ";s:4:"ظم";s:3:"ﰩ";s:4:"عج";s:3:"ﰪ";s:4:"عم";s:3:"ﰫ";s:4:"غج";s:3:"ﰬ";s:4:"غم";s:3:"ﰭ";s:4:"فج";s:3:"ﰮ";s:4:"فح";s:3:"ﰯ";s:4:"فخ";s:3:"ﰰ";s:4:"فم";s:3:"ﰱ";s:4:"فى";s:3:"ﰲ";s:4:"في";s:3:"ﰳ";s:4:"قح";s:3:"ﰴ";s:4:"قم";s:3:"ﰵ";s:4:"قى";s:3:"ﰶ";s:4:"قي";s:3:"ﰷ";s:4:"كا";s:3:"ﰸ";s:4:"كج";s:3:"ﰹ";s:4:"كح";s:3:"ﰺ";s:4:"كخ";s:3:"ﰻ";s:4:"كل";s:3:"ﰼ";s:4:"كم";s:3:"ﰽ";s:4:"كى";s:3:"ﰾ";s:4:"كي";s:3:"ﰿ";s:4:"لج";s:3:"ﱀ";s:4:"لح";s:3:"ﱁ";s:4:"لخ";s:3:"ﱂ";s:4:"لم";s:3:"ﱃ";s:4:"لى";s:3:"ﱄ";s:4:"لي";s:3:"ﱅ";s:4:"مج";s:3:"ﱆ";s:4:"مح";s:3:"ﱇ";s:4:"مخ";s:3:"ﱈ";s:4:"مم";s:3:"ﱉ";s:4:"مى";s:3:"ﱊ";s:4:"مي";s:3:"ﱋ";s:4:"نج";s:3:"ﱌ";s:4:"نح";s:3:"ﱍ";s:4:"نخ";s:3:"ﱎ";s:4:"نم";s:3:"ﱏ";s:4:"نى";s:3:"ﱐ";s:4:"ني";s:3:"ﱑ";s:4:"هج";s:3:"ﱒ";s:4:"هم";s:3:"ﱓ";s:4:"هى";s:3:"ﱔ";s:4:"هي";s:3:"ﱕ";s:4:"يج";s:3:"ﱖ";s:4:"يح";s:3:"ﱗ";s:4:"يخ";s:3:"ﱘ";s:4:"يم";s:3:"ﱙ";s:4:"يى";s:3:"ﱚ";s:4:"يي";s:3:"ﱛ";s:4:"ذٰ";s:3:"ﱜ";s:4:"رٰ";s:3:"ﱝ";s:4:"ىٰ";s:3:"ﱞ";s:5:" ٌّ";s:3:"ﱟ";s:5:" ٍّ";s:3:"ﱠ";s:5:" َّ";s:3:"ﱡ";s:5:" ُّ";s:3:"ﱢ";s:5:" ِّ";s:3:"ﱣ";s:5:" ّٰ";s:3:"ﱤ";s:6:"ئر";s:3:"ﱥ";s:6:"ئز";s:3:"ﱦ";s:6:"ئم";s:3:"ﱧ";s:6:"ئن";s:3:"ﱨ";s:6:"ئى";s:3:"ﱩ";s:6:"ئي";s:3:"ﱪ";s:4:"بر";s:3:"ﱫ";s:4:"بز";s:3:"ﱬ";s:4:"بم";s:3:"ﱭ";s:4:"بن";s:3:"ﱮ";s:4:"بى";s:3:"ﱯ";s:4:"بي";s:3:"ﱰ";s:4:"تر";s:3:"ﱱ";s:4:"تز";s:3:"ﱲ";s:4:"تم";s:3:"ﱳ";s:4:"تن";s:3:"ﱴ";s:4:"تى";s:3:"ﱵ";s:4:"تي";s:3:"ﱶ";s:4:"ثر";s:3:"ﱷ";s:4:"ثز";s:3:"ﱸ";s:4:"ثم";s:3:"ﱹ";s:4:"ثن";s:3:"ﱺ";s:4:"ثى";s:3:"ﱻ";s:4:"ثي";s:3:"ﱼ";s:4:"فى";s:3:"ﱽ";s:4:"في";s:3:"ﱾ";s:4:"قى";s:3:"ﱿ";s:4:"قي";s:3:"ﲀ";s:4:"كا";s:3:"ﲁ";s:4:"كل";s:3:"ﲂ";s:4:"كم";s:3:"ﲃ";s:4:"كى";s:3:"ﲄ";s:4:"كي";s:3:"ﲅ";s:4:"لم";s:3:"ﲆ";s:4:"لى";s:3:"ﲇ";s:4:"لي";s:3:"ﲈ";s:4:"ما";s:3:"ﲉ";s:4:"مم";s:3:"ﲊ";s:4:"نر";s:3:"ﲋ";s:4:"نز";s:3:"ﲌ";s:4:"نم";s:3:"ﲍ";s:4:"نن";s:3:"ﲎ";s:4:"نى";s:3:"ﲏ";s:4:"ني";s:3:"ﲐ";s:4:"ىٰ";s:3:"ﲑ";s:4:"ير";s:3:"ﲒ";s:4:"يز";s:3:"ﲓ";s:4:"يم";s:3:"ﲔ";s:4:"ين";s:3:"ﲕ";s:4:"يى";s:3:"ﲖ";s:4:"يي";s:3:"ﲗ";s:6:"ئج";s:3:"ﲘ";s:6:"ئح";s:3:"ﲙ";s:6:"ئخ";s:3:"ﲚ";s:6:"ئم";s:3:"ﲛ";s:6:"ئه";s:3:"ﲜ";s:4:"بج";s:3:"ﲝ";s:4:"بح";s:3:"ﲞ";s:4:"بخ";s:3:"ﲟ";s:4:"بم";s:3:"ﲠ";s:4:"به";s:3:"ﲡ";s:4:"تج";s:3:"ﲢ";s:4:"تح";s:3:"ﲣ";s:4:"تخ";s:3:"ﲤ";s:4:"تم";s:3:"ﲥ";s:4:"ته";s:3:"ﲦ";s:4:"ثم";s:3:"ﲧ";s:4:"جح";s:3:"ﲨ";s:4:"جم";s:3:"ﲩ";s:4:"حج";s:3:"ﲪ";s:4:"حم";s:3:"ﲫ";s:4:"خج";s:3:"ﲬ";s:4:"خم";s:3:"ﲭ";s:4:"سج";s:3:"ﲮ";s:4:"سح";s:3:"ﲯ";s:4:"سخ";s:3:"ﲰ";s:4:"سم";s:3:"ﲱ";s:4:"صح";s:3:"ﲲ";s:4:"صخ";s:3:"ﲳ";s:4:"صم";s:3:"ﲴ";s:4:"ضج";s:3:"ﲵ";s:4:"ضح";s:3:"ﲶ";s:4:"ضخ";s:3:"ﲷ";s:4:"ضم";s:3:"ﲸ";s:4:"طح";s:3:"ﲹ";s:4:"ظم";s:3:"ﲺ";s:4:"عج";s:3:"ﲻ";s:4:"عم";s:3:"ﲼ";s:4:"غج";s:3:"ﲽ";s:4:"غم";s:3:"ﲾ";s:4:"فج";s:3:"ﲿ";s:4:"فح";s:3:"ﳀ";s:4:"فخ";s:3:"ﳁ";s:4:"فم";s:3:"ﳂ";s:4:"قح";s:3:"ﳃ";s:4:"قم";s:3:"ﳄ";s:4:"كج";s:3:"ﳅ";s:4:"كح";s:3:"ﳆ";s:4:"كخ";s:3:"ﳇ";s:4:"كل";s:3:"ﳈ";s:4:"كم";s:3:"ﳉ";s:4:"لج";s:3:"ﳊ";s:4:"لح";s:3:"ﳋ";s:4:"لخ";s:3:"ﳌ";s:4:"لم";s:3:"ﳍ";s:4:"له";s:3:"ﳎ";s:4:"مج";s:3:"ﳏ";s:4:"مح";s:3:"ﳐ";s:4:"مخ";s:3:"ﳑ";s:4:"مم";s:3:"ﳒ";s:4:"نج";s:3:"ﳓ";s:4:"نح";s:3:"ﳔ";s:4:"نخ";s:3:"ﳕ";s:4:"نم";s:3:"ﳖ";s:4:"نه";s:3:"ﳗ";s:4:"هج";s:3:"ﳘ";s:4:"هم";s:3:"ﳙ";s:4:"هٰ";s:3:"ﳚ";s:4:"يج";s:3:"ﳛ";s:4:"يح";s:3:"ﳜ";s:4:"يخ";s:3:"ﳝ";s:4:"يم";s:3:"ﳞ";s:4:"يه";s:3:"ﳟ";s:6:"ئم";s:3:"ﳠ";s:6:"ئه";s:3:"ﳡ";s:4:"بم";s:3:"ﳢ";s:4:"به";s:3:"ﳣ";s:4:"تم";s:3:"ﳤ";s:4:"ته";s:3:"ﳥ";s:4:"ثم";s:3:"ﳦ";s:4:"ثه";s:3:"ﳧ";s:4:"سم";s:3:"ﳨ";s:4:"سه";s:3:"ﳩ";s:4:"شم";s:3:"ﳪ";s:4:"شه";s:3:"ﳫ";s:4:"كل";s:3:"ﳬ";s:4:"كم";s:3:"ﳭ";s:4:"لم";s:3:"ﳮ";s:4:"نم";s:3:"ﳯ";s:4:"نه";s:3:"ﳰ";s:4:"يم";s:3:"ﳱ";s:4:"يه";s:3:"ﳲ";s:6:"ـَّ";s:3:"ﳳ";s:6:"ـُّ";s:3:"ﳴ";s:6:"ـِّ";s:3:"ﳵ";s:4:"طى";s:3:"ﳶ";s:4:"طي";s:3:"ﳷ";s:4:"عى";s:3:"ﳸ";s:4:"عي";s:3:"ﳹ";s:4:"غى";s:3:"ﳺ";s:4:"غي";s:3:"ﳻ";s:4:"سى";s:3:"ﳼ";s:4:"سي";s:3:"ﳽ";s:4:"شى";s:3:"ﳾ";s:4:"شي";s:3:"ﳿ";s:4:"حى";s:3:"ﴀ";s:4:"حي";s:3:"ﴁ";s:4:"جى";s:3:"ﴂ";s:4:"جي";s:3:"ﴃ";s:4:"خى";s:3:"ﴄ";s:4:"خي";s:3:"ﴅ";s:4:"صى";s:3:"ﴆ";s:4:"صي";s:3:"ﴇ";s:4:"ضى";s:3:"ﴈ";s:4:"ضي";s:3:"ﴉ";s:4:"شج";s:3:"ﴊ";s:4:"شح";s:3:"ﴋ";s:4:"شخ";s:3:"ﴌ";s:4:"شم";s:3:"ﴍ";s:4:"شر";s:3:"ﴎ";s:4:"سر";s:3:"ﴏ";s:4:"صر";s:3:"ﴐ";s:4:"ضر";s:3:"ﴑ";s:4:"طى";s:3:"ﴒ";s:4:"طي";s:3:"ﴓ";s:4:"عى";s:3:"ﴔ";s:4:"عي";s:3:"ﴕ";s:4:"غى";s:3:"ﴖ";s:4:"غي";s:3:"ﴗ";s:4:"سى";s:3:"ﴘ";s:4:"سي";s:3:"ﴙ";s:4:"شى";s:3:"ﴚ";s:4:"شي";s:3:"ﴛ";s:4:"حى";s:3:"ﴜ";s:4:"حي";s:3:"ﴝ";s:4:"جى";s:3:"ﴞ";s:4:"جي";s:3:"ﴟ";s:4:"خى";s:3:"ﴠ";s:4:"خي";s:3:"ﴡ";s:4:"صى";s:3:"ﴢ";s:4:"صي";s:3:"ﴣ";s:4:"ضى";s:3:"ﴤ";s:4:"ضي";s:3:"ﴥ";s:4:"شج";s:3:"ﴦ";s:4:"شح";s:3:"ﴧ";s:4:"شخ";s:3:"ﴨ";s:4:"شم";s:3:"ﴩ";s:4:"شر";s:3:"ﴪ";s:4:"سر";s:3:"ﴫ";s:4:"صر";s:3:"ﴬ";s:4:"ضر";s:3:"ﴭ";s:4:"شج";s:3:"ﴮ";s:4:"شح";s:3:"ﴯ";s:4:"شخ";s:3:"ﴰ";s:4:"شم";s:3:"ﴱ";s:4:"سه";s:3:"ﴲ";s:4:"شه";s:3:"ﴳ";s:4:"طم";s:3:"ﴴ";s:4:"سج";s:3:"ﴵ";s:4:"سح";s:3:"ﴶ";s:4:"سخ";s:3:"ﴷ";s:4:"شج";s:3:"ﴸ";s:4:"شح";s:3:"ﴹ";s:4:"شخ";s:3:"ﴺ";s:4:"طم";s:3:"ﴻ";s:4:"ظم";s:3:"ﴼ";s:4:"اً";s:3:"ﴽ";s:4:"اً";s:3:"ﵐ";s:6:"تجم";s:3:"ﵑ";s:6:"تحج";s:3:"ﵒ";s:6:"تحج";s:3:"ﵓ";s:6:"تحم";s:3:"ﵔ";s:6:"تخم";s:3:"ﵕ";s:6:"تمج";s:3:"ﵖ";s:6:"تمح";s:3:"ﵗ";s:6:"تمخ";s:3:"ﵘ";s:6:"جمح";s:3:"ﵙ";s:6:"جمح";s:3:"ﵚ";s:6:"حمي";s:3:"ﵛ";s:6:"حمى";s:3:"ﵜ";s:6:"سحج";s:3:"ﵝ";s:6:"سجح";s:3:"ﵞ";s:6:"سجى";s:3:"ﵟ";s:6:"سمح";s:3:"ﵠ";s:6:"سمح";s:3:"ﵡ";s:6:"سمج";s:3:"ﵢ";s:6:"سمم";s:3:"ﵣ";s:6:"سمم";s:3:"ﵤ";s:6:"صحح";s:3:"ﵥ";s:6:"صحح";s:3:"ﵦ";s:6:"صمم";s:3:"ﵧ";s:6:"شحم";s:3:"ﵨ";s:6:"شحم";s:3:"ﵩ";s:6:"شجي";s:3:"ﵪ";s:6:"شمخ";s:3:"ﵫ";s:6:"شمخ";s:3:"ﵬ";s:6:"شمم";s:3:"ﵭ";s:6:"شمم";s:3:"ﵮ";s:6:"ضحى";s:3:"ﵯ";s:6:"ضخم";s:3:"ﵰ";s:6:"ضخم";s:3:"ﵱ";s:6:"طمح";s:3:"ﵲ";s:6:"طمح";s:3:"ﵳ";s:6:"طمم";s:3:"ﵴ";s:6:"طمي";s:3:"ﵵ";s:6:"عجم";s:3:"ﵶ";s:6:"عمم";s:3:"ﵷ";s:6:"عمم";s:3:"ﵸ";s:6:"عمى";s:3:"ﵹ";s:6:"غمم";s:3:"ﵺ";s:6:"غمي";s:3:"ﵻ";s:6:"غمى";s:3:"ﵼ";s:6:"فخم";s:3:"ﵽ";s:6:"فخم";s:3:"ﵾ";s:6:"قمح";s:3:"ﵿ";s:6:"قمم";s:3:"ﶀ";s:6:"لحم";s:3:"ﶁ";s:6:"لحي";s:3:"ﶂ";s:6:"لحى";s:3:"ﶃ";s:6:"لجج";s:3:"ﶄ";s:6:"لجج";s:3:"ﶅ";s:6:"لخم";s:3:"ﶆ";s:6:"لخم";s:3:"ﶇ";s:6:"لمح";s:3:"ﶈ";s:6:"لمح";s:3:"ﶉ";s:6:"محج";s:3:"ﶊ";s:6:"محم";s:3:"ﶋ";s:6:"محي";s:3:"ﶌ";s:6:"مجح";s:3:"ﶍ";s:6:"مجم";s:3:"ﶎ";s:6:"مخج";s:3:"ﶏ";s:6:"مخم";s:3:"ﶒ";s:6:"مجخ";s:3:"ﶓ";s:6:"همج";s:3:"ﶔ";s:6:"همم";s:3:"ﶕ";s:6:"نحم";s:3:"ﶖ";s:6:"نحى";s:3:"ﶗ";s:6:"نجم";s:3:"ﶘ";s:6:"نجم";s:3:"ﶙ";s:6:"نجى";s:3:"ﶚ";s:6:"نمي";s:3:"ﶛ";s:6:"نمى";s:3:"ﶜ";s:6:"يمم";s:3:"ﶝ";s:6:"يمم";s:3:"ﶞ";s:6:"بخي";s:3:"ﶟ";s:6:"تجي";s:3:"ﶠ";s:6:"تجى";s:3:"ﶡ";s:6:"تخي";s:3:"ﶢ";s:6:"تخى";s:3:"ﶣ";s:6:"تمي";s:3:"ﶤ";s:6:"تمى";s:3:"ﶥ";s:6:"جمي";s:3:"ﶦ";s:6:"جحى";s:3:"ﶧ";s:6:"جمى";s:3:"ﶨ";s:6:"سخى";s:3:"ﶩ";s:6:"صحي";s:3:"ﶪ";s:6:"شحي";s:3:"ﶫ";s:6:"ضحي";s:3:"ﶬ";s:6:"لجي";s:3:"ﶭ";s:6:"لمي";s:3:"ﶮ";s:6:"يحي";s:3:"ﶯ";s:6:"يجي";s:3:"ﶰ";s:6:"يمي";s:3:"ﶱ";s:6:"ممي";s:3:"ﶲ";s:6:"قمي";s:3:"ﶳ";s:6:"نحي";s:3:"ﶴ";s:6:"قمح";s:3:"ﶵ";s:6:"لحم";s:3:"ﶶ";s:6:"عمي";s:3:"ﶷ";s:6:"كمي";s:3:"ﶸ";s:6:"نجح";s:3:"ﶹ";s:6:"مخي";s:3:"ﶺ";s:6:"لجم";s:3:"ﶻ";s:6:"كمم";s:3:"ﶼ";s:6:"لجم";s:3:"ﶽ";s:6:"نجح";s:3:"ﶾ";s:6:"جحي";s:3:"ﶿ";s:6:"حجي";s:3:"ﷀ";s:6:"مجي";s:3:"ﷁ";s:6:"فمي";s:3:"ﷂ";s:6:"بحي";s:3:"ﷃ";s:6:"كمم";s:3:"ﷄ";s:6:"عجم";s:3:"ﷅ";s:6:"صمم";s:3:"ﷆ";s:6:"سخي";s:3:"ﷇ";s:6:"نجي";s:3:"ﷰ";s:6:"صلے";s:3:"ﷱ";s:6:"قلے";s:3:"ﷲ";s:8:"الله";s:3:"ﷳ";s:8:"اكبر";s:3:"ﷴ";s:8:"محمد";s:3:"ﷵ";s:8:"صلعم";s:3:"ﷶ";s:8:"رسول";s:3:"ﷷ";s:8:"عليه";s:3:"ﷸ";s:8:"وسلم";s:3:"ﷹ";s:6:"صلى";s:3:"ﷺ";s:33:"صلى الله عليه وسلم";s:3:"ﷻ";s:15:"جل جلاله";s:3:"﷼";s:8:"ریال";s:3:"︐";s:1:",";s:3:"︑";s:3:"、";s:3:"︒";s:3:"。";s:3:"︓";s:1:":";s:3:"︔";s:1:";";s:3:"︕";s:1:"!";s:3:"︖";s:1:"?";s:3:"︗";s:3:"〖";s:3:"︘";s:3:"〗";s:3:"︙";s:3:"...";s:3:"︰";s:2:"..";s:3:"︱";s:3:"—";s:3:"︲";s:3:"–";s:3:"︳";s:1:"_";s:3:"︴";s:1:"_";s:3:"︵";s:1:"(";s:3:"︶";s:1:")";s:3:"︷";s:1:"{";s:3:"︸";s:1:"}";s:3:"︹";s:3:"〔";s:3:"︺";s:3:"〕";s:3:"︻";s:3:"【";s:3:"︼";s:3:"】";s:3:"︽";s:3:"《";s:3:"︾";s:3:"》";s:3:"︿";s:3:"〈";s:3:"﹀";s:3:"〉";s:3:"﹁";s:3:"「";s:3:"﹂";s:3:"」";s:3:"﹃";s:3:"『";s:3:"﹄";s:3:"』";s:3:"﹇";s:1:"[";s:3:"﹈";s:1:"]";s:3:"﹉";s:3:" ̅";s:3:"﹊";s:3:" ̅";s:3:"﹋";s:3:" ̅";s:3:"﹌";s:3:" ̅";s:3:"﹍";s:1:"_";s:3:"﹎";s:1:"_";s:3:"﹏";s:1:"_";s:3:"﹐";s:1:",";s:3:"﹑";s:3:"、";s:3:"﹒";s:1:".";s:3:"﹔";s:1:";";s:3:"﹕";s:1:":";s:3:"﹖";s:1:"?";s:3:"﹗";s:1:"!";s:3:"﹘";s:3:"—";s:3:"﹙";s:1:"(";s:3:"﹚";s:1:")";s:3:"﹛";s:1:"{";s:3:"﹜";s:1:"}";s:3:"﹝";s:3:"〔";s:3:"﹞";s:3:"〕";s:3:"﹟";s:1:"#";s:3:"﹠";s:1:"&";s:3:"﹡";s:1:"*";s:3:"﹢";s:1:"+";s:3:"﹣";s:1:"-";s:3:"﹤";s:1:"<";s:3:"﹥";s:1:">";s:3:"﹦";s:1:"=";s:3:"﹨";s:1:"\\";s:3:"﹩";s:1:"$";s:3:"﹪";s:1:"%";s:3:"﹫";s:1:"@";s:3:"ﹰ";s:3:" ً";s:3:"ﹱ";s:4:"ـً";s:3:"ﹲ";s:3:" ٌ";s:3:"ﹴ";s:3:" ٍ";s:3:"ﹶ";s:3:" َ";s:3:"ﹷ";s:4:"ـَ";s:3:"ﹸ";s:3:" ُ";s:3:"ﹹ";s:4:"ـُ";s:3:"ﹺ";s:3:" ِ";s:3:"ﹻ";s:4:"ـِ";s:3:"ﹼ";s:3:" ّ";s:3:"ﹽ";s:4:"ـّ";s:3:"ﹾ";s:3:" ْ";s:3:"ﹿ";s:4:"ـْ";s:3:"ﺀ";s:2:"ء";s:3:"ﺁ";s:4:"آ";s:3:"ﺂ";s:4:"آ";s:3:"ﺃ";s:4:"أ";s:3:"ﺄ";s:4:"أ";s:3:"ﺅ";s:4:"ؤ";s:3:"ﺆ";s:4:"ؤ";s:3:"ﺇ";s:4:"إ";s:3:"ﺈ";s:4:"إ";s:3:"ﺉ";s:4:"ئ";s:3:"ﺊ";s:4:"ئ";s:3:"ﺋ";s:4:"ئ";s:3:"ﺌ";s:4:"ئ";s:3:"ﺍ";s:2:"ا";s:3:"ﺎ";s:2:"ا";s:3:"ﺏ";s:2:"ب";s:3:"ﺐ";s:2:"ب";s:3:"ﺑ";s:2:"ب";s:3:"ﺒ";s:2:"ب";s:3:"ﺓ";s:2:"ة";s:3:"ﺔ";s:2:"ة";s:3:"ﺕ";s:2:"ت";s:3:"ﺖ";s:2:"ت";s:3:"ﺗ";s:2:"ت";s:3:"ﺘ";s:2:"ت";s:3:"ﺙ";s:2:"ث";s:3:"ﺚ";s:2:"ث";s:3:"ﺛ";s:2:"ث";s:3:"ﺜ";s:2:"ث";s:3:"ﺝ";s:2:"ج";s:3:"ﺞ";s:2:"ج";s:3:"ﺟ";s:2:"ج";s:3:"ﺠ";s:2:"ج";s:3:"ﺡ";s:2:"ح";s:3:"ﺢ";s:2:"ح";s:3:"ﺣ";s:2:"ح";s:3:"ﺤ";s:2:"ح";s:3:"ﺥ";s:2:"خ";s:3:"ﺦ";s:2:"خ";s:3:"ﺧ";s:2:"خ";s:3:"ﺨ";s:2:"خ";s:3:"ﺩ";s:2:"د";s:3:"ﺪ";s:2:"د";s:3:"ﺫ";s:2:"ذ";s:3:"ﺬ";s:2:"ذ";s:3:"ﺭ";s:2:"ر";s:3:"ﺮ";s:2:"ر";s:3:"ﺯ";s:2:"ز";s:3:"ﺰ";s:2:"ز";s:3:"ﺱ";s:2:"س";s:3:"ﺲ";s:2:"س";s:3:"ﺳ";s:2:"س";s:3:"ﺴ";s:2:"س";s:3:"ﺵ";s:2:"ش";s:3:"ﺶ";s:2:"ش";s:3:"ﺷ";s:2:"ش";s:3:"ﺸ";s:2:"ش";s:3:"ﺹ";s:2:"ص";s:3:"ﺺ";s:2:"ص";s:3:"ﺻ";s:2:"ص";s:3:"ﺼ";s:2:"ص";s:3:"ﺽ";s:2:"ض";s:3:"ﺾ";s:2:"ض";s:3:"ﺿ";s:2:"ض";s:3:"ﻀ";s:2:"ض";s:3:"ﻁ";s:2:"ط";s:3:"ﻂ";s:2:"ط";s:3:"ﻃ";s:2:"ط";s:3:"ﻄ";s:2:"ط";s:3:"ﻅ";s:2:"ظ";s:3:"ﻆ";s:2:"ظ";s:3:"ﻇ";s:2:"ظ";s:3:"ﻈ";s:2:"ظ";s:3:"ﻉ";s:2:"ع";s:3:"ﻊ";s:2:"ع";s:3:"ﻋ";s:2:"ع";s:3:"ﻌ";s:2:"ع";s:3:"ﻍ";s:2:"غ";s:3:"ﻎ";s:2:"غ";s:3:"ﻏ";s:2:"غ";s:3:"ﻐ";s:2:"غ";s:3:"ﻑ";s:2:"ف";s:3:"ﻒ";s:2:"ف";s:3:"ﻓ";s:2:"ف";s:3:"ﻔ";s:2:"ف";s:3:"ﻕ";s:2:"ق";s:3:"ﻖ";s:2:"ق";s:3:"ﻗ";s:2:"ق";s:3:"ﻘ";s:2:"ق";s:3:"ﻙ";s:2:"ك";s:3:"ﻚ";s:2:"ك";s:3:"ﻛ";s:2:"ك";s:3:"ﻜ";s:2:"ك";s:3:"ﻝ";s:2:"ل";s:3:"ﻞ";s:2:"ل";s:3:"ﻟ";s:2:"ل";s:3:"ﻠ";s:2:"ل";s:3:"ﻡ";s:2:"م";s:3:"ﻢ";s:2:"م";s:3:"ﻣ";s:2:"م";s:3:"ﻤ";s:2:"م";s:3:"ﻥ";s:2:"ن";s:3:"ﻦ";s:2:"ن";s:3:"ﻧ";s:2:"ن";s:3:"ﻨ";s:2:"ن";s:3:"ﻩ";s:2:"ه";s:3:"ﻪ";s:2:"ه";s:3:"ﻫ";s:2:"ه";s:3:"ﻬ";s:2:"ه";s:3:"ﻭ";s:2:"و";s:3:"ﻮ";s:2:"و";s:3:"ﻯ";s:2:"ى";s:3:"ﻰ";s:2:"ى";s:3:"ﻱ";s:2:"ي";s:3:"ﻲ";s:2:"ي";s:3:"ﻳ";s:2:"ي";s:3:"ﻴ";s:2:"ي";s:3:"ﻵ";s:6:"لآ";s:3:"ﻶ";s:6:"لآ";s:3:"ﻷ";s:6:"لأ";s:3:"ﻸ";s:6:"لأ";s:3:"ﻹ";s:6:"لإ";s:3:"ﻺ";s:6:"لإ";s:3:"ﻻ";s:4:"لا";s:3:"ﻼ";s:4:"لا";s:3:"!";s:1:"!";s:3:""";s:1:""";s:3:"#";s:1:"#";s:3:"$";s:1:"$";s:3:"%";s:1:"%";s:3:"&";s:1:"&";s:3:"'";s:1:"\'";s:3:"(";s:1:"(";s:3:")";s:1:")";s:3:"*";s:1:"*";s:3:"+";s:1:"+";s:3:",";s:1:",";s:3:"-";s:1:"-";s:3:".";s:1:".";s:3:"/";s:1:"/";s:3:"0";s:1:"0";s:3:"1";s:1:"1";s:3:"2";s:1:"2";s:3:"3";s:1:"3";s:3:"4";s:1:"4";s:3:"5";s:1:"5";s:3:"6";s:1:"6";s:3:"7";s:1:"7";s:3:"8";s:1:"8";s:3:"9";s:1:"9";s:3:":";s:1:":";s:3:";";s:1:";";s:3:"<";s:1:"<";s:3:"=";s:1:"=";s:3:">";s:1:">";s:3:"?";s:1:"?";s:3:"@";s:1:"@";s:3:"A";s:1:"A";s:3:"B";s:1:"B";s:3:"C";s:1:"C";s:3:"D";s:1:"D";s:3:"E";s:1:"E";s:3:"F";s:1:"F";s:3:"G";s:1:"G";s:3:"H";s:1:"H";s:3:"I";s:1:"I";s:3:"J";s:1:"J";s:3:"K";s:1:"K";s:3:"L";s:1:"L";s:3:"M";s:1:"M";s:3:"N";s:1:"N";s:3:"O";s:1:"O";s:3:"P";s:1:"P";s:3:"Q";s:1:"Q";s:3:"R";s:1:"R";s:3:"S";s:1:"S";s:3:"T";s:1:"T";s:3:"U";s:1:"U";s:3:"V";s:1:"V";s:3:"W";s:1:"W";s:3:"X";s:1:"X";s:3:"Y";s:1:"Y";s:3:"Z";s:1:"Z";s:3:"[";s:1:"[";s:3:"\";s:1:"\\";s:3:"]";s:1:"]";s:3:"^";s:1:"^";s:3:"_";s:1:"_";s:3:"`";s:1:"`";s:3:"a";s:1:"a";s:3:"b";s:1:"b";s:3:"c";s:1:"c";s:3:"d";s:1:"d";s:3:"e";s:1:"e";s:3:"f";s:1:"f";s:3:"g";s:1:"g";s:3:"h";s:1:"h";s:3:"i";s:1:"i";s:3:"j";s:1:"j";s:3:"k";s:1:"k";s:3:"l";s:1:"l";s:3:"m";s:1:"m";s:3:"n";s:1:"n";s:3:"o";s:1:"o";s:3:"p";s:1:"p";s:3:"q";s:1:"q";s:3:"r";s:1:"r";s:3:"s";s:1:"s";s:3:"t";s:1:"t";s:3:"u";s:1:"u";s:3:"v";s:1:"v";s:3:"w";s:1:"w";s:3:"x";s:1:"x";s:3:"y";s:1:"y";s:3:"z";s:1:"z";s:3:"{";s:1:"{";s:3:"|";s:1:"|";s:3:"}";s:1:"}";s:3:"~";s:1:"~";s:3:"⦅";s:3:"⦅";s:3:"⦆";s:3:"⦆";s:3:"。";s:3:"。";s:3:"「";s:3:"「";s:3:"」";s:3:"」";s:3:"、";s:3:"、";s:3:"・";s:3:"・";s:3:"ヲ";s:3:"ヲ";s:3:"ァ";s:3:"ァ";s:3:"ィ";s:3:"ィ";s:3:"ゥ";s:3:"ゥ";s:3:"ェ";s:3:"ェ";s:3:"ォ";s:3:"ォ";s:3:"ャ";s:3:"ャ";s:3:"ュ";s:3:"ュ";s:3:"ョ";s:3:"ョ";s:3:"ッ";s:3:"ッ";s:3:"ー";s:3:"ー";s:3:"ア";s:3:"ア";s:3:"イ";s:3:"イ";s:3:"ウ";s:3:"ウ";s:3:"エ";s:3:"エ";s:3:"オ";s:3:"オ";s:3:"カ";s:3:"カ";s:3:"キ";s:3:"キ";s:3:"ク";s:3:"ク";s:3:"ケ";s:3:"ケ";s:3:"コ";s:3:"コ";s:3:"サ";s:3:"サ";s:3:"シ";s:3:"シ";s:3:"ス";s:3:"ス";s:3:"セ";s:3:"セ";s:3:"ソ";s:3:"ソ";s:3:"タ";s:3:"タ";s:3:"チ";s:3:"チ";s:3:"ツ";s:3:"ツ";s:3:"テ";s:3:"テ";s:3:"ト";s:3:"ト";s:3:"ナ";s:3:"ナ";s:3:"ニ";s:3:"ニ";s:3:"ヌ";s:3:"ヌ";s:3:"ネ";s:3:"ネ";s:3:"ノ";s:3:"ノ";s:3:"ハ";s:3:"ハ";s:3:"ヒ";s:3:"ヒ";s:3:"フ";s:3:"フ";s:3:"ヘ";s:3:"ヘ";s:3:"ホ";s:3:"ホ";s:3:"マ";s:3:"マ";s:3:"ミ";s:3:"ミ";s:3:"ム";s:3:"ム";s:3:"メ";s:3:"メ";s:3:"モ";s:3:"モ";s:3:"ヤ";s:3:"ヤ";s:3:"ユ";s:3:"ユ";s:3:"ヨ";s:3:"ヨ";s:3:"ラ";s:3:"ラ";s:3:"リ";s:3:"リ";s:3:"ル";s:3:"ル";s:3:"レ";s:3:"レ";s:3:"ロ";s:3:"ロ";s:3:"ワ";s:3:"ワ";s:3:"ン";s:3:"ン";s:3:"゙";s:3:"゙";s:3:"゚";s:3:"゚";s:3:"ᅠ";s:3:"ᅠ";s:3:"ᄀ";s:3:"ᄀ";s:3:"ᄁ";s:3:"ᄁ";s:3:"ᆪ";s:3:"ᆪ";s:3:"ᄂ";s:3:"ᄂ";s:3:"ᆬ";s:3:"ᆬ";s:3:"ᆭ";s:3:"ᆭ";s:3:"ᄃ";s:3:"ᄃ";s:3:"ᄄ";s:3:"ᄄ";s:3:"ᄅ";s:3:"ᄅ";s:3:"ᆰ";s:3:"ᆰ";s:3:"ᆱ";s:3:"ᆱ";s:3:"ᆲ";s:3:"ᆲ";s:3:"ᆳ";s:3:"ᆳ";s:3:"ᆴ";s:3:"ᆴ";s:3:"ᆵ";s:3:"ᆵ";s:3:"ᄚ";s:3:"ᄚ";s:3:"ᄆ";s:3:"ᄆ";s:3:"ᄇ";s:3:"ᄇ";s:3:"ᄈ";s:3:"ᄈ";s:3:"ᄡ";s:3:"ᄡ";s:3:"ᄉ";s:3:"ᄉ";s:3:"ᄊ";s:3:"ᄊ";s:3:"ᄋ";s:3:"ᄋ";s:3:"ᄌ";s:3:"ᄌ";s:3:"ᄍ";s:3:"ᄍ";s:3:"ᄎ";s:3:"ᄎ";s:3:"ᄏ";s:3:"ᄏ";s:3:"ᄐ";s:3:"ᄐ";s:3:"ᄑ";s:3:"ᄑ";s:3:"ᄒ";s:3:"ᄒ";s:3:"ᅡ";s:3:"ᅡ";s:3:"ᅢ";s:3:"ᅢ";s:3:"ᅣ";s:3:"ᅣ";s:3:"ᅤ";s:3:"ᅤ";s:3:"ᅥ";s:3:"ᅥ";s:3:"ᅦ";s:3:"ᅦ";s:3:"ᅧ";s:3:"ᅧ";s:3:"ᅨ";s:3:"ᅨ";s:3:"ᅩ";s:3:"ᅩ";s:3:"ᅪ";s:3:"ᅪ";s:3:"ᅫ";s:3:"ᅫ";s:3:"ᅬ";s:3:"ᅬ";s:3:"ᅭ";s:3:"ᅭ";s:3:"ᅮ";s:3:"ᅮ";s:3:"ᅯ";s:3:"ᅯ";s:3:"ᅰ";s:3:"ᅰ";s:3:"ᅱ";s:3:"ᅱ";s:3:"ᅲ";s:3:"ᅲ";s:3:"ᅳ";s:3:"ᅳ";s:3:"ᅴ";s:3:"ᅴ";s:3:"ᅵ";s:3:"ᅵ";s:3:"¢";s:2:"¢";s:3:"£";s:2:"£";s:3:"¬";s:2:"¬";s:3:" ̄";s:3:" ̄";s:3:"¦";s:2:"¦";s:3:"¥";s:2:"¥";s:3:"₩";s:3:"₩";s:3:"│";s:3:"│";s:3:"←";s:3:"←";s:3:"↑";s:3:"↑";s:3:"→";s:3:"→";s:3:"↓";s:3:"↓";s:3:"■";s:3:"■";s:3:"○";s:3:"○";s:4:"𑂚";s:8:"𑂚";s:4:"𑂜";s:8:"𑂜";s:4:"𑂫";s:8:"𑂫";s:4:"𝅗𝅥";s:8:"𝅗𝅥";s:4:"𝅘𝅥";s:8:"𝅘𝅥";s:4:"𝅘𝅥𝅮";s:12:"𝅘𝅥𝅮";s:4:"𝅘𝅥𝅯";s:12:"𝅘𝅥𝅯";s:4:"𝅘𝅥𝅰";s:12:"𝅘𝅥𝅰";s:4:"𝅘𝅥𝅱";s:12:"𝅘𝅥𝅱";s:4:"𝅘𝅥𝅲";s:12:"𝅘𝅥𝅲";s:4:"𝆹𝅥";s:8:"𝆹𝅥";s:4:"𝆺𝅥";s:8:"𝆺𝅥";s:4:"𝆹𝅥𝅮";s:12:"𝆹𝅥𝅮";s:4:"𝆺𝅥𝅮";s:12:"𝆺𝅥𝅮";s:4:"𝆹𝅥𝅯";s:12:"𝆹𝅥𝅯";s:4:"𝆺𝅥𝅯";s:12:"𝆺𝅥𝅯";s:4:"𝐀";s:1:"A";s:4:"𝐁";s:1:"B";s:4:"𝐂";s:1:"C";s:4:"𝐃";s:1:"D";s:4:"𝐄";s:1:"E";s:4:"𝐅";s:1:"F";s:4:"𝐆";s:1:"G";s:4:"𝐇";s:1:"H";s:4:"𝐈";s:1:"I";s:4:"𝐉";s:1:"J";s:4:"𝐊";s:1:"K";s:4:"𝐋";s:1:"L";s:4:"𝐌";s:1:"M";s:4:"𝐍";s:1:"N";s:4:"𝐎";s:1:"O";s:4:"𝐏";s:1:"P";s:4:"𝐐";s:1:"Q";s:4:"𝐑";s:1:"R";s:4:"𝐒";s:1:"S";s:4:"𝐓";s:1:"T";s:4:"𝐔";s:1:"U";s:4:"𝐕";s:1:"V";s:4:"𝐖";s:1:"W";s:4:"𝐗";s:1:"X";s:4:"𝐘";s:1:"Y";s:4:"𝐙";s:1:"Z";s:4:"𝐚";s:1:"a";s:4:"𝐛";s:1:"b";s:4:"𝐜";s:1:"c";s:4:"𝐝";s:1:"d";s:4:"𝐞";s:1:"e";s:4:"𝐟";s:1:"f";s:4:"𝐠";s:1:"g";s:4:"𝐡";s:1:"h";s:4:"𝐢";s:1:"i";s:4:"𝐣";s:1:"j";s:4:"𝐤";s:1:"k";s:4:"𝐥";s:1:"l";s:4:"𝐦";s:1:"m";s:4:"𝐧";s:1:"n";s:4:"𝐨";s:1:"o";s:4:"𝐩";s:1:"p";s:4:"𝐪";s:1:"q";s:4:"𝐫";s:1:"r";s:4:"𝐬";s:1:"s";s:4:"𝐭";s:1:"t";s:4:"𝐮";s:1:"u";s:4:"𝐯";s:1:"v";s:4:"𝐰";s:1:"w";s:4:"𝐱";s:1:"x";s:4:"𝐲";s:1:"y";s:4:"𝐳";s:1:"z";s:4:"𝐴";s:1:"A";s:4:"𝐵";s:1:"B";s:4:"𝐶";s:1:"C";s:4:"𝐷";s:1:"D";s:4:"𝐸";s:1:"E";s:4:"𝐹";s:1:"F";s:4:"𝐺";s:1:"G";s:4:"𝐻";s:1:"H";s:4:"𝐼";s:1:"I";s:4:"𝐽";s:1:"J";s:4:"𝐾";s:1:"K";s:4:"𝐿";s:1:"L";s:4:"𝑀";s:1:"M";s:4:"𝑁";s:1:"N";s:4:"𝑂";s:1:"O";s:4:"𝑃";s:1:"P";s:4:"𝑄";s:1:"Q";s:4:"𝑅";s:1:"R";s:4:"𝑆";s:1:"S";s:4:"𝑇";s:1:"T";s:4:"𝑈";s:1:"U";s:4:"𝑉";s:1:"V";s:4:"𝑊";s:1:"W";s:4:"𝑋";s:1:"X";s:4:"𝑌";s:1:"Y";s:4:"𝑍";s:1:"Z";s:4:"𝑎";s:1:"a";s:4:"𝑏";s:1:"b";s:4:"𝑐";s:1:"c";s:4:"𝑑";s:1:"d";s:4:"𝑒";s:1:"e";s:4:"𝑓";s:1:"f";s:4:"𝑔";s:1:"g";s:4:"𝑖";s:1:"i";s:4:"𝑗";s:1:"j";s:4:"𝑘";s:1:"k";s:4:"𝑙";s:1:"l";s:4:"𝑚";s:1:"m";s:4:"𝑛";s:1:"n";s:4:"𝑜";s:1:"o";s:4:"𝑝";s:1:"p";s:4:"𝑞";s:1:"q";s:4:"𝑟";s:1:"r";s:4:"𝑠";s:1:"s";s:4:"𝑡";s:1:"t";s:4:"𝑢";s:1:"u";s:4:"𝑣";s:1:"v";s:4:"𝑤";s:1:"w";s:4:"𝑥";s:1:"x";s:4:"𝑦";s:1:"y";s:4:"𝑧";s:1:"z";s:4:"𝑨";s:1:"A";s:4:"𝑩";s:1:"B";s:4:"𝑪";s:1:"C";s:4:"𝑫";s:1:"D";s:4:"𝑬";s:1:"E";s:4:"𝑭";s:1:"F";s:4:"𝑮";s:1:"G";s:4:"𝑯";s:1:"H";s:4:"𝑰";s:1:"I";s:4:"𝑱";s:1:"J";s:4:"𝑲";s:1:"K";s:4:"𝑳";s:1:"L";s:4:"𝑴";s:1:"M";s:4:"𝑵";s:1:"N";s:4:"𝑶";s:1:"O";s:4:"𝑷";s:1:"P";s:4:"𝑸";s:1:"Q";s:4:"𝑹";s:1:"R";s:4:"𝑺";s:1:"S";s:4:"𝑻";s:1:"T";s:4:"𝑼";s:1:"U";s:4:"𝑽";s:1:"V";s:4:"𝑾";s:1:"W";s:4:"𝑿";s:1:"X";s:4:"𝒀";s:1:"Y";s:4:"𝒁";s:1:"Z";s:4:"𝒂";s:1:"a";s:4:"𝒃";s:1:"b";s:4:"𝒄";s:1:"c";s:4:"𝒅";s:1:"d";s:4:"𝒆";s:1:"e";s:4:"𝒇";s:1:"f";s:4:"𝒈";s:1:"g";s:4:"𝒉";s:1:"h";s:4:"𝒊";s:1:"i";s:4:"𝒋";s:1:"j";s:4:"𝒌";s:1:"k";s:4:"𝒍";s:1:"l";s:4:"𝒎";s:1:"m";s:4:"𝒏";s:1:"n";s:4:"𝒐";s:1:"o";s:4:"𝒑";s:1:"p";s:4:"𝒒";s:1:"q";s:4:"𝒓";s:1:"r";s:4:"𝒔";s:1:"s";s:4:"𝒕";s:1:"t";s:4:"𝒖";s:1:"u";s:4:"𝒗";s:1:"v";s:4:"𝒘";s:1:"w";s:4:"𝒙";s:1:"x";s:4:"𝒚";s:1:"y";s:4:"𝒛";s:1:"z";s:4:"𝒜";s:1:"A";s:4:"𝒞";s:1:"C";s:4:"𝒟";s:1:"D";s:4:"𝒢";s:1:"G";s:4:"𝒥";s:1:"J";s:4:"𝒦";s:1:"K";s:4:"𝒩";s:1:"N";s:4:"𝒪";s:1:"O";s:4:"𝒫";s:1:"P";s:4:"𝒬";s:1:"Q";s:4:"𝒮";s:1:"S";s:4:"𝒯";s:1:"T";s:4:"𝒰";s:1:"U";s:4:"𝒱";s:1:"V";s:4:"𝒲";s:1:"W";s:4:"𝒳";s:1:"X";s:4:"𝒴";s:1:"Y";s:4:"𝒵";s:1:"Z";s:4:"𝒶";s:1:"a";s:4:"𝒷";s:1:"b";s:4:"𝒸";s:1:"c";s:4:"𝒹";s:1:"d";s:4:"𝒻";s:1:"f";s:4:"𝒽";s:1:"h";s:4:"𝒾";s:1:"i";s:4:"𝒿";s:1:"j";s:4:"𝓀";s:1:"k";s:4:"𝓁";s:1:"l";s:4:"𝓂";s:1:"m";s:4:"𝓃";s:1:"n";s:4:"𝓅";s:1:"p";s:4:"𝓆";s:1:"q";s:4:"𝓇";s:1:"r";s:4:"𝓈";s:1:"s";s:4:"𝓉";s:1:"t";s:4:"𝓊";s:1:"u";s:4:"𝓋";s:1:"v";s:4:"𝓌";s:1:"w";s:4:"𝓍";s:1:"x";s:4:"𝓎";s:1:"y";s:4:"𝓏";s:1:"z";s:4:"𝓐";s:1:"A";s:4:"𝓑";s:1:"B";s:4:"𝓒";s:1:"C";s:4:"𝓓";s:1:"D";s:4:"𝓔";s:1:"E";s:4:"𝓕";s:1:"F";s:4:"𝓖";s:1:"G";s:4:"𝓗";s:1:"H";s:4:"𝓘";s:1:"I";s:4:"𝓙";s:1:"J";s:4:"𝓚";s:1:"K";s:4:"𝓛";s:1:"L";s:4:"𝓜";s:1:"M";s:4:"𝓝";s:1:"N";s:4:"𝓞";s:1:"O";s:4:"𝓟";s:1:"P";s:4:"𝓠";s:1:"Q";s:4:"𝓡";s:1:"R";s:4:"𝓢";s:1:"S";s:4:"𝓣";s:1:"T";s:4:"𝓤";s:1:"U";s:4:"𝓥";s:1:"V";s:4:"𝓦";s:1:"W";s:4:"𝓧";s:1:"X";s:4:"𝓨";s:1:"Y";s:4:"𝓩";s:1:"Z";s:4:"𝓪";s:1:"a";s:4:"𝓫";s:1:"b";s:4:"𝓬";s:1:"c";s:4:"𝓭";s:1:"d";s:4:"𝓮";s:1:"e";s:4:"𝓯";s:1:"f";s:4:"𝓰";s:1:"g";s:4:"𝓱";s:1:"h";s:4:"𝓲";s:1:"i";s:4:"𝓳";s:1:"j";s:4:"𝓴";s:1:"k";s:4:"𝓵";s:1:"l";s:4:"𝓶";s:1:"m";s:4:"𝓷";s:1:"n";s:4:"𝓸";s:1:"o";s:4:"𝓹";s:1:"p";s:4:"𝓺";s:1:"q";s:4:"𝓻";s:1:"r";s:4:"𝓼";s:1:"s";s:4:"𝓽";s:1:"t";s:4:"𝓾";s:1:"u";s:4:"𝓿";s:1:"v";s:4:"𝔀";s:1:"w";s:4:"𝔁";s:1:"x";s:4:"𝔂";s:1:"y";s:4:"𝔃";s:1:"z";s:4:"𝔄";s:1:"A";s:4:"𝔅";s:1:"B";s:4:"𝔇";s:1:"D";s:4:"𝔈";s:1:"E";s:4:"𝔉";s:1:"F";s:4:"𝔊";s:1:"G";s:4:"𝔍";s:1:"J";s:4:"𝔎";s:1:"K";s:4:"𝔏";s:1:"L";s:4:"𝔐";s:1:"M";s:4:"𝔑";s:1:"N";s:4:"𝔒";s:1:"O";s:4:"𝔓";s:1:"P";s:4:"𝔔";s:1:"Q";s:4:"𝔖";s:1:"S";s:4:"𝔗";s:1:"T";s:4:"𝔘";s:1:"U";s:4:"𝔙";s:1:"V";s:4:"𝔚";s:1:"W";s:4:"𝔛";s:1:"X";s:4:"𝔜";s:1:"Y";s:4:"𝔞";s:1:"a";s:4:"𝔟";s:1:"b";s:4:"𝔠";s:1:"c";s:4:"𝔡";s:1:"d";s:4:"𝔢";s:1:"e";s:4:"𝔣";s:1:"f";s:4:"𝔤";s:1:"g";s:4:"𝔥";s:1:"h";s:4:"𝔦";s:1:"i";s:4:"𝔧";s:1:"j";s:4:"𝔨";s:1:"k";s:4:"𝔩";s:1:"l";s:4:"𝔪";s:1:"m";s:4:"𝔫";s:1:"n";s:4:"𝔬";s:1:"o";s:4:"𝔭";s:1:"p";s:4:"𝔮";s:1:"q";s:4:"𝔯";s:1:"r";s:4:"𝔰";s:1:"s";s:4:"𝔱";s:1:"t";s:4:"𝔲";s:1:"u";s:4:"𝔳";s:1:"v";s:4:"𝔴";s:1:"w";s:4:"𝔵";s:1:"x";s:4:"𝔶";s:1:"y";s:4:"𝔷";s:1:"z";s:4:"𝔸";s:1:"A";s:4:"𝔹";s:1:"B";s:4:"𝔻";s:1:"D";s:4:"𝔼";s:1:"E";s:4:"𝔽";s:1:"F";s:4:"𝔾";s:1:"G";s:4:"𝕀";s:1:"I";s:4:"𝕁";s:1:"J";s:4:"𝕂";s:1:"K";s:4:"𝕃";s:1:"L";s:4:"𝕄";s:1:"M";s:4:"𝕆";s:1:"O";s:4:"𝕊";s:1:"S";s:4:"𝕋";s:1:"T";s:4:"𝕌";s:1:"U";s:4:"𝕍";s:1:"V";s:4:"𝕎";s:1:"W";s:4:"𝕏";s:1:"X";s:4:"𝕐";s:1:"Y";s:4:"𝕒";s:1:"a";s:4:"𝕓";s:1:"b";s:4:"𝕔";s:1:"c";s:4:"𝕕";s:1:"d";s:4:"𝕖";s:1:"e";s:4:"𝕗";s:1:"f";s:4:"𝕘";s:1:"g";s:4:"𝕙";s:1:"h";s:4:"𝕚";s:1:"i";s:4:"𝕛";s:1:"j";s:4:"𝕜";s:1:"k";s:4:"𝕝";s:1:"l";s:4:"𝕞";s:1:"m";s:4:"𝕟";s:1:"n";s:4:"𝕠";s:1:"o";s:4:"𝕡";s:1:"p";s:4:"𝕢";s:1:"q";s:4:"𝕣";s:1:"r";s:4:"𝕤";s:1:"s";s:4:"𝕥";s:1:"t";s:4:"𝕦";s:1:"u";s:4:"𝕧";s:1:"v";s:4:"𝕨";s:1:"w";s:4:"𝕩";s:1:"x";s:4:"𝕪";s:1:"y";s:4:"𝕫";s:1:"z";s:4:"𝕬";s:1:"A";s:4:"𝕭";s:1:"B";s:4:"𝕮";s:1:"C";s:4:"𝕯";s:1:"D";s:4:"𝕰";s:1:"E";s:4:"𝕱";s:1:"F";s:4:"𝕲";s:1:"G";s:4:"𝕳";s:1:"H";s:4:"𝕴";s:1:"I";s:4:"𝕵";s:1:"J";s:4:"𝕶";s:1:"K";s:4:"𝕷";s:1:"L";s:4:"𝕸";s:1:"M";s:4:"𝕹";s:1:"N";s:4:"𝕺";s:1:"O";s:4:"𝕻";s:1:"P";s:4:"𝕼";s:1:"Q";s:4:"𝕽";s:1:"R";s:4:"𝕾";s:1:"S";s:4:"𝕿";s:1:"T";s:4:"𝖀";s:1:"U";s:4:"𝖁";s:1:"V";s:4:"𝖂";s:1:"W";s:4:"𝖃";s:1:"X";s:4:"𝖄";s:1:"Y";s:4:"𝖅";s:1:"Z";s:4:"𝖆";s:1:"a";s:4:"𝖇";s:1:"b";s:4:"𝖈";s:1:"c";s:4:"𝖉";s:1:"d";s:4:"𝖊";s:1:"e";s:4:"𝖋";s:1:"f";s:4:"𝖌";s:1:"g";s:4:"𝖍";s:1:"h";s:4:"𝖎";s:1:"i";s:4:"𝖏";s:1:"j";s:4:"𝖐";s:1:"k";s:4:"𝖑";s:1:"l";s:4:"𝖒";s:1:"m";s:4:"𝖓";s:1:"n";s:4:"𝖔";s:1:"o";s:4:"𝖕";s:1:"p";s:4:"𝖖";s:1:"q";s:4:"𝖗";s:1:"r";s:4:"𝖘";s:1:"s";s:4:"𝖙";s:1:"t";s:4:"𝖚";s:1:"u";s:4:"𝖛";s:1:"v";s:4:"𝖜";s:1:"w";s:4:"𝖝";s:1:"x";s:4:"𝖞";s:1:"y";s:4:"𝖟";s:1:"z";s:4:"𝖠";s:1:"A";s:4:"𝖡";s:1:"B";s:4:"𝖢";s:1:"C";s:4:"𝖣";s:1:"D";s:4:"𝖤";s:1:"E";s:4:"𝖥";s:1:"F";s:4:"𝖦";s:1:"G";s:4:"𝖧";s:1:"H";s:4:"𝖨";s:1:"I";s:4:"𝖩";s:1:"J";s:4:"𝖪";s:1:"K";s:4:"𝖫";s:1:"L";s:4:"𝖬";s:1:"M";s:4:"𝖭";s:1:"N";s:4:"𝖮";s:1:"O";s:4:"𝖯";s:1:"P";s:4:"𝖰";s:1:"Q";s:4:"𝖱";s:1:"R";s:4:"𝖲";s:1:"S";s:4:"𝖳";s:1:"T";s:4:"𝖴";s:1:"U";s:4:"𝖵";s:1:"V";s:4:"𝖶";s:1:"W";s:4:"𝖷";s:1:"X";s:4:"𝖸";s:1:"Y";s:4:"𝖹";s:1:"Z";s:4:"𝖺";s:1:"a";s:4:"𝖻";s:1:"b";s:4:"𝖼";s:1:"c";s:4:"𝖽";s:1:"d";s:4:"𝖾";s:1:"e";s:4:"𝖿";s:1:"f";s:4:"𝗀";s:1:"g";s:4:"𝗁";s:1:"h";s:4:"𝗂";s:1:"i";s:4:"𝗃";s:1:"j";s:4:"𝗄";s:1:"k";s:4:"𝗅";s:1:"l";s:4:"𝗆";s:1:"m";s:4:"𝗇";s:1:"n";s:4:"𝗈";s:1:"o";s:4:"𝗉";s:1:"p";s:4:"𝗊";s:1:"q";s:4:"𝗋";s:1:"r";s:4:"𝗌";s:1:"s";s:4:"𝗍";s:1:"t";s:4:"𝗎";s:1:"u";s:4:"𝗏";s:1:"v";s:4:"𝗐";s:1:"w";s:4:"𝗑";s:1:"x";s:4:"𝗒";s:1:"y";s:4:"𝗓";s:1:"z";s:4:"𝗔";s:1:"A";s:4:"𝗕";s:1:"B";s:4:"𝗖";s:1:"C";s:4:"𝗗";s:1:"D";s:4:"𝗘";s:1:"E";s:4:"𝗙";s:1:"F";s:4:"𝗚";s:1:"G";s:4:"𝗛";s:1:"H";s:4:"𝗜";s:1:"I";s:4:"𝗝";s:1:"J";s:4:"𝗞";s:1:"K";s:4:"𝗟";s:1:"L";s:4:"𝗠";s:1:"M";s:4:"𝗡";s:1:"N";s:4:"𝗢";s:1:"O";s:4:"𝗣";s:1:"P";s:4:"𝗤";s:1:"Q";s:4:"𝗥";s:1:"R";s:4:"𝗦";s:1:"S";s:4:"𝗧";s:1:"T";s:4:"𝗨";s:1:"U";s:4:"𝗩";s:1:"V";s:4:"𝗪";s:1:"W";s:4:"𝗫";s:1:"X";s:4:"𝗬";s:1:"Y";s:4:"𝗭";s:1:"Z";s:4:"𝗮";s:1:"a";s:4:"𝗯";s:1:"b";s:4:"𝗰";s:1:"c";s:4:"𝗱";s:1:"d";s:4:"𝗲";s:1:"e";s:4:"𝗳";s:1:"f";s:4:"𝗴";s:1:"g";s:4:"𝗵";s:1:"h";s:4:"𝗶";s:1:"i";s:4:"𝗷";s:1:"j";s:4:"𝗸";s:1:"k";s:4:"𝗹";s:1:"l";s:4:"𝗺";s:1:"m";s:4:"𝗻";s:1:"n";s:4:"𝗼";s:1:"o";s:4:"𝗽";s:1:"p";s:4:"𝗾";s:1:"q";s:4:"𝗿";s:1:"r";s:4:"𝘀";s:1:"s";s:4:"𝘁";s:1:"t";s:4:"𝘂";s:1:"u";s:4:"𝘃";s:1:"v";s:4:"𝘄";s:1:"w";s:4:"𝘅";s:1:"x";s:4:"𝘆";s:1:"y";s:4:"𝘇";s:1:"z";s:4:"𝘈";s:1:"A";s:4:"𝘉";s:1:"B";s:4:"𝘊";s:1:"C";s:4:"𝘋";s:1:"D";s:4:"𝘌";s:1:"E";s:4:"𝘍";s:1:"F";s:4:"𝘎";s:1:"G";s:4:"𝘏";s:1:"H";s:4:"𝘐";s:1:"I";s:4:"𝘑";s:1:"J";s:4:"𝘒";s:1:"K";s:4:"𝘓";s:1:"L";s:4:"𝘔";s:1:"M";s:4:"𝘕";s:1:"N";s:4:"𝘖";s:1:"O";s:4:"𝘗";s:1:"P";s:4:"𝘘";s:1:"Q";s:4:"𝘙";s:1:"R";s:4:"𝘚";s:1:"S";s:4:"𝘛";s:1:"T";s:4:"𝘜";s:1:"U";s:4:"𝘝";s:1:"V";s:4:"𝘞";s:1:"W";s:4:"𝘟";s:1:"X";s:4:"𝘠";s:1:"Y";s:4:"𝘡";s:1:"Z";s:4:"𝘢";s:1:"a";s:4:"𝘣";s:1:"b";s:4:"𝘤";s:1:"c";s:4:"𝘥";s:1:"d";s:4:"𝘦";s:1:"e";s:4:"𝘧";s:1:"f";s:4:"𝘨";s:1:"g";s:4:"𝘩";s:1:"h";s:4:"𝘪";s:1:"i";s:4:"𝘫";s:1:"j";s:4:"𝘬";s:1:"k";s:4:"𝘭";s:1:"l";s:4:"𝘮";s:1:"m";s:4:"𝘯";s:1:"n";s:4:"𝘰";s:1:"o";s:4:"𝘱";s:1:"p";s:4:"𝘲";s:1:"q";s:4:"𝘳";s:1:"r";s:4:"𝘴";s:1:"s";s:4:"𝘵";s:1:"t";s:4:"𝘶";s:1:"u";s:4:"𝘷";s:1:"v";s:4:"𝘸";s:1:"w";s:4:"𝘹";s:1:"x";s:4:"𝘺";s:1:"y";s:4:"𝘻";s:1:"z";s:4:"𝘼";s:1:"A";s:4:"𝘽";s:1:"B";s:4:"𝘾";s:1:"C";s:4:"𝘿";s:1:"D";s:4:"𝙀";s:1:"E";s:4:"𝙁";s:1:"F";s:4:"𝙂";s:1:"G";s:4:"𝙃";s:1:"H";s:4:"𝙄";s:1:"I";s:4:"𝙅";s:1:"J";s:4:"𝙆";s:1:"K";s:4:"𝙇";s:1:"L";s:4:"𝙈";s:1:"M";s:4:"𝙉";s:1:"N";s:4:"𝙊";s:1:"O";s:4:"𝙋";s:1:"P";s:4:"𝙌";s:1:"Q";s:4:"𝙍";s:1:"R";s:4:"𝙎";s:1:"S";s:4:"𝙏";s:1:"T";s:4:"𝙐";s:1:"U";s:4:"𝙑";s:1:"V";s:4:"𝙒";s:1:"W";s:4:"𝙓";s:1:"X";s:4:"𝙔";s:1:"Y";s:4:"𝙕";s:1:"Z";s:4:"𝙖";s:1:"a";s:4:"𝙗";s:1:"b";s:4:"𝙘";s:1:"c";s:4:"𝙙";s:1:"d";s:4:"𝙚";s:1:"e";s:4:"𝙛";s:1:"f";s:4:"𝙜";s:1:"g";s:4:"𝙝";s:1:"h";s:4:"𝙞";s:1:"i";s:4:"𝙟";s:1:"j";s:4:"𝙠";s:1:"k";s:4:"𝙡";s:1:"l";s:4:"𝙢";s:1:"m";s:4:"𝙣";s:1:"n";s:4:"𝙤";s:1:"o";s:4:"𝙥";s:1:"p";s:4:"𝙦";s:1:"q";s:4:"𝙧";s:1:"r";s:4:"𝙨";s:1:"s";s:4:"𝙩";s:1:"t";s:4:"𝙪";s:1:"u";s:4:"𝙫";s:1:"v";s:4:"𝙬";s:1:"w";s:4:"𝙭";s:1:"x";s:4:"𝙮";s:1:"y";s:4:"𝙯";s:1:"z";s:4:"𝙰";s:1:"A";s:4:"𝙱";s:1:"B";s:4:"𝙲";s:1:"C";s:4:"𝙳";s:1:"D";s:4:"𝙴";s:1:"E";s:4:"𝙵";s:1:"F";s:4:"𝙶";s:1:"G";s:4:"𝙷";s:1:"H";s:4:"𝙸";s:1:"I";s:4:"𝙹";s:1:"J";s:4:"𝙺";s:1:"K";s:4:"𝙻";s:1:"L";s:4:"𝙼";s:1:"M";s:4:"𝙽";s:1:"N";s:4:"𝙾";s:1:"O";s:4:"𝙿";s:1:"P";s:4:"𝚀";s:1:"Q";s:4:"𝚁";s:1:"R";s:4:"𝚂";s:1:"S";s:4:"𝚃";s:1:"T";s:4:"𝚄";s:1:"U";s:4:"𝚅";s:1:"V";s:4:"𝚆";s:1:"W";s:4:"𝚇";s:1:"X";s:4:"𝚈";s:1:"Y";s:4:"𝚉";s:1:"Z";s:4:"𝚊";s:1:"a";s:4:"𝚋";s:1:"b";s:4:"𝚌";s:1:"c";s:4:"𝚍";s:1:"d";s:4:"𝚎";s:1:"e";s:4:"𝚏";s:1:"f";s:4:"𝚐";s:1:"g";s:4:"𝚑";s:1:"h";s:4:"𝚒";s:1:"i";s:4:"𝚓";s:1:"j";s:4:"𝚔";s:1:"k";s:4:"𝚕";s:1:"l";s:4:"𝚖";s:1:"m";s:4:"𝚗";s:1:"n";s:4:"𝚘";s:1:"o";s:4:"𝚙";s:1:"p";s:4:"𝚚";s:1:"q";s:4:"𝚛";s:1:"r";s:4:"𝚜";s:1:"s";s:4:"𝚝";s:1:"t";s:4:"𝚞";s:1:"u";s:4:"𝚟";s:1:"v";s:4:"𝚠";s:1:"w";s:4:"𝚡";s:1:"x";s:4:"𝚢";s:1:"y";s:4:"𝚣";s:1:"z";s:4:"𝚤";s:2:"ı";s:4:"𝚥";s:2:"ȷ";s:4:"𝚨";s:2:"Α";s:4:"𝚩";s:2:"Β";s:4:"𝚪";s:2:"Γ";s:4:"𝚫";s:2:"Δ";s:4:"𝚬";s:2:"Ε";s:4:"𝚭";s:2:"Ζ";s:4:"𝚮";s:2:"Η";s:4:"𝚯";s:2:"Θ";s:4:"𝚰";s:2:"Ι";s:4:"𝚱";s:2:"Κ";s:4:"𝚲";s:2:"Λ";s:4:"𝚳";s:2:"Μ";s:4:"𝚴";s:2:"Ν";s:4:"𝚵";s:2:"Ξ";s:4:"𝚶";s:2:"Ο";s:4:"𝚷";s:2:"Π";s:4:"𝚸";s:2:"Ρ";s:4:"𝚹";s:2:"Θ";s:4:"𝚺";s:2:"Σ";s:4:"𝚻";s:2:"Τ";s:4:"𝚼";s:2:"Υ";s:4:"𝚽";s:2:"Φ";s:4:"𝚾";s:2:"Χ";s:4:"𝚿";s:2:"Ψ";s:4:"𝛀";s:2:"Ω";s:4:"𝛁";s:3:"∇";s:4:"𝛂";s:2:"α";s:4:"𝛃";s:2:"β";s:4:"𝛄";s:2:"γ";s:4:"𝛅";s:2:"δ";s:4:"𝛆";s:2:"ε";s:4:"𝛇";s:2:"ζ";s:4:"𝛈";s:2:"η";s:4:"𝛉";s:2:"θ";s:4:"𝛊";s:2:"ι";s:4:"𝛋";s:2:"κ";s:4:"𝛌";s:2:"λ";s:4:"𝛍";s:2:"μ";s:4:"𝛎";s:2:"ν";s:4:"𝛏";s:2:"ξ";s:4:"𝛐";s:2:"ο";s:4:"𝛑";s:2:"π";s:4:"𝛒";s:2:"ρ";s:4:"𝛓";s:2:"ς";s:4:"𝛔";s:2:"σ";s:4:"𝛕";s:2:"τ";s:4:"𝛖";s:2:"υ";s:4:"𝛗";s:2:"φ";s:4:"𝛘";s:2:"χ";s:4:"𝛙";s:2:"ψ";s:4:"𝛚";s:2:"ω";s:4:"𝛛";s:3:"∂";s:4:"𝛜";s:2:"ε";s:4:"𝛝";s:2:"θ";s:4:"𝛞";s:2:"κ";s:4:"𝛟";s:2:"φ";s:4:"𝛠";s:2:"ρ";s:4:"𝛡";s:2:"π";s:4:"𝛢";s:2:"Α";s:4:"𝛣";s:2:"Β";s:4:"𝛤";s:2:"Γ";s:4:"𝛥";s:2:"Δ";s:4:"𝛦";s:2:"Ε";s:4:"𝛧";s:2:"Ζ";s:4:"𝛨";s:2:"Η";s:4:"𝛩";s:2:"Θ";s:4:"𝛪";s:2:"Ι";s:4:"𝛫";s:2:"Κ";s:4:"𝛬";s:2:"Λ";s:4:"𝛭";s:2:"Μ";s:4:"𝛮";s:2:"Ν";s:4:"𝛯";s:2:"Ξ";s:4:"𝛰";s:2:"Ο";s:4:"𝛱";s:2:"Π";s:4:"𝛲";s:2:"Ρ";s:4:"𝛳";s:2:"Θ";s:4:"𝛴";s:2:"Σ";s:4:"𝛵";s:2:"Τ";s:4:"𝛶";s:2:"Υ";s:4:"𝛷";s:2:"Φ";s:4:"𝛸";s:2:"Χ";s:4:"𝛹";s:2:"Ψ";s:4:"𝛺";s:2:"Ω";s:4:"𝛻";s:3:"∇";s:4:"𝛼";s:2:"α";s:4:"𝛽";s:2:"β";s:4:"𝛾";s:2:"γ";s:4:"𝛿";s:2:"δ";s:4:"𝜀";s:2:"ε";s:4:"𝜁";s:2:"ζ";s:4:"𝜂";s:2:"η";s:4:"𝜃";s:2:"θ";s:4:"𝜄";s:2:"ι";s:4:"𝜅";s:2:"κ";s:4:"𝜆";s:2:"λ";s:4:"𝜇";s:2:"μ";s:4:"𝜈";s:2:"ν";s:4:"𝜉";s:2:"ξ";s:4:"𝜊";s:2:"ο";s:4:"𝜋";s:2:"π";s:4:"𝜌";s:2:"ρ";s:4:"𝜍";s:2:"ς";s:4:"𝜎";s:2:"σ";s:4:"𝜏";s:2:"τ";s:4:"𝜐";s:2:"υ";s:4:"𝜑";s:2:"φ";s:4:"𝜒";s:2:"χ";s:4:"𝜓";s:2:"ψ";s:4:"𝜔";s:2:"ω";s:4:"𝜕";s:3:"∂";s:4:"𝜖";s:2:"ε";s:4:"𝜗";s:2:"θ";s:4:"𝜘";s:2:"κ";s:4:"𝜙";s:2:"φ";s:4:"𝜚";s:2:"ρ";s:4:"𝜛";s:2:"π";s:4:"𝜜";s:2:"Α";s:4:"𝜝";s:2:"Β";s:4:"𝜞";s:2:"Γ";s:4:"𝜟";s:2:"Δ";s:4:"𝜠";s:2:"Ε";s:4:"𝜡";s:2:"Ζ";s:4:"𝜢";s:2:"Η";s:4:"𝜣";s:2:"Θ";s:4:"𝜤";s:2:"Ι";s:4:"𝜥";s:2:"Κ";s:4:"𝜦";s:2:"Λ";s:4:"𝜧";s:2:"Μ";s:4:"𝜨";s:2:"Ν";s:4:"𝜩";s:2:"Ξ";s:4:"𝜪";s:2:"Ο";s:4:"𝜫";s:2:"Π";s:4:"𝜬";s:2:"Ρ";s:4:"𝜭";s:2:"Θ";s:4:"𝜮";s:2:"Σ";s:4:"𝜯";s:2:"Τ";s:4:"𝜰";s:2:"Υ";s:4:"𝜱";s:2:"Φ";s:4:"𝜲";s:2:"Χ";s:4:"𝜳";s:2:"Ψ";s:4:"𝜴";s:2:"Ω";s:4:"𝜵";s:3:"∇";s:4:"𝜶";s:2:"α";s:4:"𝜷";s:2:"β";s:4:"𝜸";s:2:"γ";s:4:"𝜹";s:2:"δ";s:4:"𝜺";s:2:"ε";s:4:"𝜻";s:2:"ζ";s:4:"𝜼";s:2:"η";s:4:"𝜽";s:2:"θ";s:4:"𝜾";s:2:"ι";s:4:"𝜿";s:2:"κ";s:4:"𝝀";s:2:"λ";s:4:"𝝁";s:2:"μ";s:4:"𝝂";s:2:"ν";s:4:"𝝃";s:2:"ξ";s:4:"𝝄";s:2:"ο";s:4:"𝝅";s:2:"π";s:4:"𝝆";s:2:"ρ";s:4:"𝝇";s:2:"ς";s:4:"𝝈";s:2:"σ";s:4:"𝝉";s:2:"τ";s:4:"𝝊";s:2:"υ";s:4:"𝝋";s:2:"φ";s:4:"𝝌";s:2:"χ";s:4:"𝝍";s:2:"ψ";s:4:"𝝎";s:2:"ω";s:4:"𝝏";s:3:"∂";s:4:"𝝐";s:2:"ε";s:4:"𝝑";s:2:"θ";s:4:"𝝒";s:2:"κ";s:4:"𝝓";s:2:"φ";s:4:"𝝔";s:2:"ρ";s:4:"𝝕";s:2:"π";s:4:"𝝖";s:2:"Α";s:4:"𝝗";s:2:"Β";s:4:"𝝘";s:2:"Γ";s:4:"𝝙";s:2:"Δ";s:4:"𝝚";s:2:"Ε";s:4:"𝝛";s:2:"Ζ";s:4:"𝝜";s:2:"Η";s:4:"𝝝";s:2:"Θ";s:4:"𝝞";s:2:"Ι";s:4:"𝝟";s:2:"Κ";s:4:"𝝠";s:2:"Λ";s:4:"𝝡";s:2:"Μ";s:4:"𝝢";s:2:"Ν";s:4:"𝝣";s:2:"Ξ";s:4:"𝝤";s:2:"Ο";s:4:"𝝥";s:2:"Π";s:4:"𝝦";s:2:"Ρ";s:4:"𝝧";s:2:"Θ";s:4:"𝝨";s:2:"Σ";s:4:"𝝩";s:2:"Τ";s:4:"𝝪";s:2:"Υ";s:4:"𝝫";s:2:"Φ";s:4:"𝝬";s:2:"Χ";s:4:"𝝭";s:2:"Ψ";s:4:"𝝮";s:2:"Ω";s:4:"𝝯";s:3:"∇";s:4:"𝝰";s:2:"α";s:4:"𝝱";s:2:"β";s:4:"𝝲";s:2:"γ";s:4:"𝝳";s:2:"δ";s:4:"𝝴";s:2:"ε";s:4:"𝝵";s:2:"ζ";s:4:"𝝶";s:2:"η";s:4:"𝝷";s:2:"θ";s:4:"𝝸";s:2:"ι";s:4:"𝝹";s:2:"κ";s:4:"𝝺";s:2:"λ";s:4:"𝝻";s:2:"μ";s:4:"𝝼";s:2:"ν";s:4:"𝝽";s:2:"ξ";s:4:"𝝾";s:2:"ο";s:4:"𝝿";s:2:"π";s:4:"𝞀";s:2:"ρ";s:4:"𝞁";s:2:"ς";s:4:"𝞂";s:2:"σ";s:4:"𝞃";s:2:"τ";s:4:"𝞄";s:2:"υ";s:4:"𝞅";s:2:"φ";s:4:"𝞆";s:2:"χ";s:4:"𝞇";s:2:"ψ";s:4:"𝞈";s:2:"ω";s:4:"𝞉";s:3:"∂";s:4:"𝞊";s:2:"ε";s:4:"𝞋";s:2:"θ";s:4:"𝞌";s:2:"κ";s:4:"𝞍";s:2:"φ";s:4:"𝞎";s:2:"ρ";s:4:"𝞏";s:2:"π";s:4:"𝞐";s:2:"Α";s:4:"𝞑";s:2:"Β";s:4:"𝞒";s:2:"Γ";s:4:"𝞓";s:2:"Δ";s:4:"𝞔";s:2:"Ε";s:4:"𝞕";s:2:"Ζ";s:4:"𝞖";s:2:"Η";s:4:"𝞗";s:2:"Θ";s:4:"𝞘";s:2:"Ι";s:4:"𝞙";s:2:"Κ";s:4:"𝞚";s:2:"Λ";s:4:"𝞛";s:2:"Μ";s:4:"𝞜";s:2:"Ν";s:4:"𝞝";s:2:"Ξ";s:4:"𝞞";s:2:"Ο";s:4:"𝞟";s:2:"Π";s:4:"𝞠";s:2:"Ρ";s:4:"𝞡";s:2:"Θ";s:4:"𝞢";s:2:"Σ";s:4:"𝞣";s:2:"Τ";s:4:"𝞤";s:2:"Υ";s:4:"𝞥";s:2:"Φ";s:4:"𝞦";s:2:"Χ";s:4:"𝞧";s:2:"Ψ";s:4:"𝞨";s:2:"Ω";s:4:"𝞩";s:3:"∇";s:4:"𝞪";s:2:"α";s:4:"𝞫";s:2:"β";s:4:"𝞬";s:2:"γ";s:4:"𝞭";s:2:"δ";s:4:"𝞮";s:2:"ε";s:4:"𝞯";s:2:"ζ";s:4:"𝞰";s:2:"η";s:4:"𝞱";s:2:"θ";s:4:"𝞲";s:2:"ι";s:4:"𝞳";s:2:"κ";s:4:"𝞴";s:2:"λ";s:4:"𝞵";s:2:"μ";s:4:"𝞶";s:2:"ν";s:4:"𝞷";s:2:"ξ";s:4:"𝞸";s:2:"ο";s:4:"𝞹";s:2:"π";s:4:"𝞺";s:2:"ρ";s:4:"𝞻";s:2:"ς";s:4:"𝞼";s:2:"σ";s:4:"𝞽";s:2:"τ";s:4:"𝞾";s:2:"υ";s:4:"𝞿";s:2:"φ";s:4:"𝟀";s:2:"χ";s:4:"𝟁";s:2:"ψ";s:4:"𝟂";s:2:"ω";s:4:"𝟃";s:3:"∂";s:4:"𝟄";s:2:"ε";s:4:"𝟅";s:2:"θ";s:4:"𝟆";s:2:"κ";s:4:"𝟇";s:2:"φ";s:4:"𝟈";s:2:"ρ";s:4:"𝟉";s:2:"π";s:4:"𝟊";s:2:"Ϝ";s:4:"𝟋";s:2:"ϝ";s:4:"𝟎";s:1:"0";s:4:"𝟏";s:1:"1";s:4:"𝟐";s:1:"2";s:4:"𝟑";s:1:"3";s:4:"𝟒";s:1:"4";s:4:"𝟓";s:1:"5";s:4:"𝟔";s:1:"6";s:4:"𝟕";s:1:"7";s:4:"𝟖";s:1:"8";s:4:"𝟗";s:1:"9";s:4:"𝟘";s:1:"0";s:4:"𝟙";s:1:"1";s:4:"𝟚";s:1:"2";s:4:"𝟛";s:1:"3";s:4:"𝟜";s:1:"4";s:4:"𝟝";s:1:"5";s:4:"𝟞";s:1:"6";s:4:"𝟟";s:1:"7";s:4:"𝟠";s:1:"8";s:4:"𝟡";s:1:"9";s:4:"𝟢";s:1:"0";s:4:"𝟣";s:1:"1";s:4:"𝟤";s:1:"2";s:4:"𝟥";s:1:"3";s:4:"𝟦";s:1:"4";s:4:"𝟧";s:1:"5";s:4:"𝟨";s:1:"6";s:4:"𝟩";s:1:"7";s:4:"𝟪";s:1:"8";s:4:"𝟫";s:1:"9";s:4:"𝟬";s:1:"0";s:4:"𝟭";s:1:"1";s:4:"𝟮";s:1:"2";s:4:"𝟯";s:1:"3";s:4:"𝟰";s:1:"4";s:4:"𝟱";s:1:"5";s:4:"𝟲";s:1:"6";s:4:"𝟳";s:1:"7";s:4:"𝟴";s:1:"8";s:4:"𝟵";s:1:"9";s:4:"𝟶";s:1:"0";s:4:"𝟷";s:1:"1";s:4:"𝟸";s:1:"2";s:4:"𝟹";s:1:"3";s:4:"𝟺";s:1:"4";s:4:"𝟻";s:1:"5";s:4:"𝟼";s:1:"6";s:4:"𝟽";s:1:"7";s:4:"𝟾";s:1:"8";s:4:"𝟿";s:1:"9";s:4:"🄀";s:2:"0.";s:4:"🄁";s:2:"0,";s:4:"🄂";s:2:"1,";s:4:"🄃";s:2:"2,";s:4:"🄄";s:2:"3,";s:4:"🄅";s:2:"4,";s:4:"🄆";s:2:"5,";s:4:"🄇";s:2:"6,";s:4:"🄈";s:2:"7,";s:4:"🄉";s:2:"8,";s:4:"🄊";s:2:"9,";s:4:"🄐";s:3:"(A)";s:4:"🄑";s:3:"(B)";s:4:"🄒";s:3:"(C)";s:4:"🄓";s:3:"(D)";s:4:"🄔";s:3:"(E)";s:4:"🄕";s:3:"(F)";s:4:"🄖";s:3:"(G)";s:4:"🄗";s:3:"(H)";s:4:"🄘";s:3:"(I)";s:4:"🄙";s:3:"(J)";s:4:"🄚";s:3:"(K)";s:4:"🄛";s:3:"(L)";s:4:"🄜";s:3:"(M)";s:4:"🄝";s:3:"(N)";s:4:"🄞";s:3:"(O)";s:4:"🄟";s:3:"(P)";s:4:"🄠";s:3:"(Q)";s:4:"🄡";s:3:"(R)";s:4:"🄢";s:3:"(S)";s:4:"🄣";s:3:"(T)";s:4:"🄤";s:3:"(U)";s:4:"🄥";s:3:"(V)";s:4:"🄦";s:3:"(W)";s:4:"🄧";s:3:"(X)";s:4:"🄨";s:3:"(Y)";s:4:"🄩";s:3:"(Z)";s:4:"🄪";s:7:"〔S〕";s:4:"🄫";s:1:"C";s:4:"🄬";s:1:"R";s:4:"🄭";s:2:"CD";s:4:"🄮";s:2:"WZ";s:4:"🄰";s:1:"A";s:4:"🄱";s:1:"B";s:4:"🄲";s:1:"C";s:4:"🄳";s:1:"D";s:4:"🄴";s:1:"E";s:4:"🄵";s:1:"F";s:4:"🄶";s:1:"G";s:4:"🄷";s:1:"H";s:4:"🄸";s:1:"I";s:4:"🄹";s:1:"J";s:4:"🄺";s:1:"K";s:4:"🄻";s:1:"L";s:4:"🄼";s:1:"M";s:4:"🄽";s:1:"N";s:4:"🄾";s:1:"O";s:4:"🄿";s:1:"P";s:4:"🅀";s:1:"Q";s:4:"🅁";s:1:"R";s:4:"🅂";s:1:"S";s:4:"🅃";s:1:"T";s:4:"🅄";s:1:"U";s:4:"🅅";s:1:"V";s:4:"🅆";s:1:"W";s:4:"🅇";s:1:"X";s:4:"🅈";s:1:"Y";s:4:"🅉";s:1:"Z";s:4:"🅊";s:2:"HV";s:4:"🅋";s:2:"MV";s:4:"🅌";s:2:"SD";s:4:"🅍";s:2:"SS";s:4:"🅎";s:3:"PPV";s:4:"🅏";s:2:"WC";s:4:"🆐";s:2:"DJ";s:4:"🈀";s:6:"ほか";s:4:"🈁";s:6:"ココ";s:4:"🈂";s:3:"サ";s:4:"🈐";s:3:"手";s:4:"🈑";s:3:"字";s:4:"🈒";s:3:"双";s:4:"🈓";s:6:"デ";s:4:"🈔";s:3:"二";s:4:"🈕";s:3:"多";s:4:"🈖";s:3:"解";s:4:"🈗";s:3:"天";s:4:"🈘";s:3:"交";s:4:"🈙";s:3:"映";s:4:"🈚";s:3:"無";s:4:"🈛";s:3:"料";s:4:"🈜";s:3:"前";s:4:"🈝";s:3:"後";s:4:"🈞";s:3:"再";s:4:"🈟";s:3:"新";s:4:"🈠";s:3:"初";s:4:"🈡";s:3:"終";s:4:"🈢";s:3:"生";s:4:"🈣";s:3:"販";s:4:"🈤";s:3:"声";s:4:"🈥";s:3:"吹";s:4:"🈦";s:3:"演";s:4:"🈧";s:3:"投";s:4:"🈨";s:3:"捕";s:4:"🈩";s:3:"一";s:4:"🈪";s:3:"三";s:4:"🈫";s:3:"遊";s:4:"🈬";s:3:"左";s:4:"🈭";s:3:"中";s:4:"🈮";s:3:"右";s:4:"🈯";s:3:"指";s:4:"🈰";s:3:"走";s:4:"🈱";s:3:"打";s:4:"🈲";s:3:"禁";s:4:"🈳";s:3:"空";s:4:"🈴";s:3:"合";s:4:"🈵";s:3:"満";s:4:"🈶";s:3:"有";s:4:"🈷";s:3:"月";s:4:"🈸";s:3:"申";s:4:"🈹";s:3:"割";s:4:"🈺";s:3:"営";s:4:"🉀";s:9:"〔本〕";s:4:"🉁";s:9:"〔三〕";s:4:"🉂";s:9:"〔二〕";s:4:"🉃";s:9:"〔安〕";s:4:"🉄";s:9:"〔点〕";s:4:"🉅";s:9:"〔打〕";s:4:"🉆";s:9:"〔盗〕";s:4:"🉇";s:9:"〔勝〕";s:4:"🉈";s:9:"〔敗〕";s:4:"🉐";s:3:"得";s:4:"🉑";s:3:"可";s:4:"丽";s:3:"丽";s:4:"丸";s:3:"丸";s:4:"乁";s:3:"乁";s:4:"𠄢";s:4:"𠄢";s:4:"你";s:3:"你";s:4:"侮";s:3:"侮";s:4:"侻";s:3:"侻";s:4:"倂";s:3:"倂";s:4:"偺";s:3:"偺";s:4:"備";s:3:"備";s:4:"僧";s:3:"僧";s:4:"像";s:3:"像";s:4:"㒞";s:3:"㒞";s:4:"𠘺";s:4:"𠘺";s:4:"免";s:3:"免";s:4:"兔";s:3:"兔";s:4:"兤";s:3:"兤";s:4:"具";s:3:"具";s:4:"𠔜";s:4:"𠔜";s:4:"㒹";s:3:"㒹";s:4:"內";s:3:"內";s:4:"再";s:3:"再";s:4:"𠕋";s:4:"𠕋";s:4:"冗";s:3:"冗";s:4:"冤";s:3:"冤";s:4:"仌";s:3:"仌";s:4:"冬";s:3:"冬";s:4:"况";s:3:"况";s:4:"𩇟";s:4:"𩇟";s:4:"凵";s:3:"凵";s:4:"刃";s:3:"刃";s:4:"㓟";s:3:"㓟";s:4:"刻";s:3:"刻";s:4:"剆";s:3:"剆";s:4:"割";s:3:"割";s:4:"剷";s:3:"剷";s:4:"㔕";s:3:"㔕";s:4:"勇";s:3:"勇";s:4:"勉";s:3:"勉";s:4:"勤";s:3:"勤";s:4:"勺";s:3:"勺";s:4:"包";s:3:"包";s:4:"匆";s:3:"匆";s:4:"北";s:3:"北";s:4:"卉";s:3:"卉";s:4:"卑";s:3:"卑";s:4:"博";s:3:"博";s:4:"即";s:3:"即";s:4:"卽";s:3:"卽";s:4:"卿";s:3:"卿";s:4:"卿";s:3:"卿";s:4:"卿";s:3:"卿";s:4:"𠨬";s:4:"𠨬";s:4:"灰";s:3:"灰";s:4:"及";s:3:"及";s:4:"叟";s:3:"叟";s:4:"𠭣";s:4:"𠭣";s:4:"叫";s:3:"叫";s:4:"叱";s:3:"叱";s:4:"吆";s:3:"吆";s:4:"咞";s:3:"咞";s:4:"吸";s:3:"吸";s:4:"呈";s:3:"呈";s:4:"周";s:3:"周";s:4:"咢";s:3:"咢";s:4:"哶";s:3:"哶";s:4:"唐";s:3:"唐";s:4:"啓";s:3:"啓";s:4:"啣";s:3:"啣";s:4:"善";s:3:"善";s:4:"善";s:3:"善";s:4:"喙";s:3:"喙";s:4:"喫";s:3:"喫";s:4:"喳";s:3:"喳";s:4:"嗂";s:3:"嗂";s:4:"圖";s:3:"圖";s:4:"嘆";s:3:"嘆";s:4:"圗";s:3:"圗";s:4:"噑";s:3:"噑";s:4:"噴";s:3:"噴";s:4:"切";s:3:"切";s:4:"壮";s:3:"壮";s:4:"城";s:3:"城";s:4:"埴";s:3:"埴";s:4:"堍";s:3:"堍";s:4:"型";s:3:"型";s:4:"堲";s:3:"堲";s:4:"報";s:3:"報";s:4:"墬";s:3:"墬";s:4:"𡓤";s:4:"𡓤";s:4:"売";s:3:"売";s:4:"壷";s:3:"壷";s:4:"夆";s:3:"夆";s:4:"多";s:3:"多";s:4:"夢";s:3:"夢";s:4:"奢";s:3:"奢";s:4:"𡚨";s:4:"𡚨";s:4:"𡛪";s:4:"𡛪";s:4:"姬";s:3:"姬";s:4:"娛";s:3:"娛";s:4:"娧";s:3:"娧";s:4:"姘";s:3:"姘";s:4:"婦";s:3:"婦";s:4:"㛮";s:3:"㛮";s:4:"㛼";s:3:"㛼";s:4:"嬈";s:3:"嬈";s:4:"嬾";s:3:"嬾";s:4:"嬾";s:3:"嬾";s:4:"𡧈";s:4:"𡧈";s:4:"寃";s:3:"寃";s:4:"寘";s:3:"寘";s:4:"寧";s:3:"寧";s:4:"寳";s:3:"寳";s:4:"𡬘";s:4:"𡬘";s:4:"寿";s:3:"寿";s:4:"将";s:3:"将";s:4:"当";s:3:"当";s:4:"尢";s:3:"尢";s:4:"㞁";s:3:"㞁";s:4:"屠";s:3:"屠";s:4:"屮";s:3:"屮";s:4:"峀";s:3:"峀";s:4:"岍";s:3:"岍";s:4:"𡷤";s:4:"𡷤";s:4:"嵃";s:3:"嵃";s:4:"𡷦";s:4:"𡷦";s:4:"嵮";s:3:"嵮";s:4:"嵫";s:3:"嵫";s:4:"嵼";s:3:"嵼";s:4:"巡";s:3:"巡";s:4:"巢";s:3:"巢";s:4:"㠯";s:3:"㠯";s:4:"巽";s:3:"巽";s:4:"帨";s:3:"帨";s:4:"帽";s:3:"帽";s:4:"幩";s:3:"幩";s:4:"㡢";s:3:"㡢";s:4:"𢆃";s:4:"𢆃";s:4:"㡼";s:3:"㡼";s:4:"庰";s:3:"庰";s:4:"庳";s:3:"庳";s:4:"庶";s:3:"庶";s:4:"廊";s:3:"廊";s:4:"𪎒";s:4:"𪎒";s:4:"廾";s:3:"廾";s:4:"𢌱";s:4:"𢌱";s:4:"𢌱";s:4:"𢌱";s:4:"舁";s:3:"舁";s:4:"弢";s:3:"弢";s:4:"弢";s:3:"弢";s:4:"㣇";s:3:"㣇";s:4:"𣊸";s:4:"𣊸";s:4:"𦇚";s:4:"𦇚";s:4:"形";s:3:"形";s:4:"彫";s:3:"彫";s:4:"㣣";s:3:"㣣";s:4:"徚";s:3:"徚";s:4:"忍";s:3:"忍";s:4:"志";s:3:"志";s:4:"忹";s:3:"忹";s:4:"悁";s:3:"悁";s:4:"㤺";s:3:"㤺";s:4:"㤜";s:3:"㤜";s:4:"悔";s:3:"悔";s:4:"𢛔";s:4:"𢛔";s:4:"惇";s:3:"惇";s:4:"慈";s:3:"慈";s:4:"慌";s:3:"慌";s:4:"慎";s:3:"慎";s:4:"慌";s:3:"慌";s:4:"慺";s:3:"慺";s:4:"憎";s:3:"憎";s:4:"憲";s:3:"憲";s:4:"憤";s:3:"憤";s:4:"憯";s:3:"憯";s:4:"懞";s:3:"懞";s:4:"懲";s:3:"懲";s:4:"懶";s:3:"懶";s:4:"成";s:3:"成";s:4:"戛";s:3:"戛";s:4:"扝";s:3:"扝";s:4:"抱";s:3:"抱";s:4:"拔";s:3:"拔";s:4:"捐";s:3:"捐";s:4:"𢬌";s:4:"𢬌";s:4:"挽";s:3:"挽";s:4:"拼";s:3:"拼";s:4:"捨";s:3:"捨";s:4:"掃";s:3:"掃";s:4:"揤";s:3:"揤";s:4:"𢯱";s:4:"𢯱";s:4:"搢";s:3:"搢";s:4:"揅";s:3:"揅";s:4:"掩";s:3:"掩";s:4:"㨮";s:3:"㨮";s:4:"摩";s:3:"摩";s:4:"摾";s:3:"摾";s:4:"撝";s:3:"撝";s:4:"摷";s:3:"摷";s:4:"㩬";s:3:"㩬";s:4:"敏";s:3:"敏";s:4:"敬";s:3:"敬";s:4:"𣀊";s:4:"𣀊";s:4:"旣";s:3:"旣";s:4:"書";s:3:"書";s:4:"晉";s:3:"晉";s:4:"㬙";s:3:"㬙";s:4:"暑";s:3:"暑";s:4:"㬈";s:3:"㬈";s:4:"㫤";s:3:"㫤";s:4:"冒";s:3:"冒";s:4:"冕";s:3:"冕";s:4:"最";s:3:"最";s:4:"暜";s:3:"暜";s:4:"肭";s:3:"肭";s:4:"䏙";s:3:"䏙";s:4:"朗";s:3:"朗";s:4:"望";s:3:"望";s:4:"朡";s:3:"朡";s:4:"杞";s:3:"杞";s:4:"杓";s:3:"杓";s:4:"𣏃";s:4:"𣏃";s:4:"㭉";s:3:"㭉";s:4:"柺";s:3:"柺";s:4:"枅";s:3:"枅";s:4:"桒";s:3:"桒";s:4:"梅";s:3:"梅";s:4:"𣑭";s:4:"𣑭";s:4:"梎";s:3:"梎";s:4:"栟";s:3:"栟";s:4:"椔";s:3:"椔";s:4:"㮝";s:3:"㮝";s:4:"楂";s:3:"楂";s:4:"榣";s:3:"榣";s:4:"槪";s:3:"槪";s:4:"檨";s:3:"檨";s:4:"𣚣";s:4:"𣚣";s:4:"櫛";s:3:"櫛";s:4:"㰘";s:3:"㰘";s:4:"次";s:3:"次";s:4:"𣢧";s:4:"𣢧";s:4:"歔";s:3:"歔";s:4:"㱎";s:3:"㱎";s:4:"歲";s:3:"歲";s:4:"殟";s:3:"殟";s:4:"殺";s:3:"殺";s:4:"殻";s:3:"殻";s:4:"𣪍";s:4:"𣪍";s:4:"𡴋";s:4:"𡴋";s:4:"𣫺";s:4:"𣫺";s:4:"汎";s:3:"汎";s:4:"𣲼";s:4:"𣲼";s:4:"沿";s:3:"沿";s:4:"泍";s:3:"泍";s:4:"汧";s:3:"汧";s:4:"洖";s:3:"洖";s:4:"派";s:3:"派";s:4:"海";s:3:"海";s:4:"流";s:3:"流";s:4:"浩";s:3:"浩";s:4:"浸";s:3:"浸";s:4:"涅";s:3:"涅";s:4:"𣴞";s:4:"𣴞";s:4:"洴";s:3:"洴";s:4:"港";s:3:"港";s:4:"湮";s:3:"湮";s:4:"㴳";s:3:"㴳";s:4:"滋";s:3:"滋";s:4:"滇";s:3:"滇";s:4:"𣻑";s:4:"𣻑";s:4:"淹";s:3:"淹";s:4:"潮";s:3:"潮";s:4:"𣽞";s:4:"𣽞";s:4:"𣾎";s:4:"𣾎";s:4:"濆";s:3:"濆";s:4:"瀹";s:3:"瀹";s:4:"瀞";s:3:"瀞";s:4:"瀛";s:3:"瀛";s:4:"㶖";s:3:"㶖";s:4:"灊";s:3:"灊";s:4:"災";s:3:"災";s:4:"灷";s:3:"灷";s:4:"炭";s:3:"炭";s:4:"𠔥";s:4:"𠔥";s:4:"煅";s:3:"煅";s:4:"𤉣";s:4:"𤉣";s:4:"熜";s:3:"熜";s:4:"𤎫";s:4:"𤎫";s:4:"爨";s:3:"爨";s:4:"爵";s:3:"爵";s:4:"牐";s:3:"牐";s:4:"𤘈";s:4:"𤘈";s:4:"犀";s:3:"犀";s:4:"犕";s:3:"犕";s:4:"𤜵";s:4:"𤜵";s:4:"𤠔";s:4:"𤠔";s:4:"獺";s:3:"獺";s:4:"王";s:3:"王";s:4:"㺬";s:3:"㺬";s:4:"玥";s:3:"玥";s:4:"㺸";s:3:"㺸";s:4:"㺸";s:3:"㺸";s:4:"瑇";s:3:"瑇";s:4:"瑜";s:3:"瑜";s:4:"瑱";s:3:"瑱";s:4:"璅";s:3:"璅";s:4:"瓊";s:3:"瓊";s:4:"㼛";s:3:"㼛";s:4:"甤";s:3:"甤";s:4:"𤰶";s:4:"𤰶";s:4:"甾";s:3:"甾";s:4:"𤲒";s:4:"𤲒";s:4:"異";s:3:"異";s:4:"𢆟";s:4:"𢆟";s:4:"瘐";s:3:"瘐";s:4:"𤾡";s:4:"𤾡";s:4:"𤾸";s:4:"𤾸";s:4:"𥁄";s:4:"𥁄";s:4:"㿼";s:3:"㿼";s:4:"䀈";s:3:"䀈";s:4:"直";s:3:"直";s:4:"𥃳";s:4:"𥃳";s:4:"𥃲";s:4:"𥃲";s:4:"𥄙";s:4:"𥄙";s:4:"𥄳";s:4:"𥄳";s:4:"眞";s:3:"眞";s:4:"真";s:3:"真";s:4:"真";s:3:"真";s:4:"睊";s:3:"睊";s:4:"䀹";s:3:"䀹";s:4:"瞋";s:3:"瞋";s:4:"䁆";s:3:"䁆";s:4:"䂖";s:3:"䂖";s:4:"𥐝";s:4:"𥐝";s:4:"硎";s:3:"硎";s:4:"碌";s:3:"碌";s:4:"磌";s:3:"磌";s:4:"䃣";s:3:"䃣";s:4:"𥘦";s:4:"𥘦";s:4:"祖";s:3:"祖";s:4:"𥚚";s:4:"𥚚";s:4:"𥛅";s:4:"𥛅";s:4:"福";s:3:"福";s:4:"秫";s:3:"秫";s:4:"䄯";s:3:"䄯";s:4:"穀";s:3:"穀";s:4:"穊";s:3:"穊";s:4:"穏";s:3:"穏";s:4:"𥥼";s:4:"𥥼";s:4:"𥪧";s:4:"𥪧";s:4:"𥪧";s:4:"𥪧";s:4:"竮";s:3:"竮";s:4:"䈂";s:3:"䈂";s:4:"𥮫";s:4:"𥮫";s:4:"篆";s:3:"篆";s:4:"築";s:3:"築";s:4:"䈧";s:3:"䈧";s:4:"𥲀";s:4:"𥲀";s:4:"糒";s:3:"糒";s:4:"䊠";s:3:"䊠";s:4:"糨";s:3:"糨";s:4:"糣";s:3:"糣";s:4:"紀";s:3:"紀";s:4:"𥾆";s:4:"𥾆";s:4:"絣";s:3:"絣";s:4:"䌁";s:3:"䌁";s:4:"緇";s:3:"緇";s:4:"縂";s:3:"縂";s:4:"繅";s:3:"繅";s:4:"䌴";s:3:"䌴";s:4:"𦈨";s:4:"𦈨";s:4:"𦉇";s:4:"𦉇";s:4:"䍙";s:3:"䍙";s:4:"𦋙";s:4:"𦋙";s:4:"罺";s:3:"罺";s:4:"𦌾";s:4:"𦌾";s:4:"羕";s:3:"羕";s:4:"翺";s:3:"翺";s:4:"者";s:3:"者";s:4:"𦓚";s:4:"𦓚";s:4:"𦔣";s:4:"𦔣";s:4:"聠";s:3:"聠";s:4:"𦖨";s:4:"𦖨";s:4:"聰";s:3:"聰";s:4:"𣍟";s:4:"𣍟";s:4:"䏕";s:3:"䏕";s:4:"育";s:3:"育";s:4:"脃";s:3:"脃";s:4:"䐋";s:3:"䐋";s:4:"脾";s:3:"脾";s:4:"媵";s:3:"媵";s:4:"𦞧";s:4:"𦞧";s:4:"𦞵";s:4:"𦞵";s:4:"𣎓";s:4:"𣎓";s:4:"𣎜";s:4:"𣎜";s:4:"舁";s:3:"舁";s:4:"舄";s:3:"舄";s:4:"辞";s:3:"辞";s:4:"䑫";s:3:"䑫";s:4:"芑";s:3:"芑";s:4:"芋";s:3:"芋";s:4:"芝";s:3:"芝";s:4:"劳";s:3:"劳";s:4:"花";s:3:"花";s:4:"芳";s:3:"芳";s:4:"芽";s:3:"芽";s:4:"苦";s:3:"苦";s:4:"𦬼";s:4:"𦬼";s:4:"若";s:3:"若";s:4:"茝";s:3:"茝";s:4:"荣";s:3:"荣";s:4:"莭";s:3:"莭";s:4:"茣";s:3:"茣";s:4:"莽";s:3:"莽";s:4:"菧";s:3:"菧";s:4:"著";s:3:"著";s:4:"荓";s:3:"荓";s:4:"菊";s:3:"菊";s:4:"菌";s:3:"菌";s:4:"菜";s:3:"菜";s:4:"𦰶";s:4:"𦰶";s:4:"𦵫";s:4:"𦵫";s:4:"𦳕";s:4:"𦳕";s:4:"䔫";s:3:"䔫";s:4:"蓱";s:3:"蓱";s:4:"蓳";s:3:"蓳";s:4:"蔖";s:3:"蔖";s:4:"𧏊";s:4:"𧏊";s:4:"蕤";s:3:"蕤";s:4:"𦼬";s:4:"𦼬";s:4:"䕝";s:3:"䕝";s:4:"䕡";s:3:"䕡";s:4:"𦾱";s:4:"𦾱";s:4:"𧃒";s:4:"𧃒";s:4:"䕫";s:3:"䕫";s:4:"虐";s:3:"虐";s:4:"虜";s:3:"虜";s:4:"虧";s:3:"虧";s:4:"虩";s:3:"虩";s:4:"蚩";s:3:"蚩";s:4:"蚈";s:3:"蚈";s:4:"蜎";s:3:"蜎";s:4:"蛢";s:3:"蛢";s:4:"蝹";s:3:"蝹";s:4:"蜨";s:3:"蜨";s:4:"蝫";s:3:"蝫";s:4:"螆";s:3:"螆";s:4:"䗗";s:3:"䗗";s:4:"蟡";s:3:"蟡";s:4:"蠁";s:3:"蠁";s:4:"䗹";s:3:"䗹";s:4:"衠";s:3:"衠";s:4:"衣";s:3:"衣";s:4:"𧙧";s:4:"𧙧";s:4:"裗";s:3:"裗";s:4:"裞";s:3:"裞";s:4:"䘵";s:3:"䘵";s:4:"裺";s:3:"裺";s:4:"㒻";s:3:"㒻";s:4:"𧢮";s:4:"𧢮";s:4:"𧥦";s:4:"𧥦";s:4:"䚾";s:3:"䚾";s:4:"䛇";s:3:"䛇";s:4:"誠";s:3:"誠";s:4:"諭";s:3:"諭";s:4:"變";s:3:"變";s:4:"豕";s:3:"豕";s:4:"𧲨";s:4:"𧲨";s:4:"貫";s:3:"貫";s:4:"賁";s:3:"賁";s:4:"贛";s:3:"贛";s:4:"起";s:3:"起";s:4:"𧼯";s:4:"𧼯";s:4:"𠠄";s:4:"𠠄";s:4:"跋";s:3:"跋";s:4:"趼";s:3:"趼";s:4:"跰";s:3:"跰";s:4:"𠣞";s:4:"𠣞";s:4:"軔";s:3:"軔";s:4:"輸";s:3:"輸";s:4:"𨗒";s:4:"𨗒";s:4:"𨗭";s:4:"𨗭";s:4:"邔";s:3:"邔";s:4:"郱";s:3:"郱";s:4:"鄑";s:3:"鄑";s:4:"𨜮";s:4:"𨜮";s:4:"鄛";s:3:"鄛";s:4:"鈸";s:3:"鈸";s:4:"鋗";s:3:"鋗";s:4:"鋘";s:3:"鋘";s:4:"鉼";s:3:"鉼";s:4:"鏹";s:3:"鏹";s:4:"鐕";s:3:"鐕";s:4:"𨯺";s:4:"𨯺";s:4:"開";s:3:"開";s:4:"䦕";s:3:"䦕";s:4:"閷";s:3:"閷";s:4:"𨵷";s:4:"𨵷";s:4:"䧦";s:3:"䧦";s:4:"雃";s:3:"雃";s:4:"嶲";s:3:"嶲";s:4:"霣";s:3:"霣";s:4:"𩅅";s:4:"𩅅";s:4:"𩈚";s:4:"𩈚";s:4:"䩮";s:3:"䩮";s:4:"䩶";s:3:"䩶";s:4:"韠";s:3:"韠";s:4:"𩐊";s:4:"𩐊";s:4:"䪲";s:3:"䪲";s:4:"𩒖";s:4:"𩒖";s:4:"頋";s:3:"頋";s:4:"頋";s:3:"頋";s:4:"頩";s:3:"頩";s:4:"𩖶";s:4:"𩖶";s:4:"飢";s:3:"飢";s:4:"䬳";s:3:"䬳";s:4:"餩";s:3:"餩";s:4:"馧";s:3:"馧";s:4:"駂";s:3:"駂";s:4:"駾";s:3:"駾";s:4:"䯎";s:3:"䯎";s:4:"𩬰";s:4:"𩬰";s:4:"鬒";s:3:"鬒";s:4:"鱀";s:3:"鱀";s:4:"鳽";s:3:"鳽";s:4:"䳎";s:3:"䳎";s:4:"䳭";s:3:"䳭";s:4:"鵧";s:3:"鵧";s:4:"𪃎";s:4:"𪃎";s:4:"䳸";s:3:"䳸";s:4:"𪄅";s:4:"𪄅";s:4:"𪈎";s:4:"𪈎";s:4:"𪊑";s:4:"𪊑";s:4:"麻";s:3:"麻";s:4:"䵖";s:3:"䵖";s:4:"黹";s:3:"黹";s:4:"黾";s:3:"黾";s:4:"鼅";s:3:"鼅";s:4:"鼏";s:3:"鼏";s:4:"鼖";s:3:"鼖";s:4:"鼻";s:3:"鼻";s:4:"𪘀";s:4:"𪘀";}' );
+
diff --git a/includes/libs/normal/UtfNormalDefines.php b/includes/libs/normal/UtfNormalDefines.php
new file mode 100644 (file)
index 0000000..18d89f6
--- /dev/null
@@ -0,0 +1,77 @@
+<?php
+/**
+ * Some constant definitions for the unicode normalization module.
+ *
+ * Note: these constants must all be resolvable at compile time by HipHop,
+ * since this file will not be executed during request startup for a compiled
+ * MediaWiki.
+ *
+ * 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 UtfNormal
+ */
+
+define( 'UNICODE_HANGUL_FIRST', 0xac00 );
+define( 'UNICODE_HANGUL_LAST', 0xd7a3 );
+
+define( 'UNICODE_HANGUL_LBASE', 0x1100 );
+define( 'UNICODE_HANGUL_VBASE', 0x1161 );
+define( 'UNICODE_HANGUL_TBASE', 0x11a7 );
+
+define( 'UNICODE_HANGUL_LCOUNT', 19 );
+define( 'UNICODE_HANGUL_VCOUNT', 21 );
+define( 'UNICODE_HANGUL_TCOUNT', 28 );
+define( 'UNICODE_HANGUL_NCOUNT', UNICODE_HANGUL_VCOUNT * UNICODE_HANGUL_TCOUNT );
+
+define( 'UNICODE_HANGUL_LEND', UNICODE_HANGUL_LBASE + UNICODE_HANGUL_LCOUNT - 1 );
+define( 'UNICODE_HANGUL_VEND', UNICODE_HANGUL_VBASE + UNICODE_HANGUL_VCOUNT - 1 );
+define( 'UNICODE_HANGUL_TEND', UNICODE_HANGUL_TBASE + UNICODE_HANGUL_TCOUNT - 1 );
+
+define( 'UNICODE_SURROGATE_FIRST', 0xd800 );
+define( 'UNICODE_SURROGATE_LAST', 0xdfff );
+define( 'UNICODE_MAX', 0x10ffff );
+define( 'UNICODE_REPLACEMENT', 0xfffd );
+
+define( 'UTF8_HANGUL_FIRST', "\xea\xb0\x80" /*codepointToUtf8( UNICODE_HANGUL_FIRST )*/ );
+define( 'UTF8_HANGUL_LAST', "\xed\x9e\xa3" /*codepointToUtf8( UNICODE_HANGUL_LAST )*/ );
+
+define( 'UTF8_HANGUL_LBASE', "\xe1\x84\x80" /*codepointToUtf8( UNICODE_HANGUL_LBASE )*/ );
+define( 'UTF8_HANGUL_VBASE', "\xe1\x85\xa1" /*codepointToUtf8( UNICODE_HANGUL_VBASE )*/ );
+define( 'UTF8_HANGUL_TBASE', "\xe1\x86\xa7" /*codepointToUtf8( UNICODE_HANGUL_TBASE )*/ );
+
+define( 'UTF8_HANGUL_LEND', "\xe1\x84\x92" /*codepointToUtf8( UNICODE_HANGUL_LEND )*/ );
+define( 'UTF8_HANGUL_VEND', "\xe1\x85\xb5" /*codepointToUtf8( UNICODE_HANGUL_VEND )*/ );
+define( 'UTF8_HANGUL_TEND', "\xe1\x87\x82" /*codepointToUtf8( UNICODE_HANGUL_TEND )*/ );
+
+define( 'UTF8_SURROGATE_FIRST', "\xed\xa0\x80" /*codepointToUtf8( UNICODE_SURROGATE_FIRST )*/ );
+define( 'UTF8_SURROGATE_LAST', "\xed\xbf\xbf" /*codepointToUtf8( UNICODE_SURROGATE_LAST )*/ );
+define( 'UTF8_MAX', "\xf4\x8f\xbf\xbf" /*codepointToUtf8( UNICODE_MAX )*/ );
+define( 'UTF8_REPLACEMENT', "\xef\xbf\xbd" /*codepointToUtf8( UNICODE_REPLACEMENT )*/ );
+#define( 'UTF8_REPLACEMENT', '!' );
+
+define( 'UTF8_OVERLONG_A', "\xc1\xbf" );
+define( 'UTF8_OVERLONG_B', "\xe0\x9f\xbf" );
+define( 'UTF8_OVERLONG_C', "\xf0\x8f\xbf\xbf" );
+
+# These two ranges are illegal
+define( 'UTF8_FDD0', "\xef\xb7\x90" /*codepointToUtf8( 0xfdd0 )*/ );
+define( 'UTF8_FDEF', "\xef\xb7\xaf" /*codepointToUtf8( 0xfdef )*/ );
+define( 'UTF8_FFFE', "\xef\xbf\xbe" /*codepointToUtf8( 0xfffe )*/ );
+define( 'UTF8_FFFF', "\xef\xbf\xbf" /*codepointToUtf8( 0xffff )*/ );
+
+define( 'UTF8_HEAD', false );
+define( 'UTF8_TAIL', true );
diff --git a/includes/libs/normal/UtfNormalGenerate.php b/includes/libs/normal/UtfNormalGenerate.php
new file mode 100644 (file)
index 0000000..f57aa6c
--- /dev/null
@@ -0,0 +1,250 @@
+<?php
+/**
+ * This script generates UniNormalData.inc from the Unicode Character Database
+ * and supplementary files.
+ *
+ * Copyright (C) 2004 Brion Vibber <brion@pobox.com>
+ * https://www.mediawiki.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup UtfNormal
+ */
+
+if ( PHP_SAPI != 'cli' ) {
+       die( "Run me from the command line please.\n" );
+}
+
+require_once 'UtfNormalDefines.php';
+require_once 'UtfNormalUtil.php';
+
+$in = fopen( "DerivedNormalizationProps.txt", "rt" );
+if ( !$in ) {
+       print "Can't open DerivedNormalizationProps.txt for reading.\n";
+       print "If necessary, fetch this file from the internet:\n";
+       print "http://www.unicode.org/Public/UNIDATA/DerivedNormalizationProps.txt\n";
+       exit( -1 );
+}
+print "Initializing normalization quick check tables...\n";
+$checkNFC = array();
+while ( false !== ( $line = fgets( $in ) ) ) {
+       $matches = array();
+       if ( preg_match(
+               '/^([0-9A-F]+)(?:..([0-9A-F]+))?\s*;\s*(NFC_QC)\s*;\s*([MN])/',
+               $line,
+               $matches )
+       ) {
+               list( $junk, $first, $last, $prop, $value ) = $matches;
+               #print "$first $last $prop $value\n";
+               if ( !$last ) {
+                       $last = $first;
+               }
+
+               $lastInDecimal = hexdec( $last );
+               for ( $i = hexdec( $first ); $i <= $lastInDecimal; $i++ ) {
+                       $char = codepointToUtf8( $i );
+                       $checkNFC[$char] = $value;
+               }
+       }
+}
+fclose( $in );
+
+$in = fopen( "CompositionExclusions.txt", "rt" );
+if ( !$in ) {
+       print "Can't open CompositionExclusions.txt for reading.\n";
+       print "If necessary, fetch this file from the internet:\n";
+       print "http://www.unicode.org/Public/UNIDATA/CompositionExclusions.txt\n";
+       exit( -1 );
+}
+$exclude = array();
+while ( false !== ( $line = fgets( $in ) ) ) {
+       if ( preg_match( '/^([0-9A-F]+)/i', $line, $matches ) ) {
+               $codepoint = $matches[1];
+               $source = codepointToUtf8( hexdec( $codepoint ) );
+               $exclude[$source] = true;
+       }
+}
+fclose( $in );
+
+$in = fopen( "UnicodeData.txt", "rt" );
+if ( !$in ) {
+       print "Can't open UnicodeData.txt for reading.\n";
+       print "If necessary, fetch this file from the internet:\n";
+       print "http://www.unicode.org/Public/UNIDATA/UnicodeData.txt\n";
+       exit( -1 );
+}
+
+$compatibilityDecomp = array();
+$canonicalDecomp = array();
+$canonicalComp = array();
+$combiningClass = array();
+$total = 0;
+$compat = 0;
+$canon = 0;
+
+print "Reading character definitions...\n";
+while ( false !== ( $line = fgets( $in ) ) ) {
+       $columns = explode( ';', $line );
+       $codepoint = $columns[0];
+       $name = $columns[1];
+       $canonicalCombiningClass = $columns[3];
+       $decompositionMapping = $columns[5];
+
+       $source = codepointToUtf8( hexdec( $codepoint ) );
+
+       if ( $canonicalCombiningClass != 0 ) {
+               $combiningClass[$source] = intval( $canonicalCombiningClass );
+       }
+
+       if ( $decompositionMapping === '' ) continue;
+       if ( preg_match( '/^<(.+)> (.*)$/', $decompositionMapping, $matches ) ) {
+               # Compatibility decomposition
+               $canonical = false;
+               $decompositionMapping = $matches[2];
+               $compat++;
+       } else {
+               $canonical = true;
+               $canon++;
+       }
+       $total++;
+       $dest = hexSequenceToUtf8( $decompositionMapping );
+
+       $compatibilityDecomp[$source] = $dest;
+       if ( $canonical ) {
+               $canonicalDecomp[$source] = $dest;
+               if ( empty( $exclude[$source] ) ) {
+                       $canonicalComp[$dest] = $source;
+               }
+       }
+       #print "$codepoint | $canonicalCombiningClasses | $decompositionMapping\n";
+}
+fclose( $in );
+
+print "Recursively expanding canonical mappings...\n";
+$changed = 42;
+$pass = 1;
+while ( $changed > 0 ) {
+       print "pass $pass\n";
+       $changed = 0;
+       foreach ( $canonicalDecomp as $source => $dest ) {
+               $newDest = preg_replace_callback(
+                       '/([\xc0-\xff][\x80-\xbf]+)/',
+                       'callbackCanonical',
+                       $dest );
+               if ( $newDest === $dest ) continue;
+               $changed++;
+               $canonicalDecomp[$source] = $newDest;
+       }
+       $pass++;
+}
+
+print "Recursively expanding compatibility mappings...\n";
+$changed = 42;
+$pass = 1;
+while ( $changed > 0 ) {
+       print "pass $pass\n";
+       $changed = 0;
+       foreach ( $compatibilityDecomp as $source => $dest ) {
+               $newDest = preg_replace_callback(
+                       '/([\xc0-\xff][\x80-\xbf]+)/',
+                       'callbackCompat',
+                       $dest );
+               if ( $newDest === $dest ) continue;
+               $changed++;
+               $compatibilityDecomp[$source] = $newDest;
+       }
+       $pass++;
+}
+
+print "$total decomposition mappings ($canon canonical, $compat compatibility)\n";
+
+$out = fopen( "UtfNormalData.inc", "wt" );
+if ( $out ) {
+       $serCombining = escapeSingleString( serialize( $combiningClass ) );
+       $serComp = escapeSingleString( serialize( $canonicalComp ) );
+       $serCanon = escapeSingleString( serialize( $canonicalDecomp ) );
+       $serCheckNFC = escapeSingleString( serialize( $checkNFC ) );
+       $outdata = "<" . "?php
+/**
+ * This file was automatically generated -- do not edit!
+ * Run UtfNormalGenerate.php to create this file again (make clean && make)
+ *
+ * @file
+ */
+// @codingStandardsIgnoreFile
+
+UtfNormal::\$utfCombiningClass = unserialize( '$serCombining' );
+UtfNormal::\$utfCanonicalComp = unserialize( '$serComp' );
+UtfNormal::\$utfCanonicalDecomp = unserialize( '$serCanon' );
+UtfNormal::\$utfCheckNFC = unserialize( '$serCheckNFC' );
+\n";
+       fputs( $out, $outdata );
+       fclose( $out );
+       print "Wrote out UtfNormalData.inc\n";
+} else {
+       print "Can't create file UtfNormalData.inc\n";
+       exit( -1 );
+}
+
+$out = fopen( "UtfNormalDataK.inc", "wt" );
+if ( $out ) {
+       $serCompat = escapeSingleString( serialize( $compatibilityDecomp ) );
+       $outdata = "<" . "?php
+/**
+ * This file was automatically generated -- do not edit!
+ * Run UtfNormalGenerate.php to create this file again (make clean && make)
+ *
+ * @file
+ */
+// @codingStandardsIgnoreFile
+
+UtfNormal::\$utfCompatibilityDecomp = unserialize( '$serCompat' );
+\n";
+       fputs( $out, $outdata );
+       fclose( $out );
+       print "Wrote out UtfNormalDataK.inc\n";
+       exit( 0 );
+} else {
+       print "Can't create file UtfNormalDataK.inc\n";
+       exit( -1 );
+}
+
+# ---------------
+
+function callbackCanonical( $matches ) {
+       // @codingStandardsIgnoreStart MediaWiki.NamingConventions.ValidGlobalName.wgPrefix
+       global $canonicalDecomp;
+       // @codingStandardsIgnoreEnd
+
+       if ( isset( $canonicalDecomp[$matches[1]] ) ) {
+               return $canonicalDecomp[$matches[1]];
+       }
+
+       return $matches[1];
+}
+
+function callbackCompat( $matches ) {
+       // @codingStandardsIgnoreStart MediaWiki.NamingConventions.ValidGlobalName.wgPrefix
+       global $compatibilityDecomp;
+       // @codingStandardsIgnoreEnd
+
+       if ( isset( $compatibilityDecomp[$matches[1]] ) ) {
+               return $compatibilityDecomp[$matches[1]];
+       }
+
+       return $matches[1];
+}
diff --git a/includes/libs/normal/UtfNormalMemStress.php b/includes/libs/normal/UtfNormalMemStress.php
new file mode 100644 (file)
index 0000000..f133e4d
--- /dev/null
@@ -0,0 +1,107 @@
+<?php
+/**
+ * Approximate benchmark for some basic operations.
+ * Runs large chunks of text through cleanup with a lowish memory limit,
+ * to test regression on mem usage (bug 28146)
+ *
+ * Copyright © 2004-2011 Brion Vibber <brion@wikimedia.org>
+ * https://www.mediawiki.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup UtfNormal
+ */
+
+if ( PHP_SAPI != 'cli' ) {
+       die( "Run me from the command line please.\n" );
+}
+
+if ( isset( $_SERVER['argv'] ) && in_array( '--icu', $_SERVER['argv'] ) ) {
+       dl( 'php_utfnormal.so' );
+}
+
+require_once 'UtfNormalDefines.php';
+require_once 'UtfNormalUtil.php';
+require_once 'UtfNormal.php';
+
+define( 'BENCH_CYCLES', 1 );
+define( 'BIGSIZE', 1024 * 1024 * 10 ); // 10m
+ini_set( 'memory_limit', BIGSIZE + 120 * 1024 * 1024 );
+
+$testfiles = array(
+       'testdata/washington.txt' => 'English text',
+       'testdata/berlin.txt' => 'German text',
+       'testdata/bulgakov.txt' => 'Russian text',
+       'testdata/tokyo.txt' => 'Japanese text',
+       'testdata/young.txt' => 'Korean text'
+);
+$normalizer = new UtfNormal;
+UtfNormal::loadData();
+foreach ( $testfiles as $file => $desc ) {
+       benchmarkTest( $normalizer, $file, $desc );
+}
+
+# -------
+
+function benchmarkTest( &$u, $filename, $desc ) {
+       print "Testing $filename ($desc)...\n";
+       $data = file_get_contents( $filename );
+       $all = $data;
+       while ( strlen( $all ) < BIGSIZE ) {
+               $all .= $all;
+       }
+       $data = $all;
+       echo "Data is " . strlen( $data ) . " bytes.\n";
+       $forms = array(
+               'quickIsNFCVerify',
+               'cleanUp',
+       );
+
+       foreach ( $forms as $form ) {
+               if ( is_array( $form ) ) {
+                       $str = $data;
+                       foreach ( $form as $step ) {
+                               $str = benchmarkForm( $u, $str, $step );
+                       }
+               } else {
+                       benchmarkForm( $u, $data, $form );
+               }
+       }
+}
+
+function benchmarkForm( &$u, &$data, $form ) {
+       #$start = microtime( true );
+       for ( $i = 0; $i < BENCH_CYCLES; $i++ ) {
+               $start = microtime( true );
+               $out = $u->$form( $data, UtfNormal::$utfCanonicalDecomp );
+               $deltas[] = ( microtime( true ) - $start );
+       }
+       #$delta = (microtime( true ) - $start) / BENCH_CYCLES;
+       sort( $deltas );
+       $delta = $deltas[0]; # Take shortest time
+
+       $rate = intval( strlen( $data ) / $delta );
+       $same = ( 0 == strcmp( $data, $out ) );
+
+       printf( " %20s %6.1fms %12s bytes/s (%s)\n",
+               $form,
+               $delta * 1000.0,
+               number_format( $rate ),
+               ( $same ? 'no change' : 'changed' ) );
+
+       return $out;
+}
diff --git a/includes/libs/normal/UtfNormalTest.php b/includes/libs/normal/UtfNormalTest.php
new file mode 100644 (file)
index 0000000..10cd0f0
--- /dev/null
@@ -0,0 +1,257 @@
+<?php
+/**
+ * Implements the conformance test at:
+ * http://www.unicode.org/Public/UNIDATA/NormalizationTest.txt
+ *
+ * Copyright © 2004 Brion Vibber <brion@pobox.com>
+ * https://www.mediawiki.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup UtfNormal
+ */
+
+if ( PHP_SAPI != 'cli' ) {
+       die( "Run me from the command line please.\n" );
+}
+
+$verbose = true;
+#define( 'PRETTY_UTF8', true );
+
+if ( defined( 'PRETTY_UTF8' ) ) {
+       function pretty( $string ) {
+               return strtoupper( bin2hex( $string ) );
+       }
+} else {
+       /**
+        * @ignore
+        * @param string $string
+        * @return string
+        */
+       function pretty( $string ) {
+               return strtoupper( utf8ToHexSequence( $string ) );
+       }
+}
+
+if ( isset( $_SERVER['argv'] ) && in_array( '--icu', $_SERVER['argv'] ) ) {
+       dl( 'php_utfnormal.so' );
+}
+
+require_once 'UtfNormalDefines.php';
+require_once 'UtfNormalUtil.php';
+require_once 'UtfNormal.php';
+
+$in = fopen( "NormalizationTest.txt", "rt" );
+if ( !$in ) {
+       print "Couldn't open NormalizationTest.txt -- can't run tests.\n";
+       print "If necessary, manually download this file. It can be obtained at\n";
+       print "http://www.unicode.org/Public/UNIDATA/NormalizationTest.txt";
+       exit( -1 );
+}
+
+$normalizer = new UtfNormal;
+
+$total = 0;
+$success = 0;
+$failure = 0;
+$ok = true;
+$testedChars = array();
+
+while ( false !== ( $line = fgets( $in ) ) ) {
+       list( $data, $comment ) = explode( '#', $line );
+       if ( $data === '' ) continue;
+       $matches = array();
+       if ( preg_match( '/@Part([\d])/', $data, $matches ) ) {
+               if ( $matches[1] > 0 ) {
+                       $ok = reportResults( $total, $success, $failure ) && $ok;
+               }
+               print "Part {$matches[1]}: $comment";
+               continue;
+       }
+
+       $columns = array_map( "hexSequenceToUtf8", explode( ";", $data ) );
+       array_unshift( $columns, '' );
+
+       $testedChars[$columns[1]] = true;
+       $total++;
+       if ( testNormals( $normalizer, $columns, $comment, $verbose ) ) {
+               $success++;
+       } else {
+               $failure++;
+               # print "FAILED: $comment";
+       }
+       if ( $total % 100 == 0 ) print "$total ";
+}
+fclose( $in );
+
+$ok = reportResults( $total, $success, $failure ) && $ok;
+
+$in = fopen( "UnicodeData.txt", "rt" );
+if ( !$in ) {
+       print "Can't open UnicodeData.txt for reading.\n";
+       print "If necessary, fetch this file from the internet:\n";
+       print "http://www.unicode.org/Public/UNIDATA/UnicodeData.txt\n";
+       exit( -1 );
+}
+print "Now testing invariants...\n";
+
+while ( false !== ( $line = fgets( $in ) ) ) {
+       $cols = explode( ';', $line );
+       $char = codepointToUtf8( hexdec( $cols[0] ) );
+       $desc = $cols[0] . ": " . $cols[1];
+       if ( $char < "\x20" || $char >= UTF8_SURROGATE_FIRST && $char <= UTF8_SURROGATE_LAST ) {
+               # Can't check NULL with the ICU plugin, as null bytes fail in C land.
+               # Skip other control characters, as we strip them for XML safety.
+               # Surrogates are illegal on their own or in UTF-8, ignore.
+               continue;
+       }
+       if ( empty( $testedChars[$char] ) ) {
+               $total++;
+               if ( testInvariant( $normalizer, $char, $desc, $verbose ) ) {
+                       $success++;
+               } else {
+                       $failure++;
+               }
+               if ( $total % 100 == 0 ) print "$total ";
+       }
+}
+fclose( $in );
+
+$ok = reportResults( $total, $success, $failure ) && $ok;
+
+if ( $ok ) {
+       print "TEST SUCCEEDED!\n";
+       exit( 0 );
+} else {
+       print "TEST FAILED!\n";
+       exit( -1 );
+}
+
+## ------
+
+function reportResults( &$total, &$success, &$failure ) {
+       $percSucc = intval( $success * 100 / $total );
+       $percFail = intval( $failure * 100 / $total );
+       print "\n";
+       print "$success tests successful ($percSucc%)\n";
+       print "$failure tests failed ($percFail%)\n\n";
+       $ok = ( $success > 0 && $failure == 0 );
+       $total = 0;
+       $success = 0;
+       $failure = 0;
+
+       return $ok;
+}
+
+function testNormals( &$u, $c, $comment, $verbose, $reportFailure = false ) {
+       $result = testNFC( $u, $c, $comment, $reportFailure );
+       $result = testNFD( $u, $c, $comment, $reportFailure ) && $result;
+       $result = testNFKC( $u, $c, $comment, $reportFailure ) && $result;
+       $result = testNFKD( $u, $c, $comment, $reportFailure ) && $result;
+       $result = testCleanUp( $u, $c, $comment, $reportFailure ) && $result;
+
+       if ( $verbose && !$result && !$reportFailure ) {
+               print $comment;
+               testNormals( $u, $c, $comment, $verbose, true );
+       }
+
+       return $result;
+}
+
+function verbosify( $a, $b, $col, $form, $verbose ) {
+       #$result = ($a === $b);
+       $result = ( strcmp( $a, $b ) == 0 );
+       if ( $verbose ) {
+               $aa = pretty( $a );
+               $bb = pretty( $b );
+               $ok = $result ? "succeed" : " failed";
+               $eq = $result ? "==" : "!=";
+               print "  $ok $form c$col '$aa' $eq '$bb'\n";
+       }
+
+       return $result;
+}
+
+function testNFC( &$u, $c, $comment, $verbose ) {
+       $result = verbosify( $c[2], $u->toNFC( $c[1] ), 1, 'NFC', $verbose );
+       $result = verbosify( $c[2], $u->toNFC( $c[2] ), 2, 'NFC', $verbose ) && $result;
+       $result = verbosify( $c[2], $u->toNFC( $c[3] ), 3, 'NFC', $verbose ) && $result;
+       $result = verbosify( $c[4], $u->toNFC( $c[4] ), 4, 'NFC', $verbose ) && $result;
+       $result = verbosify( $c[4], $u->toNFC( $c[5] ), 5, 'NFC', $verbose ) && $result;
+
+       return $result;
+}
+
+function testCleanUp( &$u, $c, $comment, $verbose ) {
+       $x = $c[1];
+       $result = verbosify( $c[2], $u->cleanUp( $x ), 1, 'cleanUp', $verbose );
+       $x = $c[2];
+       $result = verbosify( $c[2], $u->cleanUp( $x ), 2, 'cleanUp', $verbose ) && $result;
+       $x = $c[3];
+       $result = verbosify( $c[2], $u->cleanUp( $x ), 3, 'cleanUp', $verbose ) && $result;
+       $x = $c[4];
+       $result = verbosify( $c[4], $u->cleanUp( $x ), 4, 'cleanUp', $verbose ) && $result;
+       $x = $c[5];
+       $result = verbosify( $c[4], $u->cleanUp( $x ), 5, 'cleanUp', $verbose ) && $result;
+
+       return $result;
+}
+
+function testNFD( &$u, $c, $comment, $verbose ) {
+       $result = verbosify( $c[3], $u->toNFD( $c[1] ), 1, 'NFD', $verbose );
+       $result = verbosify( $c[3], $u->toNFD( $c[2] ), 2, 'NFD', $verbose ) && $result;
+       $result = verbosify( $c[3], $u->toNFD( $c[3] ), 3, 'NFD', $verbose ) && $result;
+       $result = verbosify( $c[5], $u->toNFD( $c[4] ), 4, 'NFD', $verbose ) && $result;
+       $result = verbosify( $c[5], $u->toNFD( $c[5] ), 5, 'NFD', $verbose ) && $result;
+
+       return $result;
+}
+
+function testNFKC( &$u, $c, $comment, $verbose ) {
+       $result = verbosify( $c[4], $u->toNFKC( $c[1] ), 1, 'NFKC', $verbose );
+       $result = verbosify( $c[4], $u->toNFKC( $c[2] ), 2, 'NFKC', $verbose ) && $result;
+       $result = verbosify( $c[4], $u->toNFKC( $c[3] ), 3, 'NFKC', $verbose ) && $result;
+       $result = verbosify( $c[4], $u->toNFKC( $c[4] ), 4, 'NFKC', $verbose ) && $result;
+       $result = verbosify( $c[4], $u->toNFKC( $c[5] ), 5, 'NFKC', $verbose ) && $result;
+
+       return $result;
+}
+
+function testNFKD( &$u, $c, $comment, $verbose ) {
+       $result = verbosify( $c[5], $u->toNFKD( $c[1] ), 1, 'NFKD', $verbose );
+       $result = verbosify( $c[5], $u->toNFKD( $c[2] ), 2, 'NFKD', $verbose ) && $result;
+       $result = verbosify( $c[5], $u->toNFKD( $c[3] ), 3, 'NFKD', $verbose ) && $result;
+       $result = verbosify( $c[5], $u->toNFKD( $c[4] ), 4, 'NFKD', $verbose ) && $result;
+       $result = verbosify( $c[5], $u->toNFKD( $c[5] ), 5, 'NFKD', $verbose ) && $result;
+
+       return $result;
+}
+
+function testInvariant( &$u, $char, $desc, $verbose, $reportFailure = false ) {
+       $result = verbosify( $char, $u->toNFC( $char ), 1, 'NFC', $reportFailure );
+       $result = verbosify( $char, $u->toNFD( $char ), 1, 'NFD', $reportFailure ) && $result;
+       $result = verbosify( $char, $u->toNFKC( $char ), 1, 'NFKC', $reportFailure ) && $result;
+       $result = verbosify( $char, $u->toNFKD( $char ), 1, 'NFKD', $reportFailure ) && $result;
+       $result = verbosify( $char, $u->cleanUp( $char ), 1, 'cleanUp', $reportFailure ) && $result;
+
+       if ( $verbose && !$result && !$reportFailure ) {
+               print $desc;
+               testInvariant( $u, $char, $desc, $verbose, true );
+       }
+
+       return $result;
+}
diff --git a/includes/libs/normal/UtfNormalTest2.php b/includes/libs/normal/UtfNormalTest2.php
new file mode 100644 (file)
index 0000000..53e68c2
--- /dev/null
@@ -0,0 +1,275 @@
+#!/usr/bin/env php
+<?php
+/**
+ * Other tests for the unicode normalization module.
+ *
+ * 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 UtfNormal
+ */
+
+if ( PHP_SAPI != 'cli' ) {
+       die( "Run me from the command line please.\n" );
+}
+
+// From http://unicode.org/Public/UNIDATA/NormalizationTest.txt
+$file = "NormalizationTest.txt";
+
+// Anything after this character is a comment
+define ( 'COMMENT', '#' );
+
+// Semicolons are used to separate the columns
+define ( 'SEPARATOR', ';' );
+
+$f = fopen( $file, "r" );
+
+/**
+ * The following section will be used for testing different normalization methods.
+ * - Pure PHP
+ * ~ no assertion errors
+ * ~ 6.25 minutes
+ * - php_utfnormal.so or intl extension: both are wrappers around
+ * libicu so we list the version of libicu when making the
+ * comparison
+ * - libicu Ubuntu 3.8.1-3ubuntu1.1 php 5.2.6-3ubuntu4.5
+ * ~ 2200 assertion errors
+ * ~ 5 seconds
+ * ~ output: http://paste2.org/p/921566
+ * - libicu Ubuntu 4.2.1-3 php 5.3.2-1ubuntu4.2
+ * ~ 1384 assertion errors
+ * ~ 15 seconds
+ * ~ output: http://paste2.org/p/921435
+ * - libicu Debian 4.4.1-5 php 5.3.2-1ubuntu4.2
+ * ~ no assertion errors
+ * ~ 13 seconds
+ * - Tests comparing pure PHP output with libicu output were added
+ * later and slow down the runtime.
+ */
+
+require_once './UtfNormal.php';
+function normalize_form_c( $c ) {
+       return UtfNormal::toNFC( $c );
+}
+
+function normalize_form_d( $c ) {
+       return UtfNormal::toNFD( $c );
+}
+
+function normalize_form_kc( $c ) {
+       return UtfNormal::toNFKC( $c );
+}
+
+function normalize_form_kd( $c ) {
+       return UtfNormal::toNFKD( $c );
+}
+
+/**
+ * This set of functions is only useful if youve added a param to the
+ * following functions to force pure PHP usage.  I decided not to
+ * commit that code since might produce a slowdown in the UTF
+ * normalization code just for the sake of these tests. -- hexmode
+ * @return string
+ */
+function normalize_form_c_php( $c ) {
+       return UtfNormal::toNFC( $c, "php" );
+}
+
+function normalize_form_d_php( $c ) {
+       return UtfNormal::toNFD( $c, "php" );
+}
+
+function normalize_form_kc_php( $c ) {
+       return UtfNormal::toNFKC( $c, "php" );
+}
+
+function normalize_form_kd_php( $c ) {
+       return UtfNormal::toNFKD( $c, "php" );
+}
+
+assert_options( ASSERT_ACTIVE, 1 );
+assert_options( ASSERT_WARNING, 0 );
+assert_options( ASSERT_QUIET_EVAL, 1 );
+assert_options( ASSERT_CALLBACK, 'my_assert' );
+
+function my_assert( $file, $line, $code ) {
+       // @codingStandardsIgnoreStart MediaWiki.NamingConventions.ValidGlobalName.wgPrefix
+       global $col, $lineNo;
+       // @codingStandardsIgnoreEnd
+
+       echo "Assertion that '$code' failed on line $lineNo ($col[5])\n";
+}
+
+$count = 0;
+$lineNo = 0;
+if ( $f !== false ) {
+       while ( ( $col = getRow( $f ) ) !== false ) {
+               $lineNo++;
+
+               if ( count( $col ) == 6 ) {
+                       $count++;
+                       if ( $count % 100 === 0 ) echo "Count: $count\n";
+               } else {
+                       continue;
+               }
+
+               # verify that the pure PHP version is correct
+               $NFCc1 = normalize_form_c( $col[0] );
+               $NFCc1p = normalize_form_c_php( $col[0] );
+               assert( '$NFCc1 === $NFCc1p' );
+               $NFCc2 = normalize_form_c( $col[1] );
+               $NFCc2p = normalize_form_c_php( $col[1] );
+               assert( '$NFCc2 === $NFCc2p' );
+               $NFCc3 = normalize_form_c( $col[2] );
+               $NFCc3p = normalize_form_c_php( $col[2] );
+               assert( '$NFCc3 === $NFCc3p' );
+               $NFCc4 = normalize_form_c( $col[3] );
+               $NFCc4p = normalize_form_c_php( $col[3] );
+               assert( '$NFCc4 === $NFCc4p' );
+               $NFCc5 = normalize_form_c( $col[4] );
+               $NFCc5p = normalize_form_c_php( $col[4] );
+               assert( '$NFCc5 === $NFCc5p' );
+
+               $NFDc1 = normalize_form_d( $col[0] );
+               $NFDc1p = normalize_form_d_php( $col[0] );
+               assert( '$NFDc1 === $NFDc1p' );
+               $NFDc2 = normalize_form_d( $col[1] );
+               $NFDc2p = normalize_form_d_php( $col[1] );
+               assert( '$NFDc2 === $NFDc2p' );
+               $NFDc3 = normalize_form_d( $col[2] );
+               $NFDc3p = normalize_form_d_php( $col[2] );
+               assert( '$NFDc3 === $NFDc3p' );
+               $NFDc4 = normalize_form_d( $col[3] );
+               $NFDc4p = normalize_form_d_php( $col[3] );
+               assert( '$NFDc4 === $NFDc4p' );
+               $NFDc5 = normalize_form_d( $col[4] );
+               $NFDc5p = normalize_form_d_php( $col[4] );
+               assert( '$NFDc5 === $NFDc5p' );
+
+               $NFKDc1 = normalize_form_kd( $col[0] );
+               $NFKDc1p = normalize_form_kd_php( $col[0] );
+               assert( '$NFKDc1 === $NFKDc1p' );
+               $NFKDc2 = normalize_form_kd( $col[1] );
+               $NFKDc2p = normalize_form_kd_php( $col[1] );
+               assert( '$NFKDc2 === $NFKDc2p' );
+               $NFKDc3 = normalize_form_kd( $col[2] );
+               $NFKDc3p = normalize_form_kd_php( $col[2] );
+               assert( '$NFKDc3 === $NFKDc3p' );
+               $NFKDc4 = normalize_form_kd( $col[3] );
+               $NFKDc4p = normalize_form_kd_php( $col[3] );
+               assert( '$NFKDc4 === $NFKDc4p' );
+               $NFKDc5 = normalize_form_kd( $col[4] );
+               $NFKDc5p = normalize_form_kd_php( $col[4] );
+               assert( '$NFKDc5 === $NFKDc5p' );
+
+               $NFKCc1 = normalize_form_kc( $col[0] );
+               $NFKCc1p = normalize_form_kc_php( $col[0] );
+               assert( '$NFKCc1 === $NFKCc1p' );
+               $NFKCc2 = normalize_form_kc( $col[1] );
+               $NFKCc2p = normalize_form_kc_php( $col[1] );
+               assert( '$NFKCc2 === $NFKCc2p' );
+               $NFKCc3 = normalize_form_kc( $col[2] );
+               $NFKCc3p = normalize_form_kc_php( $col[2] );
+               assert( '$NFKCc3 === $NFKCc3p' );
+               $NFKCc4 = normalize_form_kc( $col[3] );
+               $NFKCc4p = normalize_form_kc_php( $col[3] );
+               assert( '$NFKCc4 === $NFKCc4p' );
+               $NFKCc5 = normalize_form_kc( $col[4] );
+               $NFKCc5p = normalize_form_kc_php( $col[4] );
+               assert( '$NFKCc5 === $NFKCc5p' );
+
+               # c2 ==  NFC(c1) ==      NFC(c2) ==      NFC(c3)
+               assert( '$col[1] === $NFCc1' );
+               assert( '$col[1] === $NFCc2' );
+               assert( '$col[1] === $NFCc3' );
+
+               # c4 ==  NFC(c4) ==      NFC(c5)
+               assert( '$col[3] === $NFCc4' );
+               assert( '$col[3] === $NFCc5' );
+
+               # c3 ==  NFD(c1) ==      NFD(c2) ==      NFD(c3)
+               assert( '$col[2] === $NFDc1' );
+               assert( '$col[2] === $NFDc2' );
+               assert( '$col[2] === $NFDc3' );
+
+               # c5 ==  NFD(c4) ==      NFD(c5)
+               assert( '$col[4] === $NFDc4' );
+               assert( '$col[4] === $NFDc5' );
+
+               # c4 == NFKC(c1) == NFKC(c2) == NFKC(c3) == NFKC(c4) == NFKC(c5)
+               assert( '$col[3] === $NFKCc1' );
+               assert( '$col[3] === $NFKCc2' );
+               assert( '$col[3] === $NFKCc3' );
+               assert( '$col[3] === $NFKCc4' );
+               assert( '$col[3] === $NFKCc5' );
+
+               # c5 == NFKD(c1) == NFKD(c2) == NFKD(c3) == NFKD(c4) == NFKD(c5)
+               assert( '$col[4] === $NFKDc1' );
+               assert( '$col[4] === $NFKDc2' );
+               assert( '$col[4] === $NFKDc3' );
+               assert( '$col[4] === $NFKDc4' );
+               assert( '$col[4] === $NFKDc5' );
+       }
+}
+echo "done.\n";
+
+// Compare against http://en.wikipedia.org/wiki/UTF-8#Description
+function unichr( $c ) {
+       if ( $c <= 0x7F ) {
+               return chr( $c );
+       } elseif ( $c <= 0x7FF ) {
+               return chr( 0xC0 | $c >> 6 ) . chr( 0x80 | $c & 0x3F );
+       } elseif ( $c <= 0xFFFF ) {
+               return chr( 0xE0 | $c >> 12 ) . chr( 0x80 | $c >> 6 & 0x3F )
+               . chr( 0x80 | $c & 0x3F );
+       } elseif ( $c <= 0x10FFFF ) {
+               return chr( 0xF0 | $c >> 18 ) . chr( 0x80 | $c >> 12 & 0x3F )
+               . chr( 0x80 | $c >> 6 & 0x3F )
+               . chr( 0x80 | $c & 0x3F );
+       } else {
+               return false;
+       }
+}
+
+function unistr( $c ) {
+       return implode( "", array_map( "unichr", array_map( "hexdec", explode( " ", $c ) ) ) );
+}
+
+function getRow( $f ) {
+       $row = fgets( $f );
+       if ( $row === false ) return false;
+       $row = rtrim( $row );
+       $pos = strpos( $row, COMMENT );
+       $pos2 = strpos( $row, ")" );
+       if ( $pos === 0 ) return array( $row );
+       $c = "";
+
+       if ( $pos ) {
+               if ( $pos2 ) $c = substr( $row, $pos2 + 2 );
+               else      $c = substr( $row, $pos );
+               $row = substr( $row, 0, $pos );
+       }
+
+       $ret = array();
+       foreach ( explode( SEPARATOR, $row ) as $ent ) {
+               if ( trim( $ent ) !== "" ) {
+                       $ret[] = unistr( $ent );
+               }
+       }
+       $ret[] = $c;
+
+       return $ret;
+}
diff --git a/includes/libs/normal/UtfNormalUtil.php b/includes/libs/normal/UtfNormalUtil.php
new file mode 100644 (file)
index 0000000..ae88e73
--- /dev/null
@@ -0,0 +1,154 @@
+<?php
+/**
+ * Some of these functions are adapted from places in MediaWiki.
+ * Should probably merge them for consistency.
+ *
+ * Copyright © 2004 Brion Vibber <brion@pobox.com>
+ * https://www.mediawiki.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup UtfNormal
+ */
+
+/**
+ * Return UTF-8 sequence for a given Unicode code point.
+ *
+ * @param $codepoint Integer:
+ * @return String
+ * @throws InvalidArgumentException if fed out of range data.
+ * @public
+ */
+function codepointToUtf8( $codepoint ) {
+       if ( $codepoint < 0x80 ) {
+               return chr( $codepoint );
+       }
+
+       if ( $codepoint < 0x800 ) {
+               return chr( $codepoint >> 6 & 0x3f | 0xc0 ) .
+                       chr( $codepoint & 0x3f | 0x80 );
+       }
+
+       if ( $codepoint < 0x10000 ) {
+               return chr( $codepoint >> 12 & 0x0f | 0xe0 ) .
+                       chr( $codepoint >> 6 & 0x3f | 0x80 ) .
+                       chr( $codepoint & 0x3f | 0x80 );
+       }
+
+       if ( $codepoint < 0x110000 ) {
+               return chr( $codepoint >> 18 & 0x07 | 0xf0 ) .
+                       chr( $codepoint >> 12 & 0x3f | 0x80 ) .
+                       chr( $codepoint >> 6 & 0x3f | 0x80 ) .
+                       chr( $codepoint & 0x3f | 0x80 );
+       }
+
+       throw new InvalidArgumentException( "Asked for code outside of range ($codepoint)" );
+}
+
+/**
+ * Take a series of space-separated hexadecimal numbers representing
+ * Unicode code points and return a UTF-8 string composed of those
+ * characters. Used by UTF-8 data generation and testing routines.
+ *
+ * @param $sequence String
+ * @return String
+ * @throws InvalidArgumentException if fed out of range data.
+ * @private
+ */
+function hexSequenceToUtf8( $sequence ) {
+       $utf = '';
+       foreach ( explode( ' ', $sequence ) as $hex ) {
+               $n = hexdec( $hex );
+               $utf .= codepointToUtf8( $n );
+       }
+
+       return $utf;
+}
+
+/**
+ * Take a UTF-8 string and return a space-separated series of hex
+ * numbers representing Unicode code points. For debugging.
+ *
+ * @param string $str UTF-8 string.
+ * @return string
+ * @private
+ */
+function utf8ToHexSequence( $str ) {
+       $buf = '';
+       foreach ( preg_split( '//u', $str, -1, PREG_SPLIT_NO_EMPTY ) as $cp ) {
+               $buf .= sprintf( '%04x ', utf8ToCodepoint( $cp ) );
+       }
+
+       return rtrim( $buf );
+}
+
+/**
+ * Determine the Unicode codepoint of a single-character UTF-8 sequence.
+ * Does not check for invalid input data.
+ *
+ * @param $char String
+ * @return Integer
+ * @public
+ */
+function utf8ToCodepoint( $char ) {
+       # Find the length
+       $z = ord( $char[0] );
+       if ( $z & 0x80 ) {
+               $length = 0;
+               while ( $z & 0x80 ) {
+                       $length++;
+                       $z <<= 1;
+               }
+       } else {
+               $length = 1;
+       }
+
+       if ( $length != strlen( $char ) ) {
+               return false;
+       }
+
+       if ( $length == 1 ) {
+               return ord( $char );
+       }
+
+       # Mask off the length-determining bits and shift back to the original location
+       $z &= 0xff;
+       $z >>= $length;
+
+       # Add in the free bits from subsequent bytes
+       for ( $i = 1; $i < $length; $i++ ) {
+               $z <<= 6;
+               $z |= ord( $char[$i] ) & 0x3f;
+       }
+
+       return $z;
+}
+
+/**
+ * Escape a string for inclusion in a PHP single-quoted string literal.
+ *
+ * @param string $string string to be escaped.
+ * @return String: escaped string.
+ * @public
+ */
+function escapeSingleString( $string ) {
+       return strtr( $string,
+               array(
+                       '\\' => '\\\\',
+                       '\'' => '\\\''
+               ) );
+}
diff --git a/includes/libs/replacers/DoubleReplacer.php b/includes/libs/replacers/DoubleReplacer.php
new file mode 100644 (file)
index 0000000..fed023b
--- /dev/null
@@ -0,0 +1,43 @@
+<?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
+ */
+
+/**
+ * Class to perform secondary replacement within each replacement string
+ */
+class DoubleReplacer extends Replacer {
+       /**
+        * @param mixed $from
+        * @param mixed $to
+        * @param int $index
+        */
+       public function __construct( $from, $to, $index = 0 ) {
+               $this->from = $from;
+               $this->to = $to;
+               $this->index = $index;
+       }
+
+       /**
+        * @param array $matches
+        * @return mixed
+        */
+       public function replace( array $matches ) {
+               return str_replace( $this->from, $this->to, $matches[$this->index] );
+       }
+}
diff --git a/includes/libs/replacers/HashtableReplacer.php b/includes/libs/replacers/HashtableReplacer.php
new file mode 100644 (file)
index 0000000..b3c219d
--- /dev/null
@@ -0,0 +1,44 @@
+<?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
+ */
+
+/**
+ * Class to perform replacement based on a simple hashtable lookup
+ */
+class HashtableReplacer extends Replacer {
+       private $table, $index;
+
+       /**
+        * @param array $table
+        * @param int $index
+        */
+       public function __construct( $table, $index = 0 ) {
+               $this->table = $table;
+               $this->index = $index;
+       }
+
+       /**
+        * @param array $matches
+        * @return mixed
+        */
+       public function replace( array $matches ) {
+               return $this->table[$matches[$this->index]];
+       }
+}
+
diff --git a/includes/libs/replacers/RegexlikeReplacer.php b/includes/libs/replacers/RegexlikeReplacer.php
new file mode 100644 (file)
index 0000000..2b1fa74
--- /dev/null
@@ -0,0 +1,46 @@
+<?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
+ */
+
+/**
+ * Class to replace regex matches with a string similar to that used in preg_replace()
+ */
+class RegexlikeReplacer extends Replacer {
+       private $r;
+
+       /**
+        * @param string $r
+        */
+       public function __construct( $r ) {
+               $this->r = $r;
+       }
+
+       /**
+        * @param array $matches
+        * @return string
+        */
+       public function replace( array $matches ) {
+               $pairs = array();
+               foreach ( $matches as $i => $match ) {
+                       $pairs["\$$i"] = $match;
+               }
+
+               return strtr( $this->r, $pairs );
+       }
+}
diff --git a/includes/libs/replacers/Replacer.php b/includes/libs/replacers/Replacer.php
new file mode 100644 (file)
index 0000000..f4850bf
--- /dev/null
@@ -0,0 +1,38 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * Base class for "replacers", objects used in preg_replace_callback() and
+ * StringUtils::delimiterReplaceCallback()
+ */
+abstract class Replacer {
+       /**
+        * @return array
+        */
+       public function cb() {
+               return array( &$this, 'replace' );
+       }
+
+       /**
+        * @param array $matches
+        * @return string
+        */
+       abstract public function replace( array $matches );
+}
index 46c5515..85a3052 100644 (file)
@@ -385,13 +385,14 @@ class ManualLogEntry extends LogEntryBase {
 
        /**
         * Set extra log parameters.
-        * You can pass params to the log action message
-        * by prefixing the keys with a number and colon.
-        * The numbering should start with number 4, the
-        * first three parameters are hardcoded for every
-        * message. Example:
+        *
+        * You can pass params to the log action message by prefixing the keys with
+        * a number and optional type, using colons to separate the fields. The
+        * numbering should start with number 4, the first three parameters are
+        * hardcoded for every message. Example:
         * $entry->setParameters(
-        *   '4:color' => 'blue',
+        *   '4::color' => 'blue',
+        *   '5:number:count' => 3000,
         *   'animal' => 'dog'
         * );
         *
index c6fcdb0..4487fec 100644 (file)
@@ -80,6 +80,9 @@ class LogFormatter {
        /** @var int Constant for handling log_deleted */
        protected $audience = self::FOR_PUBLIC;
 
+       /** @var IContextSource Context for logging */
+       public $context;
+
        /** @var bool Whether to output user tool links */
        protected $linkFlood = false;
 
index e8e73af..7246072 100644 (file)
@@ -1679,17 +1679,6 @@ class FormatMetadata extends ContextSource {
                        );
                }
 
-               $common = $file->getCommonMetaArray();
-
-               if ( $common !== false ) {
-                       foreach ( $common as $key => $value ) {
-                               $fileMetadata[$key] = array(
-                                       'value' => $value,
-                                       'source' => 'file-metadata',
-                               );
-                       }
-               }
-
                return $fileMetadata;
        }
 
index 6dd0453..787f21e 100644 (file)
@@ -57,7 +57,7 @@ abstract class ImageHandler extends MediaHandler {
                } elseif ( isset( $params['width'] ) ) {
                        $width = $params['width'];
                } else {
-                       throw new MWException( 'No width specified to ' . __METHOD__ );
+                       throw new MediaTransformInvalidParametersException( 'No width specified to ' . __METHOD__ );
                }
 
                # Removed for ProofreadPage
diff --git a/includes/media/MediaTransformInvalidParametersException.php b/includes/media/MediaTransformInvalidParametersException.php
new file mode 100644 (file)
index 0000000..15a2ca5
--- /dev/null
@@ -0,0 +1,26 @@
+<?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
+ */
+
+/**
+ * MediaWiki exception thrown by some methods when the transform parameter array is invalid
+ *
+ * @ingroup Exception
+ */
+class MediaTransformInvalidParametersException extends MWException {}
diff --git a/includes/normal/.gitignore b/includes/normal/.gitignore
deleted file mode 100644 (file)
index 0dea457..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-/CompositionExclusions.txt
-/DerivedNormalizationProps.txt
-/NormalizationCorrections.txt
-/NormalizationTest.txt
-/UTF-8-test.txt
-/UnicodeData.txt
-/testdata
diff --git a/includes/normal/Makefile b/includes/normal/Makefile
deleted file mode 100644 (file)
index 76cb68b..0000000
+++ /dev/null
@@ -1,78 +0,0 @@
-.PHONY : all test testutf8 testclean icutest bench icubench clean distclean
-
-## Latest greatest version of Unicode
-## May cause confusion if running test suite from these files
-## when the data was generated from a previous version.
-#BASE=http://www.unicode.org/Public/UNIDATA
-
-# Explicitly using Unicode 6.0
-BASE=http://www.unicode.org/Public/6.0.0/ucd
-
-# Can override to php-cli or php5 or whatever
-PHP=php
-#PHP=php-cli
-
-# Some nice tool to grab URLs with
-FETCH=wget
-#FETCH=fetch
-
-all : UtfNormalData.inc
-
-UtfNormalData.inc : UtfNormalGenerate.php UtfNormalUtil.php UnicodeData.txt CompositionExclusions.txt NormalizationCorrections.txt DerivedNormalizationProps.txt
-       $(PHP) UtfNormalGenerate.php
-
-test : testutf8 UtfNormalTest.php UtfNormalData.inc NormalizationTest.txt
-       $(PHP) UtfNormalTest.php
-
-testutf8 : Utf8Test.php UTF-8-test.txt
-       $(PHP) Utf8Test.php
-
-bench : UtfNormalData.inc testdata/washington.txt testdata/berlin.txt testdata/tokyo.txt testdata/young.txt testdata/bulgakov.txt
-       $(PHP) UtfNormalBench.php
-
-icutest : UtfNormalData.inc NormalizationTest.txt
-       $(PHP) Utf8Test.php --icu
-       $(PHP) UtfNormalTest.php --icu
-
-icubench : UtfNormalData.inc testdata/washington.txt testdata/berlin.txt testdata/tokyo.txt testdata/young.txt testdata/bulgakov.txt
-       $(PHP) UtfNormalBench.php --icu
-
-clean :
-       rm -f UtfNormalData.inc UtfNormalDataK.inc
-
-distclean : clean
-       rm -f CompositionExclusions.txt NormalizationTest.txt NormalizationCorrections.txt UnicodeData.txt DerivedNormalizationProps.txt UTF-8-test.txt
-
-# The Unicode data files...
-CompositionExclusions.txt :
-       $(FETCH) $(BASE)/CompositionExclusions.txt
-
-NormalizationTest.txt :
-       $(FETCH) $(BASE)/NormalizationTest.txt
-
-NormalizationCorrections.txt :
-       $(FETCH) $(BASE)/NormalizationCorrections.txt
-
-DerivedNormalizationProps.txt :
-       $(FETCH) $(BASE)/DerivedNormalizationProps.txt
-
-UnicodeData.txt :
-       $(FETCH) $(BASE)/UnicodeData.txt
-
-UTF-8-test.txt :
-       $(FETCH) http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt
-
-testdata/berlin.txt :
-       mkdir -p testdata && wget -U MediaWiki/test -O testdata/berlin.txt "http://de.wikipedia.org/w/index.php?title=Berlin&oldid=2775712&action=raw"
-
-testdata/washington.txt :
-       mkdir -p testdata && wget -U MediaWiki/test -O testdata/washington.txt "http://en.wikipedia.org/w/index.php?title=Washington%2C_D.C.&oldid=6370218&action=raw"
-
-testdata/tokyo.txt :
-       mkdir -p testdata && wget -U MediaWiki/test -O testdata/tokyo.txt "http://ja.wikipedia.org/w/index.php?title=%E6%9D%B1%E4%BA%AC%E9%83%BD&oldid=940880&action=raw"
-
-testdata/young.txt :
-       mkdir -p testdata && wget -U MediaWiki/test -O testdata/young.txt "http://ko.wikipedia.org/w/index.php?title=%EC%9D%B4%EC%88%98%EC%98%81&oldid=627688&action=raw"
-
-testdata/bulgakov.txt :
-       mkdir -p testdata && wget -U MediaWiki/test -O testdata/bulgakov.txt "http://ru.wikipedia.org/w/index.php?title=%D0%91%D1%83%D0%BB%D0%B3%D0%B0%D0%BA%D0%BE%D0%B2%2C_%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B9_%D0%9D%D0%B8%D0%BA%D0%BE%D0%BB%D0%B0%D0%B5%D0%B2%D0%B8%D1%87&oldid=17704&action=raw"
diff --git a/includes/normal/README b/includes/normal/README
deleted file mode 100644 (file)
index fa70c63..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-This directory contains some Unicode normalization routines. These routines
-are meant to be reusable in other projects, so I'm not tying them to the
-MediaWiki utility functions.
-
-The main function to care about is UtfNormal::toNFC(); this will convert
-a given UTF-8 string to Normalization Form C if it's not already such.
-The function assumes that the input string is already valid UTF-8; if there
-are corrupt characters this may produce erroneous results.
-
-To also check for illegal characters, use UtfNormal::cleanUp(). This will
-strip illegal UTF-8 sequences and characters that are illegal in XML, and
-if necessary convert to normalization form C.
-
-Performance is kind of stinky in absolute terms, though it should be speedy
-on pure ASCII text. ;) On text that can be determined quickly to already be
-in NFC it's not too awful but it can quickly get uncomfortably slow,
-particularly for Korean text (the hangul decomposition/composition code is
-extra slow).
-
-
-== Regenerating data tables ==
-
-UtfNormalData.inc and UtfNormalDataK.inc are generated from the Unicode
-Character Database by the script UtfNormalGenerate.php. On a *nix system
-'make' should fetch the necessary files and regenerate it if the scripts
-have been changed or you remove it.
-
-
-== Testing ==
-
-'make test' will run the conformance test (UtfNormalTest.php), fetching the
-data from the net if necessary. If it reports failure, something is
-going wrong!
-
-You may have to set up PHPUnit first.
-
-$ pear channel-discover pear.phpunit.de
-$ pear install phpunit/PHPUnit
-
-== Benchmarks ==
-
-Run 'make bench' to download some sample texts from Wikipedia and run some
-cheap benchmarks of some of the functions. Take all numbers with large
-grains of salt.
-
-
-== PHP module extension ==
-
-There's an experimental PHP extension module which wraps the ICU library's
-normalization functions. This is *MUCH* faster than doing this work in pure
-PHP code. This is at https://git.wikimedia.org/summary/mediawiki%2Fextensions%2Fnormal.git.
-It is used by the WMF, which currently runs PHP 5.3.10 on Linux.  It hasn't been
-thoroughly tested on other configurations, but may work.
-
-If the php_normal.so module is loaded in php.ini, the normalization functions
-will automatically use it. If you can't (or don't want to) load it in php.ini,
-you may be able to load it using the dl() function before the inclusion of
-UtfNormal.php, and it will be picked up.
-
diff --git a/includes/normal/RandomTest.php b/includes/normal/RandomTest.php
deleted file mode 100644 (file)
index 0604d7b..0000000
+++ /dev/null
@@ -1,102 +0,0 @@
-<?php
-/**
- * Test feeds random 16-byte strings to both the pure PHP and ICU-based
- * UtfNormal::cleanUp() code paths, and checks to see if there's a
- * difference. Will run forever until it finds one or you kill it.
- *
- * Copyright (C) 2004 Brion Vibber <brion@pobox.com>
- * https://www.mediawiki.org/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup UtfNormal
- */
-
-if ( PHP_SAPI != 'cli' ) {
-       die( "Run me from the command line please.\n" );
-}
-
-/** */
-require_once 'UtfNormal.php';
-require_once '../diff/DifferenceEngine.php';
-
-dl( 'php_utfnormal.so' );
-
-# mt_srand( 99999 );
-
-function randomString( $length, $nullOk, $ascii = false ) {
-       $out = '';
-       for ( $i = 0; $i < $length; $i++ )
-               $out .= chr( mt_rand( $nullOk ? 0 : 1, $ascii ? 127 : 255 ) );
-
-       return $out;
-}
-
-/* Duplicate of the cleanUp() path for ICU usage */
-function donorm( $str ) {
-       # We exclude a few chars that ICU would not.
-       $str = preg_replace( '/[\x00-\x08\x0b\x0c\x0e-\x1f]/', UTF8_REPLACEMENT, $str );
-       $str = str_replace( UTF8_FFFE, UTF8_REPLACEMENT, $str );
-       $str = str_replace( UTF8_FFFF, UTF8_REPLACEMENT, $str );
-
-       # UnicodeString constructor fails if the string ends with a head byte.
-       # Add a junk char at the end, we'll strip it off
-       return rtrim( utf8_normalize( $str . "\x01", UtfNormal::UNORM_NFC ), "\x01" );
-}
-
-function showDiffs( $a, $b ) {
-       $ota = explode( "\n", str_replace( "\r\n", "\n", $a ) );
-       $nta = explode( "\n", str_replace( "\r\n", "\n", $b ) );
-
-       $diffs = new Diff( $ota, $nta );
-       $formatter = new TableDiffFormatter();
-       $funky = $formatter->format( $diffs );
-       $matches = array();
-       preg_match_all( '/<(?:ins|del) class="diffchange">(.*?)<\/(?:ins|del)>/', $funky, $matches );
-       foreach ( $matches[1] as $bit ) {
-               $hex = bin2hex( $bit );
-               echo "\t$hex\n";
-       }
-}
-
-$size = 16;
-$n = 0;
-while ( true ) {
-       $n++;
-       echo "$n\n";
-
-       $str = randomString( $size, true );
-       $clean = UtfNormal::cleanUp( $str );
-       $norm = donorm( $str );
-
-       echo strlen( $clean ) . ", " . strlen( $norm );
-       if ( $clean == $norm ) {
-               echo " (match)\n";
-       } else {
-               echo " (FAIL)\n";
-               echo "\traw: " . bin2hex( $str ) . "\n" .
-                       "\tphp: " . bin2hex( $clean ) . "\n" .
-                       "\ticu: " . bin2hex( $norm ) . "\n";
-               echo "\n\tdiffs:\n";
-               showDiffs( $clean, $norm );
-               die();
-       }
-
-       $str = '';
-       $clean = '';
-       $norm = '';
-}
diff --git a/includes/normal/Utf8Test.php b/includes/normal/Utf8Test.php
deleted file mode 100644 (file)
index f4acc1e..0000000
+++ /dev/null
@@ -1,156 +0,0 @@
-<?php
-/**
- * Runs the UTF-8 decoder test at:
- * http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt
- *
- * Copyright © 2004 Brion Vibber <brion@pobox.com>
- * https://www.mediawiki.org/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup UtfNormal
- */
-
-/** */
-
-if ( PHP_SAPI != 'cli' ) {
-       die( "Run me from the command line please.\n" );
-}
-
-require_once 'UtfNormalDefines.php';
-require_once 'UtfNormalUtil.php';
-require_once 'UtfNormal.php';
-mb_internal_encoding( "utf-8" );
-
-$verbose = false;
-#$verbose = true;
-
-$in = fopen( "UTF-8-test.txt", "rt" );
-if ( !$in ) {
-       print "Couldn't open UTF-8-test.txt -- can't run tests.\n";
-       print "If necessary, manually download this file. It can be obtained at\n";
-       print "http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt\n";
-       exit( -1 );
-}
-
-$columns = 0;
-while ( false !== ( $line = fgets( $in ) ) ) {
-       $matches = array();
-       if ( preg_match( '/^(Here come the tests:\s*)\|$/', $line, $matches ) ) {
-               $columns = strpos( $line, '|' );
-               break;
-       }
-}
-
-if ( !$columns ) {
-       print "Something seems to be wrong; couldn't extract line length.\n";
-       print "Check that UTF-8-test.txt was downloaded correctly from\n";
-       print "http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt\n";
-       exit( -1 );
-}
-
-# print "$columns\n";
-
-$ignore = array(
-       # These two lines actually seem to be corrupt
-       '2.1.1', '2.2.1' );
-
-$exceptions = array(
-       # Tests that should mark invalid characters due to using long
-       # sequences beyond what is now considered legal.
-       '2.1.5', '2.1.6', '2.2.4', '2.2.5', '2.2.6', '2.3.5',
-
-       # Literal 0xffff, which is illegal
-       '2.2.3' );
-
-$longTests = array(
-       # These tests span multiple lines
-       '3.1.9', '3.2.1', '3.2.2', '3.2.3', '3.2.4', '3.2.5',
-       '3.4' );
-
-# These tests are not in proper subsections
-$sectionTests = array( '3.4' );
-
-$section = null;
-$test = '';
-$failed = 0;
-$success = 0;
-$total = 0;
-while ( false !== ( $line = fgets( $in ) ) ) {
-       $matches = array();
-       if ( preg_match( '/^(\d+)\s+(.*?)\s*\|/', $line, $matches ) ) {
-               $section = $matches[1];
-               print $line;
-               continue;
-       }
-       if ( preg_match( '/^(\d+\.\d+\.\d+)\s*/', $line, $matches ) ) {
-               $test = $matches[1];
-
-               if ( in_array( $test, $ignore ) ) {
-                       continue;
-               }
-               if ( in_array( $test, $longTests ) ) {
-                       $line = fgets( $in );
-
-                       // @codingStandardsIgnoreStart Generic.CodeAnalysis.ForLoopWithTestFunctionCall.NotAllowed
-                       for ( $line = fgets( $in ); !preg_match( '/^\s+\|/', $line ); $line = fgets( $in ) ) {
-                               // @codingStandardsIgnoreEnd
-
-                               testLine( $test, $line, $total, $success, $failed, $columns, $exceptions, $verbose );
-                       }
-               } else {
-                       testLine( $test, $line, $total, $success, $failed, $columns, $exceptions, $verbose );
-               }
-       }
-}
-
-if ( $failed ) {
-       echo "\nFailed $failed tests.\n";
-       echo "UTF-8 DECODER TEST FAILED\n";
-       exit ( -1 );
-}
-
-echo "UTF-8 DECODER TEST SUCCESS!\n";
-exit ( 0 );
-
-function testLine( $test, $line, &$total, &$success, &$failed, $columns, $exceptions, $verbose ) {
-       $stripped = $line;
-       UtfNormal::quickisNFCVerify( $stripped );
-
-       $same = ( $line == $stripped );
-       $len = mb_strlen( substr( $stripped, 0, strpos( $stripped, '|' ) ) );
-       if ( $len == 0 ) {
-               $len = strlen( substr( $stripped, 0, strpos( $stripped, '|' ) ) );
-       }
-
-       $ok = $same ^ ( $test >= 3 );
-
-       $ok ^= in_array( $test, $exceptions );
-
-       $ok &= ( $columns == $len );
-
-       $total++;
-       if ( $ok ) {
-               $success++;
-       } else {
-               $failed++;
-       }
-
-       if ( $verbose || !$ok ) {
-               print str_replace( "\n", "$len\n", $stripped );
-       }
-}
diff --git a/includes/normal/UtfNormal.php b/includes/normal/UtfNormal.php
deleted file mode 100644 (file)
index 8204f97..0000000
+++ /dev/null
@@ -1,790 +0,0 @@
-<?php
-/**
- * Unicode normalization routines
- *
- * Copyright © 2004 Brion Vibber <brion@pobox.com>
- * https://www.mediawiki.org/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup UtfNormal
- */
-
-/**
- * @defgroup UtfNormal UtfNormal
- */
-
-define( 'NORMALIZE_ICU', function_exists( 'utf8_normalize' ) );
-define( 'NORMALIZE_INTL', function_exists( 'normalizer_normalize' ) );
-
-/**
- * Unicode normalization routines for working with UTF-8 strings.
- * Currently assumes that input strings are valid UTF-8!
- *
- * Not as fast as I'd like, but should be usable for most purposes.
- * UtfNormal::toNFC() will bail early if given ASCII text or text
- * it can quickly determine is already normalized.
- *
- * All functions can be called static.
- *
- * See description of forms at http://www.unicode.org/reports/tr15/
- *
- * @ingroup UtfNormal
- */
-class UtfNormal {
-       /**
-        * For using the ICU wrapper
-        */
-       const UNORM_NONE = 1;
-       const UNORM_NFD = 2;
-       const UNORM_NFKD = 3;
-       const UNORM_NFC = 4;
-       const UNORM_NFKC = 5;
-       const UNORM_FCD = 6;
-       const UNORM_DEFAULT = self::UNORM_NFC;
-
-       public static $utfCombiningClass = null;
-       public static $utfCanonicalComp = null;
-       public static $utfCanonicalDecomp = null;
-
-       # Load compatibility decompositions on demand if they are needed.
-       public static $utfCompatibilityDecomp = null;
-       public static $utfCheckNFC;
-
-       /**
-        * The ultimate convenience function! Clean up invalid UTF-8 sequences,
-        * and convert to normal form C, canonical composition.
-        *
-        * Fast return for pure ASCII strings; some lesser optimizations for
-        * strings containing only known-good characters. Not as fast as toNFC().
-        *
-        * @param string $string a UTF-8 string
-        * @return string a clean, shiny, normalized UTF-8 string
-        */
-       static function cleanUp( $string ) {
-               if ( NORMALIZE_ICU ) {
-                       $string = self::replaceForNativeNormalize( $string );
-
-                       # UnicodeString constructor fails if the string ends with a
-                       # head byte. Add a junk char at the end, we'll strip it off.
-                       return rtrim( utf8_normalize( $string . "\x01", self::UNORM_NFC ), "\x01" );
-               } elseif ( NORMALIZE_INTL ) {
-                       $string = self::replaceForNativeNormalize( $string );
-                       $norm = normalizer_normalize( $string, Normalizer::FORM_C );
-                       if ( $norm === null || $norm === false ) {
-                               # normalizer_normalize will either return false or null
-                               # (depending on which doc you read) if invalid utf8 string.
-                               # quickIsNFCVerify cleans up invalid sequences.
-
-                               if ( UtfNormal::quickIsNFCVerify( $string ) ) {
-                                       # if that's true, the string is actually already normal.
-                                       return $string;
-                               } else {
-                                       # Now we are valid but non-normal
-                                       return normalizer_normalize( $string, Normalizer::FORM_C );
-                               }
-                       } else {
-                               return $norm;
-                       }
-               } elseif ( UtfNormal::quickIsNFCVerify( $string ) ) {
-                       # Side effect -- $string has had UTF-8 errors cleaned up.
-                       return $string;
-               } else {
-                       return UtfNormal::NFC( $string );
-               }
-       }
-
-       /**
-        * Convert a UTF-8 string to normal form C, canonical composition.
-        * Fast return for pure ASCII strings; some lesser optimizations for
-        * strings containing only known-good characters.
-        *
-        * @param string $string a valid UTF-8 string. Input is not validated.
-        * @return string a UTF-8 string in normal form C
-        */
-       static function toNFC( $string ) {
-               if ( NORMALIZE_INTL )
-                       return normalizer_normalize( $string, Normalizer::FORM_C );
-               elseif ( NORMALIZE_ICU )
-                       return utf8_normalize( $string, self::UNORM_NFC );
-               elseif ( UtfNormal::quickIsNFC( $string ) )
-                       return $string;
-               else
-                       return UtfNormal::NFC( $string );
-       }
-
-       /**
-        * Convert a UTF-8 string to normal form D, canonical decomposition.
-        * Fast return for pure ASCII strings.
-        *
-        * @param string $string a valid UTF-8 string. Input is not validated.
-        * @return string a UTF-8 string in normal form D
-        */
-       static function toNFD( $string ) {
-               if ( NORMALIZE_INTL )
-                       return normalizer_normalize( $string, Normalizer::FORM_D );
-               elseif ( NORMALIZE_ICU )
-                       return utf8_normalize( $string, self::UNORM_NFD );
-               elseif ( preg_match( '/[\x80-\xff]/', $string ) )
-                       return UtfNormal::NFD( $string );
-               else
-                       return $string;
-       }
-
-       /**
-        * Convert a UTF-8 string to normal form KC, compatibility composition.
-        * This may cause irreversible information loss, use judiciously.
-        * Fast return for pure ASCII strings.
-        *
-        * @param string $string a valid UTF-8 string. Input is not validated.
-        * @return string a UTF-8 string in normal form KC
-        */
-       static function toNFKC( $string ) {
-               if ( NORMALIZE_INTL )
-                       return normalizer_normalize( $string, Normalizer::FORM_KC );
-               elseif ( NORMALIZE_ICU )
-                       return utf8_normalize( $string, self::UNORM_NFKC );
-               elseif ( preg_match( '/[\x80-\xff]/', $string ) )
-                       return UtfNormal::NFKC( $string );
-               else
-                       return $string;
-       }
-
-       /**
-        * Convert a UTF-8 string to normal form KD, compatibility decomposition.
-        * This may cause irreversible information loss, use judiciously.
-        * Fast return for pure ASCII strings.
-        *
-        * @param string $string a valid UTF-8 string. Input is not validated.
-        * @return string a UTF-8 string in normal form KD
-        */
-       static function toNFKD( $string ) {
-               if ( NORMALIZE_INTL )
-                       return normalizer_normalize( $string, Normalizer::FORM_KD );
-               elseif ( NORMALIZE_ICU )
-                       return utf8_normalize( $string, self::UNORM_NFKD );
-               elseif ( preg_match( '/[\x80-\xff]/', $string ) )
-                       return UtfNormal::NFKD( $string );
-               else
-                       return $string;
-       }
-
-       /**
-        * Load the basic composition data if necessary
-        * @private
-        */
-       static function loadData() {
-               if ( !isset( self::$utfCombiningClass ) ) {
-                       require_once __DIR__ . '/UtfNormalData.inc';
-               }
-       }
-
-       /**
-        * Returns true if the string is _definitely_ in NFC.
-        * Returns false if not or uncertain.
-        * @param string $string a valid UTF-8 string. Input is not validated.
-        * @return bool
-        */
-       static function quickIsNFC( $string ) {
-               # ASCII is always valid NFC!
-               # If it's pure ASCII, let it through.
-               if ( !preg_match( '/[\x80-\xff]/', $string ) ) return true;
-
-               UtfNormal::loadData();
-               $len = strlen( $string );
-               for ( $i = 0; $i < $len; $i++ ) {
-                       $c = $string[$i];
-                       $n = ord( $c );
-                       if ( $n < 0x80 ) {
-                               continue;
-                       } elseif ( $n >= 0xf0 ) {
-                               $c = substr( $string, $i, 4 );
-                               $i += 3;
-                       } elseif ( $n >= 0xe0 ) {
-                               $c = substr( $string, $i, 3 );
-                               $i += 2;
-                       } elseif ( $n >= 0xc0 ) {
-                               $c = substr( $string, $i, 2 );
-                               $i++;
-                       }
-                       if ( isset( self::$utfCheckNFC[$c] ) ) {
-                               # If it's NO or MAYBE, bail and do the slow check.
-                               return false;
-                       }
-                       if ( isset( self::$utfCombiningClass[$c] ) ) {
-                               # Combining character? We might have to do sorting, at least.
-                               return false;
-                       }
-               }
-
-               return true;
-       }
-
-       /**
-        * Returns true if the string is _definitely_ in NFC.
-        * Returns false if not or uncertain.
-        * @param string $string a UTF-8 string, altered on output to be valid UTF-8 safe for XML.
-        * @return bool
-        */
-       static function quickIsNFCVerify( &$string ) {
-               # Screen out some characters that eg won't be allowed in XML
-               $string = preg_replace( '/[\x00-\x08\x0b\x0c\x0e-\x1f]/', UTF8_REPLACEMENT, $string );
-
-               # ASCII is always valid NFC!
-               # If we're only ever given plain ASCII, we can avoid the overhead
-               # of initializing the decomposition tables by skipping out early.
-               if ( !preg_match( '/[\x80-\xff]/', $string ) ) return true;
-
-               static $checkit = null, $tailBytes = null, $utfCheckOrCombining = null;
-               if ( !isset( $checkit ) ) {
-                       # Load/build some scary lookup tables...
-                       UtfNormal::loadData();
-
-                       $utfCheckOrCombining = array_merge( self::$utfCheckNFC, self::$utfCombiningClass );
-
-                       # Head bytes for sequences which we should do further validity checks
-                       $checkit = array_flip( array_map( 'chr',
-                               array( 0xc0, 0xc1, 0xe0, 0xed, 0xef,
-                                       0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
-                                       0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff ) ) );
-
-                       # Each UTF-8 head byte is followed by a certain
-                       # number of tail bytes.
-                       $tailBytes = array();
-                       for ( $n = 0; $n < 256; $n++ ) {
-                               if ( $n < 0xc0 ) {
-                                       $remaining = 0;
-                               } elseif ( $n < 0xe0 ) {
-                                       $remaining = 1;
-                               } elseif ( $n < 0xf0 ) {
-                                       $remaining = 2;
-                               } elseif ( $n < 0xf8 ) {
-                                       $remaining = 3;
-                               } elseif ( $n < 0xfc ) {
-                                       $remaining = 4;
-                               } elseif ( $n < 0xfe ) {
-                                       $remaining = 5;
-                               } else {
-                                       $remaining = 0;
-                               }
-                               $tailBytes[chr( $n )] = $remaining;
-                       }
-               }
-
-               # Chop the text into pure-ASCII and non-ASCII areas;
-               # large ASCII parts can be handled much more quickly.
-               # Don't chop up Unicode areas for punctuation, though,
-               # that wastes energy.
-               $matches = array();
-               preg_match_all(
-                       '/([\x00-\x7f]+|[\x80-\xff][\x00-\x40\x5b-\x5f\x7b-\xff]*)/',
-                       $string, $matches );
-
-               $looksNormal = true;
-               $base = 0;
-               $replace = array();
-               foreach ( $matches[1] as $str ) {
-                       $chunk = strlen( $str );
-
-                       if ( $str[0] < "\x80" ) {
-                               # ASCII chunk: guaranteed to be valid UTF-8
-                               # and in normal form C, so skip over it.
-                               $base += $chunk;
-                               continue;
-                       }
-
-                       # We'll have to examine the chunk byte by byte to ensure
-                       # that it consists of valid UTF-8 sequences, and to see
-                       # if any of them might not be normalized.
-                       #
-                       # Since PHP is not the fastest language on earth, some of
-                       # this code is a little ugly with inner loop optimizations.
-
-                       $head = '';
-                       $len = $chunk + 1; # Counting down is faster. I'm *so* sorry.
-
-                       for ( $i = -1; --$len; ) {
-                               $remaining = $tailBytes[$c = $str[++$i]];
-                               if ( $remaining ) {
-                                       # UTF-8 head byte!
-                                       $sequence = $head = $c;
-                                       do {
-                                               # Look for the defined number of tail bytes...
-                                               if ( --$len && ( $c = $str[++$i] ) >= "\x80" && $c < "\xc0" ) {
-                                                       # Legal tail bytes are nice.
-                                                       $sequence .= $c;
-                                               } else {
-                                                       if ( 0 == $len ) {
-                                                               # Premature end of string!
-                                                               # Drop a replacement character into output to
-                                                               # represent the invalid UTF-8 sequence.
-                                                               $replace[] = array( UTF8_REPLACEMENT,
-                                                                       $base + $i + 1 - strlen( $sequence ),
-                                                                       strlen( $sequence ) );
-                                                               break 2;
-                                                       } else {
-                                                               # Illegal tail byte; abandon the sequence.
-                                                               $replace[] = array( UTF8_REPLACEMENT,
-                                                                       $base + $i - strlen( $sequence ),
-                                                                       strlen( $sequence ) );
-                                                               # Back up and reprocess this byte; it may itself
-                                                               # be a legal ASCII or UTF-8 sequence head.
-                                                               --$i;
-                                                               ++$len;
-                                                               continue 2;
-                                                       }
-                                               }
-                                       } while ( --$remaining );
-
-                                       if ( isset( $checkit[$head] ) ) {
-                                               # Do some more detailed validity checks, for
-                                               # invalid characters and illegal sequences.
-                                               if ( $head == "\xed" ) {
-                                                       # 0xed is relatively frequent in Korean, which
-                                                       # abuts the surrogate area, so we're doing
-                                                       # this check separately to speed things up.
-
-                                                       if ( $sequence >= UTF8_SURROGATE_FIRST ) {
-                                                               # Surrogates are legal only in UTF-16 code.
-                                                               # They are totally forbidden here in UTF-8
-                                                               # utopia.
-                                                               $replace[] = array( UTF8_REPLACEMENT,
-                                                                       $base + $i + 1 - strlen( $sequence ),
-                                                                       strlen( $sequence ) );
-                                                               $head = '';
-                                                               continue;
-                                                       }
-                                               } else {
-                                                       # Slower, but rarer checks...
-                                                       $n = ord( $head );
-                                                       if (
-                                                               # "Overlong sequences" are those that are syntactically
-                                                               # correct but use more UTF-8 bytes than are necessary to
-                                                               # encode a character. Naïve string comparisons can be
-                                                               # tricked into failing to see a match for an ASCII
-                                                               # character, for instance, which can be a security hole
-                                                               # if blacklist checks are being used.
-                                                               ( $n < 0xc2 && $sequence <= UTF8_OVERLONG_A )
-                                                               || ( $n == 0xe0 && $sequence <= UTF8_OVERLONG_B )
-                                                               || ( $n == 0xf0 && $sequence <= UTF8_OVERLONG_C )
-
-                                                               # U+FFFE and U+FFFF are explicitly forbidden in Unicode.
-                                                               || ( $n == 0xef &&
-                                                                       ( $sequence == UTF8_FFFE )
-                                                                       || ( $sequence == UTF8_FFFF ) )
-
-                                                               # Unicode has been limited to 21 bits; longer
-                                                               # sequences are not allowed.
-                                                               || ( $n >= 0xf0 && $sequence > UTF8_MAX )
-                                                       ) {
-
-                                                               $replace[] = array( UTF8_REPLACEMENT,
-                                                                       $base + $i + 1 - strlen( $sequence ),
-                                                                       strlen( $sequence ) );
-                                                               $head = '';
-                                                               continue;
-                                                       }
-                                               }
-                                       }
-
-                                       if ( isset( $utfCheckOrCombining[$sequence] ) ) {
-                                               # If it's NO or MAYBE, we'll have to rip
-                                               # the string apart and put it back together.
-                                               # That's going to be mighty slow.
-                                               $looksNormal = false;
-                                       }
-
-                                       # The sequence is legal!
-                                       $head = '';
-                               } elseif ( $c < "\x80" ) {
-                                       # ASCII byte.
-                                       $head = '';
-                               } elseif ( $c < "\xc0" ) {
-                                       # Illegal tail bytes
-                                       if ( $head == '' ) {
-                                               # Out of the blue!
-                                               $replace[] = array( UTF8_REPLACEMENT, $base + $i, 1 );
-                                       } else {
-                                               # Don't add if we're continuing a broken sequence;
-                                               # we already put a replacement character when we looked
-                                               # at the broken sequence.
-                                               $replace[] = array( '', $base + $i, 1 );
-                                       }
-                               } else {
-                                       # Miscellaneous freaks.
-                                       $replace[] = array( UTF8_REPLACEMENT, $base + $i, 1 );
-                                       $head = '';
-                               }
-                       }
-                       $base += $chunk;
-               }
-               if ( count( $replace ) ) {
-                       # There were illegal UTF-8 sequences we need to fix up.
-                       $out = '';
-                       $last = 0;
-                       foreach ( $replace as $rep ) {
-                               list( $replacement, $start, $length ) = $rep;
-                               if ( $last < $start ) {
-                                       $out .= substr( $string, $last, $start - $last );
-                               }
-                               $out .= $replacement;
-                               $last = $start + $length;
-                       }
-                       if ( $last < strlen( $string ) ) {
-                               $out .= substr( $string, $last );
-                       }
-                       $string = $out;
-               }
-
-               return $looksNormal;
-       }
-
-       # These take a string and run the normalization on them, without
-       # checking for validity or any optimization etc. Input must be
-       # VALID UTF-8!
-       /**
-        * @param $string string
-        * @return string
-        * @private
-        */
-       static function NFC( $string ) {
-               return UtfNormal::fastCompose( UtfNormal::NFD( $string ) );
-       }
-
-       /**
-        * @param $string string
-        * @return string
-        * @private
-        */
-       static function NFD( $string ) {
-               UtfNormal::loadData();
-
-               return UtfNormal::fastCombiningSort(
-                       UtfNormal::fastDecompose( $string, self::$utfCanonicalDecomp ) );
-       }
-
-       /**
-        * @param $string string
-        * @return string
-        * @private
-        */
-       static function NFKC( $string ) {
-               return UtfNormal::fastCompose( UtfNormal::NFKD( $string ) );
-       }
-
-       /**
-        * @param $string string
-        * @return string
-        * @private
-        */
-       static function NFKD( $string ) {
-               if ( !isset( self::$utfCompatibilityDecomp ) ) {
-                       require_once 'UtfNormalDataK.inc';
-               }
-
-               return self::fastCombiningSort(
-                       self::fastDecompose( $string, self::$utfCompatibilityDecomp ) );
-       }
-
-       /**
-        * Perform decomposition of a UTF-8 string into either D or KD form
-        * (depending on which decomposition map is passed to us).
-        * Input is assumed to be *valid* UTF-8. Invalid code will break.
-        * @private
-        * @param string $string valid UTF-8 string
-        * @param array $map hash of expanded decomposition map
-        * @return string a UTF-8 string decomposed, not yet normalized (needs sorting)
-        */
-       static function fastDecompose( $string, $map ) {
-               UtfNormal::loadData();
-               $len = strlen( $string );
-               $out = '';
-               for ( $i = 0; $i < $len; $i++ ) {
-                       $c = $string[$i];
-                       $n = ord( $c );
-                       if ( $n < 0x80 ) {
-                               # ASCII chars never decompose
-                               # THEY ARE IMMORTAL
-                               $out .= $c;
-                               continue;
-                       } elseif ( $n >= 0xf0 ) {
-                               $c = substr( $string, $i, 4 );
-                               $i += 3;
-                       } elseif ( $n >= 0xe0 ) {
-                               $c = substr( $string, $i, 3 );
-                               $i += 2;
-                       } elseif ( $n >= 0xc0 ) {
-                               $c = substr( $string, $i, 2 );
-                               $i++;
-                       }
-                       if ( isset( $map[$c] ) ) {
-                               $out .= $map[$c];
-                               continue;
-                       } else {
-                               if ( $c >= UTF8_HANGUL_FIRST && $c <= UTF8_HANGUL_LAST ) {
-                                       # Decompose a hangul syllable into jamo;
-                                       # hardcoded for three-byte UTF-8 sequence.
-                                       # A lookup table would be slightly faster,
-                                       # but adds a lot of memory & disk needs.
-                                       #
-                                       $index = ( ( ord( $c[0] ) & 0x0f ) << 12
-                                                       | ( ord( $c[1] ) & 0x3f ) << 6
-                                                       | ( ord( $c[2] ) & 0x3f ) )
-                                               - UNICODE_HANGUL_FIRST;
-                                       $l = intval( $index / UNICODE_HANGUL_NCOUNT );
-                                       $v = intval( ( $index % UNICODE_HANGUL_NCOUNT ) / UNICODE_HANGUL_TCOUNT );
-                                       $t = $index % UNICODE_HANGUL_TCOUNT;
-                                       $out .= "\xe1\x84" . chr( 0x80 + $l ) . "\xe1\x85" . chr( 0xa1 + $v );
-                                       if ( $t >= 25 ) {
-                                               $out .= "\xe1\x87" . chr( 0x80 + $t - 25 );
-                                       } elseif ( $t ) {
-                                               $out .= "\xe1\x86" . chr( 0xa7 + $t );
-                                       }
-                                       continue;
-                               }
-                       }
-                       $out .= $c;
-               }
-
-               return $out;
-       }
-
-       /**
-        * Sorts combining characters into canonical order. This is the
-        * final step in creating decomposed normal forms D and KD.
-        * @private
-        * @param string $string a valid, decomposed UTF-8 string. Input is not validated.
-        * @return string a UTF-8 string with combining characters sorted in canonical order
-        */
-       static function fastCombiningSort( $string ) {
-               UtfNormal::loadData();
-               $len = strlen( $string );
-               $out = '';
-               $combiners = array();
-               $lastClass = -1;
-               for ( $i = 0; $i < $len; $i++ ) {
-                       $c = $string[$i];
-                       $n = ord( $c );
-                       if ( $n >= 0x80 ) {
-                               if ( $n >= 0xf0 ) {
-                                       $c = substr( $string, $i, 4 );
-                                       $i += 3;
-                               } elseif ( $n >= 0xe0 ) {
-                                       $c = substr( $string, $i, 3 );
-                                       $i += 2;
-                               } elseif ( $n >= 0xc0 ) {
-                                       $c = substr( $string, $i, 2 );
-                                       $i++;
-                               }
-                               if ( isset( self::$utfCombiningClass[$c] ) ) {
-                                       $lastClass = self::$utfCombiningClass[$c];
-                                       if ( isset( $combiners[$lastClass] ) ) {
-                                               $combiners[$lastClass] .= $c;
-                                       } else {
-                                               $combiners[$lastClass] = $c;
-                                       }
-                                       continue;
-                               }
-                       }
-                       if ( $lastClass ) {
-                               ksort( $combiners );
-                               $out .= implode( '', $combiners );
-                               $combiners = array();
-                       }
-                       $out .= $c;
-                       $lastClass = 0;
-               }
-               if ( $lastClass ) {
-                       ksort( $combiners );
-                       $out .= implode( '', $combiners );
-               }
-
-               return $out;
-       }
-
-       /**
-        * Produces canonically composed sequences, i.e. normal form C or KC.
-        *
-        * @private
-        * @param string $string a valid UTF-8 string in sorted normal form D or KD.
-        *   Input is not validated.
-        * @return string a UTF-8 string with canonical precomposed characters used
-        *   where possible.
-        */
-       static function fastCompose( $string ) {
-               UtfNormal::loadData();
-               $len = strlen( $string );
-               $out = '';
-               $lastClass = -1;
-               $lastHangul = 0;
-               $startChar = '';
-               $combining = '';
-               $x1 = ord( substr( UTF8_HANGUL_VBASE, 0, 1 ) );
-               $x2 = ord( substr( UTF8_HANGUL_TEND, 0, 1 ) );
-               for ( $i = 0; $i < $len; $i++ ) {
-                       $c = $string[$i];
-                       $n = ord( $c );
-                       if ( $n < 0x80 ) {
-                               # No combining characters here...
-                               $out .= $startChar;
-                               $out .= $combining;
-                               $startChar = $c;
-                               $combining = '';
-                               $lastClass = 0;
-                               continue;
-                       } elseif ( $n >= 0xf0 ) {
-                               $c = substr( $string, $i, 4 );
-                               $i += 3;
-                       } elseif ( $n >= 0xe0 ) {
-                               $c = substr( $string, $i, 3 );
-                               $i += 2;
-                       } elseif ( $n >= 0xc0 ) {
-                               $c = substr( $string, $i, 2 );
-                               $i++;
-                       }
-                       $pair = $startChar . $c;
-                       if ( $n > 0x80 ) {
-                               if ( isset( self::$utfCombiningClass[$c] ) ) {
-                                       # A combining char; see what we can do with it
-                                       $class = self::$utfCombiningClass[$c];
-                                       if ( !empty( $startChar ) &&
-                                               $lastClass < $class &&
-                                               $class > 0 &&
-                                               isset( self::$utfCanonicalComp[$pair] )
-                                       ) {
-                                               $startChar = self::$utfCanonicalComp[$pair];
-                                               $class = 0;
-                                       } else {
-                                               $combining .= $c;
-                                       }
-                                       $lastClass = $class;
-                                       $lastHangul = 0;
-                                       continue;
-                               }
-                       }
-                       # New start char
-                       if ( $lastClass == 0 ) {
-                               if ( isset( self::$utfCanonicalComp[$pair] ) ) {
-                                       $startChar = self::$utfCanonicalComp[$pair];
-                                       $lastHangul = 0;
-                                       continue;
-                               }
-                               if ( $n >= $x1 && $n <= $x2 ) {
-                                       # WARNING: Hangul code is painfully slow.
-                                       # I apologize for this ugly, ugly code; however
-                                       # performance is even more teh suck if we call
-                                       # out to nice clean functions. Lookup tables are
-                                       # marginally faster, but require a lot of space.
-                                       #
-                                       if ( $c >= UTF8_HANGUL_VBASE &&
-                                               $c <= UTF8_HANGUL_VEND &&
-                                               $startChar >= UTF8_HANGUL_LBASE &&
-                                               $startChar <= UTF8_HANGUL_LEND
-                                       ) {
-                                               #
-                                               #$lIndex = utf8ToCodepoint( $startChar ) - UNICODE_HANGUL_LBASE;
-                                               #$vIndex = utf8ToCodepoint( $c ) - UNICODE_HANGUL_VBASE;
-                                               $lIndex = ord( $startChar[2] ) - 0x80;
-                                               $vIndex = ord( $c[2] ) - 0xa1;
-
-                                               $hangulPoint = UNICODE_HANGUL_FIRST +
-                                                       UNICODE_HANGUL_TCOUNT *
-                                                       ( UNICODE_HANGUL_VCOUNT * $lIndex + $vIndex );
-
-                                               # Hardcode the limited-range UTF-8 conversion:
-                                               $startChar = chr( $hangulPoint >> 12 & 0x0f | 0xe0 ) .
-                                                       chr( $hangulPoint >> 6 & 0x3f | 0x80 ) .
-                                                       chr( $hangulPoint & 0x3f | 0x80 );
-                                               $lastHangul = 0;
-                                               continue;
-                                       } elseif ( $c >= UTF8_HANGUL_TBASE &&
-                                               $c <= UTF8_HANGUL_TEND &&
-                                               $startChar >= UTF8_HANGUL_FIRST &&
-                                               $startChar <= UTF8_HANGUL_LAST &&
-                                               !$lastHangul
-                                       ) {
-                                               # $tIndex = utf8ToCodepoint( $c ) - UNICODE_HANGUL_TBASE;
-                                               $tIndex = ord( $c[2] ) - 0xa7;
-                                               if ( $tIndex < 0 ) $tIndex = ord( $c[2] ) - 0x80 + ( 0x11c0 - 0x11a7 );
-
-                                               # Increment the code point by $tIndex, without
-                                               # the function overhead of decoding and recoding UTF-8
-                                               #
-                                               $tail = ord( $startChar[2] ) + $tIndex;
-                                               if ( $tail > 0xbf ) {
-                                                       $tail -= 0x40;
-                                                       $mid = ord( $startChar[1] ) + 1;
-                                                       if ( $mid > 0xbf ) {
-                                                               $startChar[0] = chr( ord( $startChar[0] ) + 1 );
-                                                               $mid -= 0x40;
-                                                       }
-                                                       $startChar[1] = chr( $mid );
-                                               }
-                                               $startChar[2] = chr( $tail );
-
-                                               # If there's another jamo char after this, *don't* try to merge it.
-                                               $lastHangul = 1;
-                                               continue;
-                                       }
-                               }
-                       }
-                       $out .= $startChar;
-                       $out .= $combining;
-                       $startChar = $c;
-                       $combining = '';
-                       $lastClass = 0;
-                       $lastHangul = 0;
-               }
-               $out .= $startChar . $combining;
-
-               return $out;
-       }
-
-       /**
-        * This is just used for the benchmark, comparing how long it takes to
-        * interate through a string without really doing anything of substance.
-        * @param $string string
-        * @return string
-        */
-       static function placebo( $string ) {
-               $len = strlen( $string );
-               $out = '';
-               for ( $i = 0; $i < $len; $i++ ) {
-                       $out .= $string[$i];
-               }
-
-               return $out;
-       }
-
-       /**
-        * Function to replace some characters that we don't want
-        * but most of the native normalize functions keep.
-        *
-        * @param string $string The string
-        * @return String String with the character codes replaced.
-        */
-       private static function replaceForNativeNormalize( $string ) {
-               $string = preg_replace(
-                       '/[\x00-\x08\x0b\x0c\x0e-\x1f]/',
-                       UTF8_REPLACEMENT,
-                       $string );
-               $string = str_replace( UTF8_FFFE, UTF8_REPLACEMENT, $string );
-               $string = str_replace( UTF8_FFFF, UTF8_REPLACEMENT, $string );
-
-               return $string;
-       }
-}
diff --git a/includes/normal/UtfNormalBench.php b/includes/normal/UtfNormalBench.php
deleted file mode 100644 (file)
index bd2bc4e..0000000
+++ /dev/null
@@ -1,105 +0,0 @@
-<?php
-/**
- * Approximate benchmark for some basic operations.
- *
- * Copyright © 2004 Brion Vibber <brion@pobox.com>
- * https://www.mediawiki.org/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup UtfNormal
- */
-
-if ( PHP_SAPI != 'cli' ) {
-       die( "Run me from the command line please.\n" );
-}
-
-if ( isset( $_SERVER['argv'] ) && in_array( '--icu', $_SERVER['argv'] ) ) {
-       dl( 'php_utfnormal.so' );
-}
-
-require_once 'UtfNormalDefines.php';
-require_once 'UtfNormalUtil.php';
-require_once 'UtfNormal.php';
-
-define( 'BENCH_CYCLES', 5 );
-
-$testfiles = array(
-       'testdata/washington.txt' => 'English text',
-       'testdata/berlin.txt' => 'German text',
-       'testdata/bulgakov.txt' => 'Russian text',
-       'testdata/tokyo.txt' => 'Japanese text',
-       'testdata/young.txt' => 'Korean text'
-);
-$normalizer = new UtfNormal;
-UtfNormal::loadData();
-foreach ( $testfiles as $file => $desc ) {
-       benchmarkTest( $normalizer, $file, $desc );
-}
-
-# -------
-
-function benchmarkTest( &$u, $filename, $desc ) {
-       print "Testing $filename ($desc)...\n";
-       $data = file_get_contents( $filename );
-       $forms = array(
-#              'placebo',
-               'cleanUp',
-               'toNFC',
-#              'toNFKC',
-#              'toNFD', 'toNFKD',
-               'NFC',
-#              'NFKC',
-#              'NFD', 'NFKD',
-               array( 'fastDecompose', 'fastCombiningSort', 'fastCompose' ),
-#              'quickIsNFC', 'quickIsNFCVerify',
-       );
-
-       foreach ( $forms as $form ) {
-               if ( is_array( $form ) ) {
-                       $str = $data;
-                       foreach ( $form as $step ) {
-                               $str = benchmarkForm( $u, $str, $step );
-                       }
-               } else {
-                       benchmarkForm( $u, $data, $form );
-               }
-       }
-}
-
-function benchmarkForm( &$u, &$data, $form ) {
-       #$start = microtime( true );
-       for ( $i = 0; $i < BENCH_CYCLES; $i++ ) {
-               $start = microtime( true );
-               $out = $u->$form( $data, UtfNormal::$utfCanonicalDecomp );
-               $deltas[] = ( microtime( true ) - $start );
-       }
-       #$delta = (microtime( true ) - $start) / BENCH_CYCLES;
-       sort( $deltas );
-       $delta = $deltas[0]; # Take shortest time
-
-       $rate = intval( strlen( $data ) / $delta );
-       $same = ( 0 == strcmp( $data, $out ) );
-
-       printf( " %20s %6.1fms %12s bytes/s (%s)\n",
-               $form,
-               $delta * 1000.0,
-               number_format( $rate ),
-               ( $same ? 'no change' : 'changed' ) );
-
-       return $out;
-}
diff --git a/includes/normal/UtfNormalData.inc b/includes/normal/UtfNormalData.inc
deleted file mode 100644 (file)
index 5755f6b..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-<?php
-/**
- * This file was automatically generated -- do not edit!
- * Run UtfNormalGenerate.php to create this file again (make clean && make)
- *
- * @file
- */
-// @codingStandardsIgnoreFile
-
-UtfNormal::$utfCombiningClass = unserialize( 'a:606:{s:2:"̀";i:230;s:2:"́";i:230;s:2:"̂";i:230;s:2:"̃";i:230;s:2:"̄";i:230;s:2:"̅";i:230;s:2:"̆";i:230;s:2:"̇";i:230;s:2:"̈";i:230;s:2:"̉";i:230;s:2:"̊";i:230;s:2:"̋";i:230;s:2:"̌";i:230;s:2:"̍";i:230;s:2:"̎";i:230;s:2:"̏";i:230;s:2:"̐";i:230;s:2:"̑";i:230;s:2:"̒";i:230;s:2:"̓";i:230;s:2:"̔";i:230;s:2:"̕";i:232;s:2:"̖";i:220;s:2:"̗";i:220;s:2:"̘";i:220;s:2:"̙";i:220;s:2:"̚";i:232;s:2:"̛";i:216;s:2:"̜";i:220;s:2:"̝";i:220;s:2:"̞";i:220;s:2:"̟";i:220;s:2:"̠";i:220;s:2:"̡";i:202;s:2:"̢";i:202;s:2:"̣";i:220;s:2:"̤";i:220;s:2:"̥";i:220;s:2:"̦";i:220;s:2:"̧";i:202;s:2:"̨";i:202;s:2:"̩";i:220;s:2:"̪";i:220;s:2:"̫";i:220;s:2:"̬";i:220;s:2:"̭";i:220;s:2:"̮";i:220;s:2:"̯";i:220;s:2:"̰";i:220;s:2:"̱";i:220;s:2:"̲";i:220;s:2:"̳";i:220;s:2:"̴";i:1;s:2:"̵";i:1;s:2:"̶";i:1;s:2:"̷";i:1;s:2:"̸";i:1;s:2:"̹";i:220;s:2:"̺";i:220;s:2:"̻";i:220;s:2:"̼";i:220;s:2:"̽";i:230;s:2:"̾";i:230;s:2:"̿";i:230;s:2:"̀";i:230;s:2:"́";i:230;s:2:"͂";i:230;s:2:"̓";i:230;s:2:"̈́";i:230;s:2:"ͅ";i:240;s:2:"͆";i:230;s:2:"͇";i:220;s:2:"͈";i:220;s:2:"͉";i:220;s:2:"͊";i:230;s:2:"͋";i:230;s:2:"͌";i:230;s:2:"͍";i:220;s:2:"͎";i:220;s:2:"͐";i:230;s:2:"͑";i:230;s:2:"͒";i:230;s:2:"͓";i:220;s:2:"͔";i:220;s:2:"͕";i:220;s:2:"͖";i:220;s:2:"͗";i:230;s:2:"͘";i:232;s:2:"͙";i:220;s:2:"͚";i:220;s:2:"͛";i:230;s:2:"͜";i:233;s:2:"͝";i:234;s:2:"͞";i:234;s:2:"͟";i:233;s:2:"͠";i:234;s:2:"͡";i:234;s:2:"͢";i:233;s:2:"ͣ";i:230;s:2:"ͤ";i:230;s:2:"ͥ";i:230;s:2:"ͦ";i:230;s:2:"ͧ";i:230;s:2:"ͨ";i:230;s:2:"ͩ";i:230;s:2:"ͪ";i:230;s:2:"ͫ";i:230;s:2:"ͬ";i:230;s:2:"ͭ";i:230;s:2:"ͮ";i:230;s:2:"ͯ";i:230;s:2:"҃";i:230;s:2:"҄";i:230;s:2:"҅";i:230;s:2:"҆";i:230;s:2:"҇";i:230;s:2:"֑";i:220;s:2:"֒";i:230;s:2:"֓";i:230;s:2:"֔";i:230;s:2:"֕";i:230;s:2:"֖";i:220;s:2:"֗";i:230;s:2:"֘";i:230;s:2:"֙";i:230;s:2:"֚";i:222;s:2:"֛";i:220;s:2:"֜";i:230;s:2:"֝";i:230;s:2:"֞";i:230;s:2:"֟";i:230;s:2:"֠";i:230;s:2:"֡";i:230;s:2:"֢";i:220;s:2:"֣";i:220;s:2:"֤";i:220;s:2:"֥";i:220;s:2:"֦";i:220;s:2:"֧";i:220;s:2:"֨";i:230;s:2:"֩";i:230;s:2:"֪";i:220;s:2:"֫";i:230;s:2:"֬";i:230;s:2:"֭";i:222;s:2:"֮";i:228;s:2:"֯";i:230;s:2:"ְ";i:10;s:2:"ֱ";i:11;s:2:"ֲ";i:12;s:2:"ֳ";i:13;s:2:"ִ";i:14;s:2:"ֵ";i:15;s:2:"ֶ";i:16;s:2:"ַ";i:17;s:2:"ָ";i:18;s:2:"ֹ";i:19;s:2:"ֺ";i:19;s:2:"ֻ";i:20;s:2:"ּ";i:21;s:2:"ֽ";i:22;s:2:"ֿ";i:23;s:2:"ׁ";i:24;s:2:"ׂ";i:25;s:2:"ׄ";i:230;s:2:"ׅ";i:220;s:2:"ׇ";i:18;s:2:"ؐ";i:230;s:2:"ؑ";i:230;s:2:"ؒ";i:230;s:2:"ؓ";i:230;s:2:"ؔ";i:230;s:2:"ؕ";i:230;s:2:"ؖ";i:230;s:2:"ؗ";i:230;s:2:"ؘ";i:30;s:2:"ؙ";i:31;s:2:"ؚ";i:32;s:2:"ً";i:27;s:2:"ٌ";i:28;s:2:"ٍ";i:29;s:2:"َ";i:30;s:2:"ُ";i:31;s:2:"ِ";i:32;s:2:"ّ";i:33;s:2:"ْ";i:34;s:2:"ٓ";i:230;s:2:"ٔ";i:230;s:2:"ٕ";i:220;s:2:"ٖ";i:220;s:2:"ٗ";i:230;s:2:"٘";i:230;s:2:"ٙ";i:230;s:2:"ٚ";i:230;s:2:"ٛ";i:230;s:2:"ٜ";i:220;s:2:"ٝ";i:230;s:2:"ٞ";i:230;s:2:"ٟ";i:220;s:2:"ٰ";i:35;s:2:"ۖ";i:230;s:2:"ۗ";i:230;s:2:"ۘ";i:230;s:2:"ۙ";i:230;s:2:"ۚ";i:230;s:2:"ۛ";i:230;s:2:"ۜ";i:230;s:2:"۟";i:230;s:2:"۠";i:230;s:2:"ۡ";i:230;s:2:"ۢ";i:230;s:2:"ۣ";i:220;s:2:"ۤ";i:230;s:2:"ۧ";i:230;s:2:"ۨ";i:230;s:2:"۪";i:220;s:2:"۫";i:230;s:2:"۬";i:230;s:2:"ۭ";i:220;s:2:"ܑ";i:36;s:2:"ܰ";i:230;s:2:"ܱ";i:220;s:2:"ܲ";i:230;s:2:"ܳ";i:230;s:2:"ܴ";i:220;s:2:"ܵ";i:230;s:2:"ܶ";i:230;s:2:"ܷ";i:220;s:2:"ܸ";i:220;s:2:"ܹ";i:220;s:2:"ܺ";i:230;s:2:"ܻ";i:220;s:2:"ܼ";i:220;s:2:"ܽ";i:230;s:2:"ܾ";i:220;s:2:"ܿ";i:230;s:2:"݀";i:230;s:2:"݁";i:230;s:2:"݂";i:220;s:2:"݃";i:230;s:2:"݄";i:220;s:2:"݅";i:230;s:2:"݆";i:220;s:2:"݇";i:230;s:2:"݈";i:220;s:2:"݉";i:230;s:2:"݊";i:230;s:2:"߫";i:230;s:2:"߬";i:230;s:2:"߭";i:230;s:2:"߮";i:230;s:2:"߯";i:230;s:2:"߰";i:230;s:2:"߱";i:230;s:2:"߲";i:220;s:2:"߳";i:230;s:3:"ࠖ";i:230;s:3:"ࠗ";i:230;s:3:"࠘";i:230;s:3:"࠙";i:230;s:3:"ࠛ";i:230;s:3:"ࠜ";i:230;s:3:"ࠝ";i:230;s:3:"ࠞ";i:230;s:3:"ࠟ";i:230;s:3:"ࠠ";i:230;s:3:"ࠡ";i:230;s:3:"ࠢ";i:230;s:3:"ࠣ";i:230;s:3:"ࠥ";i:230;s:3:"ࠦ";i:230;s:3:"ࠧ";i:230;s:3:"ࠩ";i:230;s:3:"ࠪ";i:230;s:3:"ࠫ";i:230;s:3:"ࠬ";i:230;s:3:"࠭";i:230;s:3:"࡙";i:220;s:3:"࡚";i:220;s:3:"࡛";i:220;s:3:"़";i:7;s:3:"्";i:9;s:3:"॑";i:230;s:3:"॒";i:220;s:3:"॓";i:230;s:3:"॔";i:230;s:3:"়";i:7;s:3:"্";i:9;s:3:"਼";i:7;s:3:"੍";i:9;s:3:"઼";i:7;s:3:"્";i:9;s:3:"଼";i:7;s:3:"୍";i:9;s:3:"்";i:9;s:3:"్";i:9;s:3:"ౕ";i:84;s:3:"ౖ";i:91;s:3:"಼";i:7;s:3:"್";i:9;s:3:"്";i:9;s:3:"්";i:9;s:3:"ุ";i:103;s:3:"ู";i:103;s:3:"ฺ";i:9;s:3:"่";i:107;s:3:"้";i:107;s:3:"๊";i:107;s:3:"๋";i:107;s:3:"ຸ";i:118;s:3:"ູ";i:118;s:3:"່";i:122;s:3:"້";i:122;s:3:"໊";i:122;s:3:"໋";i:122;s:3:"༘";i:220;s:3:"༙";i:220;s:3:"༵";i:220;s:3:"༷";i:220;s:3:"༹";i:216;s:3:"ཱ";i:129;s:3:"ི";i:130;s:3:"ུ";i:132;s:3:"ེ";i:130;s:3:"ཻ";i:130;s:3:"ོ";i:130;s:3:"ཽ";i:130;s:3:"ྀ";i:130;s:3:"ྂ";i:230;s:3:"ྃ";i:230;s:3:"྄";i:9;s:3:"྆";i:230;s:3:"྇";i:230;s:3:"࿆";i:220;s:3:"့";i:7;s:3:"္";i:9;s:3:"်";i:9;s:3:"ႍ";i:220;s:3:"፝";i:230;s:3:"፞";i:230;s:3:"፟";i:230;s:3:"᜔";i:9;s:3:"᜴";i:9;s:3:"្";i:9;s:3:"៝";i:230;s:3:"ᢩ";i:228;s:3:"᤹";i:222;s:3:"᤺";i:230;s:3:"᤻";i:220;s:3:"ᨗ";i:230;s:3:"ᨘ";i:220;s:3:"᩠";i:9;s:3:"᩵";i:230;s:3:"᩶";i:230;s:3:"᩷";i:230;s:3:"᩸";i:230;s:3:"᩹";i:230;s:3:"᩺";i:230;s:3:"᩻";i:230;s:3:"᩼";i:230;s:3:"᩿";i:220;s:3:"᬴";i:7;s:3:"᭄";i:9;s:3:"᭫";i:230;s:3:"᭬";i:220;s:3:"᭭";i:230;s:3:"᭮";i:230;s:3:"᭯";i:230;s:3:"᭰";i:230;s:3:"᭱";i:230;s:3:"᭲";i:230;s:3:"᭳";i:230;s:3:"᮪";i:9;s:3:"᯦";i:7;s:3:"᯲";i:9;s:3:"᯳";i:9;s:3:"᰷";i:7;s:3:"᳐";i:230;s:3:"᳑";i:230;s:3:"᳒";i:230;s:3:"᳔";i:1;s:3:"᳕";i:220;s:3:"᳖";i:220;s:3:"᳗";i:220;s:3:"᳘";i:220;s:3:"᳙";i:220;s:3:"᳚";i:230;s:3:"᳛";i:230;s:3:"᳜";i:220;s:3:"᳝";i:220;s:3:"᳞";i:220;s:3:"᳟";i:220;s:3:"᳠";i:230;s:3:"᳢";i:1;s:3:"᳣";i:1;s:3:"᳤";i:1;s:3:"᳥";i:1;s:3:"᳦";i:1;s:3:"᳧";i:1;s:3:"᳨";i:1;s:3:"᳭";i:220;s:3:"᷀";i:230;s:3:"᷁";i:230;s:3:"᷂";i:220;s:3:"᷃";i:230;s:3:"᷄";i:230;s:3:"᷅";i:230;s:3:"᷆";i:230;s:3:"᷇";i:230;s:3:"᷈";i:230;s:3:"᷉";i:230;s:3:"᷊";i:220;s:3:"᷋";i:230;s:3:"᷌";i:230;s:3:"᷍";i:234;s:3:"᷎";i:214;s:3:"᷏";i:220;s:3:"᷐";i:202;s:3:"᷑";i:230;s:3:"᷒";i:230;s:3:"ᷓ";i:230;s:3:"ᷔ";i:230;s:3:"ᷕ";i:230;s:3:"ᷖ";i:230;s:3:"ᷗ";i:230;s:3:"ᷘ";i:230;s:3:"ᷙ";i:230;s:3:"ᷚ";i:230;s:3:"ᷛ";i:230;s:3:"ᷜ";i:230;s:3:"ᷝ";i:230;s:3:"ᷞ";i:230;s:3:"ᷟ";i:230;s:3:"ᷠ";i:230;s:3:"ᷡ";i:230;s:3:"ᷢ";i:230;s:3:"ᷣ";i:230;s:3:"ᷤ";i:230;s:3:"ᷥ";i:230;s:3:"ᷦ";i:230;s:3:"᷼";i:233;s:3:"᷽";i:220;s:3:"᷾";i:230;s:3:"᷿";i:220;s:3:"⃐";i:230;s:3:"⃑";i:230;s:3:"⃒";i:1;s:3:"⃓";i:1;s:3:"⃔";i:230;s:3:"⃕";i:230;s:3:"⃖";i:230;s:3:"⃗";i:230;s:3:"⃘";i:1;s:3:"⃙";i:1;s:3:"⃚";i:1;s:3:"⃛";i:230;s:3:"⃜";i:230;s:3:"⃡";i:230;s:3:"⃥";i:1;s:3:"⃦";i:1;s:3:"⃧";i:230;s:3:"⃨";i:220;s:3:"⃩";i:230;s:3:"⃪";i:1;s:3:"⃫";i:1;s:3:"⃬";i:220;s:3:"⃭";i:220;s:3:"⃮";i:220;s:3:"⃯";i:220;s:3:"⃰";i:230;s:3:"⳯";i:230;s:3:"⳰";i:230;s:3:"⳱";i:230;s:3:"⵿";i:9;s:3:"ⷠ";i:230;s:3:"ⷡ";i:230;s:3:"ⷢ";i:230;s:3:"ⷣ";i:230;s:3:"ⷤ";i:230;s:3:"ⷥ";i:230;s:3:"ⷦ";i:230;s:3:"ⷧ";i:230;s:3:"ⷨ";i:230;s:3:"ⷩ";i:230;s:3:"ⷪ";i:230;s:3:"ⷫ";i:230;s:3:"ⷬ";i:230;s:3:"ⷭ";i:230;s:3:"ⷮ";i:230;s:3:"ⷯ";i:230;s:3:"ⷰ";i:230;s:3:"ⷱ";i:230;s:3:"ⷲ";i:230;s:3:"ⷳ";i:230;s:3:"ⷴ";i:230;s:3:"ⷵ";i:230;s:3:"ⷶ";i:230;s:3:"ⷷ";i:230;s:3:"ⷸ";i:230;s:3:"ⷹ";i:230;s:3:"ⷺ";i:230;s:3:"ⷻ";i:230;s:3:"ⷼ";i:230;s:3:"ⷽ";i:230;s:3:"ⷾ";i:230;s:3:"ⷿ";i:230;s:3:"〪";i:218;s:3:"〫";i:228;s:3:"〬";i:232;s:3:"〭";i:222;s:3:"〮";i:224;s:3:"〯";i:224;s:3:"゙";i:8;s:3:"゚";i:8;s:3:"꙯";i:230;s:3:"꙼";i:230;s:3:"꙽";i:230;s:3:"꛰";i:230;s:3:"꛱";i:230;s:3:"꠆";i:9;s:3:"꣄";i:9;s:3:"꣠";i:230;s:3:"꣡";i:230;s:3:"꣢";i:230;s:3:"꣣";i:230;s:3:"꣤";i:230;s:3:"꣥";i:230;s:3:"꣦";i:230;s:3:"꣧";i:230;s:3:"꣨";i:230;s:3:"꣩";i:230;s:3:"꣪";i:230;s:3:"꣫";i:230;s:3:"꣬";i:230;s:3:"꣭";i:230;s:3:"꣮";i:230;s:3:"꣯";i:230;s:3:"꣰";i:230;s:3:"꣱";i:230;s:3:"꤫";i:220;s:3:"꤬";i:220;s:3:"꤭";i:220;s:3:"꥓";i:9;s:3:"꦳";i:7;s:3:"꧀";i:9;s:3:"ꪰ";i:230;s:3:"ꪲ";i:230;s:3:"ꪳ";i:230;s:3:"ꪴ";i:220;s:3:"ꪷ";i:230;s:3:"ꪸ";i:230;s:3:"ꪾ";i:230;s:3:"꪿";i:230;s:3:"꫁";i:230;s:3:"꯭";i:9;s:3:"ﬞ";i:26;s:3:"︠";i:230;s:3:"︡";i:230;s:3:"︢";i:230;s:3:"︣";i:230;s:3:"︤";i:230;s:3:"︥";i:230;s:3:"︦";i:230;s:4:"𐇽";i:220;s:4:"𐨍";i:220;s:4:"𐨏";i:230;s:4:"𐨸";i:230;s:4:"𐨹";i:1;s:4:"𐨺";i:220;s:4:"𐨿";i:9;s:4:"𑁆";i:9;s:4:"𑂹";i:9;s:4:"𑂺";i:7;s:4:"𝅥";i:216;s:4:"𝅦";i:216;s:4:"𝅧";i:1;s:4:"𝅨";i:1;s:4:"𝅩";i:1;s:4:"𝅭";i:226;s:4:"𝅮";i:216;s:4:"𝅯";i:216;s:4:"𝅰";i:216;s:4:"𝅱";i:216;s:4:"𝅲";i:216;s:4:"𝅻";i:220;s:4:"𝅼";i:220;s:4:"𝅽";i:220;s:4:"𝅾";i:220;s:4:"𝅿";i:220;s:4:"𝆀";i:220;s:4:"𝆁";i:220;s:4:"𝆂";i:220;s:4:"𝆅";i:230;s:4:"𝆆";i:230;s:4:"𝆇";i:230;s:4:"𝆈";i:230;s:4:"𝆉";i:230;s:4:"𝆊";i:220;s:4:"𝆋";i:220;s:4:"𝆪";i:230;s:4:"𝆫";i:230;s:4:"𝆬";i:230;s:4:"𝆭";i:230;s:4:"𝉂";i:230;s:4:"𝉃";i:230;s:4:"𝉄";i:230;}' );
-UtfNormal::$utfCanonicalComp = unserialize( 'a:1868:{s:3:"À";s:2:"À";s:3:"Á";s:2:"Á";s:3:"Â";s:2:"Â";s:3:"Ã";s:2:"Ã";s:3:"Ä";s:2:"Ä";s:3:"Å";s:2:"Å";s:3:"Ç";s:2:"Ç";s:3:"È";s:2:"È";s:3:"É";s:2:"É";s:3:"Ê";s:2:"Ê";s:3:"Ë";s:2:"Ë";s:3:"Ì";s:2:"Ì";s:3:"Í";s:2:"Í";s:3:"Î";s:2:"Î";s:3:"Ï";s:2:"Ï";s:3:"Ñ";s:2:"Ñ";s:3:"Ò";s:2:"Ò";s:3:"Ó";s:2:"Ó";s:3:"Ô";s:2:"Ô";s:3:"Õ";s:2:"Õ";s:3:"Ö";s:2:"Ö";s:3:"Ù";s:2:"Ù";s:3:"Ú";s:2:"Ú";s:3:"Û";s:2:"Û";s:3:"Ü";s:2:"Ü";s:3:"Ý";s:2:"Ý";s:3:"à";s:2:"à";s:3:"á";s:2:"á";s:3:"â";s:2:"â";s:3:"ã";s:2:"ã";s:3:"ä";s:2:"ä";s:3:"å";s:2:"å";s:3:"ç";s:2:"ç";s:3:"è";s:2:"è";s:3:"é";s:2:"é";s:3:"ê";s:2:"ê";s:3:"ë";s:2:"ë";s:3:"ì";s:2:"ì";s:3:"í";s:2:"í";s:3:"î";s:2:"î";s:3:"ï";s:2:"ï";s:3:"ñ";s:2:"ñ";s:3:"ò";s:2:"ò";s:3:"ó";s:2:"ó";s:3:"ô";s:2:"ô";s:3:"õ";s:2:"õ";s:3:"ö";s:2:"ö";s:3:"ù";s:2:"ù";s:3:"ú";s:2:"ú";s:3:"û";s:2:"û";s:3:"ü";s:2:"ü";s:3:"ý";s:2:"ý";s:3:"ÿ";s:2:"ÿ";s:3:"Ā";s:2:"Ā";s:3:"ā";s:2:"ā";s:3:"Ă";s:2:"Ă";s:3:"ă";s:2:"ă";s:3:"Ą";s:2:"Ą";s:3:"ą";s:2:"ą";s:3:"Ć";s:2:"Ć";s:3:"ć";s:2:"ć";s:3:"Ĉ";s:2:"Ĉ";s:3:"ĉ";s:2:"ĉ";s:3:"Ċ";s:2:"Ċ";s:3:"ċ";s:2:"ċ";s:3:"Č";s:2:"Č";s:3:"č";s:2:"č";s:3:"Ď";s:2:"Ď";s:3:"ď";s:2:"ď";s:3:"Ē";s:2:"Ē";s:3:"ē";s:2:"ē";s:3:"Ĕ";s:2:"Ĕ";s:3:"ĕ";s:2:"ĕ";s:3:"Ė";s:2:"Ė";s:3:"ė";s:2:"ė";s:3:"Ę";s:2:"Ę";s:3:"ę";s:2:"ę";s:3:"Ě";s:2:"Ě";s:3:"ě";s:2:"ě";s:3:"Ĝ";s:2:"Ĝ";s:3:"ĝ";s:2:"ĝ";s:3:"Ğ";s:2:"Ğ";s:3:"ğ";s:2:"ğ";s:3:"Ġ";s:2:"Ġ";s:3:"ġ";s:2:"ġ";s:3:"Ģ";s:2:"Ģ";s:3:"ģ";s:2:"ģ";s:3:"Ĥ";s:2:"Ĥ";s:3:"ĥ";s:2:"ĥ";s:3:"Ĩ";s:2:"Ĩ";s:3:"ĩ";s:2:"ĩ";s:3:"Ī";s:2:"Ī";s:3:"ī";s:2:"ī";s:3:"Ĭ";s:2:"Ĭ";s:3:"ĭ";s:2:"ĭ";s:3:"Į";s:2:"Į";s:3:"į";s:2:"į";s:3:"İ";s:2:"İ";s:3:"Ĵ";s:2:"Ĵ";s:3:"ĵ";s:2:"ĵ";s:3:"Ķ";s:2:"Ķ";s:3:"ķ";s:2:"ķ";s:3:"Ĺ";s:2:"Ĺ";s:3:"ĺ";s:2:"ĺ";s:3:"Ļ";s:2:"Ļ";s:3:"ļ";s:2:"ļ";s:3:"Ľ";s:2:"Ľ";s:3:"ľ";s:2:"ľ";s:3:"Ń";s:2:"Ń";s:3:"ń";s:2:"ń";s:3:"Ņ";s:2:"Ņ";s:3:"ņ";s:2:"ņ";s:3:"Ň";s:2:"Ň";s:3:"ň";s:2:"ň";s:3:"Ō";s:2:"Ō";s:3:"ō";s:2:"ō";s:3:"Ŏ";s:2:"Ŏ";s:3:"ŏ";s:2:"ŏ";s:3:"Ő";s:2:"Ő";s:3:"ő";s:2:"ő";s:3:"Ŕ";s:2:"Ŕ";s:3:"ŕ";s:2:"ŕ";s:3:"Ŗ";s:2:"Ŗ";s:3:"ŗ";s:2:"ŗ";s:3:"Ř";s:2:"Ř";s:3:"ř";s:2:"ř";s:3:"Ś";s:2:"Ś";s:3:"ś";s:2:"ś";s:3:"Ŝ";s:2:"Ŝ";s:3:"ŝ";s:2:"ŝ";s:3:"Ş";s:2:"Ş";s:3:"ş";s:2:"ş";s:3:"Š";s:2:"Š";s:3:"š";s:2:"š";s:3:"Ţ";s:2:"Ţ";s:3:"ţ";s:2:"ţ";s:3:"Ť";s:2:"Ť";s:3:"ť";s:2:"ť";s:3:"Ũ";s:2:"Ũ";s:3:"ũ";s:2:"ũ";s:3:"Ū";s:2:"Ū";s:3:"ū";s:2:"ū";s:3:"Ŭ";s:2:"Ŭ";s:3:"ŭ";s:2:"ŭ";s:3:"Ů";s:2:"Ů";s:3:"ů";s:2:"ů";s:3:"Ű";s:2:"Ű";s:3:"ű";s:2:"ű";s:3:"Ų";s:2:"Ų";s:3:"ų";s:2:"ų";s:3:"Ŵ";s:2:"Ŵ";s:3:"ŵ";s:2:"ŵ";s:3:"Ŷ";s:2:"Ŷ";s:3:"ŷ";s:2:"ŷ";s:3:"Ÿ";s:2:"Ÿ";s:3:"Ź";s:2:"Ź";s:3:"ź";s:2:"ź";s:3:"Ż";s:2:"Ż";s:3:"ż";s:2:"ż";s:3:"Ž";s:2:"Ž";s:3:"ž";s:2:"ž";s:3:"Ơ";s:2:"Ơ";s:3:"ơ";s:2:"ơ";s:3:"Ư";s:2:"Ư";s:3:"ư";s:2:"ư";s:3:"Ǎ";s:2:"Ǎ";s:3:"ǎ";s:2:"ǎ";s:3:"Ǐ";s:2:"Ǐ";s:3:"ǐ";s:2:"ǐ";s:3:"Ǒ";s:2:"Ǒ";s:3:"ǒ";s:2:"ǒ";s:3:"Ǔ";s:2:"Ǔ";s:3:"ǔ";s:2:"ǔ";s:4:"Ǖ";s:2:"Ǖ";s:4:"ǖ";s:2:"ǖ";s:4:"Ǘ";s:2:"Ǘ";s:4:"ǘ";s:2:"ǘ";s:4:"Ǚ";s:2:"Ǚ";s:4:"ǚ";s:2:"ǚ";s:4:"Ǜ";s:2:"Ǜ";s:4:"ǜ";s:2:"ǜ";s:4:"Ǟ";s:2:"Ǟ";s:4:"ǟ";s:2:"ǟ";s:4:"Ǡ";s:2:"Ǡ";s:4:"ǡ";s:2:"ǡ";s:4:"Ǣ";s:2:"Ǣ";s:4:"ǣ";s:2:"ǣ";s:3:"Ǧ";s:2:"Ǧ";s:3:"ǧ";s:2:"ǧ";s:3:"Ǩ";s:2:"Ǩ";s:3:"ǩ";s:2:"ǩ";s:3:"Ǫ";s:2:"Ǫ";s:3:"ǫ";s:2:"ǫ";s:4:"Ǭ";s:2:"Ǭ";s:4:"ǭ";s:2:"ǭ";s:4:"Ǯ";s:2:"Ǯ";s:4:"ǯ";s:2:"ǯ";s:3:"ǰ";s:2:"ǰ";s:3:"Ǵ";s:2:"Ǵ";s:3:"ǵ";s:2:"ǵ";s:3:"Ǹ";s:2:"Ǹ";s:3:"ǹ";s:2:"ǹ";s:4:"Ǻ";s:2:"Ǻ";s:4:"ǻ";s:2:"ǻ";s:4:"Ǽ";s:2:"Ǽ";s:4:"ǽ";s:2:"ǽ";s:4:"Ǿ";s:2:"Ǿ";s:4:"ǿ";s:2:"ǿ";s:3:"Ȁ";s:2:"Ȁ";s:3:"ȁ";s:2:"ȁ";s:3:"Ȃ";s:2:"Ȃ";s:3:"ȃ";s:2:"ȃ";s:3:"Ȅ";s:2:"Ȅ";s:3:"ȅ";s:2:"ȅ";s:3:"Ȇ";s:2:"Ȇ";s:3:"ȇ";s:2:"ȇ";s:3:"Ȉ";s:2:"Ȉ";s:3:"ȉ";s:2:"ȉ";s:3:"Ȋ";s:2:"Ȋ";s:3:"ȋ";s:2:"ȋ";s:3:"Ȍ";s:2:"Ȍ";s:3:"ȍ";s:2:"ȍ";s:3:"Ȏ";s:2:"Ȏ";s:3:"ȏ";s:2:"ȏ";s:3:"Ȑ";s:2:"Ȑ";s:3:"ȑ";s:2:"ȑ";s:3:"Ȓ";s:2:"Ȓ";s:3:"ȓ";s:2:"ȓ";s:3:"Ȕ";s:2:"Ȕ";s:3:"ȕ";s:2:"ȕ";s:3:"Ȗ";s:2:"Ȗ";s:3:"ȗ";s:2:"ȗ";s:3:"Ș";s:2:"Ș";s:3:"ș";s:2:"ș";s:3:"Ț";s:2:"Ț";s:3:"ț";s:2:"ț";s:3:"Ȟ";s:2:"Ȟ";s:3:"ȟ";s:2:"ȟ";s:3:"Ȧ";s:2:"Ȧ";s:3:"ȧ";s:2:"ȧ";s:3:"Ȩ";s:2:"Ȩ";s:3:"ȩ";s:2:"ȩ";s:4:"Ȫ";s:2:"Ȫ";s:4:"ȫ";s:2:"ȫ";s:4:"Ȭ";s:2:"Ȭ";s:4:"ȭ";s:2:"ȭ";s:3:"Ȯ";s:2:"Ȯ";s:3:"ȯ";s:2:"ȯ";s:4:"Ȱ";s:2:"Ȱ";s:4:"ȱ";s:2:"ȱ";s:3:"Ȳ";s:2:"Ȳ";s:3:"ȳ";s:2:"ȳ";s:2:"̀";s:2:"̀";s:2:"́";s:2:"́";s:2:"̓";s:2:"̓";s:4:"̈́";s:2:"̈́";s:2:"ʹ";s:2:"ʹ";s:1:";";s:2:";";s:4:"΅";s:2:"΅";s:4:"Ά";s:2:"Ά";s:2:"·";s:2:"·";s:4:"Έ";s:2:"Έ";s:4:"Ή";s:2:"Ή";s:4:"Ί";s:2:"Ί";s:4:"Ό";s:2:"Ό";s:4:"Ύ";s:2:"Ύ";s:4:"Ώ";s:2:"Ώ";s:4:"ΐ";s:2:"ΐ";s:4:"Ϊ";s:2:"Ϊ";s:4:"Ϋ";s:2:"Ϋ";s:4:"ά";s:2:"ά";s:4:"έ";s:2:"έ";s:4:"ή";s:2:"ή";s:4:"ί";s:2:"ί";s:4:"ΰ";s:2:"ΰ";s:4:"ϊ";s:2:"ϊ";s:4:"ϋ";s:2:"ϋ";s:4:"ό";s:2:"ό";s:4:"ύ";s:2:"ύ";s:4:"ώ";s:2:"ώ";s:4:"ϓ";s:2:"ϓ";s:4:"ϔ";s:2:"ϔ";s:4:"Ѐ";s:2:"Ѐ";s:4:"Ё";s:2:"Ё";s:4:"Ѓ";s:2:"Ѓ";s:4:"Ї";s:2:"Ї";s:4:"Ќ";s:2:"Ќ";s:4:"Ѝ";s:2:"Ѝ";s:4:"Ў";s:2:"Ў";s:4:"Й";s:2:"Й";s:4:"й";s:2:"й";s:4:"ѐ";s:2:"ѐ";s:4:"ё";s:2:"ё";s:4:"ѓ";s:2:"ѓ";s:4:"ї";s:2:"ї";s:4:"ќ";s:2:"ќ";s:4:"ѝ";s:2:"ѝ";s:4:"ў";s:2:"ў";s:4:"Ѷ";s:2:"Ѷ";s:4:"ѷ";s:2:"ѷ";s:4:"Ӂ";s:2:"Ӂ";s:4:"ӂ";s:2:"ӂ";s:4:"Ӑ";s:2:"Ӑ";s:4:"ӑ";s:2:"ӑ";s:4:"Ӓ";s:2:"Ӓ";s:4:"ӓ";s:2:"ӓ";s:4:"Ӗ";s:2:"Ӗ";s:4:"ӗ";s:2:"ӗ";s:4:"Ӛ";s:2:"Ӛ";s:4:"ӛ";s:2:"ӛ";s:4:"Ӝ";s:2:"Ӝ";s:4:"ӝ";s:2:"ӝ";s:4:"Ӟ";s:2:"Ӟ";s:4:"ӟ";s:2:"ӟ";s:4:"Ӣ";s:2:"Ӣ";s:4:"ӣ";s:2:"ӣ";s:4:"Ӥ";s:2:"Ӥ";s:4:"ӥ";s:2:"ӥ";s:4:"Ӧ";s:2:"Ӧ";s:4:"ӧ";s:2:"ӧ";s:4:"Ӫ";s:2:"Ӫ";s:4:"ӫ";s:2:"ӫ";s:4:"Ӭ";s:2:"Ӭ";s:4:"ӭ";s:2:"ӭ";s:4:"Ӯ";s:2:"Ӯ";s:4:"ӯ";s:2:"ӯ";s:4:"Ӱ";s:2:"Ӱ";s:4:"ӱ";s:2:"ӱ";s:4:"Ӳ";s:2:"Ӳ";s:4:"ӳ";s:2:"ӳ";s:4:"Ӵ";s:2:"Ӵ";s:4:"ӵ";s:2:"ӵ";s:4:"Ӹ";s:2:"Ӹ";s:4:"ӹ";s:2:"ӹ";s:4:"آ";s:2:"آ";s:4:"أ";s:2:"أ";s:4:"ؤ";s:2:"ؤ";s:4:"إ";s:2:"إ";s:4:"ئ";s:2:"ئ";s:4:"ۀ";s:2:"ۀ";s:4:"ۂ";s:2:"ۂ";s:4:"ۓ";s:2:"ۓ";s:6:"ऩ";s:3:"ऩ";s:6:"ऱ";s:3:"ऱ";s:6:"ऴ";s:3:"ऴ";s:6:"ো";s:3:"ো";s:6:"ৌ";s:3:"ৌ";s:6:"ୈ";s:3:"ୈ";s:6:"ୋ";s:3:"ୋ";s:6:"ୌ";s:3:"ୌ";s:6:"ஔ";s:3:"ஔ";s:6:"ொ";s:3:"ொ";s:6:"ோ";s:3:"ோ";s:6:"ௌ";s:3:"ௌ";s:6:"ై";s:3:"ై";s:6:"ೀ";s:3:"ೀ";s:6:"ೇ";s:3:"ೇ";s:6:"ೈ";s:3:"ೈ";s:6:"ೊ";s:3:"ೊ";s:6:"ೋ";s:3:"ೋ";s:6:"ൊ";s:3:"ൊ";s:6:"ോ";s:3:"ോ";s:6:"ൌ";s:3:"ൌ";s:6:"ේ";s:3:"ේ";s:6:"ො";s:3:"ො";s:6:"ෝ";s:3:"ෝ";s:6:"ෞ";s:3:"ෞ";s:6:"ཱི";s:3:"ཱི";s:6:"ཱུ";s:3:"ཱུ";s:6:"ཱྀ";s:3:"ཱྀ";s:6:"ဦ";s:3:"ဦ";s:6:"ᬆ";s:3:"ᬆ";s:6:"ᬈ";s:3:"ᬈ";s:6:"ᬊ";s:3:"ᬊ";s:6:"ᬌ";s:3:"ᬌ";s:6:"ᬎ";s:3:"ᬎ";s:6:"ᬒ";s:3:"ᬒ";s:6:"ᬻ";s:3:"ᬻ";s:6:"ᬽ";s:3:"ᬽ";s:6:"ᭀ";s:3:"ᭀ";s:6:"ᭁ";s:3:"ᭁ";s:6:"ᭃ";s:3:"ᭃ";s:3:"Ḁ";s:3:"Ḁ";s:3:"ḁ";s:3:"ḁ";s:3:"Ḃ";s:3:"Ḃ";s:3:"ḃ";s:3:"ḃ";s:3:"Ḅ";s:3:"Ḅ";s:3:"ḅ";s:3:"ḅ";s:3:"Ḇ";s:3:"Ḇ";s:3:"ḇ";s:3:"ḇ";s:4:"Ḉ";s:3:"Ḉ";s:4:"ḉ";s:3:"ḉ";s:3:"Ḋ";s:3:"Ḋ";s:3:"ḋ";s:3:"ḋ";s:3:"Ḍ";s:3:"Ḍ";s:3:"ḍ";s:3:"ḍ";s:3:"Ḏ";s:3:"Ḏ";s:3:"ḏ";s:3:"ḏ";s:3:"Ḑ";s:3:"Ḑ";s:3:"ḑ";s:3:"ḑ";s:3:"Ḓ";s:3:"Ḓ";s:3:"ḓ";s:3:"ḓ";s:4:"Ḕ";s:3:"Ḕ";s:4:"ḕ";s:3:"ḕ";s:4:"Ḗ";s:3:"Ḗ";s:4:"ḗ";s:3:"ḗ";s:3:"Ḙ";s:3:"Ḙ";s:3:"ḙ";s:3:"ḙ";s:3:"Ḛ";s:3:"Ḛ";s:3:"ḛ";s:3:"ḛ";s:4:"Ḝ";s:3:"Ḝ";s:4:"ḝ";s:3:"ḝ";s:3:"Ḟ";s:3:"Ḟ";s:3:"ḟ";s:3:"ḟ";s:3:"Ḡ";s:3:"Ḡ";s:3:"ḡ";s:3:"ḡ";s:3:"Ḣ";s:3:"Ḣ";s:3:"ḣ";s:3:"ḣ";s:3:"Ḥ";s:3:"Ḥ";s:3:"ḥ";s:3:"ḥ";s:3:"Ḧ";s:3:"Ḧ";s:3:"ḧ";s:3:"ḧ";s:3:"Ḩ";s:3:"Ḩ";s:3:"ḩ";s:3:"ḩ";s:3:"Ḫ";s:3:"Ḫ";s:3:"ḫ";s:3:"ḫ";s:3:"Ḭ";s:3:"Ḭ";s:3:"ḭ";s:3:"ḭ";s:4:"Ḯ";s:3:"Ḯ";s:4:"ḯ";s:3:"ḯ";s:3:"Ḱ";s:3:"Ḱ";s:3:"ḱ";s:3:"ḱ";s:3:"Ḳ";s:3:"Ḳ";s:3:"ḳ";s:3:"ḳ";s:3:"Ḵ";s:3:"Ḵ";s:3:"ḵ";s:3:"ḵ";s:3:"Ḷ";s:3:"Ḷ";s:3:"ḷ";s:3:"ḷ";s:5:"Ḹ";s:3:"Ḹ";s:5:"ḹ";s:3:"ḹ";s:3:"Ḻ";s:3:"Ḻ";s:3:"ḻ";s:3:"ḻ";s:3:"Ḽ";s:3:"Ḽ";s:3:"ḽ";s:3:"ḽ";s:3:"Ḿ";s:3:"Ḿ";s:3:"ḿ";s:3:"ḿ";s:3:"Ṁ";s:3:"Ṁ";s:3:"ṁ";s:3:"ṁ";s:3:"Ṃ";s:3:"Ṃ";s:3:"ṃ";s:3:"ṃ";s:3:"Ṅ";s:3:"Ṅ";s:3:"ṅ";s:3:"ṅ";s:3:"Ṇ";s:3:"Ṇ";s:3:"ṇ";s:3:"ṇ";s:3:"Ṉ";s:3:"Ṉ";s:3:"ṉ";s:3:"ṉ";s:3:"Ṋ";s:3:"Ṋ";s:3:"ṋ";s:3:"ṋ";s:4:"Ṍ";s:3:"Ṍ";s:4:"ṍ";s:3:"ṍ";s:4:"Ṏ";s:3:"Ṏ";s:4:"ṏ";s:3:"ṏ";s:4:"Ṑ";s:3:"Ṑ";s:4:"ṑ";s:3:"ṑ";s:4:"Ṓ";s:3:"Ṓ";s:4:"ṓ";s:3:"ṓ";s:3:"Ṕ";s:3:"Ṕ";s:3:"ṕ";s:3:"ṕ";s:3:"Ṗ";s:3:"Ṗ";s:3:"ṗ";s:3:"ṗ";s:3:"Ṙ";s:3:"Ṙ";s:3:"ṙ";s:3:"ṙ";s:3:"Ṛ";s:3:"Ṛ";s:3:"ṛ";s:3:"ṛ";s:5:"Ṝ";s:3:"Ṝ";s:5:"ṝ";s:3:"ṝ";s:3:"Ṟ";s:3:"Ṟ";s:3:"ṟ";s:3:"ṟ";s:3:"Ṡ";s:3:"Ṡ";s:3:"ṡ";s:3:"ṡ";s:3:"Ṣ";s:3:"Ṣ";s:3:"ṣ";s:3:"ṣ";s:4:"Ṥ";s:3:"Ṥ";s:4:"ṥ";s:3:"ṥ";s:4:"Ṧ";s:3:"Ṧ";s:4:"ṧ";s:3:"ṧ";s:5:"Ṩ";s:3:"Ṩ";s:5:"ṩ";s:3:"ṩ";s:3:"Ṫ";s:3:"Ṫ";s:3:"ṫ";s:3:"ṫ";s:3:"Ṭ";s:3:"Ṭ";s:3:"ṭ";s:3:"ṭ";s:3:"Ṯ";s:3:"Ṯ";s:3:"ṯ";s:3:"ṯ";s:3:"Ṱ";s:3:"Ṱ";s:3:"ṱ";s:3:"ṱ";s:3:"Ṳ";s:3:"Ṳ";s:3:"ṳ";s:3:"ṳ";s:3:"Ṵ";s:3:"Ṵ";s:3:"ṵ";s:3:"ṵ";s:3:"Ṷ";s:3:"Ṷ";s:3:"ṷ";s:3:"ṷ";s:4:"Ṹ";s:3:"Ṹ";s:4:"ṹ";s:3:"ṹ";s:4:"Ṻ";s:3:"Ṻ";s:4:"ṻ";s:3:"ṻ";s:3:"Ṽ";s:3:"Ṽ";s:3:"ṽ";s:3:"ṽ";s:3:"Ṿ";s:3:"Ṿ";s:3:"ṿ";s:3:"ṿ";s:3:"Ẁ";s:3:"Ẁ";s:3:"ẁ";s:3:"ẁ";s:3:"Ẃ";s:3:"Ẃ";s:3:"ẃ";s:3:"ẃ";s:3:"Ẅ";s:3:"Ẅ";s:3:"ẅ";s:3:"ẅ";s:3:"Ẇ";s:3:"Ẇ";s:3:"ẇ";s:3:"ẇ";s:3:"Ẉ";s:3:"Ẉ";s:3:"ẉ";s:3:"ẉ";s:3:"Ẋ";s:3:"Ẋ";s:3:"ẋ";s:3:"ẋ";s:3:"Ẍ";s:3:"Ẍ";s:3:"ẍ";s:3:"ẍ";s:3:"Ẏ";s:3:"Ẏ";s:3:"ẏ";s:3:"ẏ";s:3:"Ẑ";s:3:"Ẑ";s:3:"ẑ";s:3:"ẑ";s:3:"Ẓ";s:3:"Ẓ";s:3:"ẓ";s:3:"ẓ";s:3:"Ẕ";s:3:"Ẕ";s:3:"ẕ";s:3:"ẕ";s:3:"ẖ";s:3:"ẖ";s:3:"ẗ";s:3:"ẗ";s:3:"ẘ";s:3:"ẘ";s:3:"ẙ";s:3:"ẙ";s:4:"ẛ";s:3:"ẛ";s:3:"Ạ";s:3:"Ạ";s:3:"ạ";s:3:"ạ";s:3:"Ả";s:3:"Ả";s:3:"ả";s:3:"ả";s:4:"Ấ";s:3:"Ấ";s:4:"ấ";s:3:"ấ";s:4:"Ầ";s:3:"Ầ";s:4:"ầ";s:3:"ầ";s:4:"Ẩ";s:3:"Ẩ";s:4:"ẩ";s:3:"ẩ";s:4:"Ẫ";s:3:"Ẫ";s:4:"ẫ";s:3:"ẫ";s:5:"Ậ";s:3:"Ậ";s:5:"ậ";s:3:"ậ";s:4:"Ắ";s:3:"Ắ";s:4:"ắ";s:3:"ắ";s:4:"Ằ";s:3:"Ằ";s:4:"ằ";s:3:"ằ";s:4:"Ẳ";s:3:"Ẳ";s:4:"ẳ";s:3:"ẳ";s:4:"Ẵ";s:3:"Ẵ";s:4:"ẵ";s:3:"ẵ";s:5:"Ặ";s:3:"Ặ";s:5:"ặ";s:3:"ặ";s:3:"Ẹ";s:3:"Ẹ";s:3:"ẹ";s:3:"ẹ";s:3:"Ẻ";s:3:"Ẻ";s:3:"ẻ";s:3:"ẻ";s:3:"Ẽ";s:3:"Ẽ";s:3:"ẽ";s:3:"ẽ";s:4:"Ế";s:3:"Ế";s:4:"ế";s:3:"ế";s:4:"Ề";s:3:"Ề";s:4:"ề";s:3:"ề";s:4:"Ể";s:3:"Ể";s:4:"ể";s:3:"ể";s:4:"Ễ";s:3:"Ễ";s:4:"ễ";s:3:"ễ";s:5:"Ệ";s:3:"Ệ";s:5:"ệ";s:3:"ệ";s:3:"Ỉ";s:3:"Ỉ";s:3:"ỉ";s:3:"ỉ";s:3:"Ị";s:3:"Ị";s:3:"ị";s:3:"ị";s:3:"Ọ";s:3:"Ọ";s:3:"ọ";s:3:"ọ";s:3:"Ỏ";s:3:"Ỏ";s:3:"ỏ";s:3:"ỏ";s:4:"Ố";s:3:"Ố";s:4:"ố";s:3:"ố";s:4:"Ồ";s:3:"Ồ";s:4:"ồ";s:3:"ồ";s:4:"Ổ";s:3:"Ổ";s:4:"ổ";s:3:"ổ";s:4:"Ỗ";s:3:"Ỗ";s:4:"ỗ";s:3:"ỗ";s:5:"Ộ";s:3:"Ộ";s:5:"ộ";s:3:"ộ";s:4:"Ớ";s:3:"Ớ";s:4:"ớ";s:3:"ớ";s:4:"Ờ";s:3:"Ờ";s:4:"ờ";s:3:"ờ";s:4:"Ở";s:3:"Ở";s:4:"ở";s:3:"ở";s:4:"Ỡ";s:3:"Ỡ";s:4:"ỡ";s:3:"ỡ";s:4:"Ợ";s:3:"Ợ";s:4:"ợ";s:3:"ợ";s:3:"Ụ";s:3:"Ụ";s:3:"ụ";s:3:"ụ";s:3:"Ủ";s:3:"Ủ";s:3:"ủ";s:3:"ủ";s:4:"Ứ";s:3:"Ứ";s:4:"ứ";s:3:"ứ";s:4:"Ừ";s:3:"Ừ";s:4:"ừ";s:3:"ừ";s:4:"Ử";s:3:"Ử";s:4:"ử";s:3:"ử";s:4:"Ữ";s:3:"Ữ";s:4:"ữ";s:3:"ữ";s:4:"Ự";s:3:"Ự";s:4:"ự";s:3:"ự";s:3:"Ỳ";s:3:"Ỳ";s:3:"ỳ";s:3:"ỳ";s:3:"Ỵ";s:3:"Ỵ";s:3:"ỵ";s:3:"ỵ";s:3:"Ỷ";s:3:"Ỷ";s:3:"ỷ";s:3:"ỷ";s:3:"Ỹ";s:3:"Ỹ";s:3:"ỹ";s:3:"ỹ";s:4:"ἀ";s:3:"ἀ";s:4:"ἁ";s:3:"ἁ";s:5:"ἂ";s:3:"ἂ";s:5:"ἃ";s:3:"ἃ";s:5:"ἄ";s:3:"ἄ";s:5:"ἅ";s:3:"ἅ";s:5:"ἆ";s:3:"ἆ";s:5:"ἇ";s:3:"ἇ";s:4:"Ἀ";s:3:"Ἀ";s:4:"Ἁ";s:3:"Ἁ";s:5:"Ἂ";s:3:"Ἂ";s:5:"Ἃ";s:3:"Ἃ";s:5:"Ἄ";s:3:"Ἄ";s:5:"Ἅ";s:3:"Ἅ";s:5:"Ἆ";s:3:"Ἆ";s:5:"Ἇ";s:3:"Ἇ";s:4:"ἐ";s:3:"ἐ";s:4:"ἑ";s:3:"ἑ";s:5:"ἒ";s:3:"ἒ";s:5:"ἓ";s:3:"ἓ";s:5:"ἔ";s:3:"ἔ";s:5:"ἕ";s:3:"ἕ";s:4:"Ἐ";s:3:"Ἐ";s:4:"Ἑ";s:3:"Ἑ";s:5:"Ἒ";s:3:"Ἒ";s:5:"Ἓ";s:3:"Ἓ";s:5:"Ἔ";s:3:"Ἔ";s:5:"Ἕ";s:3:"Ἕ";s:4:"ἠ";s:3:"ἠ";s:4:"ἡ";s:3:"ἡ";s:5:"ἢ";s:3:"ἢ";s:5:"ἣ";s:3:"ἣ";s:5:"ἤ";s:3:"ἤ";s:5:"ἥ";s:3:"ἥ";s:5:"ἦ";s:3:"ἦ";s:5:"ἧ";s:3:"ἧ";s:4:"Ἠ";s:3:"Ἠ";s:4:"Ἡ";s:3:"Ἡ";s:5:"Ἢ";s:3:"Ἢ";s:5:"Ἣ";s:3:"Ἣ";s:5:"Ἤ";s:3:"Ἤ";s:5:"Ἥ";s:3:"Ἥ";s:5:"Ἦ";s:3:"Ἦ";s:5:"Ἧ";s:3:"Ἧ";s:4:"ἰ";s:3:"ἰ";s:4:"ἱ";s:3:"ἱ";s:5:"ἲ";s:3:"ἲ";s:5:"ἳ";s:3:"ἳ";s:5:"ἴ";s:3:"ἴ";s:5:"ἵ";s:3:"ἵ";s:5:"ἶ";s:3:"ἶ";s:5:"ἷ";s:3:"ἷ";s:4:"Ἰ";s:3:"Ἰ";s:4:"Ἱ";s:3:"Ἱ";s:5:"Ἲ";s:3:"Ἲ";s:5:"Ἳ";s:3:"Ἳ";s:5:"Ἴ";s:3:"Ἴ";s:5:"Ἵ";s:3:"Ἵ";s:5:"Ἶ";s:3:"Ἶ";s:5:"Ἷ";s:3:"Ἷ";s:4:"ὀ";s:3:"ὀ";s:4:"ὁ";s:3:"ὁ";s:5:"ὂ";s:3:"ὂ";s:5:"ὃ";s:3:"ὃ";s:5:"ὄ";s:3:"ὄ";s:5:"ὅ";s:3:"ὅ";s:4:"Ὀ";s:3:"Ὀ";s:4:"Ὁ";s:3:"Ὁ";s:5:"Ὂ";s:3:"Ὂ";s:5:"Ὃ";s:3:"Ὃ";s:5:"Ὄ";s:3:"Ὄ";s:5:"Ὅ";s:3:"Ὅ";s:4:"ὐ";s:3:"ὐ";s:4:"ὑ";s:3:"ὑ";s:5:"ὒ";s:3:"ὒ";s:5:"ὓ";s:3:"ὓ";s:5:"ὔ";s:3:"ὔ";s:5:"ὕ";s:3:"ὕ";s:5:"ὖ";s:3:"ὖ";s:5:"ὗ";s:3:"ὗ";s:4:"Ὑ";s:3:"Ὑ";s:5:"Ὓ";s:3:"Ὓ";s:5:"Ὕ";s:3:"Ὕ";s:5:"Ὗ";s:3:"Ὗ";s:4:"ὠ";s:3:"ὠ";s:4:"ὡ";s:3:"ὡ";s:5:"ὢ";s:3:"ὢ";s:5:"ὣ";s:3:"ὣ";s:5:"ὤ";s:3:"ὤ";s:5:"ὥ";s:3:"ὥ";s:5:"ὦ";s:3:"ὦ";s:5:"ὧ";s:3:"ὧ";s:4:"Ὠ";s:3:"Ὠ";s:4:"Ὡ";s:3:"Ὡ";s:5:"Ὢ";s:3:"Ὢ";s:5:"Ὣ";s:3:"Ὣ";s:5:"Ὤ";s:3:"Ὤ";s:5:"Ὥ";s:3:"Ὥ";s:5:"Ὦ";s:3:"Ὦ";s:5:"Ὧ";s:3:"Ὧ";s:4:"ὰ";s:3:"ὰ";s:2:"ά";s:3:"ά";s:4:"ὲ";s:3:"ὲ";s:2:"έ";s:3:"έ";s:4:"ὴ";s:3:"ὴ";s:2:"ή";s:3:"ή";s:4:"ὶ";s:3:"ὶ";s:2:"ί";s:3:"ί";s:4:"ὸ";s:3:"ὸ";s:2:"ό";s:3:"ό";s:4:"ὺ";s:3:"ὺ";s:2:"ύ";s:3:"ύ";s:4:"ὼ";s:3:"ὼ";s:2:"ώ";s:3:"ώ";s:5:"ᾀ";s:3:"ᾀ";s:5:"ᾁ";s:3:"ᾁ";s:5:"ᾂ";s:3:"ᾂ";s:5:"ᾃ";s:3:"ᾃ";s:5:"ᾄ";s:3:"ᾄ";s:5:"ᾅ";s:3:"ᾅ";s:5:"ᾆ";s:3:"ᾆ";s:5:"ᾇ";s:3:"ᾇ";s:5:"ᾈ";s:3:"ᾈ";s:5:"ᾉ";s:3:"ᾉ";s:5:"ᾊ";s:3:"ᾊ";s:5:"ᾋ";s:3:"ᾋ";s:5:"ᾌ";s:3:"ᾌ";s:5:"ᾍ";s:3:"ᾍ";s:5:"ᾎ";s:3:"ᾎ";s:5:"ᾏ";s:3:"ᾏ";s:5:"ᾐ";s:3:"ᾐ";s:5:"ᾑ";s:3:"ᾑ";s:5:"ᾒ";s:3:"ᾒ";s:5:"ᾓ";s:3:"ᾓ";s:5:"ᾔ";s:3:"ᾔ";s:5:"ᾕ";s:3:"ᾕ";s:5:"ᾖ";s:3:"ᾖ";s:5:"ᾗ";s:3:"ᾗ";s:5:"ᾘ";s:3:"ᾘ";s:5:"ᾙ";s:3:"ᾙ";s:5:"ᾚ";s:3:"ᾚ";s:5:"ᾛ";s:3:"ᾛ";s:5:"ᾜ";s:3:"ᾜ";s:5:"ᾝ";s:3:"ᾝ";s:5:"ᾞ";s:3:"ᾞ";s:5:"ᾟ";s:3:"ᾟ";s:5:"ᾠ";s:3:"ᾠ";s:5:"ᾡ";s:3:"ᾡ";s:5:"ᾢ";s:3:"ᾢ";s:5:"ᾣ";s:3:"ᾣ";s:5:"ᾤ";s:3:"ᾤ";s:5:"ᾥ";s:3:"ᾥ";s:5:"ᾦ";s:3:"ᾦ";s:5:"ᾧ";s:3:"ᾧ";s:5:"ᾨ";s:3:"ᾨ";s:5:"ᾩ";s:3:"ᾩ";s:5:"ᾪ";s:3:"ᾪ";s:5:"ᾫ";s:3:"ᾫ";s:5:"ᾬ";s:3:"ᾬ";s:5:"ᾭ";s:3:"ᾭ";s:5:"ᾮ";s:3:"ᾮ";s:5:"ᾯ";s:3:"ᾯ";s:4:"ᾰ";s:3:"ᾰ";s:4:"ᾱ";s:3:"ᾱ";s:5:"ᾲ";s:3:"ᾲ";s:4:"ᾳ";s:3:"ᾳ";s:4:"ᾴ";s:3:"ᾴ";s:4:"ᾶ";s:3:"ᾶ";s:5:"ᾷ";s:3:"ᾷ";s:4:"Ᾰ";s:3:"Ᾰ";s:4:"Ᾱ";s:3:"Ᾱ";s:4:"Ὰ";s:3:"Ὰ";s:2:"Ά";s:3:"Ά";s:4:"ᾼ";s:3:"ᾼ";s:2:"ι";s:3:"ι";s:4:"῁";s:3:"῁";s:5:"ῂ";s:3:"ῂ";s:4:"ῃ";s:3:"ῃ";s:4:"ῄ";s:3:"ῄ";s:4:"ῆ";s:3:"ῆ";s:5:"ῇ";s:3:"ῇ";s:4:"Ὲ";s:3:"Ὲ";s:2:"Έ";s:3:"Έ";s:4:"Ὴ";s:3:"Ὴ";s:2:"Ή";s:3:"Ή";s:4:"ῌ";s:3:"ῌ";s:5:"῍";s:3:"῍";s:5:"῎";s:3:"῎";s:5:"῏";s:3:"῏";s:4:"ῐ";s:3:"ῐ";s:4:"ῑ";s:3:"ῑ";s:4:"ῒ";s:3:"ῒ";s:2:"ΐ";s:3:"ΐ";s:4:"ῖ";s:3:"ῖ";s:4:"ῗ";s:3:"ῗ";s:4:"Ῐ";s:3:"Ῐ";s:4:"Ῑ";s:3:"Ῑ";s:4:"Ὶ";s:3:"Ὶ";s:2:"Ί";s:3:"Ί";s:5:"῝";s:3:"῝";s:5:"῞";s:3:"῞";s:5:"῟";s:3:"῟";s:4:"ῠ";s:3:"ῠ";s:4:"ῡ";s:3:"ῡ";s:4:"ῢ";s:3:"ῢ";s:2:"ΰ";s:3:"ΰ";s:4:"ῤ";s:3:"ῤ";s:4:"ῥ";s:3:"ῥ";s:4:"ῦ";s:3:"ῦ";s:4:"ῧ";s:3:"ῧ";s:4:"Ῠ";s:3:"Ῠ";s:4:"Ῡ";s:3:"Ῡ";s:4:"Ὺ";s:3:"Ὺ";s:2:"Ύ";s:3:"Ύ";s:4:"Ῥ";s:3:"Ῥ";s:4:"῭";s:3:"῭";s:2:"΅";s:3:"΅";s:1:"`";s:3:"`";s:5:"ῲ";s:3:"ῲ";s:4:"ῳ";s:3:"ῳ";s:4:"ῴ";s:3:"ῴ";s:4:"ῶ";s:3:"ῶ";s:5:"ῷ";s:3:"ῷ";s:4:"Ὸ";s:3:"Ὸ";s:2:"Ό";s:3:"Ό";s:4:"Ὼ";s:3:"Ὼ";s:2:"Ώ";s:3:"Ώ";s:4:"ῼ";s:3:"ῼ";s:2:"´";s:3:"´";s:3:" ";s:3:" ";s:3:" ";s:3:" ";s:2:"Ω";s:3:"Ω";s:1:"K";s:3:"K";s:2:"Å";s:3:"Å";s:5:"↚";s:3:"↚";s:5:"↛";s:3:"↛";s:5:"↮";s:3:"↮";s:5:"⇍";s:3:"⇍";s:5:"⇎";s:3:"⇎";s:5:"⇏";s:3:"⇏";s:5:"∄";s:3:"∄";s:5:"∉";s:3:"∉";s:5:"∌";s:3:"∌";s:5:"∤";s:3:"∤";s:5:"∦";s:3:"∦";s:5:"≁";s:3:"≁";s:5:"≄";s:3:"≄";s:5:"≇";s:3:"≇";s:5:"≉";s:3:"≉";s:3:"≠";s:3:"≠";s:5:"≢";s:3:"≢";s:5:"≭";s:3:"≭";s:3:"≮";s:3:"≮";s:3:"≯";s:3:"≯";s:5:"≰";s:3:"≰";s:5:"≱";s:3:"≱";s:5:"≴";s:3:"≴";s:5:"≵";s:3:"≵";s:5:"≸";s:3:"≸";s:5:"≹";s:3:"≹";s:5:"⊀";s:3:"⊀";s:5:"⊁";s:3:"⊁";s:5:"⊄";s:3:"⊄";s:5:"⊅";s:3:"⊅";s:5:"⊈";s:3:"⊈";s:5:"⊉";s:3:"⊉";s:5:"⊬";s:3:"⊬";s:5:"⊭";s:3:"⊭";s:5:"⊮";s:3:"⊮";s:5:"⊯";s:3:"⊯";s:5:"⋠";s:3:"⋠";s:5:"⋡";s:3:"⋡";s:5:"⋢";s:3:"⋢";s:5:"⋣";s:3:"⋣";s:5:"⋪";s:3:"⋪";s:5:"⋫";s:3:"⋫";s:5:"⋬";s:3:"⋬";s:5:"⋭";s:3:"⋭";s:3:"〈";s:3:"〈";s:3:"〉";s:3:"〉";s:6:"が";s:3:"が";s:6:"ぎ";s:3:"ぎ";s:6:"ぐ";s:3:"ぐ";s:6:"げ";s:3:"げ";s:6:"ご";s:3:"ご";s:6:"ざ";s:3:"ざ";s:6:"じ";s:3:"じ";s:6:"ず";s:3:"ず";s:6:"ぜ";s:3:"ぜ";s:6:"ぞ";s:3:"ぞ";s:6:"だ";s:3:"だ";s:6:"ぢ";s:3:"ぢ";s:6:"づ";s:3:"づ";s:6:"で";s:3:"で";s:6:"ど";s:3:"ど";s:6:"ば";s:3:"ば";s:6:"ぱ";s:3:"ぱ";s:6:"び";s:3:"び";s:6:"ぴ";s:3:"ぴ";s:6:"ぶ";s:3:"ぶ";s:6:"ぷ";s:3:"ぷ";s:6:"べ";s:3:"べ";s:6:"ぺ";s:3:"ぺ";s:6:"ぼ";s:3:"ぼ";s:6:"ぽ";s:3:"ぽ";s:6:"ゔ";s:3:"ゔ";s:6:"ゞ";s:3:"ゞ";s:6:"ガ";s:3:"ガ";s:6:"ギ";s:3:"ギ";s:6:"グ";s:3:"グ";s:6:"ゲ";s:3:"ゲ";s:6:"ゴ";s:3:"ゴ";s:6:"ザ";s:3:"ザ";s:6:"ジ";s:3:"ジ";s:6:"ズ";s:3:"ズ";s:6:"ゼ";s:3:"ゼ";s:6:"ゾ";s:3:"ゾ";s:6:"ダ";s:3:"ダ";s:6:"ヂ";s:3:"ヂ";s:6:"ヅ";s:3:"ヅ";s:6:"デ";s:3:"デ";s:6:"ド";s:3:"ド";s:6:"バ";s:3:"バ";s:6:"パ";s:3:"パ";s:6:"ビ";s:3:"ビ";s:6:"ピ";s:3:"ピ";s:6:"ブ";s:3:"ブ";s:6:"プ";s:3:"プ";s:6:"ベ";s:3:"ベ";s:6:"ペ";s:3:"ペ";s:6:"ボ";s:3:"ボ";s:6:"ポ";s:3:"ポ";s:6:"ヴ";s:3:"ヴ";s:6:"ヷ";s:3:"ヷ";s:6:"ヸ";s:3:"ヸ";s:6:"ヹ";s:3:"ヹ";s:6:"ヺ";s:3:"ヺ";s:6:"ヾ";s:3:"ヾ";s:3:"豈";s:3:"豈";s:3:"更";s:3:"更";s:3:"車";s:3:"車";s:3:"賈";s:3:"賈";s:3:"滑";s:3:"滑";s:3:"串";s:3:"串";s:3:"句";s:3:"句";s:3:"龜";s:3:"龜";s:3:"契";s:3:"契";s:3:"金";s:3:"金";s:3:"喇";s:3:"喇";s:3:"奈";s:3:"奈";s:3:"懶";s:4:"懶";s:3:"癩";s:3:"癩";s:3:"羅";s:3:"羅";s:3:"蘿";s:3:"蘿";s:3:"螺";s:3:"螺";s:3:"裸";s:3:"裸";s:3:"邏";s:3:"邏";s:3:"樂";s:3:"樂";s:3:"洛";s:3:"洛";s:3:"烙";s:3:"烙";s:3:"珞";s:3:"珞";s:3:"落";s:3:"落";s:3:"酪";s:3:"酪";s:3:"駱";s:3:"駱";s:3:"亂";s:3:"亂";s:3:"卵";s:3:"卵";s:3:"欄";s:3:"欄";s:3:"爛";s:3:"爛";s:3:"蘭";s:3:"蘭";s:3:"鸞";s:3:"鸞";s:3:"嵐";s:3:"嵐";s:3:"濫";s:3:"濫";s:3:"藍";s:3:"藍";s:3:"襤";s:3:"襤";s:3:"拉";s:3:"拉";s:3:"臘";s:3:"臘";s:3:"蠟";s:3:"蠟";s:3:"廊";s:4:"廊";s:3:"朗";s:4:"朗";s:3:"浪";s:3:"浪";s:3:"狼";s:3:"狼";s:3:"郎";s:3:"郎";s:3:"來";s:3:"來";s:3:"冷";s:3:"冷";s:3:"勞";s:3:"勞";s:3:"擄";s:3:"擄";s:3:"櫓";s:3:"櫓";s:3:"爐";s:3:"爐";s:3:"盧";s:3:"盧";s:3:"老";s:3:"老";s:3:"蘆";s:3:"蘆";s:3:"虜";s:4:"虜";s:3:"路";s:3:"路";s:3:"露";s:3:"露";s:3:"魯";s:3:"魯";s:3:"鷺";s:3:"鷺";s:3:"碌";s:4:"碌";s:3:"祿";s:3:"祿";s:3:"綠";s:3:"綠";s:3:"菉";s:3:"菉";s:3:"錄";s:3:"錄";s:3:"鹿";s:3:"鹿";s:3:"論";s:3:"論";s:3:"壟";s:3:"壟";s:3:"弄";s:3:"弄";s:3:"籠";s:3:"籠";s:3:"聾";s:3:"聾";s:3:"牢";s:3:"牢";s:3:"磊";s:3:"磊";s:3:"賂";s:3:"賂";s:3:"雷";s:3:"雷";s:3:"壘";s:3:"壘";s:3:"屢";s:3:"屢";s:3:"樓";s:3:"樓";s:3:"淚";s:3:"淚";s:3:"漏";s:3:"漏";s:3:"累";s:3:"累";s:3:"縷";s:3:"縷";s:3:"陋";s:3:"陋";s:3:"勒";s:3:"勒";s:3:"肋";s:3:"肋";s:3:"凜";s:3:"凜";s:3:"凌";s:3:"凌";s:3:"稜";s:3:"稜";s:3:"綾";s:3:"綾";s:3:"菱";s:3:"菱";s:3:"陵";s:3:"陵";s:3:"讀";s:3:"讀";s:3:"拏";s:3:"拏";s:3:"諾";s:3:"諾";s:3:"丹";s:3:"丹";s:3:"寧";s:4:"寧";s:3:"怒";s:3:"怒";s:3:"率";s:3:"率";s:3:"異";s:4:"異";s:3:"北";s:4:"北";s:3:"磻";s:3:"磻";s:3:"便";s:3:"便";s:3:"復";s:3:"復";s:3:"不";s:3:"不";s:3:"泌";s:3:"泌";s:3:"數";s:3:"數";s:3:"索";s:3:"索";s:3:"參";s:3:"參";s:3:"塞";s:3:"塞";s:3:"省";s:3:"省";s:3:"葉";s:3:"葉";s:3:"說";s:3:"說";s:3:"殺";s:4:"殺";s:3:"辰";s:3:"辰";s:3:"沈";s:3:"沈";s:3:"拾";s:3:"拾";s:3:"若";s:4:"若";s:3:"掠";s:3:"掠";s:3:"略";s:3:"略";s:3:"亮";s:3:"亮";s:3:"兩";s:3:"兩";s:3:"凉";s:3:"凉";s:3:"梁";s:3:"梁";s:3:"糧";s:3:"糧";s:3:"良";s:3:"良";s:3:"諒";s:3:"諒";s:3:"量";s:3:"量";s:3:"勵";s:3:"勵";s:3:"呂";s:3:"呂";s:3:"女";s:3:"女";s:3:"廬";s:3:"廬";s:3:"旅";s:3:"旅";s:3:"濾";s:3:"濾";s:3:"礪";s:3:"礪";s:3:"閭";s:3:"閭";s:3:"驪";s:3:"驪";s:3:"麗";s:3:"麗";s:3:"黎";s:3:"黎";s:3:"力";s:3:"力";s:3:"曆";s:3:"曆";s:3:"歷";s:3:"歷";s:3:"轢";s:3:"轢";s:3:"年";s:3:"年";s:3:"憐";s:3:"憐";s:3:"戀";s:3:"戀";s:3:"撚";s:3:"撚";s:3:"漣";s:3:"漣";s:3:"煉";s:3:"煉";s:3:"璉";s:3:"璉";s:3:"秊";s:3:"秊";s:3:"練";s:3:"練";s:3:"聯";s:3:"聯";s:3:"輦";s:3:"輦";s:3:"蓮";s:3:"蓮";s:3:"連";s:3:"連";s:3:"鍊";s:3:"鍊";s:3:"列";s:3:"列";s:3:"劣";s:3:"劣";s:3:"咽";s:3:"咽";s:3:"烈";s:3:"烈";s:3:"裂";s:3:"裂";s:3:"廉";s:3:"廉";s:3:"念";s:3:"念";s:3:"捻";s:3:"捻";s:3:"殮";s:3:"殮";s:3:"簾";s:3:"簾";s:3:"獵";s:3:"獵";s:3:"令";s:3:"令";s:3:"囹";s:3:"囹";s:3:"嶺";s:3:"嶺";s:3:"怜";s:3:"怜";s:3:"玲";s:3:"玲";s:3:"瑩";s:3:"瑩";s:3:"羚";s:3:"羚";s:3:"聆";s:3:"聆";s:3:"鈴";s:3:"鈴";s:3:"零";s:3:"零";s:3:"靈";s:3:"靈";s:3:"領";s:3:"領";s:3:"例";s:3:"例";s:3:"禮";s:3:"禮";s:3:"醴";s:3:"醴";s:3:"隸";s:3:"隸";s:3:"惡";s:3:"惡";s:3:"了";s:3:"了";s:3:"僚";s:3:"僚";s:3:"寮";s:3:"寮";s:3:"尿";s:3:"尿";s:3:"料";s:3:"料";s:3:"燎";s:3:"燎";s:3:"療";s:3:"療";s:3:"蓼";s:3:"蓼";s:3:"遼";s:3:"遼";s:3:"龍";s:3:"龍";s:3:"暈";s:3:"暈";s:3:"阮";s:3:"阮";s:3:"劉";s:3:"劉";s:3:"杻";s:3:"杻";s:3:"柳";s:3:"柳";s:3:"流";s:4:"流";s:3:"溜";s:3:"溜";s:3:"琉";s:3:"琉";s:3:"留";s:3:"留";s:3:"硫";s:3:"硫";s:3:"紐";s:3:"紐";s:3:"類";s:3:"類";s:3:"六";s:3:"六";s:3:"戮";s:3:"戮";s:3:"陸";s:3:"陸";s:3:"倫";s:3:"倫";s:3:"崙";s:3:"崙";s:3:"淪";s:3:"淪";s:3:"輪";s:3:"輪";s:3:"律";s:3:"律";s:3:"慄";s:3:"慄";s:3:"栗";s:3:"栗";s:3:"隆";s:3:"隆";s:3:"利";s:3:"利";s:3:"吏";s:3:"吏";s:3:"履";s:3:"履";s:3:"易";s:3:"易";s:3:"李";s:3:"李";s:3:"梨";s:3:"梨";s:3:"泥";s:3:"泥";s:3:"理";s:3:"理";s:3:"痢";s:3:"痢";s:3:"罹";s:3:"罹";s:3:"裏";s:3:"裏";s:3:"裡";s:3:"裡";s:3:"里";s:3:"里";s:3:"離";s:3:"離";s:3:"匿";s:3:"匿";s:3:"溺";s:3:"溺";s:3:"吝";s:3:"吝";s:3:"燐";s:3:"燐";s:3:"璘";s:3:"璘";s:3:"藺";s:3:"藺";s:3:"隣";s:3:"隣";s:3:"鱗";s:3:"鱗";s:3:"麟";s:3:"麟";s:3:"林";s:3:"林";s:3:"淋";s:3:"淋";s:3:"臨";s:3:"臨";s:3:"立";s:3:"立";s:3:"笠";s:3:"笠";s:3:"粒";s:3:"粒";s:3:"狀";s:3:"狀";s:3:"炙";s:3:"炙";s:3:"識";s:3:"識";s:3:"什";s:3:"什";s:3:"茶";s:3:"茶";s:3:"刺";s:3:"刺";s:3:"切";s:4:"切";s:3:"度";s:3:"度";s:3:"拓";s:3:"拓";s:3:"糖";s:3:"糖";s:3:"宅";s:3:"宅";s:3:"洞";s:3:"洞";s:3:"暴";s:3:"暴";s:3:"輻";s:3:"輻";s:3:"行";s:3:"行";s:3:"降";s:3:"降";s:3:"見";s:3:"見";s:3:"廓";s:3:"廓";s:3:"兀";s:3:"兀";s:3:"嗀";s:3:"嗀";s:3:"塚";s:3:"塚";s:3:"晴";s:3:"晴";s:3:"凞";s:3:"凞";s:3:"猪";s:3:"猪";s:3:"益";s:3:"益";s:3:"礼";s:3:"礼";s:3:"神";s:3:"神";s:3:"祥";s:3:"祥";s:3:"福";s:4:"福";s:3:"靖";s:3:"靖";s:3:"精";s:3:"精";s:3:"羽";s:3:"羽";s:3:"蘒";s:3:"蘒";s:3:"諸";s:3:"諸";s:3:"逸";s:3:"逸";s:3:"都";s:3:"都";s:3:"飯";s:3:"飯";s:3:"飼";s:3:"飼";s:3:"館";s:3:"館";s:3:"鶴";s:3:"鶴";s:3:"侮";s:4:"侮";s:3:"僧";s:4:"僧";s:3:"免";s:4:"免";s:3:"勉";s:4:"勉";s:3:"勤";s:4:"勤";s:3:"卑";s:4:"卑";s:3:"喝";s:3:"喝";s:3:"嘆";s:4:"嘆";s:3:"器";s:3:"器";s:3:"塀";s:3:"塀";s:3:"墨";s:3:"墨";s:3:"層";s:3:"層";s:3:"屮";s:4:"屮";s:3:"悔";s:4:"悔";s:3:"慨";s:3:"慨";s:3:"憎";s:4:"憎";s:3:"懲";s:4:"懲";s:3:"敏";s:4:"敏";s:3:"既";s:3:"既";s:3:"暑";s:4:"暑";s:3:"梅";s:4:"梅";s:3:"海";s:4:"海";s:3:"渚";s:3:"渚";s:3:"漢";s:3:"漢";s:3:"煮";s:3:"煮";s:3:"爫";s:3:"爫";s:3:"琢";s:3:"琢";s:3:"碑";s:3:"碑";s:3:"社";s:3:"社";s:3:"祉";s:3:"祉";s:3:"祈";s:3:"祈";s:3:"祐";s:3:"祐";s:3:"祖";s:4:"祖";s:3:"祝";s:3:"祝";s:3:"禍";s:3:"禍";s:3:"禎";s:3:"禎";s:3:"穀";s:4:"穀";s:3:"突";s:3:"突";s:3:"節";s:3:"節";s:3:"縉";s:3:"縉";s:3:"繁";s:3:"繁";s:3:"署";s:3:"署";s:3:"者";s:4:"者";s:3:"臭";s:3:"臭";s:3:"艹";s:3:"艹";s:3:"著";s:4:"著";s:3:"褐";s:3:"褐";s:3:"視";s:3:"視";s:3:"謁";s:3:"謁";s:3:"謹";s:3:"謹";s:3:"賓";s:3:"賓";s:3:"贈";s:3:"贈";s:3:"辶";s:3:"辶";s:3:"難";s:3:"難";s:3:"響";s:3:"響";s:3:"頻";s:3:"頻";s:3:"恵";s:3:"恵";s:4:"𤋮";s:3:"𤋮";s:3:"舘";s:3:"舘";s:3:"並";s:3:"並";s:3:"况";s:4:"况";s:3:"全";s:3:"全";s:3:"侀";s:3:"侀";s:3:"充";s:3:"充";s:3:"冀";s:3:"冀";s:3:"勇";s:4:"勇";s:3:"勺";s:4:"勺";s:3:"啕";s:3:"啕";s:3:"喙";s:4:"喙";s:3:"嗢";s:3:"嗢";s:3:"墳";s:3:"墳";s:3:"奄";s:3:"奄";s:3:"奔";s:3:"奔";s:3:"婢";s:3:"婢";s:3:"嬨";s:3:"嬨";s:3:"廒";s:3:"廒";s:3:"廙";s:3:"廙";s:3:"彩";s:3:"彩";s:3:"徭";s:3:"徭";s:3:"惘";s:3:"惘";s:3:"慎";s:4:"慎";s:3:"愈";s:3:"愈";s:3:"慠";s:3:"慠";s:3:"戴";s:3:"戴";s:3:"揄";s:3:"揄";s:3:"搜";s:3:"搜";s:3:"摒";s:3:"摒";s:3:"敖";s:3:"敖";s:3:"望";s:4:"望";s:3:"杖";s:3:"杖";s:3:"歹";s:3:"歹";s:3:"滛";s:3:"滛";s:3:"滋";s:4:"滋";s:3:"瀞";s:4:"瀞";s:3:"瞧";s:3:"瞧";s:3:"爵";s:4:"爵";s:3:"犯";s:3:"犯";s:3:"瑱";s:4:"瑱";s:3:"甆";s:3:"甆";s:3:"画";s:3:"画";s:3:"瘝";s:3:"瘝";s:3:"瘟";s:3:"瘟";s:3:"盛";s:3:"盛";s:3:"直";s:4:"直";s:3:"睊";s:4:"睊";s:3:"着";s:3:"着";s:3:"磌";s:4:"磌";s:3:"窱";s:3:"窱";s:3:"类";s:3:"类";s:3:"絛";s:3:"絛";s:3:"缾";s:3:"缾";s:3:"荒";s:3:"荒";s:3:"華";s:3:"華";s:3:"蝹";s:4:"蝹";s:3:"襁";s:3:"襁";s:3:"覆";s:3:"覆";s:3:"調";s:3:"調";s:3:"請";s:3:"請";s:3:"諭";s:4:"諭";s:3:"變";s:4:"變";s:3:"輸";s:4:"輸";s:3:"遲";s:3:"遲";s:3:"醙";s:3:"醙";s:3:"鉶";s:3:"鉶";s:3:"陼";s:3:"陼";s:3:"韛";s:3:"韛";s:3:"頋";s:4:"頋";s:3:"鬒";s:4:"鬒";s:4:"𢡊";s:3:"𢡊";s:4:"𢡄";s:3:"𢡄";s:4:"𣏕";s:3:"𣏕";s:3:"㮝";s:4:"㮝";s:3:"䀘";s:3:"䀘";s:3:"䀹";s:4:"䀹";s:4:"𥉉";s:3:"𥉉";s:4:"𥳐";s:3:"𥳐";s:4:"𧻓";s:3:"𧻓";s:3:"齃";s:3:"齃";s:3:"龎";s:3:"龎";s:8:"𑂚";s:4:"𑂚";s:8:"𑂜";s:4:"𑂜";s:8:"𑂫";s:4:"𑂫";s:3:"丽";s:4:"丽";s:3:"丸";s:4:"丸";s:3:"乁";s:4:"乁";s:4:"𠄢";s:4:"𠄢";s:3:"你";s:4:"你";s:3:"侻";s:4:"侻";s:3:"倂";s:4:"倂";s:3:"偺";s:4:"偺";s:3:"備";s:4:"備";s:3:"像";s:4:"像";s:3:"㒞";s:4:"㒞";s:4:"𠘺";s:4:"𠘺";s:3:"兔";s:4:"兔";s:3:"兤";s:4:"兤";s:3:"具";s:4:"具";s:4:"𠔜";s:4:"𠔜";s:3:"㒹";s:4:"㒹";s:3:"內";s:4:"內";s:3:"再";s:4:"再";s:4:"𠕋";s:4:"𠕋";s:3:"冗";s:4:"冗";s:3:"冤";s:4:"冤";s:3:"仌";s:4:"仌";s:3:"冬";s:4:"冬";s:4:"𩇟";s:4:"𩇟";s:3:"凵";s:4:"凵";s:3:"刃";s:4:"刃";s:3:"㓟";s:4:"㓟";s:3:"刻";s:4:"刻";s:3:"剆";s:4:"剆";s:3:"割";s:4:"割";s:3:"剷";s:4:"剷";s:3:"㔕";s:4:"㔕";s:3:"包";s:4:"包";s:3:"匆";s:4:"匆";s:3:"卉";s:4:"卉";s:3:"博";s:4:"博";s:3:"即";s:4:"即";s:3:"卽";s:4:"卽";s:3:"卿";s:4:"卿";s:4:"𠨬";s:4:"𠨬";s:3:"灰";s:4:"灰";s:3:"及";s:4:"及";s:3:"叟";s:4:"叟";s:4:"𠭣";s:4:"𠭣";s:3:"叫";s:4:"叫";s:3:"叱";s:4:"叱";s:3:"吆";s:4:"吆";s:3:"咞";s:4:"咞";s:3:"吸";s:4:"吸";s:3:"呈";s:4:"呈";s:3:"周";s:4:"周";s:3:"咢";s:4:"咢";s:3:"哶";s:4:"哶";s:3:"唐";s:4:"唐";s:3:"啓";s:4:"啓";s:3:"啣";s:4:"啣";s:3:"善";s:4:"善";s:3:"喫";s:4:"喫";s:3:"喳";s:4:"喳";s:3:"嗂";s:4:"嗂";s:3:"圖";s:4:"圖";s:3:"圗";s:4:"圗";s:3:"噑";s:4:"噑";s:3:"噴";s:4:"噴";s:3:"壮";s:4:"壮";s:3:"城";s:4:"城";s:3:"埴";s:4:"埴";s:3:"堍";s:4:"堍";s:3:"型";s:4:"型";s:3:"堲";s:4:"堲";s:3:"報";s:4:"報";s:3:"墬";s:4:"墬";s:4:"𡓤";s:4:"𡓤";s:3:"売";s:4:"売";s:3:"壷";s:4:"壷";s:3:"夆";s:4:"夆";s:3:"多";s:4:"多";s:3:"夢";s:4:"夢";s:3:"奢";s:4:"奢";s:4:"𡚨";s:4:"𡚨";s:4:"𡛪";s:4:"𡛪";s:3:"姬";s:4:"姬";s:3:"娛";s:4:"娛";s:3:"娧";s:4:"娧";s:3:"姘";s:4:"姘";s:3:"婦";s:4:"婦";s:3:"㛮";s:4:"㛮";s:3:"㛼";s:4:"㛼";s:3:"嬈";s:4:"嬈";s:3:"嬾";s:4:"嬾";s:4:"𡧈";s:4:"𡧈";s:3:"寃";s:4:"寃";s:3:"寘";s:4:"寘";s:3:"寳";s:4:"寳";s:4:"𡬘";s:4:"𡬘";s:3:"寿";s:4:"寿";s:3:"将";s:4:"将";s:3:"当";s:4:"当";s:3:"尢";s:4:"尢";s:3:"㞁";s:4:"㞁";s:3:"屠";s:4:"屠";s:3:"峀";s:4:"峀";s:3:"岍";s:4:"岍";s:4:"𡷤";s:4:"𡷤";s:3:"嵃";s:4:"嵃";s:4:"𡷦";s:4:"𡷦";s:3:"嵮";s:4:"嵮";s:3:"嵫";s:4:"嵫";s:3:"嵼";s:4:"嵼";s:3:"巡";s:4:"巡";s:3:"巢";s:4:"巢";s:3:"㠯";s:4:"㠯";s:3:"巽";s:4:"巽";s:3:"帨";s:4:"帨";s:3:"帽";s:4:"帽";s:3:"幩";s:4:"幩";s:3:"㡢";s:4:"㡢";s:4:"𢆃";s:4:"𢆃";s:3:"㡼";s:4:"㡼";s:3:"庰";s:4:"庰";s:3:"庳";s:4:"庳";s:3:"庶";s:4:"庶";s:4:"𪎒";s:4:"𪎒";s:3:"廾";s:4:"廾";s:4:"𢌱";s:4:"𢌱";s:3:"舁";s:4:"舁";s:3:"弢";s:4:"弢";s:3:"㣇";s:4:"㣇";s:4:"𣊸";s:4:"𣊸";s:4:"𦇚";s:4:"𦇚";s:3:"形";s:4:"形";s:3:"彫";s:4:"彫";s:3:"㣣";s:4:"㣣";s:3:"徚";s:4:"徚";s:3:"忍";s:4:"忍";s:3:"志";s:4:"志";s:3:"忹";s:4:"忹";s:3:"悁";s:4:"悁";s:3:"㤺";s:4:"㤺";s:3:"㤜";s:4:"㤜";s:4:"𢛔";s:4:"𢛔";s:3:"惇";s:4:"惇";s:3:"慈";s:4:"慈";s:3:"慌";s:4:"慌";s:3:"慺";s:4:"慺";s:3:"憲";s:4:"憲";s:3:"憤";s:4:"憤";s:3:"憯";s:4:"憯";s:3:"懞";s:4:"懞";s:3:"成";s:4:"成";s:3:"戛";s:4:"戛";s:3:"扝";s:4:"扝";s:3:"抱";s:4:"抱";s:3:"拔";s:4:"拔";s:3:"捐";s:4:"捐";s:4:"𢬌";s:4:"𢬌";s:3:"挽";s:4:"挽";s:3:"拼";s:4:"拼";s:3:"捨";s:4:"捨";s:3:"掃";s:4:"掃";s:3:"揤";s:4:"揤";s:4:"𢯱";s:4:"𢯱";s:3:"搢";s:4:"搢";s:3:"揅";s:4:"揅";s:3:"掩";s:4:"掩";s:3:"㨮";s:4:"㨮";s:3:"摩";s:4:"摩";s:3:"摾";s:4:"摾";s:3:"撝";s:4:"撝";s:3:"摷";s:4:"摷";s:3:"㩬";s:4:"㩬";s:3:"敬";s:4:"敬";s:4:"𣀊";s:4:"𣀊";s:3:"旣";s:4:"旣";s:3:"書";s:4:"書";s:3:"晉";s:4:"晉";s:3:"㬙";s:4:"㬙";s:3:"㬈";s:4:"㬈";s:3:"㫤";s:4:"㫤";s:3:"冒";s:4:"冒";s:3:"冕";s:4:"冕";s:3:"最";s:4:"最";s:3:"暜";s:4:"暜";s:3:"肭";s:4:"肭";s:3:"䏙";s:4:"䏙";s:3:"朡";s:4:"朡";s:3:"杞";s:4:"杞";s:3:"杓";s:4:"杓";s:4:"𣏃";s:4:"𣏃";s:3:"㭉";s:4:"㭉";s:3:"柺";s:4:"柺";s:3:"枅";s:4:"枅";s:3:"桒";s:4:"桒";s:4:"𣑭";s:4:"𣑭";s:3:"梎";s:4:"梎";s:3:"栟";s:4:"栟";s:3:"椔";s:4:"椔";s:3:"楂";s:4:"楂";s:3:"榣";s:4:"榣";s:3:"槪";s:4:"槪";s:3:"檨";s:4:"檨";s:4:"𣚣";s:4:"𣚣";s:3:"櫛";s:4:"櫛";s:3:"㰘";s:4:"㰘";s:3:"次";s:4:"次";s:4:"𣢧";s:4:"𣢧";s:3:"歔";s:4:"歔";s:3:"㱎";s:4:"㱎";s:3:"歲";s:4:"歲";s:3:"殟";s:4:"殟";s:3:"殻";s:4:"殻";s:4:"𣪍";s:4:"𣪍";s:4:"𡴋";s:4:"𡴋";s:4:"𣫺";s:4:"𣫺";s:3:"汎";s:4:"汎";s:4:"𣲼";s:4:"𣲼";s:3:"沿";s:4:"沿";s:3:"泍";s:4:"泍";s:3:"汧";s:4:"汧";s:3:"洖";s:4:"洖";s:3:"派";s:4:"派";s:3:"浩";s:4:"浩";s:3:"浸";s:4:"浸";s:3:"涅";s:4:"涅";s:4:"𣴞";s:4:"𣴞";s:3:"洴";s:4:"洴";s:3:"港";s:4:"港";s:3:"湮";s:4:"湮";s:3:"㴳";s:4:"㴳";s:3:"滇";s:4:"滇";s:4:"𣻑";s:4:"𣻑";s:3:"淹";s:4:"淹";s:3:"潮";s:4:"潮";s:4:"𣽞";s:4:"𣽞";s:4:"𣾎";s:4:"𣾎";s:3:"濆";s:4:"濆";s:3:"瀹";s:4:"瀹";s:3:"瀛";s:4:"瀛";s:3:"㶖";s:4:"㶖";s:3:"灊";s:4:"灊";s:3:"災";s:4:"災";s:3:"灷";s:4:"灷";s:3:"炭";s:4:"炭";s:4:"𠔥";s:4:"𠔥";s:3:"煅";s:4:"煅";s:4:"𤉣";s:4:"𤉣";s:3:"熜";s:4:"熜";s:4:"𤎫";s:4:"𤎫";s:3:"爨";s:4:"爨";s:3:"牐";s:4:"牐";s:4:"𤘈";s:4:"𤘈";s:3:"犀";s:4:"犀";s:3:"犕";s:4:"犕";s:4:"𤜵";s:4:"𤜵";s:4:"𤠔";s:4:"𤠔";s:3:"獺";s:4:"獺";s:3:"王";s:4:"王";s:3:"㺬";s:4:"㺬";s:3:"玥";s:4:"玥";s:3:"㺸";s:4:"㺸";s:3:"瑇";s:4:"瑇";s:3:"瑜";s:4:"瑜";s:3:"璅";s:4:"璅";s:3:"瓊";s:4:"瓊";s:3:"㼛";s:4:"㼛";s:3:"甤";s:4:"甤";s:4:"𤰶";s:4:"𤰶";s:3:"甾";s:4:"甾";s:4:"𤲒";s:4:"𤲒";s:4:"𢆟";s:4:"𢆟";s:3:"瘐";s:4:"瘐";s:4:"𤾡";s:4:"𤾡";s:4:"𤾸";s:4:"𤾸";s:4:"𥁄";s:4:"𥁄";s:3:"㿼";s:4:"㿼";s:3:"䀈";s:4:"䀈";s:4:"𥃳";s:4:"𥃳";s:4:"𥃲";s:4:"𥃲";s:4:"𥄙";s:4:"𥄙";s:4:"𥄳";s:4:"𥄳";s:3:"眞";s:4:"眞";s:3:"真";s:4:"真";s:3:"瞋";s:4:"瞋";s:3:"䁆";s:4:"䁆";s:3:"䂖";s:4:"䂖";s:4:"𥐝";s:4:"𥐝";s:3:"硎";s:4:"硎";s:3:"䃣";s:4:"䃣";s:4:"𥘦";s:4:"𥘦";s:4:"𥚚";s:4:"𥚚";s:4:"𥛅";s:4:"𥛅";s:3:"秫";s:4:"秫";s:3:"䄯";s:4:"䄯";s:3:"穊";s:4:"穊";s:3:"穏";s:4:"穏";s:4:"𥥼";s:4:"𥥼";s:4:"𥪧";s:4:"𥪧";s:3:"竮";s:4:"竮";s:3:"䈂";s:4:"䈂";s:4:"𥮫";s:4:"𥮫";s:3:"篆";s:4:"篆";s:3:"築";s:4:"築";s:3:"䈧";s:4:"䈧";s:4:"𥲀";s:4:"𥲀";s:3:"糒";s:4:"糒";s:3:"䊠";s:4:"䊠";s:3:"糨";s:4:"糨";s:3:"糣";s:4:"糣";s:3:"紀";s:4:"紀";s:4:"𥾆";s:4:"𥾆";s:3:"絣";s:4:"絣";s:3:"䌁";s:4:"䌁";s:3:"緇";s:4:"緇";s:3:"縂";s:4:"縂";s:3:"繅";s:4:"繅";s:3:"䌴";s:4:"䌴";s:4:"𦈨";s:4:"𦈨";s:4:"𦉇";s:4:"𦉇";s:3:"䍙";s:4:"䍙";s:4:"𦋙";s:4:"𦋙";s:3:"罺";s:4:"罺";s:4:"𦌾";s:4:"𦌾";s:3:"羕";s:4:"羕";s:3:"翺";s:4:"翺";s:4:"𦓚";s:4:"𦓚";s:4:"𦔣";s:4:"𦔣";s:3:"聠";s:4:"聠";s:4:"𦖨";s:4:"𦖨";s:3:"聰";s:4:"聰";s:4:"𣍟";s:4:"𣍟";s:3:"䏕";s:4:"䏕";s:3:"育";s:4:"育";s:3:"脃";s:4:"脃";s:3:"䐋";s:4:"䐋";s:3:"脾";s:4:"脾";s:3:"媵";s:4:"媵";s:4:"𦞧";s:4:"𦞧";s:4:"𦞵";s:4:"𦞵";s:4:"𣎓";s:4:"𣎓";s:4:"𣎜";s:4:"𣎜";s:3:"舄";s:4:"舄";s:3:"辞";s:4:"辞";s:3:"䑫";s:4:"䑫";s:3:"芑";s:4:"芑";s:3:"芋";s:4:"芋";s:3:"芝";s:4:"芝";s:3:"劳";s:4:"劳";s:3:"花";s:4:"花";s:3:"芳";s:4:"芳";s:3:"芽";s:4:"芽";s:3:"苦";s:4:"苦";s:4:"𦬼";s:4:"𦬼";s:3:"茝";s:4:"茝";s:3:"荣";s:4:"荣";s:3:"莭";s:4:"莭";s:3:"茣";s:4:"茣";s:3:"莽";s:4:"莽";s:3:"菧";s:4:"菧";s:3:"荓";s:4:"荓";s:3:"菊";s:4:"菊";s:3:"菌";s:4:"菌";s:3:"菜";s:4:"菜";s:4:"𦰶";s:4:"𦰶";s:4:"𦵫";s:4:"𦵫";s:4:"𦳕";s:4:"𦳕";s:3:"䔫";s:4:"䔫";s:3:"蓱";s:4:"蓱";s:3:"蓳";s:4:"蓳";s:3:"蔖";s:4:"蔖";s:4:"𧏊";s:4:"𧏊";s:3:"蕤";s:4:"蕤";s:4:"𦼬";s:4:"𦼬";s:3:"䕝";s:4:"䕝";s:3:"䕡";s:4:"䕡";s:4:"𦾱";s:4:"𦾱";s:4:"𧃒";s:4:"𧃒";s:3:"䕫";s:4:"䕫";s:3:"虐";s:4:"虐";s:3:"虧";s:4:"虧";s:3:"虩";s:4:"虩";s:3:"蚩";s:4:"蚩";s:3:"蚈";s:4:"蚈";s:3:"蜎";s:4:"蜎";s:3:"蛢";s:4:"蛢";s:3:"蜨";s:4:"蜨";s:3:"蝫";s:4:"蝫";s:3:"螆";s:4:"螆";s:3:"䗗";s:4:"䗗";s:3:"蟡";s:4:"蟡";s:3:"蠁";s:4:"蠁";s:3:"䗹";s:4:"䗹";s:3:"衠";s:4:"衠";s:3:"衣";s:4:"衣";s:4:"𧙧";s:4:"𧙧";s:3:"裗";s:4:"裗";s:3:"裞";s:4:"裞";s:3:"䘵";s:4:"䘵";s:3:"裺";s:4:"裺";s:3:"㒻";s:4:"㒻";s:4:"𧢮";s:4:"𧢮";s:4:"𧥦";s:4:"𧥦";s:3:"䚾";s:4:"䚾";s:3:"䛇";s:4:"䛇";s:3:"誠";s:4:"誠";s:3:"豕";s:4:"豕";s:4:"𧲨";s:4:"𧲨";s:3:"貫";s:4:"貫";s:3:"賁";s:4:"賁";s:3:"贛";s:4:"贛";s:3:"起";s:4:"起";s:4:"𧼯";s:4:"𧼯";s:4:"𠠄";s:4:"𠠄";s:3:"跋";s:4:"跋";s:3:"趼";s:4:"趼";s:3:"跰";s:4:"跰";s:4:"𠣞";s:4:"𠣞";s:3:"軔";s:4:"軔";s:4:"𨗒";s:4:"𨗒";s:4:"𨗭";s:4:"𨗭";s:3:"邔";s:4:"邔";s:3:"郱";s:4:"郱";s:3:"鄑";s:4:"鄑";s:4:"𨜮";s:4:"𨜮";s:3:"鄛";s:4:"鄛";s:3:"鈸";s:4:"鈸";s:3:"鋗";s:4:"鋗";s:3:"鋘";s:4:"鋘";s:3:"鉼";s:4:"鉼";s:3:"鏹";s:4:"鏹";s:3:"鐕";s:4:"鐕";s:4:"𨯺";s:4:"𨯺";s:3:"開";s:4:"開";s:3:"䦕";s:4:"䦕";s:3:"閷";s:4:"閷";s:4:"𨵷";s:4:"𨵷";s:3:"䧦";s:4:"䧦";s:3:"雃";s:4:"雃";s:3:"嶲";s:4:"嶲";s:3:"霣";s:4:"霣";s:4:"𩅅";s:4:"𩅅";s:4:"𩈚";s:4:"𩈚";s:3:"䩮";s:4:"䩮";s:3:"䩶";s:4:"䩶";s:3:"韠";s:4:"韠";s:4:"𩐊";s:4:"𩐊";s:3:"䪲";s:4:"䪲";s:4:"𩒖";s:4:"𩒖";s:3:"頩";s:4:"頩";s:4:"𩖶";s:4:"𩖶";s:3:"飢";s:4:"飢";s:3:"䬳";s:4:"䬳";s:3:"餩";s:4:"餩";s:3:"馧";s:4:"馧";s:3:"駂";s:4:"駂";s:3:"駾";s:4:"駾";s:3:"䯎";s:4:"䯎";s:4:"𩬰";s:4:"𩬰";s:3:"鱀";s:4:"鱀";s:3:"鳽";s:4:"鳽";s:3:"䳎";s:4:"䳎";s:3:"䳭";s:4:"䳭";s:3:"鵧";s:4:"鵧";s:4:"𪃎";s:4:"𪃎";s:3:"䳸";s:4:"䳸";s:4:"𪄅";s:4:"𪄅";s:4:"𪈎";s:4:"𪈎";s:4:"𪊑";s:4:"𪊑";s:3:"麻";s:4:"麻";s:3:"䵖";s:4:"䵖";s:3:"黹";s:4:"黹";s:3:"黾";s:4:"黾";s:3:"鼅";s:4:"鼅";s:3:"鼏";s:4:"鼏";s:3:"鼖";s:4:"鼖";s:3:"鼻";s:4:"鼻";s:4:"𪘀";s:4:"𪘀";}' );
-UtfNormal::$utfCanonicalDecomp = unserialize( 'a:2049:{s:2:"À";s:3:"À";s:2:"Á";s:3:"Á";s:2:"Â";s:3:"Â";s:2:"Ã";s:3:"Ã";s:2:"Ä";s:3:"Ä";s:2:"Å";s:3:"Å";s:2:"Ç";s:3:"Ç";s:2:"È";s:3:"È";s:2:"É";s:3:"É";s:2:"Ê";s:3:"Ê";s:2:"Ë";s:3:"Ë";s:2:"Ì";s:3:"Ì";s:2:"Í";s:3:"Í";s:2:"Î";s:3:"Î";s:2:"Ï";s:3:"Ï";s:2:"Ñ";s:3:"Ñ";s:2:"Ò";s:3:"Ò";s:2:"Ó";s:3:"Ó";s:2:"Ô";s:3:"Ô";s:2:"Õ";s:3:"Õ";s:2:"Ö";s:3:"Ö";s:2:"Ù";s:3:"Ù";s:2:"Ú";s:3:"Ú";s:2:"Û";s:3:"Û";s:2:"Ü";s:3:"Ü";s:2:"Ý";s:3:"Ý";s:2:"à";s:3:"à";s:2:"á";s:3:"á";s:2:"â";s:3:"â";s:2:"ã";s:3:"ã";s:2:"ä";s:3:"ä";s:2:"å";s:3:"å";s:2:"ç";s:3:"ç";s:2:"è";s:3:"è";s:2:"é";s:3:"é";s:2:"ê";s:3:"ê";s:2:"ë";s:3:"ë";s:2:"ì";s:3:"ì";s:2:"í";s:3:"í";s:2:"î";s:3:"î";s:2:"ï";s:3:"ï";s:2:"ñ";s:3:"ñ";s:2:"ò";s:3:"ò";s:2:"ó";s:3:"ó";s:2:"ô";s:3:"ô";s:2:"õ";s:3:"õ";s:2:"ö";s:3:"ö";s:2:"ù";s:3:"ù";s:2:"ú";s:3:"ú";s:2:"û";s:3:"û";s:2:"ü";s:3:"ü";s:2:"ý";s:3:"ý";s:2:"ÿ";s:3:"ÿ";s:2:"Ā";s:3:"Ā";s:2:"ā";s:3:"ā";s:2:"Ă";s:3:"Ă";s:2:"ă";s:3:"ă";s:2:"Ą";s:3:"Ą";s:2:"ą";s:3:"ą";s:2:"Ć";s:3:"Ć";s:2:"ć";s:3:"ć";s:2:"Ĉ";s:3:"Ĉ";s:2:"ĉ";s:3:"ĉ";s:2:"Ċ";s:3:"Ċ";s:2:"ċ";s:3:"ċ";s:2:"Č";s:3:"Č";s:2:"č";s:3:"č";s:2:"Ď";s:3:"Ď";s:2:"ď";s:3:"ď";s:2:"Ē";s:3:"Ē";s:2:"ē";s:3:"ē";s:2:"Ĕ";s:3:"Ĕ";s:2:"ĕ";s:3:"ĕ";s:2:"Ė";s:3:"Ė";s:2:"ė";s:3:"ė";s:2:"Ę";s:3:"Ę";s:2:"ę";s:3:"ę";s:2:"Ě";s:3:"Ě";s:2:"ě";s:3:"ě";s:2:"Ĝ";s:3:"Ĝ";s:2:"ĝ";s:3:"ĝ";s:2:"Ğ";s:3:"Ğ";s:2:"ğ";s:3:"ğ";s:2:"Ġ";s:3:"Ġ";s:2:"ġ";s:3:"ġ";s:2:"Ģ";s:3:"Ģ";s:2:"ģ";s:3:"ģ";s:2:"Ĥ";s:3:"Ĥ";s:2:"ĥ";s:3:"ĥ";s:2:"Ĩ";s:3:"Ĩ";s:2:"ĩ";s:3:"ĩ";s:2:"Ī";s:3:"Ī";s:2:"ī";s:3:"ī";s:2:"Ĭ";s:3:"Ĭ";s:2:"ĭ";s:3:"ĭ";s:2:"Į";s:3:"Į";s:2:"į";s:3:"į";s:2:"İ";s:3:"İ";s:2:"Ĵ";s:3:"Ĵ";s:2:"ĵ";s:3:"ĵ";s:2:"Ķ";s:3:"Ķ";s:2:"ķ";s:3:"ķ";s:2:"Ĺ";s:3:"Ĺ";s:2:"ĺ";s:3:"ĺ";s:2:"Ļ";s:3:"Ļ";s:2:"ļ";s:3:"ļ";s:2:"Ľ";s:3:"Ľ";s:2:"ľ";s:3:"ľ";s:2:"Ń";s:3:"Ń";s:2:"ń";s:3:"ń";s:2:"Ņ";s:3:"Ņ";s:2:"ņ";s:3:"ņ";s:2:"Ň";s:3:"Ň";s:2:"ň";s:3:"ň";s:2:"Ō";s:3:"Ō";s:2:"ō";s:3:"ō";s:2:"Ŏ";s:3:"Ŏ";s:2:"ŏ";s:3:"ŏ";s:2:"Ő";s:3:"Ő";s:2:"ő";s:3:"ő";s:2:"Ŕ";s:3:"Ŕ";s:2:"ŕ";s:3:"ŕ";s:2:"Ŗ";s:3:"Ŗ";s:2:"ŗ";s:3:"ŗ";s:2:"Ř";s:3:"Ř";s:2:"ř";s:3:"ř";s:2:"Ś";s:3:"Ś";s:2:"ś";s:3:"ś";s:2:"Ŝ";s:3:"Ŝ";s:2:"ŝ";s:3:"ŝ";s:2:"Ş";s:3:"Ş";s:2:"ş";s:3:"ş";s:2:"Š";s:3:"Š";s:2:"š";s:3:"š";s:2:"Ţ";s:3:"Ţ";s:2:"ţ";s:3:"ţ";s:2:"Ť";s:3:"Ť";s:2:"ť";s:3:"ť";s:2:"Ũ";s:3:"Ũ";s:2:"ũ";s:3:"ũ";s:2:"Ū";s:3:"Ū";s:2:"ū";s:3:"ū";s:2:"Ŭ";s:3:"Ŭ";s:2:"ŭ";s:3:"ŭ";s:2:"Ů";s:3:"Ů";s:2:"ů";s:3:"ů";s:2:"Ű";s:3:"Ű";s:2:"ű";s:3:"ű";s:2:"Ų";s:3:"Ų";s:2:"ų";s:3:"ų";s:2:"Ŵ";s:3:"Ŵ";s:2:"ŵ";s:3:"ŵ";s:2:"Ŷ";s:3:"Ŷ";s:2:"ŷ";s:3:"ŷ";s:2:"Ÿ";s:3:"Ÿ";s:2:"Ź";s:3:"Ź";s:2:"ź";s:3:"ź";s:2:"Ż";s:3:"Ż";s:2:"ż";s:3:"ż";s:2:"Ž";s:3:"Ž";s:2:"ž";s:3:"ž";s:2:"Ơ";s:3:"Ơ";s:2:"ơ";s:3:"ơ";s:2:"Ư";s:3:"Ư";s:2:"ư";s:3:"ư";s:2:"Ǎ";s:3:"Ǎ";s:2:"ǎ";s:3:"ǎ";s:2:"Ǐ";s:3:"Ǐ";s:2:"ǐ";s:3:"ǐ";s:2:"Ǒ";s:3:"Ǒ";s:2:"ǒ";s:3:"ǒ";s:2:"Ǔ";s:3:"Ǔ";s:2:"ǔ";s:3:"ǔ";s:2:"Ǖ";s:5:"Ǖ";s:2:"ǖ";s:5:"ǖ";s:2:"Ǘ";s:5:"Ǘ";s:2:"ǘ";s:5:"ǘ";s:2:"Ǚ";s:5:"Ǚ";s:2:"ǚ";s:5:"ǚ";s:2:"Ǜ";s:5:"Ǜ";s:2:"ǜ";s:5:"ǜ";s:2:"Ǟ";s:5:"Ǟ";s:2:"ǟ";s:5:"ǟ";s:2:"Ǡ";s:5:"Ǡ";s:2:"ǡ";s:5:"ǡ";s:2:"Ǣ";s:4:"Ǣ";s:2:"ǣ";s:4:"ǣ";s:2:"Ǧ";s:3:"Ǧ";s:2:"ǧ";s:3:"ǧ";s:2:"Ǩ";s:3:"Ǩ";s:2:"ǩ";s:3:"ǩ";s:2:"Ǫ";s:3:"Ǫ";s:2:"ǫ";s:3:"ǫ";s:2:"Ǭ";s:5:"Ǭ";s:2:"ǭ";s:5:"ǭ";s:2:"Ǯ";s:4:"Ǯ";s:2:"ǯ";s:4:"ǯ";s:2:"ǰ";s:3:"ǰ";s:2:"Ǵ";s:3:"Ǵ";s:2:"ǵ";s:3:"ǵ";s:2:"Ǹ";s:3:"Ǹ";s:2:"ǹ";s:3:"ǹ";s:2:"Ǻ";s:5:"Ǻ";s:2:"ǻ";s:5:"ǻ";s:2:"Ǽ";s:4:"Ǽ";s:2:"ǽ";s:4:"ǽ";s:2:"Ǿ";s:4:"Ǿ";s:2:"ǿ";s:4:"ǿ";s:2:"Ȁ";s:3:"Ȁ";s:2:"ȁ";s:3:"ȁ";s:2:"Ȃ";s:3:"Ȃ";s:2:"ȃ";s:3:"ȃ";s:2:"Ȅ";s:3:"Ȅ";s:2:"ȅ";s:3:"ȅ";s:2:"Ȇ";s:3:"Ȇ";s:2:"ȇ";s:3:"ȇ";s:2:"Ȉ";s:3:"Ȉ";s:2:"ȉ";s:3:"ȉ";s:2:"Ȋ";s:3:"Ȋ";s:2:"ȋ";s:3:"ȋ";s:2:"Ȍ";s:3:"Ȍ";s:2:"ȍ";s:3:"ȍ";s:2:"Ȏ";s:3:"Ȏ";s:2:"ȏ";s:3:"ȏ";s:2:"Ȑ";s:3:"Ȑ";s:2:"ȑ";s:3:"ȑ";s:2:"Ȓ";s:3:"Ȓ";s:2:"ȓ";s:3:"ȓ";s:2:"Ȕ";s:3:"Ȕ";s:2:"ȕ";s:3:"ȕ";s:2:"Ȗ";s:3:"Ȗ";s:2:"ȗ";s:3:"ȗ";s:2:"Ș";s:3:"Ș";s:2:"ș";s:3:"ș";s:2:"Ț";s:3:"Ț";s:2:"ț";s:3:"ț";s:2:"Ȟ";s:3:"Ȟ";s:2:"ȟ";s:3:"ȟ";s:2:"Ȧ";s:3:"Ȧ";s:2:"ȧ";s:3:"ȧ";s:2:"Ȩ";s:3:"Ȩ";s:2:"ȩ";s:3:"ȩ";s:2:"Ȫ";s:5:"Ȫ";s:2:"ȫ";s:5:"ȫ";s:2:"Ȭ";s:5:"Ȭ";s:2:"ȭ";s:5:"ȭ";s:2:"Ȯ";s:3:"Ȯ";s:2:"ȯ";s:3:"ȯ";s:2:"Ȱ";s:5:"Ȱ";s:2:"ȱ";s:5:"ȱ";s:2:"Ȳ";s:3:"Ȳ";s:2:"ȳ";s:3:"ȳ";s:2:"̀";s:2:"̀";s:2:"́";s:2:"́";s:2:"̓";s:2:"̓";s:2:"̈́";s:4:"̈́";s:2:"ʹ";s:2:"ʹ";s:2:";";s:1:";";s:2:"΅";s:4:"΅";s:2:"Ά";s:4:"Ά";s:2:"·";s:2:"·";s:2:"Έ";s:4:"Έ";s:2:"Ή";s:4:"Ή";s:2:"Ί";s:4:"Ί";s:2:"Ό";s:4:"Ό";s:2:"Ύ";s:4:"Ύ";s:2:"Ώ";s:4:"Ώ";s:2:"ΐ";s:6:"ΐ";s:2:"Ϊ";s:4:"Ϊ";s:2:"Ϋ";s:4:"Ϋ";s:2:"ά";s:4:"ά";s:2:"έ";s:4:"έ";s:2:"ή";s:4:"ή";s:2:"ί";s:4:"ί";s:2:"ΰ";s:6:"ΰ";s:2:"ϊ";s:4:"ϊ";s:2:"ϋ";s:4:"ϋ";s:2:"ό";s:4:"ό";s:2:"ύ";s:4:"ύ";s:2:"ώ";s:4:"ώ";s:2:"ϓ";s:4:"ϓ";s:2:"ϔ";s:4:"ϔ";s:2:"Ѐ";s:4:"Ѐ";s:2:"Ё";s:4:"Ё";s:2:"Ѓ";s:4:"Ѓ";s:2:"Ї";s:4:"Ї";s:2:"Ќ";s:4:"Ќ";s:2:"Ѝ";s:4:"Ѝ";s:2:"Ў";s:4:"Ў";s:2:"Й";s:4:"Й";s:2:"й";s:4:"й";s:2:"ѐ";s:4:"ѐ";s:2:"ё";s:4:"ё";s:2:"ѓ";s:4:"ѓ";s:2:"ї";s:4:"ї";s:2:"ќ";s:4:"ќ";s:2:"ѝ";s:4:"ѝ";s:2:"ў";s:4:"ў";s:2:"Ѷ";s:4:"Ѷ";s:2:"ѷ";s:4:"ѷ";s:2:"Ӂ";s:4:"Ӂ";s:2:"ӂ";s:4:"ӂ";s:2:"Ӑ";s:4:"Ӑ";s:2:"ӑ";s:4:"ӑ";s:2:"Ӓ";s:4:"Ӓ";s:2:"ӓ";s:4:"ӓ";s:2:"Ӗ";s:4:"Ӗ";s:2:"ӗ";s:4:"ӗ";s:2:"Ӛ";s:4:"Ӛ";s:2:"ӛ";s:4:"ӛ";s:2:"Ӝ";s:4:"Ӝ";s:2:"ӝ";s:4:"ӝ";s:2:"Ӟ";s:4:"Ӟ";s:2:"ӟ";s:4:"ӟ";s:2:"Ӣ";s:4:"Ӣ";s:2:"ӣ";s:4:"ӣ";s:2:"Ӥ";s:4:"Ӥ";s:2:"ӥ";s:4:"ӥ";s:2:"Ӧ";s:4:"Ӧ";s:2:"ӧ";s:4:"ӧ";s:2:"Ӫ";s:4:"Ӫ";s:2:"ӫ";s:4:"ӫ";s:2:"Ӭ";s:4:"Ӭ";s:2:"ӭ";s:4:"ӭ";s:2:"Ӯ";s:4:"Ӯ";s:2:"ӯ";s:4:"ӯ";s:2:"Ӱ";s:4:"Ӱ";s:2:"ӱ";s:4:"ӱ";s:2:"Ӳ";s:4:"Ӳ";s:2:"ӳ";s:4:"ӳ";s:2:"Ӵ";s:4:"Ӵ";s:2:"ӵ";s:4:"ӵ";s:2:"Ӹ";s:4:"Ӹ";s:2:"ӹ";s:4:"ӹ";s:2:"آ";s:4:"آ";s:2:"أ";s:4:"أ";s:2:"ؤ";s:4:"ؤ";s:2:"إ";s:4:"إ";s:2:"ئ";s:4:"ئ";s:2:"ۀ";s:4:"ۀ";s:2:"ۂ";s:4:"ۂ";s:2:"ۓ";s:4:"ۓ";s:3:"ऩ";s:6:"ऩ";s:3:"ऱ";s:6:"ऱ";s:3:"ऴ";s:6:"ऴ";s:3:"क़";s:6:"क़";s:3:"ख़";s:6:"ख़";s:3:"ग़";s:6:"ग़";s:3:"ज़";s:6:"ज़";s:3:"ड़";s:6:"ड़";s:3:"ढ़";s:6:"ढ़";s:3:"फ़";s:6:"फ़";s:3:"य़";s:6:"य़";s:3:"ো";s:6:"ো";s:3:"ৌ";s:6:"ৌ";s:3:"ড়";s:6:"ড়";s:3:"ঢ়";s:6:"ঢ়";s:3:"য়";s:6:"য়";s:3:"ਲ਼";s:6:"ਲ਼";s:3:"ਸ਼";s:6:"ਸ਼";s:3:"ਖ਼";s:6:"ਖ਼";s:3:"ਗ਼";s:6:"ਗ਼";s:3:"ਜ਼";s:6:"ਜ਼";s:3:"ਫ਼";s:6:"ਫ਼";s:3:"ୈ";s:6:"ୈ";s:3:"ୋ";s:6:"ୋ";s:3:"ୌ";s:6:"ୌ";s:3:"ଡ଼";s:6:"ଡ଼";s:3:"ଢ଼";s:6:"ଢ଼";s:3:"ஔ";s:6:"ஔ";s:3:"ொ";s:6:"ொ";s:3:"ோ";s:6:"ோ";s:3:"ௌ";s:6:"ௌ";s:3:"ై";s:6:"ై";s:3:"ೀ";s:6:"ೀ";s:3:"ೇ";s:6:"ೇ";s:3:"ೈ";s:6:"ೈ";s:3:"ೊ";s:6:"ೊ";s:3:"ೋ";s:9:"ೋ";s:3:"ൊ";s:6:"ൊ";s:3:"ോ";s:6:"ോ";s:3:"ൌ";s:6:"ൌ";s:3:"ේ";s:6:"ේ";s:3:"ො";s:6:"ො";s:3:"ෝ";s:9:"ෝ";s:3:"ෞ";s:6:"ෞ";s:3:"གྷ";s:6:"གྷ";s:3:"ཌྷ";s:6:"ཌྷ";s:3:"དྷ";s:6:"དྷ";s:3:"བྷ";s:6:"བྷ";s:3:"ཛྷ";s:6:"ཛྷ";s:3:"ཀྵ";s:6:"ཀྵ";s:3:"ཱི";s:6:"ཱི";s:3:"ཱུ";s:6:"ཱུ";s:3:"ྲྀ";s:6:"ྲྀ";s:3:"ླྀ";s:6:"ླྀ";s:3:"ཱྀ";s:6:"ཱྀ";s:3:"ྒྷ";s:6:"ྒྷ";s:3:"ྜྷ";s:6:"ྜྷ";s:3:"ྡྷ";s:6:"ྡྷ";s:3:"ྦྷ";s:6:"ྦྷ";s:3:"ྫྷ";s:6:"ྫྷ";s:3:"ྐྵ";s:6:"ྐྵ";s:3:"ဦ";s:6:"ဦ";s:3:"ᬆ";s:6:"ᬆ";s:3:"ᬈ";s:6:"ᬈ";s:3:"ᬊ";s:6:"ᬊ";s:3:"ᬌ";s:6:"ᬌ";s:3:"ᬎ";s:6:"ᬎ";s:3:"ᬒ";s:6:"ᬒ";s:3:"ᬻ";s:6:"ᬻ";s:3:"ᬽ";s:6:"ᬽ";s:3:"ᭀ";s:6:"ᭀ";s:3:"ᭁ";s:6:"ᭁ";s:3:"ᭃ";s:6:"ᭃ";s:3:"Ḁ";s:3:"Ḁ";s:3:"ḁ";s:3:"ḁ";s:3:"Ḃ";s:3:"Ḃ";s:3:"ḃ";s:3:"ḃ";s:3:"Ḅ";s:3:"Ḅ";s:3:"ḅ";s:3:"ḅ";s:3:"Ḇ";s:3:"Ḇ";s:3:"ḇ";s:3:"ḇ";s:3:"Ḉ";s:5:"Ḉ";s:3:"ḉ";s:5:"ḉ";s:3:"Ḋ";s:3:"Ḋ";s:3:"ḋ";s:3:"ḋ";s:3:"Ḍ";s:3:"Ḍ";s:3:"ḍ";s:3:"ḍ";s:3:"Ḏ";s:3:"Ḏ";s:3:"ḏ";s:3:"ḏ";s:3:"Ḑ";s:3:"Ḑ";s:3:"ḑ";s:3:"ḑ";s:3:"Ḓ";s:3:"Ḓ";s:3:"ḓ";s:3:"ḓ";s:3:"Ḕ";s:5:"Ḕ";s:3:"ḕ";s:5:"ḕ";s:3:"Ḗ";s:5:"Ḗ";s:3:"ḗ";s:5:"ḗ";s:3:"Ḙ";s:3:"Ḙ";s:3:"ḙ";s:3:"ḙ";s:3:"Ḛ";s:3:"Ḛ";s:3:"ḛ";s:3:"ḛ";s:3:"Ḝ";s:5:"Ḝ";s:3:"ḝ";s:5:"ḝ";s:3:"Ḟ";s:3:"Ḟ";s:3:"ḟ";s:3:"ḟ";s:3:"Ḡ";s:3:"Ḡ";s:3:"ḡ";s:3:"ḡ";s:3:"Ḣ";s:3:"Ḣ";s:3:"ḣ";s:3:"ḣ";s:3:"Ḥ";s:3:"Ḥ";s:3:"ḥ";s:3:"ḥ";s:3:"Ḧ";s:3:"Ḧ";s:3:"ḧ";s:3:"ḧ";s:3:"Ḩ";s:3:"Ḩ";s:3:"ḩ";s:3:"ḩ";s:3:"Ḫ";s:3:"Ḫ";s:3:"ḫ";s:3:"ḫ";s:3:"Ḭ";s:3:"Ḭ";s:3:"ḭ";s:3:"ḭ";s:3:"Ḯ";s:5:"Ḯ";s:3:"ḯ";s:5:"ḯ";s:3:"Ḱ";s:3:"Ḱ";s:3:"ḱ";s:3:"ḱ";s:3:"Ḳ";s:3:"Ḳ";s:3:"ḳ";s:3:"ḳ";s:3:"Ḵ";s:3:"Ḵ";s:3:"ḵ";s:3:"ḵ";s:3:"Ḷ";s:3:"Ḷ";s:3:"ḷ";s:3:"ḷ";s:3:"Ḹ";s:5:"Ḹ";s:3:"ḹ";s:5:"ḹ";s:3:"Ḻ";s:3:"Ḻ";s:3:"ḻ";s:3:"ḻ";s:3:"Ḽ";s:3:"Ḽ";s:3:"ḽ";s:3:"ḽ";s:3:"Ḿ";s:3:"Ḿ";s:3:"ḿ";s:3:"ḿ";s:3:"Ṁ";s:3:"Ṁ";s:3:"ṁ";s:3:"ṁ";s:3:"Ṃ";s:3:"Ṃ";s:3:"ṃ";s:3:"ṃ";s:3:"Ṅ";s:3:"Ṅ";s:3:"ṅ";s:3:"ṅ";s:3:"Ṇ";s:3:"Ṇ";s:3:"ṇ";s:3:"ṇ";s:3:"Ṉ";s:3:"Ṉ";s:3:"ṉ";s:3:"ṉ";s:3:"Ṋ";s:3:"Ṋ";s:3:"ṋ";s:3:"ṋ";s:3:"Ṍ";s:5:"Ṍ";s:3:"ṍ";s:5:"ṍ";s:3:"Ṏ";s:5:"Ṏ";s:3:"ṏ";s:5:"ṏ";s:3:"Ṑ";s:5:"Ṑ";s:3:"ṑ";s:5:"ṑ";s:3:"Ṓ";s:5:"Ṓ";s:3:"ṓ";s:5:"ṓ";s:3:"Ṕ";s:3:"Ṕ";s:3:"ṕ";s:3:"ṕ";s:3:"Ṗ";s:3:"Ṗ";s:3:"ṗ";s:3:"ṗ";s:3:"Ṙ";s:3:"Ṙ";s:3:"ṙ";s:3:"ṙ";s:3:"Ṛ";s:3:"Ṛ";s:3:"ṛ";s:3:"ṛ";s:3:"Ṝ";s:5:"Ṝ";s:3:"ṝ";s:5:"ṝ";s:3:"Ṟ";s:3:"Ṟ";s:3:"ṟ";s:3:"ṟ";s:3:"Ṡ";s:3:"Ṡ";s:3:"ṡ";s:3:"ṡ";s:3:"Ṣ";s:3:"Ṣ";s:3:"ṣ";s:3:"ṣ";s:3:"Ṥ";s:5:"Ṥ";s:3:"ṥ";s:5:"ṥ";s:3:"Ṧ";s:5:"Ṧ";s:3:"ṧ";s:5:"ṧ";s:3:"Ṩ";s:5:"Ṩ";s:3:"ṩ";s:5:"ṩ";s:3:"Ṫ";s:3:"Ṫ";s:3:"ṫ";s:3:"ṫ";s:3:"Ṭ";s:3:"Ṭ";s:3:"ṭ";s:3:"ṭ";s:3:"Ṯ";s:3:"Ṯ";s:3:"ṯ";s:3:"ṯ";s:3:"Ṱ";s:3:"Ṱ";s:3:"ṱ";s:3:"ṱ";s:3:"Ṳ";s:3:"Ṳ";s:3:"ṳ";s:3:"ṳ";s:3:"Ṵ";s:3:"Ṵ";s:3:"ṵ";s:3:"ṵ";s:3:"Ṷ";s:3:"Ṷ";s:3:"ṷ";s:3:"ṷ";s:3:"Ṹ";s:5:"Ṹ";s:3:"ṹ";s:5:"ṹ";s:3:"Ṻ";s:5:"Ṻ";s:3:"ṻ";s:5:"ṻ";s:3:"Ṽ";s:3:"Ṽ";s:3:"ṽ";s:3:"ṽ";s:3:"Ṿ";s:3:"Ṿ";s:3:"ṿ";s:3:"ṿ";s:3:"Ẁ";s:3:"Ẁ";s:3:"ẁ";s:3:"ẁ";s:3:"Ẃ";s:3:"Ẃ";s:3:"ẃ";s:3:"ẃ";s:3:"Ẅ";s:3:"Ẅ";s:3:"ẅ";s:3:"ẅ";s:3:"Ẇ";s:3:"Ẇ";s:3:"ẇ";s:3:"ẇ";s:3:"Ẉ";s:3:"Ẉ";s:3:"ẉ";s:3:"ẉ";s:3:"Ẋ";s:3:"Ẋ";s:3:"ẋ";s:3:"ẋ";s:3:"Ẍ";s:3:"Ẍ";s:3:"ẍ";s:3:"ẍ";s:3:"Ẏ";s:3:"Ẏ";s:3:"ẏ";s:3:"ẏ";s:3:"Ẑ";s:3:"Ẑ";s:3:"ẑ";s:3:"ẑ";s:3:"Ẓ";s:3:"Ẓ";s:3:"ẓ";s:3:"ẓ";s:3:"Ẕ";s:3:"Ẕ";s:3:"ẕ";s:3:"ẕ";s:3:"ẖ";s:3:"ẖ";s:3:"ẗ";s:3:"ẗ";s:3:"ẘ";s:3:"ẘ";s:3:"ẙ";s:3:"ẙ";s:3:"ẛ";s:4:"ẛ";s:3:"Ạ";s:3:"Ạ";s:3:"ạ";s:3:"ạ";s:3:"Ả";s:3:"Ả";s:3:"ả";s:3:"ả";s:3:"Ấ";s:5:"Ấ";s:3:"ấ";s:5:"ấ";s:3:"Ầ";s:5:"Ầ";s:3:"ầ";s:5:"ầ";s:3:"Ẩ";s:5:"Ẩ";s:3:"ẩ";s:5:"ẩ";s:3:"Ẫ";s:5:"Ẫ";s:3:"ẫ";s:5:"ẫ";s:3:"Ậ";s:5:"Ậ";s:3:"ậ";s:5:"ậ";s:3:"Ắ";s:5:"Ắ";s:3:"ắ";s:5:"ắ";s:3:"Ằ";s:5:"Ằ";s:3:"ằ";s:5:"ằ";s:3:"Ẳ";s:5:"Ẳ";s:3:"ẳ";s:5:"ẳ";s:3:"Ẵ";s:5:"Ẵ";s:3:"ẵ";s:5:"ẵ";s:3:"Ặ";s:5:"Ặ";s:3:"ặ";s:5:"ặ";s:3:"Ẹ";s:3:"Ẹ";s:3:"ẹ";s:3:"ẹ";s:3:"Ẻ";s:3:"Ẻ";s:3:"ẻ";s:3:"ẻ";s:3:"Ẽ";s:3:"Ẽ";s:3:"ẽ";s:3:"ẽ";s:3:"Ế";s:5:"Ế";s:3:"ế";s:5:"ế";s:3:"Ề";s:5:"Ề";s:3:"ề";s:5:"ề";s:3:"Ể";s:5:"Ể";s:3:"ể";s:5:"ể";s:3:"Ễ";s:5:"Ễ";s:3:"ễ";s:5:"ễ";s:3:"Ệ";s:5:"Ệ";s:3:"ệ";s:5:"ệ";s:3:"Ỉ";s:3:"Ỉ";s:3:"ỉ";s:3:"ỉ";s:3:"Ị";s:3:"Ị";s:3:"ị";s:3:"ị";s:3:"Ọ";s:3:"Ọ";s:3:"ọ";s:3:"ọ";s:3:"Ỏ";s:3:"Ỏ";s:3:"ỏ";s:3:"ỏ";s:3:"Ố";s:5:"Ố";s:3:"ố";s:5:"ố";s:3:"Ồ";s:5:"Ồ";s:3:"ồ";s:5:"ồ";s:3:"Ổ";s:5:"Ổ";s:3:"ổ";s:5:"ổ";s:3:"Ỗ";s:5:"Ỗ";s:3:"ỗ";s:5:"ỗ";s:3:"Ộ";s:5:"Ộ";s:3:"ộ";s:5:"ộ";s:3:"Ớ";s:5:"Ớ";s:3:"ớ";s:5:"ớ";s:3:"Ờ";s:5:"Ờ";s:3:"ờ";s:5:"ờ";s:3:"Ở";s:5:"Ở";s:3:"ở";s:5:"ở";s:3:"Ỡ";s:5:"Ỡ";s:3:"ỡ";s:5:"ỡ";s:3:"Ợ";s:5:"Ợ";s:3:"ợ";s:5:"ợ";s:3:"Ụ";s:3:"Ụ";s:3:"ụ";s:3:"ụ";s:3:"Ủ";s:3:"Ủ";s:3:"ủ";s:3:"ủ";s:3:"Ứ";s:5:"Ứ";s:3:"ứ";s:5:"ứ";s:3:"Ừ";s:5:"Ừ";s:3:"ừ";s:5:"ừ";s:3:"Ử";s:5:"Ử";s:3:"ử";s:5:"ử";s:3:"Ữ";s:5:"Ữ";s:3:"ữ";s:5:"ữ";s:3:"Ự";s:5:"Ự";s:3:"ự";s:5:"ự";s:3:"Ỳ";s:3:"Ỳ";s:3:"ỳ";s:3:"ỳ";s:3:"Ỵ";s:3:"Ỵ";s:3:"ỵ";s:3:"ỵ";s:3:"Ỷ";s:3:"Ỷ";s:3:"ỷ";s:3:"ỷ";s:3:"Ỹ";s:3:"Ỹ";s:3:"ỹ";s:3:"ỹ";s:3:"ἀ";s:4:"ἀ";s:3:"ἁ";s:4:"ἁ";s:3:"ἂ";s:6:"ἂ";s:3:"ἃ";s:6:"ἃ";s:3:"ἄ";s:6:"ἄ";s:3:"ἅ";s:6:"ἅ";s:3:"ἆ";s:6:"ἆ";s:3:"ἇ";s:6:"ἇ";s:3:"Ἀ";s:4:"Ἀ";s:3:"Ἁ";s:4:"Ἁ";s:3:"Ἂ";s:6:"Ἂ";s:3:"Ἃ";s:6:"Ἃ";s:3:"Ἄ";s:6:"Ἄ";s:3:"Ἅ";s:6:"Ἅ";s:3:"Ἆ";s:6:"Ἆ";s:3:"Ἇ";s:6:"Ἇ";s:3:"ἐ";s:4:"ἐ";s:3:"ἑ";s:4:"ἑ";s:3:"ἒ";s:6:"ἒ";s:3:"ἓ";s:6:"ἓ";s:3:"ἔ";s:6:"ἔ";s:3:"ἕ";s:6:"ἕ";s:3:"Ἐ";s:4:"Ἐ";s:3:"Ἑ";s:4:"Ἑ";s:3:"Ἒ";s:6:"Ἒ";s:3:"Ἓ";s:6:"Ἓ";s:3:"Ἔ";s:6:"Ἔ";s:3:"Ἕ";s:6:"Ἕ";s:3:"ἠ";s:4:"ἠ";s:3:"ἡ";s:4:"ἡ";s:3:"ἢ";s:6:"ἢ";s:3:"ἣ";s:6:"ἣ";s:3:"ἤ";s:6:"ἤ";s:3:"ἥ";s:6:"ἥ";s:3:"ἦ";s:6:"ἦ";s:3:"ἧ";s:6:"ἧ";s:3:"Ἠ";s:4:"Ἠ";s:3:"Ἡ";s:4:"Ἡ";s:3:"Ἢ";s:6:"Ἢ";s:3:"Ἣ";s:6:"Ἣ";s:3:"Ἤ";s:6:"Ἤ";s:3:"Ἥ";s:6:"Ἥ";s:3:"Ἦ";s:6:"Ἦ";s:3:"Ἧ";s:6:"Ἧ";s:3:"ἰ";s:4:"ἰ";s:3:"ἱ";s:4:"ἱ";s:3:"ἲ";s:6:"ἲ";s:3:"ἳ";s:6:"ἳ";s:3:"ἴ";s:6:"ἴ";s:3:"ἵ";s:6:"ἵ";s:3:"ἶ";s:6:"ἶ";s:3:"ἷ";s:6:"ἷ";s:3:"Ἰ";s:4:"Ἰ";s:3:"Ἱ";s:4:"Ἱ";s:3:"Ἲ";s:6:"Ἲ";s:3:"Ἳ";s:6:"Ἳ";s:3:"Ἴ";s:6:"Ἴ";s:3:"Ἵ";s:6:"Ἵ";s:3:"Ἶ";s:6:"Ἶ";s:3:"Ἷ";s:6:"Ἷ";s:3:"ὀ";s:4:"ὀ";s:3:"ὁ";s:4:"ὁ";s:3:"ὂ";s:6:"ὂ";s:3:"ὃ";s:6:"ὃ";s:3:"ὄ";s:6:"ὄ";s:3:"ὅ";s:6:"ὅ";s:3:"Ὀ";s:4:"Ὀ";s:3:"Ὁ";s:4:"Ὁ";s:3:"Ὂ";s:6:"Ὂ";s:3:"Ὃ";s:6:"Ὃ";s:3:"Ὄ";s:6:"Ὄ";s:3:"Ὅ";s:6:"Ὅ";s:3:"ὐ";s:4:"ὐ";s:3:"ὑ";s:4:"ὑ";s:3:"ὒ";s:6:"ὒ";s:3:"ὓ";s:6:"ὓ";s:3:"ὔ";s:6:"ὔ";s:3:"ὕ";s:6:"ὕ";s:3:"ὖ";s:6:"ὖ";s:3:"ὗ";s:6:"ὗ";s:3:"Ὑ";s:4:"Ὑ";s:3:"Ὓ";s:6:"Ὓ";s:3:"Ὕ";s:6:"Ὕ";s:3:"Ὗ";s:6:"Ὗ";s:3:"ὠ";s:4:"ὠ";s:3:"ὡ";s:4:"ὡ";s:3:"ὢ";s:6:"ὢ";s:3:"ὣ";s:6:"ὣ";s:3:"ὤ";s:6:"ὤ";s:3:"ὥ";s:6:"ὥ";s:3:"ὦ";s:6:"ὦ";s:3:"ὧ";s:6:"ὧ";s:3:"Ὠ";s:4:"Ὠ";s:3:"Ὡ";s:4:"Ὡ";s:3:"Ὢ";s:6:"Ὢ";s:3:"Ὣ";s:6:"Ὣ";s:3:"Ὤ";s:6:"Ὤ";s:3:"Ὥ";s:6:"Ὥ";s:3:"Ὦ";s:6:"Ὦ";s:3:"Ὧ";s:6:"Ὧ";s:3:"ὰ";s:4:"ὰ";s:3:"ά";s:4:"ά";s:3:"ὲ";s:4:"ὲ";s:3:"έ";s:4:"έ";s:3:"ὴ";s:4:"ὴ";s:3:"ή";s:4:"ή";s:3:"ὶ";s:4:"ὶ";s:3:"ί";s:4:"ί";s:3:"ὸ";s:4:"ὸ";s:3:"ό";s:4:"ό";s:3:"ὺ";s:4:"ὺ";s:3:"ύ";s:4:"ύ";s:3:"ὼ";s:4:"ὼ";s:3:"ώ";s:4:"ώ";s:3:"ᾀ";s:6:"ᾀ";s:3:"ᾁ";s:6:"ᾁ";s:3:"ᾂ";s:8:"ᾂ";s:3:"ᾃ";s:8:"ᾃ";s:3:"ᾄ";s:8:"ᾄ";s:3:"ᾅ";s:8:"ᾅ";s:3:"ᾆ";s:8:"ᾆ";s:3:"ᾇ";s:8:"ᾇ";s:3:"ᾈ";s:6:"ᾈ";s:3:"ᾉ";s:6:"ᾉ";s:3:"ᾊ";s:8:"ᾊ";s:3:"ᾋ";s:8:"ᾋ";s:3:"ᾌ";s:8:"ᾌ";s:3:"ᾍ";s:8:"ᾍ";s:3:"ᾎ";s:8:"ᾎ";s:3:"ᾏ";s:8:"ᾏ";s:3:"ᾐ";s:6:"ᾐ";s:3:"ᾑ";s:6:"ᾑ";s:3:"ᾒ";s:8:"ᾒ";s:3:"ᾓ";s:8:"ᾓ";s:3:"ᾔ";s:8:"ᾔ";s:3:"ᾕ";s:8:"ᾕ";s:3:"ᾖ";s:8:"ᾖ";s:3:"ᾗ";s:8:"ᾗ";s:3:"ᾘ";s:6:"ᾘ";s:3:"ᾙ";s:6:"ᾙ";s:3:"ᾚ";s:8:"ᾚ";s:3:"ᾛ";s:8:"ᾛ";s:3:"ᾜ";s:8:"ᾜ";s:3:"ᾝ";s:8:"ᾝ";s:3:"ᾞ";s:8:"ᾞ";s:3:"ᾟ";s:8:"ᾟ";s:3:"ᾠ";s:6:"ᾠ";s:3:"ᾡ";s:6:"ᾡ";s:3:"ᾢ";s:8:"ᾢ";s:3:"ᾣ";s:8:"ᾣ";s:3:"ᾤ";s:8:"ᾤ";s:3:"ᾥ";s:8:"ᾥ";s:3:"ᾦ";s:8:"ᾦ";s:3:"ᾧ";s:8:"ᾧ";s:3:"ᾨ";s:6:"ᾨ";s:3:"ᾩ";s:6:"ᾩ";s:3:"ᾪ";s:8:"ᾪ";s:3:"ᾫ";s:8:"ᾫ";s:3:"ᾬ";s:8:"ᾬ";s:3:"ᾭ";s:8:"ᾭ";s:3:"ᾮ";s:8:"ᾮ";s:3:"ᾯ";s:8:"ᾯ";s:3:"ᾰ";s:4:"ᾰ";s:3:"ᾱ";s:4:"ᾱ";s:3:"ᾲ";s:6:"ᾲ";s:3:"ᾳ";s:4:"ᾳ";s:3:"ᾴ";s:6:"ᾴ";s:3:"ᾶ";s:4:"ᾶ";s:3:"ᾷ";s:6:"ᾷ";s:3:"Ᾰ";s:4:"Ᾰ";s:3:"Ᾱ";s:4:"Ᾱ";s:3:"Ὰ";s:4:"Ὰ";s:3:"Ά";s:4:"Ά";s:3:"ᾼ";s:4:"ᾼ";s:3:"ι";s:2:"ι";s:3:"῁";s:4:"῁";s:3:"ῂ";s:6:"ῂ";s:3:"ῃ";s:4:"ῃ";s:3:"ῄ";s:6:"ῄ";s:3:"ῆ";s:4:"ῆ";s:3:"ῇ";s:6:"ῇ";s:3:"Ὲ";s:4:"Ὲ";s:3:"Έ";s:4:"Έ";s:3:"Ὴ";s:4:"Ὴ";s:3:"Ή";s:4:"Ή";s:3:"ῌ";s:4:"ῌ";s:3:"῍";s:5:"῍";s:3:"῎";s:5:"῎";s:3:"῏";s:5:"῏";s:3:"ῐ";s:4:"ῐ";s:3:"ῑ";s:4:"ῑ";s:3:"ῒ";s:6:"ῒ";s:3:"ΐ";s:6:"ΐ";s:3:"ῖ";s:4:"ῖ";s:3:"ῗ";s:6:"ῗ";s:3:"Ῐ";s:4:"Ῐ";s:3:"Ῑ";s:4:"Ῑ";s:3:"Ὶ";s:4:"Ὶ";s:3:"Ί";s:4:"Ί";s:3:"῝";s:5:"῝";s:3:"῞";s:5:"῞";s:3:"῟";s:5:"῟";s:3:"ῠ";s:4:"ῠ";s:3:"ῡ";s:4:"ῡ";s:3:"ῢ";s:6:"ῢ";s:3:"ΰ";s:6:"ΰ";s:3:"ῤ";s:4:"ῤ";s:3:"ῥ";s:4:"ῥ";s:3:"ῦ";s:4:"ῦ";s:3:"ῧ";s:6:"ῧ";s:3:"Ῠ";s:4:"Ῠ";s:3:"Ῡ";s:4:"Ῡ";s:3:"Ὺ";s:4:"Ὺ";s:3:"Ύ";s:4:"Ύ";s:3:"Ῥ";s:4:"Ῥ";s:3:"῭";s:4:"῭";s:3:"΅";s:4:"΅";s:3:"`";s:1:"`";s:3:"ῲ";s:6:"ῲ";s:3:"ῳ";s:4:"ῳ";s:3:"ῴ";s:6:"ῴ";s:3:"ῶ";s:4:"ῶ";s:3:"ῷ";s:6:"ῷ";s:3:"Ὸ";s:4:"Ὸ";s:3:"Ό";s:4:"Ό";s:3:"Ὼ";s:4:"Ὼ";s:3:"Ώ";s:4:"Ώ";s:3:"ῼ";s:4:"ῼ";s:3:"´";s:2:"´";s:3:" ";s:3:" ";s:3:" ";s:3:" ";s:3:"Ω";s:2:"Ω";s:3:"K";s:1:"K";s:3:"Å";s:3:"Å";s:3:"↚";s:5:"↚";s:3:"↛";s:5:"↛";s:3:"↮";s:5:"↮";s:3:"⇍";s:5:"⇍";s:3:"⇎";s:5:"⇎";s:3:"⇏";s:5:"⇏";s:3:"∄";s:5:"∄";s:3:"∉";s:5:"∉";s:3:"∌";s:5:"∌";s:3:"∤";s:5:"∤";s:3:"∦";s:5:"∦";s:3:"≁";s:5:"≁";s:3:"≄";s:5:"≄";s:3:"≇";s:5:"≇";s:3:"≉";s:5:"≉";s:3:"≠";s:3:"≠";s:3:"≢";s:5:"≢";s:3:"≭";s:5:"≭";s:3:"≮";s:3:"≮";s:3:"≯";s:3:"≯";s:3:"≰";s:5:"≰";s:3:"≱";s:5:"≱";s:3:"≴";s:5:"≴";s:3:"≵";s:5:"≵";s:3:"≸";s:5:"≸";s:3:"≹";s:5:"≹";s:3:"⊀";s:5:"⊀";s:3:"⊁";s:5:"⊁";s:3:"⊄";s:5:"⊄";s:3:"⊅";s:5:"⊅";s:3:"⊈";s:5:"⊈";s:3:"⊉";s:5:"⊉";s:3:"⊬";s:5:"⊬";s:3:"⊭";s:5:"⊭";s:3:"⊮";s:5:"⊮";s:3:"⊯";s:5:"⊯";s:3:"⋠";s:5:"⋠";s:3:"⋡";s:5:"⋡";s:3:"⋢";s:5:"⋢";s:3:"⋣";s:5:"⋣";s:3:"⋪";s:5:"⋪";s:3:"⋫";s:5:"⋫";s:3:"⋬";s:5:"⋬";s:3:"⋭";s:5:"⋭";s:3:"〈";s:3:"〈";s:3:"〉";s:3:"〉";s:3:"⫝̸";s:5:"⫝̸";s:3:"が";s:6:"が";s:3:"ぎ";s:6:"ぎ";s:3:"ぐ";s:6:"ぐ";s:3:"げ";s:6:"げ";s:3:"ご";s:6:"ご";s:3:"ざ";s:6:"ざ";s:3:"じ";s:6:"じ";s:3:"ず";s:6:"ず";s:3:"ぜ";s:6:"ぜ";s:3:"ぞ";s:6:"ぞ";s:3:"だ";s:6:"だ";s:3:"ぢ";s:6:"ぢ";s:3:"づ";s:6:"づ";s:3:"で";s:6:"で";s:3:"ど";s:6:"ど";s:3:"ば";s:6:"ば";s:3:"ぱ";s:6:"ぱ";s:3:"び";s:6:"び";s:3:"ぴ";s:6:"ぴ";s:3:"ぶ";s:6:"ぶ";s:3:"ぷ";s:6:"ぷ";s:3:"べ";s:6:"べ";s:3:"ぺ";s:6:"ぺ";s:3:"ぼ";s:6:"ぼ";s:3:"ぽ";s:6:"ぽ";s:3:"ゔ";s:6:"ゔ";s:3:"ゞ";s:6:"ゞ";s:3:"ガ";s:6:"ガ";s:3:"ギ";s:6:"ギ";s:3:"グ";s:6:"グ";s:3:"ゲ";s:6:"ゲ";s:3:"ゴ";s:6:"ゴ";s:3:"ザ";s:6:"ザ";s:3:"ジ";s:6:"ジ";s:3:"ズ";s:6:"ズ";s:3:"ゼ";s:6:"ゼ";s:3:"ゾ";s:6:"ゾ";s:3:"ダ";s:6:"ダ";s:3:"ヂ";s:6:"ヂ";s:3:"ヅ";s:6:"ヅ";s:3:"デ";s:6:"デ";s:3:"ド";s:6:"ド";s:3:"バ";s:6:"バ";s:3:"パ";s:6:"パ";s:3:"ビ";s:6:"ビ";s:3:"ピ";s:6:"ピ";s:3:"ブ";s:6:"ブ";s:3:"プ";s:6:"プ";s:3:"ベ";s:6:"ベ";s:3:"ペ";s:6:"ペ";s:3:"ボ";s:6:"ボ";s:3:"ポ";s:6:"ポ";s:3:"ヴ";s:6:"ヴ";s:3:"ヷ";s:6:"ヷ";s:3:"ヸ";s:6:"ヸ";s:3:"ヹ";s:6:"ヹ";s:3:"ヺ";s:6:"ヺ";s:3:"ヾ";s:6:"ヾ";s:3:"豈";s:3:"豈";s:3:"更";s:3:"更";s:3:"車";s:3:"車";s:3:"賈";s:3:"賈";s:3:"滑";s:3:"滑";s:3:"串";s:3:"串";s:3:"句";s:3:"句";s:3:"龜";s:3:"龜";s:3:"龜";s:3:"龜";s:3:"契";s:3:"契";s:3:"金";s:3:"金";s:3:"喇";s:3:"喇";s:3:"奈";s:3:"奈";s:3:"懶";s:3:"懶";s:3:"癩";s:3:"癩";s:3:"羅";s:3:"羅";s:3:"蘿";s:3:"蘿";s:3:"螺";s:3:"螺";s:3:"裸";s:3:"裸";s:3:"邏";s:3:"邏";s:3:"樂";s:3:"樂";s:3:"洛";s:3:"洛";s:3:"烙";s:3:"烙";s:3:"珞";s:3:"珞";s:3:"落";s:3:"落";s:3:"酪";s:3:"酪";s:3:"駱";s:3:"駱";s:3:"亂";s:3:"亂";s:3:"卵";s:3:"卵";s:3:"欄";s:3:"欄";s:3:"爛";s:3:"爛";s:3:"蘭";s:3:"蘭";s:3:"鸞";s:3:"鸞";s:3:"嵐";s:3:"嵐";s:3:"濫";s:3:"濫";s:3:"藍";s:3:"藍";s:3:"襤";s:3:"襤";s:3:"拉";s:3:"拉";s:3:"臘";s:3:"臘";s:3:"蠟";s:3:"蠟";s:3:"廊";s:3:"廊";s:3:"朗";s:3:"朗";s:3:"浪";s:3:"浪";s:3:"狼";s:3:"狼";s:3:"郎";s:3:"郎";s:3:"來";s:3:"來";s:3:"冷";s:3:"冷";s:3:"勞";s:3:"勞";s:3:"擄";s:3:"擄";s:3:"櫓";s:3:"櫓";s:3:"爐";s:3:"爐";s:3:"盧";s:3:"盧";s:3:"老";s:3:"老";s:3:"蘆";s:3:"蘆";s:3:"虜";s:3:"虜";s:3:"路";s:3:"路";s:3:"露";s:3:"露";s:3:"魯";s:3:"魯";s:3:"鷺";s:3:"鷺";s:3:"碌";s:3:"碌";s:3:"祿";s:3:"祿";s:3:"綠";s:3:"綠";s:3:"菉";s:3:"菉";s:3:"錄";s:3:"錄";s:3:"鹿";s:3:"鹿";s:3:"論";s:3:"論";s:3:"壟";s:3:"壟";s:3:"弄";s:3:"弄";s:3:"籠";s:3:"籠";s:3:"聾";s:3:"聾";s:3:"牢";s:3:"牢";s:3:"磊";s:3:"磊";s:3:"賂";s:3:"賂";s:3:"雷";s:3:"雷";s:3:"壘";s:3:"壘";s:3:"屢";s:3:"屢";s:3:"樓";s:3:"樓";s:3:"淚";s:3:"淚";s:3:"漏";s:3:"漏";s:3:"累";s:3:"累";s:3:"縷";s:3:"縷";s:3:"陋";s:3:"陋";s:3:"勒";s:3:"勒";s:3:"肋";s:3:"肋";s:3:"凜";s:3:"凜";s:3:"凌";s:3:"凌";s:3:"稜";s:3:"稜";s:3:"綾";s:3:"綾";s:3:"菱";s:3:"菱";s:3:"陵";s:3:"陵";s:3:"讀";s:3:"讀";s:3:"拏";s:3:"拏";s:3:"樂";s:3:"樂";s:3:"諾";s:3:"諾";s:3:"丹";s:3:"丹";s:3:"寧";s:3:"寧";s:3:"怒";s:3:"怒";s:3:"率";s:3:"率";s:3:"異";s:3:"異";s:3:"北";s:3:"北";s:3:"磻";s:3:"磻";s:3:"便";s:3:"便";s:3:"復";s:3:"復";s:3:"不";s:3:"不";s:3:"泌";s:3:"泌";s:3:"數";s:3:"數";s:3:"索";s:3:"索";s:3:"參";s:3:"參";s:3:"塞";s:3:"塞";s:3:"省";s:3:"省";s:3:"葉";s:3:"葉";s:3:"說";s:3:"說";s:3:"殺";s:3:"殺";s:3:"辰";s:3:"辰";s:3:"沈";s:3:"沈";s:3:"拾";s:3:"拾";s:3:"若";s:3:"若";s:3:"掠";s:3:"掠";s:3:"略";s:3:"略";s:3:"亮";s:3:"亮";s:3:"兩";s:3:"兩";s:3:"凉";s:3:"凉";s:3:"梁";s:3:"梁";s:3:"糧";s:3:"糧";s:3:"良";s:3:"良";s:3:"諒";s:3:"諒";s:3:"量";s:3:"量";s:3:"勵";s:3:"勵";s:3:"呂";s:3:"呂";s:3:"女";s:3:"女";s:3:"廬";s:3:"廬";s:3:"旅";s:3:"旅";s:3:"濾";s:3:"濾";s:3:"礪";s:3:"礪";s:3:"閭";s:3:"閭";s:3:"驪";s:3:"驪";s:3:"麗";s:3:"麗";s:3:"黎";s:3:"黎";s:3:"力";s:3:"力";s:3:"曆";s:3:"曆";s:3:"歷";s:3:"歷";s:3:"轢";s:3:"轢";s:3:"年";s:3:"年";s:3:"憐";s:3:"憐";s:3:"戀";s:3:"戀";s:3:"撚";s:3:"撚";s:3:"漣";s:3:"漣";s:3:"煉";s:3:"煉";s:3:"璉";s:3:"璉";s:3:"秊";s:3:"秊";s:3:"練";s:3:"練";s:3:"聯";s:3:"聯";s:3:"輦";s:3:"輦";s:3:"蓮";s:3:"蓮";s:3:"連";s:3:"連";s:3:"鍊";s:3:"鍊";s:3:"列";s:3:"列";s:3:"劣";s:3:"劣";s:3:"咽";s:3:"咽";s:3:"烈";s:3:"烈";s:3:"裂";s:3:"裂";s:3:"說";s:3:"說";s:3:"廉";s:3:"廉";s:3:"念";s:3:"念";s:3:"捻";s:3:"捻";s:3:"殮";s:3:"殮";s:3:"簾";s:3:"簾";s:3:"獵";s:3:"獵";s:3:"令";s:3:"令";s:3:"囹";s:3:"囹";s:3:"寧";s:3:"寧";s:3:"嶺";s:3:"嶺";s:3:"怜";s:3:"怜";s:3:"玲";s:3:"玲";s:3:"瑩";s:3:"瑩";s:3:"羚";s:3:"羚";s:3:"聆";s:3:"聆";s:3:"鈴";s:3:"鈴";s:3:"零";s:3:"零";s:3:"靈";s:3:"靈";s:3:"領";s:3:"領";s:3:"例";s:3:"例";s:3:"禮";s:3:"禮";s:3:"醴";s:3:"醴";s:3:"隸";s:3:"隸";s:3:"惡";s:3:"惡";s:3:"了";s:3:"了";s:3:"僚";s:3:"僚";s:3:"寮";s:3:"寮";s:3:"尿";s:3:"尿";s:3:"料";s:3:"料";s:3:"樂";s:3:"樂";s:3:"燎";s:3:"燎";s:3:"療";s:3:"療";s:3:"蓼";s:3:"蓼";s:3:"遼";s:3:"遼";s:3:"龍";s:3:"龍";s:3:"暈";s:3:"暈";s:3:"阮";s:3:"阮";s:3:"劉";s:3:"劉";s:3:"杻";s:3:"杻";s:3:"柳";s:3:"柳";s:3:"流";s:3:"流";s:3:"溜";s:3:"溜";s:3:"琉";s:3:"琉";s:3:"留";s:3:"留";s:3:"硫";s:3:"硫";s:3:"紐";s:3:"紐";s:3:"類";s:3:"類";s:3:"六";s:3:"六";s:3:"戮";s:3:"戮";s:3:"陸";s:3:"陸";s:3:"倫";s:3:"倫";s:3:"崙";s:3:"崙";s:3:"淪";s:3:"淪";s:3:"輪";s:3:"輪";s:3:"律";s:3:"律";s:3:"慄";s:3:"慄";s:3:"栗";s:3:"栗";s:3:"率";s:3:"率";s:3:"隆";s:3:"隆";s:3:"利";s:3:"利";s:3:"吏";s:3:"吏";s:3:"履";s:3:"履";s:3:"易";s:3:"易";s:3:"李";s:3:"李";s:3:"梨";s:3:"梨";s:3:"泥";s:3:"泥";s:3:"理";s:3:"理";s:3:"痢";s:3:"痢";s:3:"罹";s:3:"罹";s:3:"裏";s:3:"裏";s:3:"裡";s:3:"裡";s:3:"里";s:3:"里";s:3:"離";s:3:"離";s:3:"匿";s:3:"匿";s:3:"溺";s:3:"溺";s:3:"吝";s:3:"吝";s:3:"燐";s:3:"燐";s:3:"璘";s:3:"璘";s:3:"藺";s:3:"藺";s:3:"隣";s:3:"隣";s:3:"鱗";s:3:"鱗";s:3:"麟";s:3:"麟";s:3:"林";s:3:"林";s:3:"淋";s:3:"淋";s:3:"臨";s:3:"臨";s:3:"立";s:3:"立";s:3:"笠";s:3:"笠";s:3:"粒";s:3:"粒";s:3:"狀";s:3:"狀";s:3:"炙";s:3:"炙";s:3:"識";s:3:"識";s:3:"什";s:3:"什";s:3:"茶";s:3:"茶";s:3:"刺";s:3:"刺";s:3:"切";s:3:"切";s:3:"度";s:3:"度";s:3:"拓";s:3:"拓";s:3:"糖";s:3:"糖";s:3:"宅";s:3:"宅";s:3:"洞";s:3:"洞";s:3:"暴";s:3:"暴";s:3:"輻";s:3:"輻";s:3:"行";s:3:"行";s:3:"降";s:3:"降";s:3:"見";s:3:"見";s:3:"廓";s:3:"廓";s:3:"兀";s:3:"兀";s:3:"嗀";s:3:"嗀";s:3:"塚";s:3:"塚";s:3:"晴";s:3:"晴";s:3:"凞";s:3:"凞";s:3:"猪";s:3:"猪";s:3:"益";s:3:"益";s:3:"礼";s:3:"礼";s:3:"神";s:3:"神";s:3:"祥";s:3:"祥";s:3:"福";s:3:"福";s:3:"靖";s:3:"靖";s:3:"精";s:3:"精";s:3:"羽";s:3:"羽";s:3:"蘒";s:3:"蘒";s:3:"諸";s:3:"諸";s:3:"逸";s:3:"逸";s:3:"都";s:3:"都";s:3:"飯";s:3:"飯";s:3:"飼";s:3:"飼";s:3:"館";s:3:"館";s:3:"鶴";s:3:"鶴";s:3:"侮";s:3:"侮";s:3:"僧";s:3:"僧";s:3:"免";s:3:"免";s:3:"勉";s:3:"勉";s:3:"勤";s:3:"勤";s:3:"卑";s:3:"卑";s:3:"喝";s:3:"喝";s:3:"嘆";s:3:"嘆";s:3:"器";s:3:"器";s:3:"塀";s:3:"塀";s:3:"墨";s:3:"墨";s:3:"層";s:3:"層";s:3:"屮";s:3:"屮";s:3:"悔";s:3:"悔";s:3:"慨";s:3:"慨";s:3:"憎";s:3:"憎";s:3:"懲";s:3:"懲";s:3:"敏";s:3:"敏";s:3:"既";s:3:"既";s:3:"暑";s:3:"暑";s:3:"梅";s:3:"梅";s:3:"海";s:3:"海";s:3:"渚";s:3:"渚";s:3:"漢";s:3:"漢";s:3:"煮";s:3:"煮";s:3:"爫";s:3:"爫";s:3:"琢";s:3:"琢";s:3:"碑";s:3:"碑";s:3:"社";s:3:"社";s:3:"祉";s:3:"祉";s:3:"祈";s:3:"祈";s:3:"祐";s:3:"祐";s:3:"祖";s:3:"祖";s:3:"祝";s:3:"祝";s:3:"禍";s:3:"禍";s:3:"禎";s:3:"禎";s:3:"穀";s:3:"穀";s:3:"突";s:3:"突";s:3:"節";s:3:"節";s:3:"練";s:3:"練";s:3:"縉";s:3:"縉";s:3:"繁";s:3:"繁";s:3:"署";s:3:"署";s:3:"者";s:3:"者";s:3:"臭";s:3:"臭";s:3:"艹";s:3:"艹";s:3:"艹";s:3:"艹";s:3:"著";s:3:"著";s:3:"褐";s:3:"褐";s:3:"視";s:3:"視";s:3:"謁";s:3:"謁";s:3:"謹";s:3:"謹";s:3:"賓";s:3:"賓";s:3:"贈";s:3:"贈";s:3:"辶";s:3:"辶";s:3:"逸";s:3:"逸";s:3:"難";s:3:"難";s:3:"響";s:3:"響";s:3:"頻";s:3:"頻";s:3:"恵";s:3:"恵";s:3:"𤋮";s:4:"𤋮";s:3:"舘";s:3:"舘";s:3:"並";s:3:"並";s:3:"况";s:3:"况";s:3:"全";s:3:"全";s:3:"侀";s:3:"侀";s:3:"充";s:3:"充";s:3:"冀";s:3:"冀";s:3:"勇";s:3:"勇";s:3:"勺";s:3:"勺";s:3:"喝";s:3:"喝";s:3:"啕";s:3:"啕";s:3:"喙";s:3:"喙";s:3:"嗢";s:3:"嗢";s:3:"塚";s:3:"塚";s:3:"墳";s:3:"墳";s:3:"奄";s:3:"奄";s:3:"奔";s:3:"奔";s:3:"婢";s:3:"婢";s:3:"嬨";s:3:"嬨";s:3:"廒";s:3:"廒";s:3:"廙";s:3:"廙";s:3:"彩";s:3:"彩";s:3:"徭";s:3:"徭";s:3:"惘";s:3:"惘";s:3:"慎";s:3:"慎";s:3:"愈";s:3:"愈";s:3:"憎";s:3:"憎";s:3:"慠";s:3:"慠";s:3:"懲";s:3:"懲";s:3:"戴";s:3:"戴";s:3:"揄";s:3:"揄";s:3:"搜";s:3:"搜";s:3:"摒";s:3:"摒";s:3:"敖";s:3:"敖";s:3:"晴";s:3:"晴";s:3:"朗";s:3:"朗";s:3:"望";s:3:"望";s:3:"杖";s:3:"杖";s:3:"歹";s:3:"歹";s:3:"殺";s:3:"殺";s:3:"流";s:3:"流";s:3:"滛";s:3:"滛";s:3:"滋";s:3:"滋";s:3:"漢";s:3:"漢";s:3:"瀞";s:3:"瀞";s:3:"煮";s:3:"煮";s:3:"瞧";s:3:"瞧";s:3:"爵";s:3:"爵";s:3:"犯";s:3:"犯";s:3:"猪";s:3:"猪";s:3:"瑱";s:3:"瑱";s:3:"甆";s:3:"甆";s:3:"画";s:3:"画";s:3:"瘝";s:3:"瘝";s:3:"瘟";s:3:"瘟";s:3:"益";s:3:"益";s:3:"盛";s:3:"盛";s:3:"直";s:3:"直";s:3:"睊";s:3:"睊";s:3:"着";s:3:"着";s:3:"磌";s:3:"磌";s:3:"窱";s:3:"窱";s:3:"節";s:3:"節";s:3:"类";s:3:"类";s:3:"絛";s:3:"絛";s:3:"練";s:3:"練";s:3:"缾";s:3:"缾";s:3:"者";s:3:"者";s:3:"荒";s:3:"荒";s:3:"華";s:3:"華";s:3:"蝹";s:3:"蝹";s:3:"襁";s:3:"襁";s:3:"覆";s:3:"覆";s:3:"視";s:3:"視";s:3:"調";s:3:"調";s:3:"諸";s:3:"諸";s:3:"請";s:3:"請";s:3:"謁";s:3:"謁";s:3:"諾";s:3:"諾";s:3:"諭";s:3:"諭";s:3:"謹";s:3:"謹";s:3:"變";s:3:"變";s:3:"贈";s:3:"贈";s:3:"輸";s:3:"輸";s:3:"遲";s:3:"遲";s:3:"醙";s:3:"醙";s:3:"鉶";s:3:"鉶";s:3:"陼";s:3:"陼";s:3:"難";s:3:"難";s:3:"靖";s:3:"靖";s:3:"韛";s:3:"韛";s:3:"響";s:3:"響";s:3:"頋";s:3:"頋";s:3:"頻";s:3:"頻";s:3:"鬒";s:3:"鬒";s:3:"龜";s:3:"龜";s:3:"𢡊";s:4:"𢡊";s:3:"𢡄";s:4:"𢡄";s:3:"𣏕";s:4:"𣏕";s:3:"㮝";s:3:"㮝";s:3:"䀘";s:3:"䀘";s:3:"䀹";s:3:"䀹";s:3:"𥉉";s:4:"𥉉";s:3:"𥳐";s:4:"𥳐";s:3:"𧻓";s:4:"𧻓";s:3:"齃";s:3:"齃";s:3:"龎";s:3:"龎";s:3:"יִ";s:4:"יִ";s:3:"ײַ";s:4:"ײַ";s:3:"שׁ";s:4:"שׁ";s:3:"שׂ";s:4:"שׂ";s:3:"שּׁ";s:6:"שּׁ";s:3:"שּׂ";s:6:"שּׂ";s:3:"אַ";s:4:"אַ";s:3:"אָ";s:4:"אָ";s:3:"אּ";s:4:"אּ";s:3:"בּ";s:4:"בּ";s:3:"גּ";s:4:"גּ";s:3:"דּ";s:4:"דּ";s:3:"הּ";s:4:"הּ";s:3:"וּ";s:4:"וּ";s:3:"זּ";s:4:"זּ";s:3:"טּ";s:4:"טּ";s:3:"יּ";s:4:"יּ";s:3:"ךּ";s:4:"ךּ";s:3:"כּ";s:4:"כּ";s:3:"לּ";s:4:"לּ";s:3:"מּ";s:4:"מּ";s:3:"נּ";s:4:"נּ";s:3:"סּ";s:4:"סּ";s:3:"ףּ";s:4:"ףּ";s:3:"פּ";s:4:"פּ";s:3:"צּ";s:4:"צּ";s:3:"קּ";s:4:"קּ";s:3:"רּ";s:4:"רּ";s:3:"שּ";s:4:"שּ";s:3:"תּ";s:4:"תּ";s:3:"וֹ";s:4:"וֹ";s:3:"בֿ";s:4:"בֿ";s:3:"כֿ";s:4:"כֿ";s:3:"פֿ";s:4:"פֿ";s:4:"𑂚";s:8:"𑂚";s:4:"𑂜";s:8:"𑂜";s:4:"𑂫";s:8:"𑂫";s:4:"𝅗𝅥";s:8:"𝅗𝅥";s:4:"𝅘𝅥";s:8:"𝅘𝅥";s:4:"𝅘𝅥𝅮";s:12:"𝅘𝅥𝅮";s:4:"𝅘𝅥𝅯";s:12:"𝅘𝅥𝅯";s:4:"𝅘𝅥𝅰";s:12:"𝅘𝅥𝅰";s:4:"𝅘𝅥𝅱";s:12:"𝅘𝅥𝅱";s:4:"𝅘𝅥𝅲";s:12:"𝅘𝅥𝅲";s:4:"𝆹𝅥";s:8:"𝆹𝅥";s:4:"𝆺𝅥";s:8:"𝆺𝅥";s:4:"𝆹𝅥𝅮";s:12:"𝆹𝅥𝅮";s:4:"𝆺𝅥𝅮";s:12:"𝆺𝅥𝅮";s:4:"𝆹𝅥𝅯";s:12:"𝆹𝅥𝅯";s:4:"𝆺𝅥𝅯";s:12:"𝆺𝅥𝅯";s:4:"丽";s:3:"丽";s:4:"丸";s:3:"丸";s:4:"乁";s:3:"乁";s:4:"𠄢";s:4:"𠄢";s:4:"你";s:3:"你";s:4:"侮";s:3:"侮";s:4:"侻";s:3:"侻";s:4:"倂";s:3:"倂";s:4:"偺";s:3:"偺";s:4:"備";s:3:"備";s:4:"僧";s:3:"僧";s:4:"像";s:3:"像";s:4:"㒞";s:3:"㒞";s:4:"𠘺";s:4:"𠘺";s:4:"免";s:3:"免";s:4:"兔";s:3:"兔";s:4:"兤";s:3:"兤";s:4:"具";s:3:"具";s:4:"𠔜";s:4:"𠔜";s:4:"㒹";s:3:"㒹";s:4:"內";s:3:"內";s:4:"再";s:3:"再";s:4:"𠕋";s:4:"𠕋";s:4:"冗";s:3:"冗";s:4:"冤";s:3:"冤";s:4:"仌";s:3:"仌";s:4:"冬";s:3:"冬";s:4:"况";s:3:"况";s:4:"𩇟";s:4:"𩇟";s:4:"凵";s:3:"凵";s:4:"刃";s:3:"刃";s:4:"㓟";s:3:"㓟";s:4:"刻";s:3:"刻";s:4:"剆";s:3:"剆";s:4:"割";s:3:"割";s:4:"剷";s:3:"剷";s:4:"㔕";s:3:"㔕";s:4:"勇";s:3:"勇";s:4:"勉";s:3:"勉";s:4:"勤";s:3:"勤";s:4:"勺";s:3:"勺";s:4:"包";s:3:"包";s:4:"匆";s:3:"匆";s:4:"北";s:3:"北";s:4:"卉";s:3:"卉";s:4:"卑";s:3:"卑";s:4:"博";s:3:"博";s:4:"即";s:3:"即";s:4:"卽";s:3:"卽";s:4:"卿";s:3:"卿";s:4:"卿";s:3:"卿";s:4:"卿";s:3:"卿";s:4:"𠨬";s:4:"𠨬";s:4:"灰";s:3:"灰";s:4:"及";s:3:"及";s:4:"叟";s:3:"叟";s:4:"𠭣";s:4:"𠭣";s:4:"叫";s:3:"叫";s:4:"叱";s:3:"叱";s:4:"吆";s:3:"吆";s:4:"咞";s:3:"咞";s:4:"吸";s:3:"吸";s:4:"呈";s:3:"呈";s:4:"周";s:3:"周";s:4:"咢";s:3:"咢";s:4:"哶";s:3:"哶";s:4:"唐";s:3:"唐";s:4:"啓";s:3:"啓";s:4:"啣";s:3:"啣";s:4:"善";s:3:"善";s:4:"善";s:3:"善";s:4:"喙";s:3:"喙";s:4:"喫";s:3:"喫";s:4:"喳";s:3:"喳";s:4:"嗂";s:3:"嗂";s:4:"圖";s:3:"圖";s:4:"嘆";s:3:"嘆";s:4:"圗";s:3:"圗";s:4:"噑";s:3:"噑";s:4:"噴";s:3:"噴";s:4:"切";s:3:"切";s:4:"壮";s:3:"壮";s:4:"城";s:3:"城";s:4:"埴";s:3:"埴";s:4:"堍";s:3:"堍";s:4:"型";s:3:"型";s:4:"堲";s:3:"堲";s:4:"報";s:3:"報";s:4:"墬";s:3:"墬";s:4:"𡓤";s:4:"𡓤";s:4:"売";s:3:"売";s:4:"壷";s:3:"壷";s:4:"夆";s:3:"夆";s:4:"多";s:3:"多";s:4:"夢";s:3:"夢";s:4:"奢";s:3:"奢";s:4:"𡚨";s:4:"𡚨";s:4:"𡛪";s:4:"𡛪";s:4:"姬";s:3:"姬";s:4:"娛";s:3:"娛";s:4:"娧";s:3:"娧";s:4:"姘";s:3:"姘";s:4:"婦";s:3:"婦";s:4:"㛮";s:3:"㛮";s:4:"㛼";s:3:"㛼";s:4:"嬈";s:3:"嬈";s:4:"嬾";s:3:"嬾";s:4:"嬾";s:3:"嬾";s:4:"𡧈";s:4:"𡧈";s:4:"寃";s:3:"寃";s:4:"寘";s:3:"寘";s:4:"寧";s:3:"寧";s:4:"寳";s:3:"寳";s:4:"𡬘";s:4:"𡬘";s:4:"寿";s:3:"寿";s:4:"将";s:3:"将";s:4:"当";s:3:"当";s:4:"尢";s:3:"尢";s:4:"㞁";s:3:"㞁";s:4:"屠";s:3:"屠";s:4:"屮";s:3:"屮";s:4:"峀";s:3:"峀";s:4:"岍";s:3:"岍";s:4:"𡷤";s:4:"𡷤";s:4:"嵃";s:3:"嵃";s:4:"𡷦";s:4:"𡷦";s:4:"嵮";s:3:"嵮";s:4:"嵫";s:3:"嵫";s:4:"嵼";s:3:"嵼";s:4:"巡";s:3:"巡";s:4:"巢";s:3:"巢";s:4:"㠯";s:3:"㠯";s:4:"巽";s:3:"巽";s:4:"帨";s:3:"帨";s:4:"帽";s:3:"帽";s:4:"幩";s:3:"幩";s:4:"㡢";s:3:"㡢";s:4:"𢆃";s:4:"𢆃";s:4:"㡼";s:3:"㡼";s:4:"庰";s:3:"庰";s:4:"庳";s:3:"庳";s:4:"庶";s:3:"庶";s:4:"廊";s:3:"廊";s:4:"𪎒";s:4:"𪎒";s:4:"廾";s:3:"廾";s:4:"𢌱";s:4:"𢌱";s:4:"𢌱";s:4:"𢌱";s:4:"舁";s:3:"舁";s:4:"弢";s:3:"弢";s:4:"弢";s:3:"弢";s:4:"㣇";s:3:"㣇";s:4:"𣊸";s:4:"𣊸";s:4:"𦇚";s:4:"𦇚";s:4:"形";s:3:"形";s:4:"彫";s:3:"彫";s:4:"㣣";s:3:"㣣";s:4:"徚";s:3:"徚";s:4:"忍";s:3:"忍";s:4:"志";s:3:"志";s:4:"忹";s:3:"忹";s:4:"悁";s:3:"悁";s:4:"㤺";s:3:"㤺";s:4:"㤜";s:3:"㤜";s:4:"悔";s:3:"悔";s:4:"𢛔";s:4:"𢛔";s:4:"惇";s:3:"惇";s:4:"慈";s:3:"慈";s:4:"慌";s:3:"慌";s:4:"慎";s:3:"慎";s:4:"慌";s:3:"慌";s:4:"慺";s:3:"慺";s:4:"憎";s:3:"憎";s:4:"憲";s:3:"憲";s:4:"憤";s:3:"憤";s:4:"憯";s:3:"憯";s:4:"懞";s:3:"懞";s:4:"懲";s:3:"懲";s:4:"懶";s:3:"懶";s:4:"成";s:3:"成";s:4:"戛";s:3:"戛";s:4:"扝";s:3:"扝";s:4:"抱";s:3:"抱";s:4:"拔";s:3:"拔";s:4:"捐";s:3:"捐";s:4:"𢬌";s:4:"𢬌";s:4:"挽";s:3:"挽";s:4:"拼";s:3:"拼";s:4:"捨";s:3:"捨";s:4:"掃";s:3:"掃";s:4:"揤";s:3:"揤";s:4:"𢯱";s:4:"𢯱";s:4:"搢";s:3:"搢";s:4:"揅";s:3:"揅";s:4:"掩";s:3:"掩";s:4:"㨮";s:3:"㨮";s:4:"摩";s:3:"摩";s:4:"摾";s:3:"摾";s:4:"撝";s:3:"撝";s:4:"摷";s:3:"摷";s:4:"㩬";s:3:"㩬";s:4:"敏";s:3:"敏";s:4:"敬";s:3:"敬";s:4:"𣀊";s:4:"𣀊";s:4:"旣";s:3:"旣";s:4:"書";s:3:"書";s:4:"晉";s:3:"晉";s:4:"㬙";s:3:"㬙";s:4:"暑";s:3:"暑";s:4:"㬈";s:3:"㬈";s:4:"㫤";s:3:"㫤";s:4:"冒";s:3:"冒";s:4:"冕";s:3:"冕";s:4:"最";s:3:"最";s:4:"暜";s:3:"暜";s:4:"肭";s:3:"肭";s:4:"䏙";s:3:"䏙";s:4:"朗";s:3:"朗";s:4:"望";s:3:"望";s:4:"朡";s:3:"朡";s:4:"杞";s:3:"杞";s:4:"杓";s:3:"杓";s:4:"𣏃";s:4:"𣏃";s:4:"㭉";s:3:"㭉";s:4:"柺";s:3:"柺";s:4:"枅";s:3:"枅";s:4:"桒";s:3:"桒";s:4:"梅";s:3:"梅";s:4:"𣑭";s:4:"𣑭";s:4:"梎";s:3:"梎";s:4:"栟";s:3:"栟";s:4:"椔";s:3:"椔";s:4:"㮝";s:3:"㮝";s:4:"楂";s:3:"楂";s:4:"榣";s:3:"榣";s:4:"槪";s:3:"槪";s:4:"檨";s:3:"檨";s:4:"𣚣";s:4:"𣚣";s:4:"櫛";s:3:"櫛";s:4:"㰘";s:3:"㰘";s:4:"次";s:3:"次";s:4:"𣢧";s:4:"𣢧";s:4:"歔";s:3:"歔";s:4:"㱎";s:3:"㱎";s:4:"歲";s:3:"歲";s:4:"殟";s:3:"殟";s:4:"殺";s:3:"殺";s:4:"殻";s:3:"殻";s:4:"𣪍";s:4:"𣪍";s:4:"𡴋";s:4:"𡴋";s:4:"𣫺";s:4:"𣫺";s:4:"汎";s:3:"汎";s:4:"𣲼";s:4:"𣲼";s:4:"沿";s:3:"沿";s:4:"泍";s:3:"泍";s:4:"汧";s:3:"汧";s:4:"洖";s:3:"洖";s:4:"派";s:3:"派";s:4:"海";s:3:"海";s:4:"流";s:3:"流";s:4:"浩";s:3:"浩";s:4:"浸";s:3:"浸";s:4:"涅";s:3:"涅";s:4:"𣴞";s:4:"𣴞";s:4:"洴";s:3:"洴";s:4:"港";s:3:"港";s:4:"湮";s:3:"湮";s:4:"㴳";s:3:"㴳";s:4:"滋";s:3:"滋";s:4:"滇";s:3:"滇";s:4:"𣻑";s:4:"𣻑";s:4:"淹";s:3:"淹";s:4:"潮";s:3:"潮";s:4:"𣽞";s:4:"𣽞";s:4:"𣾎";s:4:"𣾎";s:4:"濆";s:3:"濆";s:4:"瀹";s:3:"瀹";s:4:"瀞";s:3:"瀞";s:4:"瀛";s:3:"瀛";s:4:"㶖";s:3:"㶖";s:4:"灊";s:3:"灊";s:4:"災";s:3:"災";s:4:"灷";s:3:"灷";s:4:"炭";s:3:"炭";s:4:"𠔥";s:4:"𠔥";s:4:"煅";s:3:"煅";s:4:"𤉣";s:4:"𤉣";s:4:"熜";s:3:"熜";s:4:"𤎫";s:4:"𤎫";s:4:"爨";s:3:"爨";s:4:"爵";s:3:"爵";s:4:"牐";s:3:"牐";s:4:"𤘈";s:4:"𤘈";s:4:"犀";s:3:"犀";s:4:"犕";s:3:"犕";s:4:"𤜵";s:4:"𤜵";s:4:"𤠔";s:4:"𤠔";s:4:"獺";s:3:"獺";s:4:"王";s:3:"王";s:4:"㺬";s:3:"㺬";s:4:"玥";s:3:"玥";s:4:"㺸";s:3:"㺸";s:4:"㺸";s:3:"㺸";s:4:"瑇";s:3:"瑇";s:4:"瑜";s:3:"瑜";s:4:"瑱";s:3:"瑱";s:4:"璅";s:3:"璅";s:4:"瓊";s:3:"瓊";s:4:"㼛";s:3:"㼛";s:4:"甤";s:3:"甤";s:4:"𤰶";s:4:"𤰶";s:4:"甾";s:3:"甾";s:4:"𤲒";s:4:"𤲒";s:4:"異";s:3:"異";s:4:"𢆟";s:4:"𢆟";s:4:"瘐";s:3:"瘐";s:4:"𤾡";s:4:"𤾡";s:4:"𤾸";s:4:"𤾸";s:4:"𥁄";s:4:"𥁄";s:4:"㿼";s:3:"㿼";s:4:"䀈";s:3:"䀈";s:4:"直";s:3:"直";s:4:"𥃳";s:4:"𥃳";s:4:"𥃲";s:4:"𥃲";s:4:"𥄙";s:4:"𥄙";s:4:"𥄳";s:4:"𥄳";s:4:"眞";s:3:"眞";s:4:"真";s:3:"真";s:4:"真";s:3:"真";s:4:"睊";s:3:"睊";s:4:"䀹";s:3:"䀹";s:4:"瞋";s:3:"瞋";s:4:"䁆";s:3:"䁆";s:4:"䂖";s:3:"䂖";s:4:"𥐝";s:4:"𥐝";s:4:"硎";s:3:"硎";s:4:"碌";s:3:"碌";s:4:"磌";s:3:"磌";s:4:"䃣";s:3:"䃣";s:4:"𥘦";s:4:"𥘦";s:4:"祖";s:3:"祖";s:4:"𥚚";s:4:"𥚚";s:4:"𥛅";s:4:"𥛅";s:4:"福";s:3:"福";s:4:"秫";s:3:"秫";s:4:"䄯";s:3:"䄯";s:4:"穀";s:3:"穀";s:4:"穊";s:3:"穊";s:4:"穏";s:3:"穏";s:4:"𥥼";s:4:"𥥼";s:4:"𥪧";s:4:"𥪧";s:4:"𥪧";s:4:"𥪧";s:4:"竮";s:3:"竮";s:4:"䈂";s:3:"䈂";s:4:"𥮫";s:4:"𥮫";s:4:"篆";s:3:"篆";s:4:"築";s:3:"築";s:4:"䈧";s:3:"䈧";s:4:"𥲀";s:4:"𥲀";s:4:"糒";s:3:"糒";s:4:"䊠";s:3:"䊠";s:4:"糨";s:3:"糨";s:4:"糣";s:3:"糣";s:4:"紀";s:3:"紀";s:4:"𥾆";s:4:"𥾆";s:4:"絣";s:3:"絣";s:4:"䌁";s:3:"䌁";s:4:"緇";s:3:"緇";s:4:"縂";s:3:"縂";s:4:"繅";s:3:"繅";s:4:"䌴";s:3:"䌴";s:4:"𦈨";s:4:"𦈨";s:4:"𦉇";s:4:"𦉇";s:4:"䍙";s:3:"䍙";s:4:"𦋙";s:4:"𦋙";s:4:"罺";s:3:"罺";s:4:"𦌾";s:4:"𦌾";s:4:"羕";s:3:"羕";s:4:"翺";s:3:"翺";s:4:"者";s:3:"者";s:4:"𦓚";s:4:"𦓚";s:4:"𦔣";s:4:"𦔣";s:4:"聠";s:3:"聠";s:4:"𦖨";s:4:"𦖨";s:4:"聰";s:3:"聰";s:4:"𣍟";s:4:"𣍟";s:4:"䏕";s:3:"䏕";s:4:"育";s:3:"育";s:4:"脃";s:3:"脃";s:4:"䐋";s:3:"䐋";s:4:"脾";s:3:"脾";s:4:"媵";s:3:"媵";s:4:"𦞧";s:4:"𦞧";s:4:"𦞵";s:4:"𦞵";s:4:"𣎓";s:4:"𣎓";s:4:"𣎜";s:4:"𣎜";s:4:"舁";s:3:"舁";s:4:"舄";s:3:"舄";s:4:"辞";s:3:"辞";s:4:"䑫";s:3:"䑫";s:4:"芑";s:3:"芑";s:4:"芋";s:3:"芋";s:4:"芝";s:3:"芝";s:4:"劳";s:3:"劳";s:4:"花";s:3:"花";s:4:"芳";s:3:"芳";s:4:"芽";s:3:"芽";s:4:"苦";s:3:"苦";s:4:"𦬼";s:4:"𦬼";s:4:"若";s:3:"若";s:4:"茝";s:3:"茝";s:4:"荣";s:3:"荣";s:4:"莭";s:3:"莭";s:4:"茣";s:3:"茣";s:4:"莽";s:3:"莽";s:4:"菧";s:3:"菧";s:4:"著";s:3:"著";s:4:"荓";s:3:"荓";s:4:"菊";s:3:"菊";s:4:"菌";s:3:"菌";s:4:"菜";s:3:"菜";s:4:"𦰶";s:4:"𦰶";s:4:"𦵫";s:4:"𦵫";s:4:"𦳕";s:4:"𦳕";s:4:"䔫";s:3:"䔫";s:4:"蓱";s:3:"蓱";s:4:"蓳";s:3:"蓳";s:4:"蔖";s:3:"蔖";s:4:"𧏊";s:4:"𧏊";s:4:"蕤";s:3:"蕤";s:4:"𦼬";s:4:"𦼬";s:4:"䕝";s:3:"䕝";s:4:"䕡";s:3:"䕡";s:4:"𦾱";s:4:"𦾱";s:4:"𧃒";s:4:"𧃒";s:4:"䕫";s:3:"䕫";s:4:"虐";s:3:"虐";s:4:"虜";s:3:"虜";s:4:"虧";s:3:"虧";s:4:"虩";s:3:"虩";s:4:"蚩";s:3:"蚩";s:4:"蚈";s:3:"蚈";s:4:"蜎";s:3:"蜎";s:4:"蛢";s:3:"蛢";s:4:"蝹";s:3:"蝹";s:4:"蜨";s:3:"蜨";s:4:"蝫";s:3:"蝫";s:4:"螆";s:3:"螆";s:4:"䗗";s:3:"䗗";s:4:"蟡";s:3:"蟡";s:4:"蠁";s:3:"蠁";s:4:"䗹";s:3:"䗹";s:4:"衠";s:3:"衠";s:4:"衣";s:3:"衣";s:4:"𧙧";s:4:"𧙧";s:4:"裗";s:3:"裗";s:4:"裞";s:3:"裞";s:4:"䘵";s:3:"䘵";s:4:"裺";s:3:"裺";s:4:"㒻";s:3:"㒻";s:4:"𧢮";s:4:"𧢮";s:4:"𧥦";s:4:"𧥦";s:4:"䚾";s:3:"䚾";s:4:"䛇";s:3:"䛇";s:4:"誠";s:3:"誠";s:4:"諭";s:3:"諭";s:4:"變";s:3:"變";s:4:"豕";s:3:"豕";s:4:"𧲨";s:4:"𧲨";s:4:"貫";s:3:"貫";s:4:"賁";s:3:"賁";s:4:"贛";s:3:"贛";s:4:"起";s:3:"起";s:4:"𧼯";s:4:"𧼯";s:4:"𠠄";s:4:"𠠄";s:4:"跋";s:3:"跋";s:4:"趼";s:3:"趼";s:4:"跰";s:3:"跰";s:4:"𠣞";s:4:"𠣞";s:4:"軔";s:3:"軔";s:4:"輸";s:3:"輸";s:4:"𨗒";s:4:"𨗒";s:4:"𨗭";s:4:"𨗭";s:4:"邔";s:3:"邔";s:4:"郱";s:3:"郱";s:4:"鄑";s:3:"鄑";s:4:"𨜮";s:4:"𨜮";s:4:"鄛";s:3:"鄛";s:4:"鈸";s:3:"鈸";s:4:"鋗";s:3:"鋗";s:4:"鋘";s:3:"鋘";s:4:"鉼";s:3:"鉼";s:4:"鏹";s:3:"鏹";s:4:"鐕";s:3:"鐕";s:4:"𨯺";s:4:"𨯺";s:4:"開";s:3:"開";s:4:"䦕";s:3:"䦕";s:4:"閷";s:3:"閷";s:4:"𨵷";s:4:"𨵷";s:4:"䧦";s:3:"䧦";s:4:"雃";s:3:"雃";s:4:"嶲";s:3:"嶲";s:4:"霣";s:3:"霣";s:4:"𩅅";s:4:"𩅅";s:4:"𩈚";s:4:"𩈚";s:4:"䩮";s:3:"䩮";s:4:"䩶";s:3:"䩶";s:4:"韠";s:3:"韠";s:4:"𩐊";s:4:"𩐊";s:4:"䪲";s:3:"䪲";s:4:"𩒖";s:4:"𩒖";s:4:"頋";s:3:"頋";s:4:"頋";s:3:"頋";s:4:"頩";s:3:"頩";s:4:"𩖶";s:4:"𩖶";s:4:"飢";s:3:"飢";s:4:"䬳";s:3:"䬳";s:4:"餩";s:3:"餩";s:4:"馧";s:3:"馧";s:4:"駂";s:3:"駂";s:4:"駾";s:3:"駾";s:4:"䯎";s:3:"䯎";s:4:"𩬰";s:4:"𩬰";s:4:"鬒";s:3:"鬒";s:4:"鱀";s:3:"鱀";s:4:"鳽";s:3:"鳽";s:4:"䳎";s:3:"䳎";s:4:"䳭";s:3:"䳭";s:4:"鵧";s:3:"鵧";s:4:"𪃎";s:4:"𪃎";s:4:"䳸";s:3:"䳸";s:4:"𪄅";s:4:"𪄅";s:4:"𪈎";s:4:"𪈎";s:4:"𪊑";s:4:"𪊑";s:4:"麻";s:3:"麻";s:4:"䵖";s:3:"䵖";s:4:"黹";s:3:"黹";s:4:"黾";s:3:"黾";s:4:"鼅";s:3:"鼅";s:4:"鼏";s:3:"鼏";s:4:"鼖";s:3:"鼖";s:4:"鼻";s:3:"鼻";s:4:"𪘀";s:4:"𪘀";}' );
-UtfNormal::$utfCheckNFC = unserialize( 'a:1221:{s:2:"̀";s:1:"N";s:2:"́";s:1:"N";s:2:"̓";s:1:"N";s:2:"̈́";s:1:"N";s:2:"ʹ";s:1:"N";s:2:";";s:1:"N";s:2:"·";s:1:"N";s:3:"क़";s:1:"N";s:3:"ख़";s:1:"N";s:3:"ग़";s:1:"N";s:3:"ज़";s:1:"N";s:3:"ड़";s:1:"N";s:3:"ढ़";s:1:"N";s:3:"फ़";s:1:"N";s:3:"य़";s:1:"N";s:3:"ড়";s:1:"N";s:3:"ঢ়";s:1:"N";s:3:"য়";s:1:"N";s:3:"ਲ਼";s:1:"N";s:3:"ਸ਼";s:1:"N";s:3:"ਖ਼";s:1:"N";s:3:"ਗ਼";s:1:"N";s:3:"ਜ਼";s:1:"N";s:3:"ਫ਼";s:1:"N";s:3:"ଡ଼";s:1:"N";s:3:"ଢ଼";s:1:"N";s:3:"གྷ";s:1:"N";s:3:"ཌྷ";s:1:"N";s:3:"དྷ";s:1:"N";s:3:"བྷ";s:1:"N";s:3:"ཛྷ";s:1:"N";s:3:"ཀྵ";s:1:"N";s:3:"ཱི";s:1:"N";s:3:"ཱུ";s:1:"N";s:3:"ྲྀ";s:1:"N";s:3:"ླྀ";s:1:"N";s:3:"ཱྀ";s:1:"N";s:3:"ྒྷ";s:1:"N";s:3:"ྜྷ";s:1:"N";s:3:"ྡྷ";s:1:"N";s:3:"ྦྷ";s:1:"N";s:3:"ྫྷ";s:1:"N";s:3:"ྐྵ";s:1:"N";s:3:"ά";s:1:"N";s:3:"έ";s:1:"N";s:3:"ή";s:1:"N";s:3:"ί";s:1:"N";s:3:"ό";s:1:"N";s:3:"ύ";s:1:"N";s:3:"ώ";s:1:"N";s:3:"Ά";s:1:"N";s:3:"ι";s:1:"N";s:3:"Έ";s:1:"N";s:3:"Ή";s:1:"N";s:3:"ΐ";s:1:"N";s:3:"Ί";s:1:"N";s:3:"ΰ";s:1:"N";s:3:"Ύ";s:1:"N";s:3:"΅";s:1:"N";s:3:"`";s:1:"N";s:3:"Ό";s:1:"N";s:3:"Ώ";s:1:"N";s:3:"´";s:1:"N";s:3:" ";s:1:"N";s:3:" ";s:1:"N";s:3:"Ω";s:1:"N";s:3:"K";s:1:"N";s:3:"Å";s:1:"N";s:3:"〈";s:1:"N";s:3:"〉";s:1:"N";s:3:"⫝̸";s:1:"N";s:3:"豈";s:1:"N";s:3:"更";s:1:"N";s:3:"車";s:1:"N";s:3:"賈";s:1:"N";s:3:"滑";s:1:"N";s:3:"串";s:1:"N";s:3:"句";s:1:"N";s:3:"龜";s:1:"N";s:3:"龜";s:1:"N";s:3:"契";s:1:"N";s:3:"金";s:1:"N";s:3:"喇";s:1:"N";s:3:"奈";s:1:"N";s:3:"懶";s:1:"N";s:3:"癩";s:1:"N";s:3:"羅";s:1:"N";s:3:"蘿";s:1:"N";s:3:"螺";s:1:"N";s:3:"裸";s:1:"N";s:3:"邏";s:1:"N";s:3:"樂";s:1:"N";s:3:"洛";s:1:"N";s:3:"烙";s:1:"N";s:3:"珞";s:1:"N";s:3:"落";s:1:"N";s:3:"酪";s:1:"N";s:3:"駱";s:1:"N";s:3:"亂";s:1:"N";s:3:"卵";s:1:"N";s:3:"欄";s:1:"N";s:3:"爛";s:1:"N";s:3:"蘭";s:1:"N";s:3:"鸞";s:1:"N";s:3:"嵐";s:1:"N";s:3:"濫";s:1:"N";s:3:"藍";s:1:"N";s:3:"襤";s:1:"N";s:3:"拉";s:1:"N";s:3:"臘";s:1:"N";s:3:"蠟";s:1:"N";s:3:"廊";s:1:"N";s:3:"朗";s:1:"N";s:3:"浪";s:1:"N";s:3:"狼";s:1:"N";s:3:"郎";s:1:"N";s:3:"來";s:1:"N";s:3:"冷";s:1:"N";s:3:"勞";s:1:"N";s:3:"擄";s:1:"N";s:3:"櫓";s:1:"N";s:3:"爐";s:1:"N";s:3:"盧";s:1:"N";s:3:"老";s:1:"N";s:3:"蘆";s:1:"N";s:3:"虜";s:1:"N";s:3:"路";s:1:"N";s:3:"露";s:1:"N";s:3:"魯";s:1:"N";s:3:"鷺";s:1:"N";s:3:"碌";s:1:"N";s:3:"祿";s:1:"N";s:3:"綠";s:1:"N";s:3:"菉";s:1:"N";s:3:"錄";s:1:"N";s:3:"鹿";s:1:"N";s:3:"論";s:1:"N";s:3:"壟";s:1:"N";s:3:"弄";s:1:"N";s:3:"籠";s:1:"N";s:3:"聾";s:1:"N";s:3:"牢";s:1:"N";s:3:"磊";s:1:"N";s:3:"賂";s:1:"N";s:3:"雷";s:1:"N";s:3:"壘";s:1:"N";s:3:"屢";s:1:"N";s:3:"樓";s:1:"N";s:3:"淚";s:1:"N";s:3:"漏";s:1:"N";s:3:"累";s:1:"N";s:3:"縷";s:1:"N";s:3:"陋";s:1:"N";s:3:"勒";s:1:"N";s:3:"肋";s:1:"N";s:3:"凜";s:1:"N";s:3:"凌";s:1:"N";s:3:"稜";s:1:"N";s:3:"綾";s:1:"N";s:3:"菱";s:1:"N";s:3:"陵";s:1:"N";s:3:"讀";s:1:"N";s:3:"拏";s:1:"N";s:3:"樂";s:1:"N";s:3:"諾";s:1:"N";s:3:"丹";s:1:"N";s:3:"寧";s:1:"N";s:3:"怒";s:1:"N";s:3:"率";s:1:"N";s:3:"異";s:1:"N";s:3:"北";s:1:"N";s:3:"磻";s:1:"N";s:3:"便";s:1:"N";s:3:"復";s:1:"N";s:3:"不";s:1:"N";s:3:"泌";s:1:"N";s:3:"數";s:1:"N";s:3:"索";s:1:"N";s:3:"參";s:1:"N";s:3:"塞";s:1:"N";s:3:"省";s:1:"N";s:3:"葉";s:1:"N";s:3:"說";s:1:"N";s:3:"殺";s:1:"N";s:3:"辰";s:1:"N";s:3:"沈";s:1:"N";s:3:"拾";s:1:"N";s:3:"若";s:1:"N";s:3:"掠";s:1:"N";s:3:"略";s:1:"N";s:3:"亮";s:1:"N";s:3:"兩";s:1:"N";s:3:"凉";s:1:"N";s:3:"梁";s:1:"N";s:3:"糧";s:1:"N";s:3:"良";s:1:"N";s:3:"諒";s:1:"N";s:3:"量";s:1:"N";s:3:"勵";s:1:"N";s:3:"呂";s:1:"N";s:3:"女";s:1:"N";s:3:"廬";s:1:"N";s:3:"旅";s:1:"N";s:3:"濾";s:1:"N";s:3:"礪";s:1:"N";s:3:"閭";s:1:"N";s:3:"驪";s:1:"N";s:3:"麗";s:1:"N";s:3:"黎";s:1:"N";s:3:"力";s:1:"N";s:3:"曆";s:1:"N";s:3:"歷";s:1:"N";s:3:"轢";s:1:"N";s:3:"年";s:1:"N";s:3:"憐";s:1:"N";s:3:"戀";s:1:"N";s:3:"撚";s:1:"N";s:3:"漣";s:1:"N";s:3:"煉";s:1:"N";s:3:"璉";s:1:"N";s:3:"秊";s:1:"N";s:3:"練";s:1:"N";s:3:"聯";s:1:"N";s:3:"輦";s:1:"N";s:3:"蓮";s:1:"N";s:3:"連";s:1:"N";s:3:"鍊";s:1:"N";s:3:"列";s:1:"N";s:3:"劣";s:1:"N";s:3:"咽";s:1:"N";s:3:"烈";s:1:"N";s:3:"裂";s:1:"N";s:3:"說";s:1:"N";s:3:"廉";s:1:"N";s:3:"念";s:1:"N";s:3:"捻";s:1:"N";s:3:"殮";s:1:"N";s:3:"簾";s:1:"N";s:3:"獵";s:1:"N";s:3:"令";s:1:"N";s:3:"囹";s:1:"N";s:3:"寧";s:1:"N";s:3:"嶺";s:1:"N";s:3:"怜";s:1:"N";s:3:"玲";s:1:"N";s:3:"瑩";s:1:"N";s:3:"羚";s:1:"N";s:3:"聆";s:1:"N";s:3:"鈴";s:1:"N";s:3:"零";s:1:"N";s:3:"靈";s:1:"N";s:3:"領";s:1:"N";s:3:"例";s:1:"N";s:3:"禮";s:1:"N";s:3:"醴";s:1:"N";s:3:"隸";s:1:"N";s:3:"惡";s:1:"N";s:3:"了";s:1:"N";s:3:"僚";s:1:"N";s:3:"寮";s:1:"N";s:3:"尿";s:1:"N";s:3:"料";s:1:"N";s:3:"樂";s:1:"N";s:3:"燎";s:1:"N";s:3:"療";s:1:"N";s:3:"蓼";s:1:"N";s:3:"遼";s:1:"N";s:3:"龍";s:1:"N";s:3:"暈";s:1:"N";s:3:"阮";s:1:"N";s:3:"劉";s:1:"N";s:3:"杻";s:1:"N";s:3:"柳";s:1:"N";s:3:"流";s:1:"N";s:3:"溜";s:1:"N";s:3:"琉";s:1:"N";s:3:"留";s:1:"N";s:3:"硫";s:1:"N";s:3:"紐";s:1:"N";s:3:"類";s:1:"N";s:3:"六";s:1:"N";s:3:"戮";s:1:"N";s:3:"陸";s:1:"N";s:3:"倫";s:1:"N";s:3:"崙";s:1:"N";s:3:"淪";s:1:"N";s:3:"輪";s:1:"N";s:3:"律";s:1:"N";s:3:"慄";s:1:"N";s:3:"栗";s:1:"N";s:3:"率";s:1:"N";s:3:"隆";s:1:"N";s:3:"利";s:1:"N";s:3:"吏";s:1:"N";s:3:"履";s:1:"N";s:3:"易";s:1:"N";s:3:"李";s:1:"N";s:3:"梨";s:1:"N";s:3:"泥";s:1:"N";s:3:"理";s:1:"N";s:3:"痢";s:1:"N";s:3:"罹";s:1:"N";s:3:"裏";s:1:"N";s:3:"裡";s:1:"N";s:3:"里";s:1:"N";s:3:"離";s:1:"N";s:3:"匿";s:1:"N";s:3:"溺";s:1:"N";s:3:"吝";s:1:"N";s:3:"燐";s:1:"N";s:3:"璘";s:1:"N";s:3:"藺";s:1:"N";s:3:"隣";s:1:"N";s:3:"鱗";s:1:"N";s:3:"麟";s:1:"N";s:3:"林";s:1:"N";s:3:"淋";s:1:"N";s:3:"臨";s:1:"N";s:3:"立";s:1:"N";s:3:"笠";s:1:"N";s:3:"粒";s:1:"N";s:3:"狀";s:1:"N";s:3:"炙";s:1:"N";s:3:"識";s:1:"N";s:3:"什";s:1:"N";s:3:"茶";s:1:"N";s:3:"刺";s:1:"N";s:3:"切";s:1:"N";s:3:"度";s:1:"N";s:3:"拓";s:1:"N";s:3:"糖";s:1:"N";s:3:"宅";s:1:"N";s:3:"洞";s:1:"N";s:3:"暴";s:1:"N";s:3:"輻";s:1:"N";s:3:"行";s:1:"N";s:3:"降";s:1:"N";s:3:"見";s:1:"N";s:3:"廓";s:1:"N";s:3:"兀";s:1:"N";s:3:"嗀";s:1:"N";s:3:"塚";s:1:"N";s:3:"晴";s:1:"N";s:3:"凞";s:1:"N";s:3:"猪";s:1:"N";s:3:"益";s:1:"N";s:3:"礼";s:1:"N";s:3:"神";s:1:"N";s:3:"祥";s:1:"N";s:3:"福";s:1:"N";s:3:"靖";s:1:"N";s:3:"精";s:1:"N";s:3:"羽";s:1:"N";s:3:"蘒";s:1:"N";s:3:"諸";s:1:"N";s:3:"逸";s:1:"N";s:3:"都";s:1:"N";s:3:"飯";s:1:"N";s:3:"飼";s:1:"N";s:3:"館";s:1:"N";s:3:"鶴";s:1:"N";s:3:"侮";s:1:"N";s:3:"僧";s:1:"N";s:3:"免";s:1:"N";s:3:"勉";s:1:"N";s:3:"勤";s:1:"N";s:3:"卑";s:1:"N";s:3:"喝";s:1:"N";s:3:"嘆";s:1:"N";s:3:"器";s:1:"N";s:3:"塀";s:1:"N";s:3:"墨";s:1:"N";s:3:"層";s:1:"N";s:3:"屮";s:1:"N";s:3:"悔";s:1:"N";s:3:"慨";s:1:"N";s:3:"憎";s:1:"N";s:3:"懲";s:1:"N";s:3:"敏";s:1:"N";s:3:"既";s:1:"N";s:3:"暑";s:1:"N";s:3:"梅";s:1:"N";s:3:"海";s:1:"N";s:3:"渚";s:1:"N";s:3:"漢";s:1:"N";s:3:"煮";s:1:"N";s:3:"爫";s:1:"N";s:3:"琢";s:1:"N";s:3:"碑";s:1:"N";s:3:"社";s:1:"N";s:3:"祉";s:1:"N";s:3:"祈";s:1:"N";s:3:"祐";s:1:"N";s:3:"祖";s:1:"N";s:3:"祝";s:1:"N";s:3:"禍";s:1:"N";s:3:"禎";s:1:"N";s:3:"穀";s:1:"N";s:3:"突";s:1:"N";s:3:"節";s:1:"N";s:3:"練";s:1:"N";s:3:"縉";s:1:"N";s:3:"繁";s:1:"N";s:3:"署";s:1:"N";s:3:"者";s:1:"N";s:3:"臭";s:1:"N";s:3:"艹";s:1:"N";s:3:"艹";s:1:"N";s:3:"著";s:1:"N";s:3:"褐";s:1:"N";s:3:"視";s:1:"N";s:3:"謁";s:1:"N";s:3:"謹";s:1:"N";s:3:"賓";s:1:"N";s:3:"贈";s:1:"N";s:3:"辶";s:1:"N";s:3:"逸";s:1:"N";s:3:"難";s:1:"N";s:3:"響";s:1:"N";s:3:"頻";s:1:"N";s:3:"恵";s:1:"N";s:3:"𤋮";s:1:"N";s:3:"舘";s:1:"N";s:3:"並";s:1:"N";s:3:"况";s:1:"N";s:3:"全";s:1:"N";s:3:"侀";s:1:"N";s:3:"充";s:1:"N";s:3:"冀";s:1:"N";s:3:"勇";s:1:"N";s:3:"勺";s:1:"N";s:3:"喝";s:1:"N";s:3:"啕";s:1:"N";s:3:"喙";s:1:"N";s:3:"嗢";s:1:"N";s:3:"塚";s:1:"N";s:3:"墳";s:1:"N";s:3:"奄";s:1:"N";s:3:"奔";s:1:"N";s:3:"婢";s:1:"N";s:3:"嬨";s:1:"N";s:3:"廒";s:1:"N";s:3:"廙";s:1:"N";s:3:"彩";s:1:"N";s:3:"徭";s:1:"N";s:3:"惘";s:1:"N";s:3:"慎";s:1:"N";s:3:"愈";s:1:"N";s:3:"憎";s:1:"N";s:3:"慠";s:1:"N";s:3:"懲";s:1:"N";s:3:"戴";s:1:"N";s:3:"揄";s:1:"N";s:3:"搜";s:1:"N";s:3:"摒";s:1:"N";s:3:"敖";s:1:"N";s:3:"晴";s:1:"N";s:3:"朗";s:1:"N";s:3:"望";s:1:"N";s:3:"杖";s:1:"N";s:3:"歹";s:1:"N";s:3:"殺";s:1:"N";s:3:"流";s:1:"N";s:3:"滛";s:1:"N";s:3:"滋";s:1:"N";s:3:"漢";s:1:"N";s:3:"瀞";s:1:"N";s:3:"煮";s:1:"N";s:3:"瞧";s:1:"N";s:3:"爵";s:1:"N";s:3:"犯";s:1:"N";s:3:"猪";s:1:"N";s:3:"瑱";s:1:"N";s:3:"甆";s:1:"N";s:3:"画";s:1:"N";s:3:"瘝";s:1:"N";s:3:"瘟";s:1:"N";s:3:"益";s:1:"N";s:3:"盛";s:1:"N";s:3:"直";s:1:"N";s:3:"睊";s:1:"N";s:3:"着";s:1:"N";s:3:"磌";s:1:"N";s:3:"窱";s:1:"N";s:3:"節";s:1:"N";s:3:"类";s:1:"N";s:3:"絛";s:1:"N";s:3:"練";s:1:"N";s:3:"缾";s:1:"N";s:3:"者";s:1:"N";s:3:"荒";s:1:"N";s:3:"華";s:1:"N";s:3:"蝹";s:1:"N";s:3:"襁";s:1:"N";s:3:"覆";s:1:"N";s:3:"視";s:1:"N";s:3:"調";s:1:"N";s:3:"諸";s:1:"N";s:3:"請";s:1:"N";s:3:"謁";s:1:"N";s:3:"諾";s:1:"N";s:3:"諭";s:1:"N";s:3:"謹";s:1:"N";s:3:"變";s:1:"N";s:3:"贈";s:1:"N";s:3:"輸";s:1:"N";s:3:"遲";s:1:"N";s:3:"醙";s:1:"N";s:3:"鉶";s:1:"N";s:3:"陼";s:1:"N";s:3:"難";s:1:"N";s:3:"靖";s:1:"N";s:3:"韛";s:1:"N";s:3:"響";s:1:"N";s:3:"頋";s:1:"N";s:3:"頻";s:1:"N";s:3:"鬒";s:1:"N";s:3:"龜";s:1:"N";s:3:"𢡊";s:1:"N";s:3:"𢡄";s:1:"N";s:3:"𣏕";s:1:"N";s:3:"㮝";s:1:"N";s:3:"䀘";s:1:"N";s:3:"䀹";s:1:"N";s:3:"𥉉";s:1:"N";s:3:"𥳐";s:1:"N";s:3:"𧻓";s:1:"N";s:3:"齃";s:1:"N";s:3:"龎";s:1:"N";s:3:"יִ";s:1:"N";s:3:"ײַ";s:1:"N";s:3:"שׁ";s:1:"N";s:3:"שׂ";s:1:"N";s:3:"שּׁ";s:1:"N";s:3:"שּׂ";s:1:"N";s:3:"אַ";s:1:"N";s:3:"אָ";s:1:"N";s:3:"אּ";s:1:"N";s:3:"בּ";s:1:"N";s:3:"גּ";s:1:"N";s:3:"דּ";s:1:"N";s:3:"הּ";s:1:"N";s:3:"וּ";s:1:"N";s:3:"זּ";s:1:"N";s:3:"טּ";s:1:"N";s:3:"יּ";s:1:"N";s:3:"ךּ";s:1:"N";s:3:"כּ";s:1:"N";s:3:"לּ";s:1:"N";s:3:"מּ";s:1:"N";s:3:"נּ";s:1:"N";s:3:"סּ";s:1:"N";s:3:"ףּ";s:1:"N";s:3:"פּ";s:1:"N";s:3:"צּ";s:1:"N";s:3:"קּ";s:1:"N";s:3:"רּ";s:1:"N";s:3:"שּ";s:1:"N";s:3:"תּ";s:1:"N";s:3:"וֹ";s:1:"N";s:3:"בֿ";s:1:"N";s:3:"כֿ";s:1:"N";s:3:"פֿ";s:1:"N";s:4:"𝅗𝅥";s:1:"N";s:4:"𝅘𝅥";s:1:"N";s:4:"𝅘𝅥𝅮";s:1:"N";s:4:"𝅘𝅥𝅯";s:1:"N";s:4:"𝅘𝅥𝅰";s:1:"N";s:4:"𝅘𝅥𝅱";s:1:"N";s:4:"𝅘𝅥𝅲";s:1:"N";s:4:"𝆹𝅥";s:1:"N";s:4:"𝆺𝅥";s:1:"N";s:4:"𝆹𝅥𝅮";s:1:"N";s:4:"𝆺𝅥𝅮";s:1:"N";s:4:"𝆹𝅥𝅯";s:1:"N";s:4:"𝆺𝅥𝅯";s:1:"N";s:4:"丽";s:1:"N";s:4:"丸";s:1:"N";s:4:"乁";s:1:"N";s:4:"𠄢";s:1:"N";s:4:"你";s:1:"N";s:4:"侮";s:1:"N";s:4:"侻";s:1:"N";s:4:"倂";s:1:"N";s:4:"偺";s:1:"N";s:4:"備";s:1:"N";s:4:"僧";s:1:"N";s:4:"像";s:1:"N";s:4:"㒞";s:1:"N";s:4:"𠘺";s:1:"N";s:4:"免";s:1:"N";s:4:"兔";s:1:"N";s:4:"兤";s:1:"N";s:4:"具";s:1:"N";s:4:"𠔜";s:1:"N";s:4:"㒹";s:1:"N";s:4:"內";s:1:"N";s:4:"再";s:1:"N";s:4:"𠕋";s:1:"N";s:4:"冗";s:1:"N";s:4:"冤";s:1:"N";s:4:"仌";s:1:"N";s:4:"冬";s:1:"N";s:4:"况";s:1:"N";s:4:"𩇟";s:1:"N";s:4:"凵";s:1:"N";s:4:"刃";s:1:"N";s:4:"㓟";s:1:"N";s:4:"刻";s:1:"N";s:4:"剆";s:1:"N";s:4:"割";s:1:"N";s:4:"剷";s:1:"N";s:4:"㔕";s:1:"N";s:4:"勇";s:1:"N";s:4:"勉";s:1:"N";s:4:"勤";s:1:"N";s:4:"勺";s:1:"N";s:4:"包";s:1:"N";s:4:"匆";s:1:"N";s:4:"北";s:1:"N";s:4:"卉";s:1:"N";s:4:"卑";s:1:"N";s:4:"博";s:1:"N";s:4:"即";s:1:"N";s:4:"卽";s:1:"N";s:4:"卿";s:1:"N";s:4:"卿";s:1:"N";s:4:"卿";s:1:"N";s:4:"𠨬";s:1:"N";s:4:"灰";s:1:"N";s:4:"及";s:1:"N";s:4:"叟";s:1:"N";s:4:"𠭣";s:1:"N";s:4:"叫";s:1:"N";s:4:"叱";s:1:"N";s:4:"吆";s:1:"N";s:4:"咞";s:1:"N";s:4:"吸";s:1:"N";s:4:"呈";s:1:"N";s:4:"周";s:1:"N";s:4:"咢";s:1:"N";s:4:"哶";s:1:"N";s:4:"唐";s:1:"N";s:4:"啓";s:1:"N";s:4:"啣";s:1:"N";s:4:"善";s:1:"N";s:4:"善";s:1:"N";s:4:"喙";s:1:"N";s:4:"喫";s:1:"N";s:4:"喳";s:1:"N";s:4:"嗂";s:1:"N";s:4:"圖";s:1:"N";s:4:"嘆";s:1:"N";s:4:"圗";s:1:"N";s:4:"噑";s:1:"N";s:4:"噴";s:1:"N";s:4:"切";s:1:"N";s:4:"壮";s:1:"N";s:4:"城";s:1:"N";s:4:"埴";s:1:"N";s:4:"堍";s:1:"N";s:4:"型";s:1:"N";s:4:"堲";s:1:"N";s:4:"報";s:1:"N";s:4:"墬";s:1:"N";s:4:"𡓤";s:1:"N";s:4:"売";s:1:"N";s:4:"壷";s:1:"N";s:4:"夆";s:1:"N";s:4:"多";s:1:"N";s:4:"夢";s:1:"N";s:4:"奢";s:1:"N";s:4:"𡚨";s:1:"N";s:4:"𡛪";s:1:"N";s:4:"姬";s:1:"N";s:4:"娛";s:1:"N";s:4:"娧";s:1:"N";s:4:"姘";s:1:"N";s:4:"婦";s:1:"N";s:4:"㛮";s:1:"N";s:4:"㛼";s:1:"N";s:4:"嬈";s:1:"N";s:4:"嬾";s:1:"N";s:4:"嬾";s:1:"N";s:4:"𡧈";s:1:"N";s:4:"寃";s:1:"N";s:4:"寘";s:1:"N";s:4:"寧";s:1:"N";s:4:"寳";s:1:"N";s:4:"𡬘";s:1:"N";s:4:"寿";s:1:"N";s:4:"将";s:1:"N";s:4:"当";s:1:"N";s:4:"尢";s:1:"N";s:4:"㞁";s:1:"N";s:4:"屠";s:1:"N";s:4:"屮";s:1:"N";s:4:"峀";s:1:"N";s:4:"岍";s:1:"N";s:4:"𡷤";s:1:"N";s:4:"嵃";s:1:"N";s:4:"𡷦";s:1:"N";s:4:"嵮";s:1:"N";s:4:"嵫";s:1:"N";s:4:"嵼";s:1:"N";s:4:"巡";s:1:"N";s:4:"巢";s:1:"N";s:4:"㠯";s:1:"N";s:4:"巽";s:1:"N";s:4:"帨";s:1:"N";s:4:"帽";s:1:"N";s:4:"幩";s:1:"N";s:4:"㡢";s:1:"N";s:4:"𢆃";s:1:"N";s:4:"㡼";s:1:"N";s:4:"庰";s:1:"N";s:4:"庳";s:1:"N";s:4:"庶";s:1:"N";s:4:"廊";s:1:"N";s:4:"𪎒";s:1:"N";s:4:"廾";s:1:"N";s:4:"𢌱";s:1:"N";s:4:"𢌱";s:1:"N";s:4:"舁";s:1:"N";s:4:"弢";s:1:"N";s:4:"弢";s:1:"N";s:4:"㣇";s:1:"N";s:4:"𣊸";s:1:"N";s:4:"𦇚";s:1:"N";s:4:"形";s:1:"N";s:4:"彫";s:1:"N";s:4:"㣣";s:1:"N";s:4:"徚";s:1:"N";s:4:"忍";s:1:"N";s:4:"志";s:1:"N";s:4:"忹";s:1:"N";s:4:"悁";s:1:"N";s:4:"㤺";s:1:"N";s:4:"㤜";s:1:"N";s:4:"悔";s:1:"N";s:4:"𢛔";s:1:"N";s:4:"惇";s:1:"N";s:4:"慈";s:1:"N";s:4:"慌";s:1:"N";s:4:"慎";s:1:"N";s:4:"慌";s:1:"N";s:4:"慺";s:1:"N";s:4:"憎";s:1:"N";s:4:"憲";s:1:"N";s:4:"憤";s:1:"N";s:4:"憯";s:1:"N";s:4:"懞";s:1:"N";s:4:"懲";s:1:"N";s:4:"懶";s:1:"N";s:4:"成";s:1:"N";s:4:"戛";s:1:"N";s:4:"扝";s:1:"N";s:4:"抱";s:1:"N";s:4:"拔";s:1:"N";s:4:"捐";s:1:"N";s:4:"𢬌";s:1:"N";s:4:"挽";s:1:"N";s:4:"拼";s:1:"N";s:4:"捨";s:1:"N";s:4:"掃";s:1:"N";s:4:"揤";s:1:"N";s:4:"𢯱";s:1:"N";s:4:"搢";s:1:"N";s:4:"揅";s:1:"N";s:4:"掩";s:1:"N";s:4:"㨮";s:1:"N";s:4:"摩";s:1:"N";s:4:"摾";s:1:"N";s:4:"撝";s:1:"N";s:4:"摷";s:1:"N";s:4:"㩬";s:1:"N";s:4:"敏";s:1:"N";s:4:"敬";s:1:"N";s:4:"𣀊";s:1:"N";s:4:"旣";s:1:"N";s:4:"書";s:1:"N";s:4:"晉";s:1:"N";s:4:"㬙";s:1:"N";s:4:"暑";s:1:"N";s:4:"㬈";s:1:"N";s:4:"㫤";s:1:"N";s:4:"冒";s:1:"N";s:4:"冕";s:1:"N";s:4:"最";s:1:"N";s:4:"暜";s:1:"N";s:4:"肭";s:1:"N";s:4:"䏙";s:1:"N";s:4:"朗";s:1:"N";s:4:"望";s:1:"N";s:4:"朡";s:1:"N";s:4:"杞";s:1:"N";s:4:"杓";s:1:"N";s:4:"𣏃";s:1:"N";s:4:"㭉";s:1:"N";s:4:"柺";s:1:"N";s:4:"枅";s:1:"N";s:4:"桒";s:1:"N";s:4:"梅";s:1:"N";s:4:"𣑭";s:1:"N";s:4:"梎";s:1:"N";s:4:"栟";s:1:"N";s:4:"椔";s:1:"N";s:4:"㮝";s:1:"N";s:4:"楂";s:1:"N";s:4:"榣";s:1:"N";s:4:"槪";s:1:"N";s:4:"檨";s:1:"N";s:4:"𣚣";s:1:"N";s:4:"櫛";s:1:"N";s:4:"㰘";s:1:"N";s:4:"次";s:1:"N";s:4:"𣢧";s:1:"N";s:4:"歔";s:1:"N";s:4:"㱎";s:1:"N";s:4:"歲";s:1:"N";s:4:"殟";s:1:"N";s:4:"殺";s:1:"N";s:4:"殻";s:1:"N";s:4:"𣪍";s:1:"N";s:4:"𡴋";s:1:"N";s:4:"𣫺";s:1:"N";s:4:"汎";s:1:"N";s:4:"𣲼";s:1:"N";s:4:"沿";s:1:"N";s:4:"泍";s:1:"N";s:4:"汧";s:1:"N";s:4:"洖";s:1:"N";s:4:"派";s:1:"N";s:4:"海";s:1:"N";s:4:"流";s:1:"N";s:4:"浩";s:1:"N";s:4:"浸";s:1:"N";s:4:"涅";s:1:"N";s:4:"𣴞";s:1:"N";s:4:"洴";s:1:"N";s:4:"港";s:1:"N";s:4:"湮";s:1:"N";s:4:"㴳";s:1:"N";s:4:"滋";s:1:"N";s:4:"滇";s:1:"N";s:4:"𣻑";s:1:"N";s:4:"淹";s:1:"N";s:4:"潮";s:1:"N";s:4:"𣽞";s:1:"N";s:4:"𣾎";s:1:"N";s:4:"濆";s:1:"N";s:4:"瀹";s:1:"N";s:4:"瀞";s:1:"N";s:4:"瀛";s:1:"N";s:4:"㶖";s:1:"N";s:4:"灊";s:1:"N";s:4:"災";s:1:"N";s:4:"灷";s:1:"N";s:4:"炭";s:1:"N";s:4:"𠔥";s:1:"N";s:4:"煅";s:1:"N";s:4:"𤉣";s:1:"N";s:4:"熜";s:1:"N";s:4:"𤎫";s:1:"N";s:4:"爨";s:1:"N";s:4:"爵";s:1:"N";s:4:"牐";s:1:"N";s:4:"𤘈";s:1:"N";s:4:"犀";s:1:"N";s:4:"犕";s:1:"N";s:4:"𤜵";s:1:"N";s:4:"𤠔";s:1:"N";s:4:"獺";s:1:"N";s:4:"王";s:1:"N";s:4:"㺬";s:1:"N";s:4:"玥";s:1:"N";s:4:"㺸";s:1:"N";s:4:"㺸";s:1:"N";s:4:"瑇";s:1:"N";s:4:"瑜";s:1:"N";s:4:"瑱";s:1:"N";s:4:"璅";s:1:"N";s:4:"瓊";s:1:"N";s:4:"㼛";s:1:"N";s:4:"甤";s:1:"N";s:4:"𤰶";s:1:"N";s:4:"甾";s:1:"N";s:4:"𤲒";s:1:"N";s:4:"異";s:1:"N";s:4:"𢆟";s:1:"N";s:4:"瘐";s:1:"N";s:4:"𤾡";s:1:"N";s:4:"𤾸";s:1:"N";s:4:"𥁄";s:1:"N";s:4:"㿼";s:1:"N";s:4:"䀈";s:1:"N";s:4:"直";s:1:"N";s:4:"𥃳";s:1:"N";s:4:"𥃲";s:1:"N";s:4:"𥄙";s:1:"N";s:4:"𥄳";s:1:"N";s:4:"眞";s:1:"N";s:4:"真";s:1:"N";s:4:"真";s:1:"N";s:4:"睊";s:1:"N";s:4:"䀹";s:1:"N";s:4:"瞋";s:1:"N";s:4:"䁆";s:1:"N";s:4:"䂖";s:1:"N";s:4:"𥐝";s:1:"N";s:4:"硎";s:1:"N";s:4:"碌";s:1:"N";s:4:"磌";s:1:"N";s:4:"䃣";s:1:"N";s:4:"𥘦";s:1:"N";s:4:"祖";s:1:"N";s:4:"𥚚";s:1:"N";s:4:"𥛅";s:1:"N";s:4:"福";s:1:"N";s:4:"秫";s:1:"N";s:4:"䄯";s:1:"N";s:4:"穀";s:1:"N";s:4:"穊";s:1:"N";s:4:"穏";s:1:"N";s:4:"𥥼";s:1:"N";s:4:"𥪧";s:1:"N";s:4:"𥪧";s:1:"N";s:4:"竮";s:1:"N";s:4:"䈂";s:1:"N";s:4:"𥮫";s:1:"N";s:4:"篆";s:1:"N";s:4:"築";s:1:"N";s:4:"䈧";s:1:"N";s:4:"𥲀";s:1:"N";s:4:"糒";s:1:"N";s:4:"䊠";s:1:"N";s:4:"糨";s:1:"N";s:4:"糣";s:1:"N";s:4:"紀";s:1:"N";s:4:"𥾆";s:1:"N";s:4:"絣";s:1:"N";s:4:"䌁";s:1:"N";s:4:"緇";s:1:"N";s:4:"縂";s:1:"N";s:4:"繅";s:1:"N";s:4:"䌴";s:1:"N";s:4:"𦈨";s:1:"N";s:4:"𦉇";s:1:"N";s:4:"䍙";s:1:"N";s:4:"𦋙";s:1:"N";s:4:"罺";s:1:"N";s:4:"𦌾";s:1:"N";s:4:"羕";s:1:"N";s:4:"翺";s:1:"N";s:4:"者";s:1:"N";s:4:"𦓚";s:1:"N";s:4:"𦔣";s:1:"N";s:4:"聠";s:1:"N";s:4:"𦖨";s:1:"N";s:4:"聰";s:1:"N";s:4:"𣍟";s:1:"N";s:4:"䏕";s:1:"N";s:4:"育";s:1:"N";s:4:"脃";s:1:"N";s:4:"䐋";s:1:"N";s:4:"脾";s:1:"N";s:4:"媵";s:1:"N";s:4:"𦞧";s:1:"N";s:4:"𦞵";s:1:"N";s:4:"𣎓";s:1:"N";s:4:"𣎜";s:1:"N";s:4:"舁";s:1:"N";s:4:"舄";s:1:"N";s:4:"辞";s:1:"N";s:4:"䑫";s:1:"N";s:4:"芑";s:1:"N";s:4:"芋";s:1:"N";s:4:"芝";s:1:"N";s:4:"劳";s:1:"N";s:4:"花";s:1:"N";s:4:"芳";s:1:"N";s:4:"芽";s:1:"N";s:4:"苦";s:1:"N";s:4:"𦬼";s:1:"N";s:4:"若";s:1:"N";s:4:"茝";s:1:"N";s:4:"荣";s:1:"N";s:4:"莭";s:1:"N";s:4:"茣";s:1:"N";s:4:"莽";s:1:"N";s:4:"菧";s:1:"N";s:4:"著";s:1:"N";s:4:"荓";s:1:"N";s:4:"菊";s:1:"N";s:4:"菌";s:1:"N";s:4:"菜";s:1:"N";s:4:"𦰶";s:1:"N";s:4:"𦵫";s:1:"N";s:4:"𦳕";s:1:"N";s:4:"䔫";s:1:"N";s:4:"蓱";s:1:"N";s:4:"蓳";s:1:"N";s:4:"蔖";s:1:"N";s:4:"𧏊";s:1:"N";s:4:"蕤";s:1:"N";s:4:"𦼬";s:1:"N";s:4:"䕝";s:1:"N";s:4:"䕡";s:1:"N";s:4:"𦾱";s:1:"N";s:4:"𧃒";s:1:"N";s:4:"䕫";s:1:"N";s:4:"虐";s:1:"N";s:4:"虜";s:1:"N";s:4:"虧";s:1:"N";s:4:"虩";s:1:"N";s:4:"蚩";s:1:"N";s:4:"蚈";s:1:"N";s:4:"蜎";s:1:"N";s:4:"蛢";s:1:"N";s:4:"蝹";s:1:"N";s:4:"蜨";s:1:"N";s:4:"蝫";s:1:"N";s:4:"螆";s:1:"N";s:4:"䗗";s:1:"N";s:4:"蟡";s:1:"N";s:4:"蠁";s:1:"N";s:4:"䗹";s:1:"N";s:4:"衠";s:1:"N";s:4:"衣";s:1:"N";s:4:"𧙧";s:1:"N";s:4:"裗";s:1:"N";s:4:"裞";s:1:"N";s:4:"䘵";s:1:"N";s:4:"裺";s:1:"N";s:4:"㒻";s:1:"N";s:4:"𧢮";s:1:"N";s:4:"𧥦";s:1:"N";s:4:"䚾";s:1:"N";s:4:"䛇";s:1:"N";s:4:"誠";s:1:"N";s:4:"諭";s:1:"N";s:4:"變";s:1:"N";s:4:"豕";s:1:"N";s:4:"𧲨";s:1:"N";s:4:"貫";s:1:"N";s:4:"賁";s:1:"N";s:4:"贛";s:1:"N";s:4:"起";s:1:"N";s:4:"𧼯";s:1:"N";s:4:"𠠄";s:1:"N";s:4:"跋";s:1:"N";s:4:"趼";s:1:"N";s:4:"跰";s:1:"N";s:4:"𠣞";s:1:"N";s:4:"軔";s:1:"N";s:4:"輸";s:1:"N";s:4:"𨗒";s:1:"N";s:4:"𨗭";s:1:"N";s:4:"邔";s:1:"N";s:4:"郱";s:1:"N";s:4:"鄑";s:1:"N";s:4:"𨜮";s:1:"N";s:4:"鄛";s:1:"N";s:4:"鈸";s:1:"N";s:4:"鋗";s:1:"N";s:4:"鋘";s:1:"N";s:4:"鉼";s:1:"N";s:4:"鏹";s:1:"N";s:4:"鐕";s:1:"N";s:4:"𨯺";s:1:"N";s:4:"開";s:1:"N";s:4:"䦕";s:1:"N";s:4:"閷";s:1:"N";s:4:"𨵷";s:1:"N";s:4:"䧦";s:1:"N";s:4:"雃";s:1:"N";s:4:"嶲";s:1:"N";s:4:"霣";s:1:"N";s:4:"𩅅";s:1:"N";s:4:"𩈚";s:1:"N";s:4:"䩮";s:1:"N";s:4:"䩶";s:1:"N";s:4:"韠";s:1:"N";s:4:"𩐊";s:1:"N";s:4:"䪲";s:1:"N";s:4:"𩒖";s:1:"N";s:4:"頋";s:1:"N";s:4:"頋";s:1:"N";s:4:"頩";s:1:"N";s:4:"𩖶";s:1:"N";s:4:"飢";s:1:"N";s:4:"䬳";s:1:"N";s:4:"餩";s:1:"N";s:4:"馧";s:1:"N";s:4:"駂";s:1:"N";s:4:"駾";s:1:"N";s:4:"䯎";s:1:"N";s:4:"𩬰";s:1:"N";s:4:"鬒";s:1:"N";s:4:"鱀";s:1:"N";s:4:"鳽";s:1:"N";s:4:"䳎";s:1:"N";s:4:"䳭";s:1:"N";s:4:"鵧";s:1:"N";s:4:"𪃎";s:1:"N";s:4:"䳸";s:1:"N";s:4:"𪄅";s:1:"N";s:4:"𪈎";s:1:"N";s:4:"𪊑";s:1:"N";s:4:"麻";s:1:"N";s:4:"䵖";s:1:"N";s:4:"黹";s:1:"N";s:4:"黾";s:1:"N";s:4:"鼅";s:1:"N";s:4:"鼏";s:1:"N";s:4:"鼖";s:1:"N";s:4:"鼻";s:1:"N";s:4:"𪘀";s:1:"N";s:2:"̀";s:1:"M";s:2:"́";s:1:"M";s:2:"̂";s:1:"M";s:2:"̃";s:1:"M";s:2:"̄";s:1:"M";s:2:"̆";s:1:"M";s:2:"̇";s:1:"M";s:2:"̈";s:1:"M";s:2:"̉";s:1:"M";s:2:"̊";s:1:"M";s:2:"̋";s:1:"M";s:2:"̌";s:1:"M";s:2:"̏";s:1:"M";s:2:"̑";s:1:"M";s:2:"̓";s:1:"M";s:2:"̔";s:1:"M";s:2:"̛";s:1:"M";s:2:"̣";s:1:"M";s:2:"̤";s:1:"M";s:2:"̥";s:1:"M";s:2:"̦";s:1:"M";s:2:"̧";s:1:"M";s:2:"̨";s:1:"M";s:2:"̭";s:1:"M";s:2:"̮";s:1:"M";s:2:"̰";s:1:"M";s:2:"̱";s:1:"M";s:2:"̸";s:1:"M";s:2:"͂";s:1:"M";s:2:"ͅ";s:1:"M";s:2:"ٓ";s:1:"M";s:2:"ٔ";s:1:"M";s:2:"ٕ";s:1:"M";s:3:"़";s:1:"M";s:3:"া";s:1:"M";s:3:"ৗ";s:1:"M";s:3:"ା";s:1:"M";s:3:"ୖ";s:1:"M";s:3:"ୗ";s:1:"M";s:3:"ா";s:1:"M";s:3:"ௗ";s:1:"M";s:3:"ౖ";s:1:"M";s:3:"ೂ";s:1:"M";s:3:"ೕ";s:1:"M";s:3:"ೖ";s:1:"M";s:3:"ാ";s:1:"M";s:3:"ൗ";s:1:"M";s:3:"්";s:1:"M";s:3:"ා";s:1:"M";s:3:"ෟ";s:1:"M";s:3:"ီ";s:1:"M";s:3:"ᅡ";s:1:"M";s:3:"ᅢ";s:1:"M";s:3:"ᅣ";s:1:"M";s:3:"ᅤ";s:1:"M";s:3:"ᅥ";s:1:"M";s:3:"ᅦ";s:1:"M";s:3:"ᅧ";s:1:"M";s:3:"ᅨ";s:1:"M";s:3:"ᅩ";s:1:"M";s:3:"ᅪ";s:1:"M";s:3:"ᅫ";s:1:"M";s:3:"ᅬ";s:1:"M";s:3:"ᅭ";s:1:"M";s:3:"ᅮ";s:1:"M";s:3:"ᅯ";s:1:"M";s:3:"ᅰ";s:1:"M";s:3:"ᅱ";s:1:"M";s:3:"ᅲ";s:1:"M";s:3:"ᅳ";s:1:"M";s:3:"ᅴ";s:1:"M";s:3:"ᅵ";s:1:"M";s:3:"ᆨ";s:1:"M";s:3:"ᆩ";s:1:"M";s:3:"ᆪ";s:1:"M";s:3:"ᆫ";s:1:"M";s:3:"ᆬ";s:1:"M";s:3:"ᆭ";s:1:"M";s:3:"ᆮ";s:1:"M";s:3:"ᆯ";s:1:"M";s:3:"ᆰ";s:1:"M";s:3:"ᆱ";s:1:"M";s:3:"ᆲ";s:1:"M";s:3:"ᆳ";s:1:"M";s:3:"ᆴ";s:1:"M";s:3:"ᆵ";s:1:"M";s:3:"ᆶ";s:1:"M";s:3:"ᆷ";s:1:"M";s:3:"ᆸ";s:1:"M";s:3:"ᆹ";s:1:"M";s:3:"ᆺ";s:1:"M";s:3:"ᆻ";s:1:"M";s:3:"ᆼ";s:1:"M";s:3:"ᆽ";s:1:"M";s:3:"ᆾ";s:1:"M";s:3:"ᆿ";s:1:"M";s:3:"ᇀ";s:1:"M";s:3:"ᇁ";s:1:"M";s:3:"ᇂ";s:1:"M";s:3:"ᬵ";s:1:"M";s:3:"゙";s:1:"M";s:3:"゚";s:1:"M";s:4:"𑂺";s:1:"M";}' );
-
diff --git a/includes/normal/UtfNormalDataK.inc b/includes/normal/UtfNormalDataK.inc
deleted file mode 100644 (file)
index dde3eff..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-<?php
-/**
- * This file was automatically generated -- do not edit!
- * Run UtfNormalGenerate.php to create this file again (make clean && make)
- *
- * @file
- */
-// @codingStandardsIgnoreFile
-
-UtfNormal::$utfCompatibilityDecomp = unserialize( 'a:5559:{s:2:" ";s:1:" ";s:2:"¨";s:3:" ̈";s:2:"ª";s:1:"a";s:2:"¯";s:3:" ̄";s:2:"²";s:1:"2";s:2:"³";s:1:"3";s:2:"´";s:3:" ́";s:2:"µ";s:2:"μ";s:2:"¸";s:3:" ̧";s:2:"¹";s:1:"1";s:2:"º";s:1:"o";s:2:"¼";s:5:"1⁄4";s:2:"½";s:5:"1⁄2";s:2:"¾";s:5:"3⁄4";s:2:"À";s:3:"À";s:2:"Á";s:3:"Á";s:2:"Â";s:3:"Â";s:2:"Ã";s:3:"Ã";s:2:"Ä";s:3:"Ä";s:2:"Å";s:3:"Å";s:2:"Ç";s:3:"Ç";s:2:"È";s:3:"È";s:2:"É";s:3:"É";s:2:"Ê";s:3:"Ê";s:2:"Ë";s:3:"Ë";s:2:"Ì";s:3:"Ì";s:2:"Í";s:3:"Í";s:2:"Î";s:3:"Î";s:2:"Ï";s:3:"Ï";s:2:"Ñ";s:3:"Ñ";s:2:"Ò";s:3:"Ò";s:2:"Ó";s:3:"Ó";s:2:"Ô";s:3:"Ô";s:2:"Õ";s:3:"Õ";s:2:"Ö";s:3:"Ö";s:2:"Ù";s:3:"Ù";s:2:"Ú";s:3:"Ú";s:2:"Û";s:3:"Û";s:2:"Ü";s:3:"Ü";s:2:"Ý";s:3:"Ý";s:2:"à";s:3:"à";s:2:"á";s:3:"á";s:2:"â";s:3:"â";s:2:"ã";s:3:"ã";s:2:"ä";s:3:"ä";s:2:"å";s:3:"å";s:2:"ç";s:3:"ç";s:2:"è";s:3:"è";s:2:"é";s:3:"é";s:2:"ê";s:3:"ê";s:2:"ë";s:3:"ë";s:2:"ì";s:3:"ì";s:2:"í";s:3:"í";s:2:"î";s:3:"î";s:2:"ï";s:3:"ï";s:2:"ñ";s:3:"ñ";s:2:"ò";s:3:"ò";s:2:"ó";s:3:"ó";s:2:"ô";s:3:"ô";s:2:"õ";s:3:"õ";s:2:"ö";s:3:"ö";s:2:"ù";s:3:"ù";s:2:"ú";s:3:"ú";s:2:"û";s:3:"û";s:2:"ü";s:3:"ü";s:2:"ý";s:3:"ý";s:2:"ÿ";s:3:"ÿ";s:2:"Ā";s:3:"Ā";s:2:"ā";s:3:"ā";s:2:"Ă";s:3:"Ă";s:2:"ă";s:3:"ă";s:2:"Ą";s:3:"Ą";s:2:"ą";s:3:"ą";s:2:"Ć";s:3:"Ć";s:2:"ć";s:3:"ć";s:2:"Ĉ";s:3:"Ĉ";s:2:"ĉ";s:3:"ĉ";s:2:"Ċ";s:3:"Ċ";s:2:"ċ";s:3:"ċ";s:2:"Č";s:3:"Č";s:2:"č";s:3:"č";s:2:"Ď";s:3:"Ď";s:2:"ď";s:3:"ď";s:2:"Ē";s:3:"Ē";s:2:"ē";s:3:"ē";s:2:"Ĕ";s:3:"Ĕ";s:2:"ĕ";s:3:"ĕ";s:2:"Ė";s:3:"Ė";s:2:"ė";s:3:"ė";s:2:"Ę";s:3:"Ę";s:2:"ę";s:3:"ę";s:2:"Ě";s:3:"Ě";s:2:"ě";s:3:"ě";s:2:"Ĝ";s:3:"Ĝ";s:2:"ĝ";s:3:"ĝ";s:2:"Ğ";s:3:"Ğ";s:2:"ğ";s:3:"ğ";s:2:"Ġ";s:3:"Ġ";s:2:"ġ";s:3:"ġ";s:2:"Ģ";s:3:"Ģ";s:2:"ģ";s:3:"ģ";s:2:"Ĥ";s:3:"Ĥ";s:2:"ĥ";s:3:"ĥ";s:2:"Ĩ";s:3:"Ĩ";s:2:"ĩ";s:3:"ĩ";s:2:"Ī";s:3:"Ī";s:2:"ī";s:3:"ī";s:2:"Ĭ";s:3:"Ĭ";s:2:"ĭ";s:3:"ĭ";s:2:"Į";s:3:"Į";s:2:"į";s:3:"į";s:2:"İ";s:3:"İ";s:2:"IJ";s:2:"IJ";s:2:"ij";s:2:"ij";s:2:"Ĵ";s:3:"Ĵ";s:2:"ĵ";s:3:"ĵ";s:2:"Ķ";s:3:"Ķ";s:2:"ķ";s:3:"ķ";s:2:"Ĺ";s:3:"Ĺ";s:2:"ĺ";s:3:"ĺ";s:2:"Ļ";s:3:"Ļ";s:2:"ļ";s:3:"ļ";s:2:"Ľ";s:3:"Ľ";s:2:"ľ";s:3:"ľ";s:2:"Ŀ";s:3:"L·";s:2:"ŀ";s:3:"l·";s:2:"Ń";s:3:"Ń";s:2:"ń";s:3:"ń";s:2:"Ņ";s:3:"Ņ";s:2:"ņ";s:3:"ņ";s:2:"Ň";s:3:"Ň";s:2:"ň";s:3:"ň";s:2:"ʼn";s:3:"ʼn";s:2:"Ō";s:3:"Ō";s:2:"ō";s:3:"ō";s:2:"Ŏ";s:3:"Ŏ";s:2:"ŏ";s:3:"ŏ";s:2:"Ő";s:3:"Ő";s:2:"ő";s:3:"ő";s:2:"Ŕ";s:3:"Ŕ";s:2:"ŕ";s:3:"ŕ";s:2:"Ŗ";s:3:"Ŗ";s:2:"ŗ";s:3:"ŗ";s:2:"Ř";s:3:"Ř";s:2:"ř";s:3:"ř";s:2:"Ś";s:3:"Ś";s:2:"ś";s:3:"ś";s:2:"Ŝ";s:3:"Ŝ";s:2:"ŝ";s:3:"ŝ";s:2:"Ş";s:3:"Ş";s:2:"ş";s:3:"ş";s:2:"Š";s:3:"Š";s:2:"š";s:3:"š";s:2:"Ţ";s:3:"Ţ";s:2:"ţ";s:3:"ţ";s:2:"Ť";s:3:"Ť";s:2:"ť";s:3:"ť";s:2:"Ũ";s:3:"Ũ";s:2:"ũ";s:3:"ũ";s:2:"Ū";s:3:"Ū";s:2:"ū";s:3:"ū";s:2:"Ŭ";s:3:"Ŭ";s:2:"ŭ";s:3:"ŭ";s:2:"Ů";s:3:"Ů";s:2:"ů";s:3:"ů";s:2:"Ű";s:3:"Ű";s:2:"ű";s:3:"ű";s:2:"Ų";s:3:"Ų";s:2:"ų";s:3:"ų";s:2:"Ŵ";s:3:"Ŵ";s:2:"ŵ";s:3:"ŵ";s:2:"Ŷ";s:3:"Ŷ";s:2:"ŷ";s:3:"ŷ";s:2:"Ÿ";s:3:"Ÿ";s:2:"Ź";s:3:"Ź";s:2:"ź";s:3:"ź";s:2:"Ż";s:3:"Ż";s:2:"ż";s:3:"ż";s:2:"Ž";s:3:"Ž";s:2:"ž";s:3:"ž";s:2:"ſ";s:1:"s";s:2:"Ơ";s:3:"Ơ";s:2:"ơ";s:3:"ơ";s:2:"Ư";s:3:"Ư";s:2:"ư";s:3:"ư";s:2:"DŽ";s:4:"DŽ";s:2:"Dž";s:4:"Dž";s:2:"dž";s:4:"dž";s:2:"LJ";s:2:"LJ";s:2:"Lj";s:2:"Lj";s:2:"lj";s:2:"lj";s:2:"NJ";s:2:"NJ";s:2:"Nj";s:2:"Nj";s:2:"nj";s:2:"nj";s:2:"Ǎ";s:3:"Ǎ";s:2:"ǎ";s:3:"ǎ";s:2:"Ǐ";s:3:"Ǐ";s:2:"ǐ";s:3:"ǐ";s:2:"Ǒ";s:3:"Ǒ";s:2:"ǒ";s:3:"ǒ";s:2:"Ǔ";s:3:"Ǔ";s:2:"ǔ";s:3:"ǔ";s:2:"Ǖ";s:5:"Ǖ";s:2:"ǖ";s:5:"ǖ";s:2:"Ǘ";s:5:"Ǘ";s:2:"ǘ";s:5:"ǘ";s:2:"Ǚ";s:5:"Ǚ";s:2:"ǚ";s:5:"ǚ";s:2:"Ǜ";s:5:"Ǜ";s:2:"ǜ";s:5:"ǜ";s:2:"Ǟ";s:5:"Ǟ";s:2:"ǟ";s:5:"ǟ";s:2:"Ǡ";s:5:"Ǡ";s:2:"ǡ";s:5:"ǡ";s:2:"Ǣ";s:4:"Ǣ";s:2:"ǣ";s:4:"ǣ";s:2:"Ǧ";s:3:"Ǧ";s:2:"ǧ";s:3:"ǧ";s:2:"Ǩ";s:3:"Ǩ";s:2:"ǩ";s:3:"ǩ";s:2:"Ǫ";s:3:"Ǫ";s:2:"ǫ";s:3:"ǫ";s:2:"Ǭ";s:5:"Ǭ";s:2:"ǭ";s:5:"ǭ";s:2:"Ǯ";s:4:"Ǯ";s:2:"ǯ";s:4:"ǯ";s:2:"ǰ";s:3:"ǰ";s:2:"DZ";s:2:"DZ";s:2:"Dz";s:2:"Dz";s:2:"dz";s:2:"dz";s:2:"Ǵ";s:3:"Ǵ";s:2:"ǵ";s:3:"ǵ";s:2:"Ǹ";s:3:"Ǹ";s:2:"ǹ";s:3:"ǹ";s:2:"Ǻ";s:5:"Ǻ";s:2:"ǻ";s:5:"ǻ";s:2:"Ǽ";s:4:"Ǽ";s:2:"ǽ";s:4:"ǽ";s:2:"Ǿ";s:4:"Ǿ";s:2:"ǿ";s:4:"ǿ";s:2:"Ȁ";s:3:"Ȁ";s:2:"ȁ";s:3:"ȁ";s:2:"Ȃ";s:3:"Ȃ";s:2:"ȃ";s:3:"ȃ";s:2:"Ȅ";s:3:"Ȅ";s:2:"ȅ";s:3:"ȅ";s:2:"Ȇ";s:3:"Ȇ";s:2:"ȇ";s:3:"ȇ";s:2:"Ȉ";s:3:"Ȉ";s:2:"ȉ";s:3:"ȉ";s:2:"Ȋ";s:3:"Ȋ";s:2:"ȋ";s:3:"ȋ";s:2:"Ȍ";s:3:"Ȍ";s:2:"ȍ";s:3:"ȍ";s:2:"Ȏ";s:3:"Ȏ";s:2:"ȏ";s:3:"ȏ";s:2:"Ȑ";s:3:"Ȑ";s:2:"ȑ";s:3:"ȑ";s:2:"Ȓ";s:3:"Ȓ";s:2:"ȓ";s:3:"ȓ";s:2:"Ȕ";s:3:"Ȕ";s:2:"ȕ";s:3:"ȕ";s:2:"Ȗ";s:3:"Ȗ";s:2:"ȗ";s:3:"ȗ";s:2:"Ș";s:3:"Ș";s:2:"ș";s:3:"ș";s:2:"Ț";s:3:"Ț";s:2:"ț";s:3:"ț";s:2:"Ȟ";s:3:"Ȟ";s:2:"ȟ";s:3:"ȟ";s:2:"Ȧ";s:3:"Ȧ";s:2:"ȧ";s:3:"ȧ";s:2:"Ȩ";s:3:"Ȩ";s:2:"ȩ";s:3:"ȩ";s:2:"Ȫ";s:5:"Ȫ";s:2:"ȫ";s:5:"ȫ";s:2:"Ȭ";s:5:"Ȭ";s:2:"ȭ";s:5:"ȭ";s:2:"Ȯ";s:3:"Ȯ";s:2:"ȯ";s:3:"ȯ";s:2:"Ȱ";s:5:"Ȱ";s:2:"ȱ";s:5:"ȱ";s:2:"Ȳ";s:3:"Ȳ";s:2:"ȳ";s:3:"ȳ";s:2:"ʰ";s:1:"h";s:2:"ʱ";s:2:"ɦ";s:2:"ʲ";s:1:"j";s:2:"ʳ";s:1:"r";s:2:"ʴ";s:2:"ɹ";s:2:"ʵ";s:2:"ɻ";s:2:"ʶ";s:2:"ʁ";s:2:"ʷ";s:1:"w";s:2:"ʸ";s:1:"y";s:2:"˘";s:3:" ̆";s:2:"˙";s:3:" ̇";s:2:"˚";s:3:" ̊";s:2:"˛";s:3:" ̨";s:2:"˜";s:3:" ̃";s:2:"˝";s:3:" ̋";s:2:"ˠ";s:2:"ɣ";s:2:"ˡ";s:1:"l";s:2:"ˢ";s:1:"s";s:2:"ˣ";s:1:"x";s:2:"ˤ";s:2:"ʕ";s:2:"̀";s:2:"̀";s:2:"́";s:2:"́";s:2:"̓";s:2:"̓";s:2:"̈́";s:4:"̈́";s:2:"ʹ";s:2:"ʹ";s:2:"ͺ";s:3:" ͅ";s:2:";";s:1:";";s:2:"΄";s:3:" ́";s:2:"΅";s:5:" ̈́";s:2:"Ά";s:4:"Ά";s:2:"·";s:2:"·";s:2:"Έ";s:4:"Έ";s:2:"Ή";s:4:"Ή";s:2:"Ί";s:4:"Ί";s:2:"Ό";s:4:"Ό";s:2:"Ύ";s:4:"Ύ";s:2:"Ώ";s:4:"Ώ";s:2:"ΐ";s:6:"ΐ";s:2:"Ϊ";s:4:"Ϊ";s:2:"Ϋ";s:4:"Ϋ";s:2:"ά";s:4:"ά";s:2:"έ";s:4:"έ";s:2:"ή";s:4:"ή";s:2:"ί";s:4:"ί";s:2:"ΰ";s:6:"ΰ";s:2:"ϊ";s:4:"ϊ";s:2:"ϋ";s:4:"ϋ";s:2:"ό";s:4:"ό";s:2:"ύ";s:4:"ύ";s:2:"ώ";s:4:"ώ";s:2:"ϐ";s:2:"β";s:2:"ϑ";s:2:"θ";s:2:"ϒ";s:2:"Υ";s:2:"ϓ";s:4:"Ύ";s:2:"ϔ";s:4:"Ϋ";s:2:"ϕ";s:2:"φ";s:2:"ϖ";s:2:"π";s:2:"ϰ";s:2:"κ";s:2:"ϱ";s:2:"ρ";s:2:"ϲ";s:2:"ς";s:2:"ϴ";s:2:"Θ";s:2:"ϵ";s:2:"ε";s:2:"Ϲ";s:2:"Σ";s:2:"Ѐ";s:4:"Ѐ";s:2:"Ё";s:4:"Ё";s:2:"Ѓ";s:4:"Ѓ";s:2:"Ї";s:4:"Ї";s:2:"Ќ";s:4:"Ќ";s:2:"Ѝ";s:4:"Ѝ";s:2:"Ў";s:4:"Ў";s:2:"Й";s:4:"Й";s:2:"й";s:4:"й";s:2:"ѐ";s:4:"ѐ";s:2:"ё";s:4:"ё";s:2:"ѓ";s:4:"ѓ";s:2:"ї";s:4:"ї";s:2:"ќ";s:4:"ќ";s:2:"ѝ";s:4:"ѝ";s:2:"ў";s:4:"ў";s:2:"Ѷ";s:4:"Ѷ";s:2:"ѷ";s:4:"ѷ";s:2:"Ӂ";s:4:"Ӂ";s:2:"ӂ";s:4:"ӂ";s:2:"Ӑ";s:4:"Ӑ";s:2:"ӑ";s:4:"ӑ";s:2:"Ӓ";s:4:"Ӓ";s:2:"ӓ";s:4:"ӓ";s:2:"Ӗ";s:4:"Ӗ";s:2:"ӗ";s:4:"ӗ";s:2:"Ӛ";s:4:"Ӛ";s:2:"ӛ";s:4:"ӛ";s:2:"Ӝ";s:4:"Ӝ";s:2:"ӝ";s:4:"ӝ";s:2:"Ӟ";s:4:"Ӟ";s:2:"ӟ";s:4:"ӟ";s:2:"Ӣ";s:4:"Ӣ";s:2:"ӣ";s:4:"ӣ";s:2:"Ӥ";s:4:"Ӥ";s:2:"ӥ";s:4:"ӥ";s:2:"Ӧ";s:4:"Ӧ";s:2:"ӧ";s:4:"ӧ";s:2:"Ӫ";s:4:"Ӫ";s:2:"ӫ";s:4:"ӫ";s:2:"Ӭ";s:4:"Ӭ";s:2:"ӭ";s:4:"ӭ";s:2:"Ӯ";s:4:"Ӯ";s:2:"ӯ";s:4:"ӯ";s:2:"Ӱ";s:4:"Ӱ";s:2:"ӱ";s:4:"ӱ";s:2:"Ӳ";s:4:"Ӳ";s:2:"ӳ";s:4:"ӳ";s:2:"Ӵ";s:4:"Ӵ";s:2:"ӵ";s:4:"ӵ";s:2:"Ӹ";s:4:"Ӹ";s:2:"ӹ";s:4:"ӹ";s:2:"և";s:4:"եւ";s:2:"آ";s:4:"آ";s:2:"أ";s:4:"أ";s:2:"ؤ";s:4:"ؤ";s:2:"إ";s:4:"إ";s:2:"ئ";s:4:"ئ";s:2:"ٵ";s:4:"اٴ";s:2:"ٶ";s:4:"وٴ";s:2:"ٷ";s:4:"ۇٴ";s:2:"ٸ";s:4:"يٴ";s:2:"ۀ";s:4:"ۀ";s:2:"ۂ";s:4:"ۂ";s:2:"ۓ";s:4:"ۓ";s:3:"ऩ";s:6:"ऩ";s:3:"ऱ";s:6:"ऱ";s:3:"ऴ";s:6:"ऴ";s:3:"क़";s:6:"क़";s:3:"ख़";s:6:"ख़";s:3:"ग़";s:6:"ग़";s:3:"ज़";s:6:"ज़";s:3:"ड़";s:6:"ड़";s:3:"ढ़";s:6:"ढ़";s:3:"फ़";s:6:"फ़";s:3:"य़";s:6:"य़";s:3:"ো";s:6:"ো";s:3:"ৌ";s:6:"ৌ";s:3:"ড়";s:6:"ড়";s:3:"ঢ়";s:6:"ঢ়";s:3:"য়";s:6:"য়";s:3:"ਲ਼";s:6:"ਲ਼";s:3:"ਸ਼";s:6:"ਸ਼";s:3:"ਖ਼";s:6:"ਖ਼";s:3:"ਗ਼";s:6:"ਗ਼";s:3:"ਜ਼";s:6:"ਜ਼";s:3:"ਫ਼";s:6:"ਫ਼";s:3:"ୈ";s:6:"ୈ";s:3:"ୋ";s:6:"ୋ";s:3:"ୌ";s:6:"ୌ";s:3:"ଡ଼";s:6:"ଡ଼";s:3:"ଢ଼";s:6:"ଢ଼";s:3:"ஔ";s:6:"ஔ";s:3:"ொ";s:6:"ொ";s:3:"ோ";s:6:"ோ";s:3:"ௌ";s:6:"ௌ";s:3:"ై";s:6:"ై";s:3:"ೀ";s:6:"ೀ";s:3:"ೇ";s:6:"ೇ";s:3:"ೈ";s:6:"ೈ";s:3:"ೊ";s:6:"ೊ";s:3:"ೋ";s:9:"ೋ";s:3:"ൊ";s:6:"ൊ";s:3:"ോ";s:6:"ോ";s:3:"ൌ";s:6:"ൌ";s:3:"ේ";s:6:"ේ";s:3:"ො";s:6:"ො";s:3:"ෝ";s:9:"ෝ";s:3:"ෞ";s:6:"ෞ";s:3:"ำ";s:6:"ํา";s:3:"ຳ";s:6:"ໍາ";s:3:"ໜ";s:6:"ຫນ";s:3:"ໝ";s:6:"ຫມ";s:3:"༌";s:3:"་";s:3:"གྷ";s:6:"གྷ";s:3:"ཌྷ";s:6:"ཌྷ";s:3:"དྷ";s:6:"དྷ";s:3:"བྷ";s:6:"བྷ";s:3:"ཛྷ";s:6:"ཛྷ";s:3:"ཀྵ";s:6:"ཀྵ";s:3:"ཱི";s:6:"ཱི";s:3:"ཱུ";s:6:"ཱུ";s:3:"ྲྀ";s:6:"ྲྀ";s:3:"ཷ";s:9:"ྲཱྀ";s:3:"ླྀ";s:6:"ླྀ";s:3:"ཹ";s:9:"ླཱྀ";s:3:"ཱྀ";s:6:"ཱྀ";s:3:"ྒྷ";s:6:"ྒྷ";s:3:"ྜྷ";s:6:"ྜྷ";s:3:"ྡྷ";s:6:"ྡྷ";s:3:"ྦྷ";s:6:"ྦྷ";s:3:"ྫྷ";s:6:"ྫྷ";s:3:"ྐྵ";s:6:"ྐྵ";s:3:"ဦ";s:6:"ဦ";s:3:"ჼ";s:3:"ნ";s:3:"ᬆ";s:6:"ᬆ";s:3:"ᬈ";s:6:"ᬈ";s:3:"ᬊ";s:6:"ᬊ";s:3:"ᬌ";s:6:"ᬌ";s:3:"ᬎ";s:6:"ᬎ";s:3:"ᬒ";s:6:"ᬒ";s:3:"ᬻ";s:6:"ᬻ";s:3:"ᬽ";s:6:"ᬽ";s:3:"ᭀ";s:6:"ᭀ";s:3:"ᭁ";s:6:"ᭁ";s:3:"ᭃ";s:6:"ᭃ";s:3:"ᴬ";s:1:"A";s:3:"ᴭ";s:2:"Æ";s:3:"ᴮ";s:1:"B";s:3:"ᴰ";s:1:"D";s:3:"ᴱ";s:1:"E";s:3:"ᴲ";s:2:"Ǝ";s:3:"ᴳ";s:1:"G";s:3:"ᴴ";s:1:"H";s:3:"ᴵ";s:1:"I";s:3:"ᴶ";s:1:"J";s:3:"ᴷ";s:1:"K";s:3:"ᴸ";s:1:"L";s:3:"ᴹ";s:1:"M";s:3:"ᴺ";s:1:"N";s:3:"ᴼ";s:1:"O";s:3:"ᴽ";s:2:"Ȣ";s:3:"ᴾ";s:1:"P";s:3:"ᴿ";s:1:"R";s:3:"ᵀ";s:1:"T";s:3:"ᵁ";s:1:"U";s:3:"ᵂ";s:1:"W";s:3:"ᵃ";s:1:"a";s:3:"ᵄ";s:2:"ɐ";s:3:"ᵅ";s:2:"ɑ";s:3:"ᵆ";s:3:"ᴂ";s:3:"ᵇ";s:1:"b";s:3:"ᵈ";s:1:"d";s:3:"ᵉ";s:1:"e";s:3:"ᵊ";s:2:"ə";s:3:"ᵋ";s:2:"ɛ";s:3:"ᵌ";s:2:"ɜ";s:3:"ᵍ";s:1:"g";s:3:"ᵏ";s:1:"k";s:3:"ᵐ";s:1:"m";s:3:"ᵑ";s:2:"ŋ";s:3:"ᵒ";s:1:"o";s:3:"ᵓ";s:2:"ɔ";s:3:"ᵔ";s:3:"ᴖ";s:3:"ᵕ";s:3:"ᴗ";s:3:"ᵖ";s:1:"p";s:3:"ᵗ";s:1:"t";s:3:"ᵘ";s:1:"u";s:3:"ᵙ";s:3:"ᴝ";s:3:"ᵚ";s:2:"ɯ";s:3:"ᵛ";s:1:"v";s:3:"ᵜ";s:3:"ᴥ";s:3:"ᵝ";s:2:"β";s:3:"ᵞ";s:2:"γ";s:3:"ᵟ";s:2:"δ";s:3:"ᵠ";s:2:"φ";s:3:"ᵡ";s:2:"χ";s:3:"ᵢ";s:1:"i";s:3:"ᵣ";s:1:"r";s:3:"ᵤ";s:1:"u";s:3:"ᵥ";s:1:"v";s:3:"ᵦ";s:2:"β";s:3:"ᵧ";s:2:"γ";s:3:"ᵨ";s:2:"ρ";s:3:"ᵩ";s:2:"φ";s:3:"ᵪ";s:2:"χ";s:3:"ᵸ";s:2:"н";s:3:"ᶛ";s:2:"ɒ";s:3:"ᶜ";s:1:"c";s:3:"ᶝ";s:2:"ɕ";s:3:"ᶞ";s:2:"ð";s:3:"ᶟ";s:2:"ɜ";s:3:"ᶠ";s:1:"f";s:3:"ᶡ";s:2:"ɟ";s:3:"ᶢ";s:2:"ɡ";s:3:"ᶣ";s:2:"ɥ";s:3:"ᶤ";s:2:"ɨ";s:3:"ᶥ";s:2:"ɩ";s:3:"ᶦ";s:2:"ɪ";s:3:"ᶧ";s:3:"ᵻ";s:3:"ᶨ";s:2:"ʝ";s:3:"ᶩ";s:2:"ɭ";s:3:"ᶪ";s:3:"ᶅ";s:3:"ᶫ";s:2:"ʟ";s:3:"ᶬ";s:2:"ɱ";s:3:"ᶭ";s:2:"ɰ";s:3:"ᶮ";s:2:"ɲ";s:3:"ᶯ";s:2:"ɳ";s:3:"ᶰ";s:2:"ɴ";s:3:"ᶱ";s:2:"ɵ";s:3:"ᶲ";s:2:"ɸ";s:3:"ᶳ";s:2:"ʂ";s:3:"ᶴ";s:2:"ʃ";s:3:"ᶵ";s:2:"ƫ";s:3:"ᶶ";s:2:"ʉ";s:3:"ᶷ";s:2:"ʊ";s:3:"ᶸ";s:3:"ᴜ";s:3:"ᶹ";s:2:"ʋ";s:3:"ᶺ";s:2:"ʌ";s:3:"ᶻ";s:1:"z";s:3:"ᶼ";s:2:"ʐ";s:3:"ᶽ";s:2:"ʑ";s:3:"ᶾ";s:2:"ʒ";s:3:"ᶿ";s:2:"θ";s:3:"Ḁ";s:3:"Ḁ";s:3:"ḁ";s:3:"ḁ";s:3:"Ḃ";s:3:"Ḃ";s:3:"ḃ";s:3:"ḃ";s:3:"Ḅ";s:3:"Ḅ";s:3:"ḅ";s:3:"ḅ";s:3:"Ḇ";s:3:"Ḇ";s:3:"ḇ";s:3:"ḇ";s:3:"Ḉ";s:5:"Ḉ";s:3:"ḉ";s:5:"ḉ";s:3:"Ḋ";s:3:"Ḋ";s:3:"ḋ";s:3:"ḋ";s:3:"Ḍ";s:3:"Ḍ";s:3:"ḍ";s:3:"ḍ";s:3:"Ḏ";s:3:"Ḏ";s:3:"ḏ";s:3:"ḏ";s:3:"Ḑ";s:3:"Ḑ";s:3:"ḑ";s:3:"ḑ";s:3:"Ḓ";s:3:"Ḓ";s:3:"ḓ";s:3:"ḓ";s:3:"Ḕ";s:5:"Ḕ";s:3:"ḕ";s:5:"ḕ";s:3:"Ḗ";s:5:"Ḗ";s:3:"ḗ";s:5:"ḗ";s:3:"Ḙ";s:3:"Ḙ";s:3:"ḙ";s:3:"ḙ";s:3:"Ḛ";s:3:"Ḛ";s:3:"ḛ";s:3:"ḛ";s:3:"Ḝ";s:5:"Ḝ";s:3:"ḝ";s:5:"ḝ";s:3:"Ḟ";s:3:"Ḟ";s:3:"ḟ";s:3:"ḟ";s:3:"Ḡ";s:3:"Ḡ";s:3:"ḡ";s:3:"ḡ";s:3:"Ḣ";s:3:"Ḣ";s:3:"ḣ";s:3:"ḣ";s:3:"Ḥ";s:3:"Ḥ";s:3:"ḥ";s:3:"ḥ";s:3:"Ḧ";s:3:"Ḧ";s:3:"ḧ";s:3:"ḧ";s:3:"Ḩ";s:3:"Ḩ";s:3:"ḩ";s:3:"ḩ";s:3:"Ḫ";s:3:"Ḫ";s:3:"ḫ";s:3:"ḫ";s:3:"Ḭ";s:3:"Ḭ";s:3:"ḭ";s:3:"ḭ";s:3:"Ḯ";s:5:"Ḯ";s:3:"ḯ";s:5:"ḯ";s:3:"Ḱ";s:3:"Ḱ";s:3:"ḱ";s:3:"ḱ";s:3:"Ḳ";s:3:"Ḳ";s:3:"ḳ";s:3:"ḳ";s:3:"Ḵ";s:3:"Ḵ";s:3:"ḵ";s:3:"ḵ";s:3:"Ḷ";s:3:"Ḷ";s:3:"ḷ";s:3:"ḷ";s:3:"Ḹ";s:5:"Ḹ";s:3:"ḹ";s:5:"ḹ";s:3:"Ḻ";s:3:"Ḻ";s:3:"ḻ";s:3:"ḻ";s:3:"Ḽ";s:3:"Ḽ";s:3:"ḽ";s:3:"ḽ";s:3:"Ḿ";s:3:"Ḿ";s:3:"ḿ";s:3:"ḿ";s:3:"Ṁ";s:3:"Ṁ";s:3:"ṁ";s:3:"ṁ";s:3:"Ṃ";s:3:"Ṃ";s:3:"ṃ";s:3:"ṃ";s:3:"Ṅ";s:3:"Ṅ";s:3:"ṅ";s:3:"ṅ";s:3:"Ṇ";s:3:"Ṇ";s:3:"ṇ";s:3:"ṇ";s:3:"Ṉ";s:3:"Ṉ";s:3:"ṉ";s:3:"ṉ";s:3:"Ṋ";s:3:"Ṋ";s:3:"ṋ";s:3:"ṋ";s:3:"Ṍ";s:5:"Ṍ";s:3:"ṍ";s:5:"ṍ";s:3:"Ṏ";s:5:"Ṏ";s:3:"ṏ";s:5:"ṏ";s:3:"Ṑ";s:5:"Ṑ";s:3:"ṑ";s:5:"ṑ";s:3:"Ṓ";s:5:"Ṓ";s:3:"ṓ";s:5:"ṓ";s:3:"Ṕ";s:3:"Ṕ";s:3:"ṕ";s:3:"ṕ";s:3:"Ṗ";s:3:"Ṗ";s:3:"ṗ";s:3:"ṗ";s:3:"Ṙ";s:3:"Ṙ";s:3:"ṙ";s:3:"ṙ";s:3:"Ṛ";s:3:"Ṛ";s:3:"ṛ";s:3:"ṛ";s:3:"Ṝ";s:5:"Ṝ";s:3:"ṝ";s:5:"ṝ";s:3:"Ṟ";s:3:"Ṟ";s:3:"ṟ";s:3:"ṟ";s:3:"Ṡ";s:3:"Ṡ";s:3:"ṡ";s:3:"ṡ";s:3:"Ṣ";s:3:"Ṣ";s:3:"ṣ";s:3:"ṣ";s:3:"Ṥ";s:5:"Ṥ";s:3:"ṥ";s:5:"ṥ";s:3:"Ṧ";s:5:"Ṧ";s:3:"ṧ";s:5:"ṧ";s:3:"Ṩ";s:5:"Ṩ";s:3:"ṩ";s:5:"ṩ";s:3:"Ṫ";s:3:"Ṫ";s:3:"ṫ";s:3:"ṫ";s:3:"Ṭ";s:3:"Ṭ";s:3:"ṭ";s:3:"ṭ";s:3:"Ṯ";s:3:"Ṯ";s:3:"ṯ";s:3:"ṯ";s:3:"Ṱ";s:3:"Ṱ";s:3:"ṱ";s:3:"ṱ";s:3:"Ṳ";s:3:"Ṳ";s:3:"ṳ";s:3:"ṳ";s:3:"Ṵ";s:3:"Ṵ";s:3:"ṵ";s:3:"ṵ";s:3:"Ṷ";s:3:"Ṷ";s:3:"ṷ";s:3:"ṷ";s:3:"Ṹ";s:5:"Ṹ";s:3:"ṹ";s:5:"ṹ";s:3:"Ṻ";s:5:"Ṻ";s:3:"ṻ";s:5:"ṻ";s:3:"Ṽ";s:3:"Ṽ";s:3:"ṽ";s:3:"ṽ";s:3:"Ṿ";s:3:"Ṿ";s:3:"ṿ";s:3:"ṿ";s:3:"Ẁ";s:3:"Ẁ";s:3:"ẁ";s:3:"ẁ";s:3:"Ẃ";s:3:"Ẃ";s:3:"ẃ";s:3:"ẃ";s:3:"Ẅ";s:3:"Ẅ";s:3:"ẅ";s:3:"ẅ";s:3:"Ẇ";s:3:"Ẇ";s:3:"ẇ";s:3:"ẇ";s:3:"Ẉ";s:3:"Ẉ";s:3:"ẉ";s:3:"ẉ";s:3:"Ẋ";s:3:"Ẋ";s:3:"ẋ";s:3:"ẋ";s:3:"Ẍ";s:3:"Ẍ";s:3:"ẍ";s:3:"ẍ";s:3:"Ẏ";s:3:"Ẏ";s:3:"ẏ";s:3:"ẏ";s:3:"Ẑ";s:3:"Ẑ";s:3:"ẑ";s:3:"ẑ";s:3:"Ẓ";s:3:"Ẓ";s:3:"ẓ";s:3:"ẓ";s:3:"Ẕ";s:3:"Ẕ";s:3:"ẕ";s:3:"ẕ";s:3:"ẖ";s:3:"ẖ";s:3:"ẗ";s:3:"ẗ";s:3:"ẘ";s:3:"ẘ";s:3:"ẙ";s:3:"ẙ";s:3:"ẚ";s:3:"aʾ";s:3:"ẛ";s:3:"ṡ";s:3:"Ạ";s:3:"Ạ";s:3:"ạ";s:3:"ạ";s:3:"Ả";s:3:"Ả";s:3:"ả";s:3:"ả";s:3:"Ấ";s:5:"Ấ";s:3:"ấ";s:5:"ấ";s:3:"Ầ";s:5:"Ầ";s:3:"ầ";s:5:"ầ";s:3:"Ẩ";s:5:"Ẩ";s:3:"ẩ";s:5:"ẩ";s:3:"Ẫ";s:5:"Ẫ";s:3:"ẫ";s:5:"ẫ";s:3:"Ậ";s:5:"Ậ";s:3:"ậ";s:5:"ậ";s:3:"Ắ";s:5:"Ắ";s:3:"ắ";s:5:"ắ";s:3:"Ằ";s:5:"Ằ";s:3:"ằ";s:5:"ằ";s:3:"Ẳ";s:5:"Ẳ";s:3:"ẳ";s:5:"ẳ";s:3:"Ẵ";s:5:"Ẵ";s:3:"ẵ";s:5:"ẵ";s:3:"Ặ";s:5:"Ặ";s:3:"ặ";s:5:"ặ";s:3:"Ẹ";s:3:"Ẹ";s:3:"ẹ";s:3:"ẹ";s:3:"Ẻ";s:3:"Ẻ";s:3:"ẻ";s:3:"ẻ";s:3:"Ẽ";s:3:"Ẽ";s:3:"ẽ";s:3:"ẽ";s:3:"Ế";s:5:"Ế";s:3:"ế";s:5:"ế";s:3:"Ề";s:5:"Ề";s:3:"ề";s:5:"ề";s:3:"Ể";s:5:"Ể";s:3:"ể";s:5:"ể";s:3:"Ễ";s:5:"Ễ";s:3:"ễ";s:5:"ễ";s:3:"Ệ";s:5:"Ệ";s:3:"ệ";s:5:"ệ";s:3:"Ỉ";s:3:"Ỉ";s:3:"ỉ";s:3:"ỉ";s:3:"Ị";s:3:"Ị";s:3:"ị";s:3:"ị";s:3:"Ọ";s:3:"Ọ";s:3:"ọ";s:3:"ọ";s:3:"Ỏ";s:3:"Ỏ";s:3:"ỏ";s:3:"ỏ";s:3:"Ố";s:5:"Ố";s:3:"ố";s:5:"ố";s:3:"Ồ";s:5:"Ồ";s:3:"ồ";s:5:"ồ";s:3:"Ổ";s:5:"Ổ";s:3:"ổ";s:5:"ổ";s:3:"Ỗ";s:5:"Ỗ";s:3:"ỗ";s:5:"ỗ";s:3:"Ộ";s:5:"Ộ";s:3:"ộ";s:5:"ộ";s:3:"Ớ";s:5:"Ớ";s:3:"ớ";s:5:"ớ";s:3:"Ờ";s:5:"Ờ";s:3:"ờ";s:5:"ờ";s:3:"Ở";s:5:"Ở";s:3:"ở";s:5:"ở";s:3:"Ỡ";s:5:"Ỡ";s:3:"ỡ";s:5:"ỡ";s:3:"Ợ";s:5:"Ợ";s:3:"ợ";s:5:"ợ";s:3:"Ụ";s:3:"Ụ";s:3:"ụ";s:3:"ụ";s:3:"Ủ";s:3:"Ủ";s:3:"ủ";s:3:"ủ";s:3:"Ứ";s:5:"Ứ";s:3:"ứ";s:5:"ứ";s:3:"Ừ";s:5:"Ừ";s:3:"ừ";s:5:"ừ";s:3:"Ử";s:5:"Ử";s:3:"ử";s:5:"ử";s:3:"Ữ";s:5:"Ữ";s:3:"ữ";s:5:"ữ";s:3:"Ự";s:5:"Ự";s:3:"ự";s:5:"ự";s:3:"Ỳ";s:3:"Ỳ";s:3:"ỳ";s:3:"ỳ";s:3:"Ỵ";s:3:"Ỵ";s:3:"ỵ";s:3:"ỵ";s:3:"Ỷ";s:3:"Ỷ";s:3:"ỷ";s:3:"ỷ";s:3:"Ỹ";s:3:"Ỹ";s:3:"ỹ";s:3:"ỹ";s:3:"ἀ";s:4:"ἀ";s:3:"ἁ";s:4:"ἁ";s:3:"ἂ";s:6:"ἂ";s:3:"ἃ";s:6:"ἃ";s:3:"ἄ";s:6:"ἄ";s:3:"ἅ";s:6:"ἅ";s:3:"ἆ";s:6:"ἆ";s:3:"ἇ";s:6:"ἇ";s:3:"Ἀ";s:4:"Ἀ";s:3:"Ἁ";s:4:"Ἁ";s:3:"Ἂ";s:6:"Ἂ";s:3:"Ἃ";s:6:"Ἃ";s:3:"Ἄ";s:6:"Ἄ";s:3:"Ἅ";s:6:"Ἅ";s:3:"Ἆ";s:6:"Ἆ";s:3:"Ἇ";s:6:"Ἇ";s:3:"ἐ";s:4:"ἐ";s:3:"ἑ";s:4:"ἑ";s:3:"ἒ";s:6:"ἒ";s:3:"ἓ";s:6:"ἓ";s:3:"ἔ";s:6:"ἔ";s:3:"ἕ";s:6:"ἕ";s:3:"Ἐ";s:4:"Ἐ";s:3:"Ἑ";s:4:"Ἑ";s:3:"Ἒ";s:6:"Ἒ";s:3:"Ἓ";s:6:"Ἓ";s:3:"Ἔ";s:6:"Ἔ";s:3:"Ἕ";s:6:"Ἕ";s:3:"ἠ";s:4:"ἠ";s:3:"ἡ";s:4:"ἡ";s:3:"ἢ";s:6:"ἢ";s:3:"ἣ";s:6:"ἣ";s:3:"ἤ";s:6:"ἤ";s:3:"ἥ";s:6:"ἥ";s:3:"ἦ";s:6:"ἦ";s:3:"ἧ";s:6:"ἧ";s:3:"Ἠ";s:4:"Ἠ";s:3:"Ἡ";s:4:"Ἡ";s:3:"Ἢ";s:6:"Ἢ";s:3:"Ἣ";s:6:"Ἣ";s:3:"Ἤ";s:6:"Ἤ";s:3:"Ἥ";s:6:"Ἥ";s:3:"Ἦ";s:6:"Ἦ";s:3:"Ἧ";s:6:"Ἧ";s:3:"ἰ";s:4:"ἰ";s:3:"ἱ";s:4:"ἱ";s:3:"ἲ";s:6:"ἲ";s:3:"ἳ";s:6:"ἳ";s:3:"ἴ";s:6:"ἴ";s:3:"ἵ";s:6:"ἵ";s:3:"ἶ";s:6:"ἶ";s:3:"ἷ";s:6:"ἷ";s:3:"Ἰ";s:4:"Ἰ";s:3:"Ἱ";s:4:"Ἱ";s:3:"Ἲ";s:6:"Ἲ";s:3:"Ἳ";s:6:"Ἳ";s:3:"Ἴ";s:6:"Ἴ";s:3:"Ἵ";s:6:"Ἵ";s:3:"Ἶ";s:6:"Ἶ";s:3:"Ἷ";s:6:"Ἷ";s:3:"ὀ";s:4:"ὀ";s:3:"ὁ";s:4:"ὁ";s:3:"ὂ";s:6:"ὂ";s:3:"ὃ";s:6:"ὃ";s:3:"ὄ";s:6:"ὄ";s:3:"ὅ";s:6:"ὅ";s:3:"Ὀ";s:4:"Ὀ";s:3:"Ὁ";s:4:"Ὁ";s:3:"Ὂ";s:6:"Ὂ";s:3:"Ὃ";s:6:"Ὃ";s:3:"Ὄ";s:6:"Ὄ";s:3:"Ὅ";s:6:"Ὅ";s:3:"ὐ";s:4:"ὐ";s:3:"ὑ";s:4:"ὑ";s:3:"ὒ";s:6:"ὒ";s:3:"ὓ";s:6:"ὓ";s:3:"ὔ";s:6:"ὔ";s:3:"ὕ";s:6:"ὕ";s:3:"ὖ";s:6:"ὖ";s:3:"ὗ";s:6:"ὗ";s:3:"Ὑ";s:4:"Ὑ";s:3:"Ὓ";s:6:"Ὓ";s:3:"Ὕ";s:6:"Ὕ";s:3:"Ὗ";s:6:"Ὗ";s:3:"ὠ";s:4:"ὠ";s:3:"ὡ";s:4:"ὡ";s:3:"ὢ";s:6:"ὢ";s:3:"ὣ";s:6:"ὣ";s:3:"ὤ";s:6:"ὤ";s:3:"ὥ";s:6:"ὥ";s:3:"ὦ";s:6:"ὦ";s:3:"ὧ";s:6:"ὧ";s:3:"Ὠ";s:4:"Ὠ";s:3:"Ὡ";s:4:"Ὡ";s:3:"Ὢ";s:6:"Ὢ";s:3:"Ὣ";s:6:"Ὣ";s:3:"Ὤ";s:6:"Ὤ";s:3:"Ὥ";s:6:"Ὥ";s:3:"Ὦ";s:6:"Ὦ";s:3:"Ὧ";s:6:"Ὧ";s:3:"ὰ";s:4:"ὰ";s:3:"ά";s:4:"ά";s:3:"ὲ";s:4:"ὲ";s:3:"έ";s:4:"έ";s:3:"ὴ";s:4:"ὴ";s:3:"ή";s:4:"ή";s:3:"ὶ";s:4:"ὶ";s:3:"ί";s:4:"ί";s:3:"ὸ";s:4:"ὸ";s:3:"ό";s:4:"ό";s:3:"ὺ";s:4:"ὺ";s:3:"ύ";s:4:"ύ";s:3:"ὼ";s:4:"ὼ";s:3:"ώ";s:4:"ώ";s:3:"ᾀ";s:6:"ᾀ";s:3:"ᾁ";s:6:"ᾁ";s:3:"ᾂ";s:8:"ᾂ";s:3:"ᾃ";s:8:"ᾃ";s:3:"ᾄ";s:8:"ᾄ";s:3:"ᾅ";s:8:"ᾅ";s:3:"ᾆ";s:8:"ᾆ";s:3:"ᾇ";s:8:"ᾇ";s:3:"ᾈ";s:6:"ᾈ";s:3:"ᾉ";s:6:"ᾉ";s:3:"ᾊ";s:8:"ᾊ";s:3:"ᾋ";s:8:"ᾋ";s:3:"ᾌ";s:8:"ᾌ";s:3:"ᾍ";s:8:"ᾍ";s:3:"ᾎ";s:8:"ᾎ";s:3:"ᾏ";s:8:"ᾏ";s:3:"ᾐ";s:6:"ᾐ";s:3:"ᾑ";s:6:"ᾑ";s:3:"ᾒ";s:8:"ᾒ";s:3:"ᾓ";s:8:"ᾓ";s:3:"ᾔ";s:8:"ᾔ";s:3:"ᾕ";s:8:"ᾕ";s:3:"ᾖ";s:8:"ᾖ";s:3:"ᾗ";s:8:"ᾗ";s:3:"ᾘ";s:6:"ᾘ";s:3:"ᾙ";s:6:"ᾙ";s:3:"ᾚ";s:8:"ᾚ";s:3:"ᾛ";s:8:"ᾛ";s:3:"ᾜ";s:8:"ᾜ";s:3:"ᾝ";s:8:"ᾝ";s:3:"ᾞ";s:8:"ᾞ";s:3:"ᾟ";s:8:"ᾟ";s:3:"ᾠ";s:6:"ᾠ";s:3:"ᾡ";s:6:"ᾡ";s:3:"ᾢ";s:8:"ᾢ";s:3:"ᾣ";s:8:"ᾣ";s:3:"ᾤ";s:8:"ᾤ";s:3:"ᾥ";s:8:"ᾥ";s:3:"ᾦ";s:8:"ᾦ";s:3:"ᾧ";s:8:"ᾧ";s:3:"ᾨ";s:6:"ᾨ";s:3:"ᾩ";s:6:"ᾩ";s:3:"ᾪ";s:8:"ᾪ";s:3:"ᾫ";s:8:"ᾫ";s:3:"ᾬ";s:8:"ᾬ";s:3:"ᾭ";s:8:"ᾭ";s:3:"ᾮ";s:8:"ᾮ";s:3:"ᾯ";s:8:"ᾯ";s:3:"ᾰ";s:4:"ᾰ";s:3:"ᾱ";s:4:"ᾱ";s:3:"ᾲ";s:6:"ᾲ";s:3:"ᾳ";s:4:"ᾳ";s:3:"ᾴ";s:6:"ᾴ";s:3:"ᾶ";s:4:"ᾶ";s:3:"ᾷ";s:6:"ᾷ";s:3:"Ᾰ";s:4:"Ᾰ";s:3:"Ᾱ";s:4:"Ᾱ";s:3:"Ὰ";s:4:"Ὰ";s:3:"Ά";s:4:"Ά";s:3:"ᾼ";s:4:"ᾼ";s:3:"᾽";s:3:" ̓";s:3:"ι";s:2:"ι";s:3:"᾿";s:3:" ̓";s:3:"῀";s:3:" ͂";s:3:"῁";s:5:" ̈͂";s:3:"ῂ";s:6:"ῂ";s:3:"ῃ";s:4:"ῃ";s:3:"ῄ";s:6:"ῄ";s:3:"ῆ";s:4:"ῆ";s:3:"ῇ";s:6:"ῇ";s:3:"Ὲ";s:4:"Ὲ";s:3:"Έ";s:4:"Έ";s:3:"Ὴ";s:4:"Ὴ";s:3:"Ή";s:4:"Ή";s:3:"ῌ";s:4:"ῌ";s:3:"῍";s:5:" ̓̀";s:3:"῎";s:5:" ̓́";s:3:"῏";s:5:" ̓͂";s:3:"ῐ";s:4:"ῐ";s:3:"ῑ";s:4:"ῑ";s:3:"ῒ";s:6:"ῒ";s:3:"ΐ";s:6:"ΐ";s:3:"ῖ";s:4:"ῖ";s:3:"ῗ";s:6:"ῗ";s:3:"Ῐ";s:4:"Ῐ";s:3:"Ῑ";s:4:"Ῑ";s:3:"Ὶ";s:4:"Ὶ";s:3:"Ί";s:4:"Ί";s:3:"῝";s:5:" ̔̀";s:3:"῞";s:5:" ̔́";s:3:"῟";s:5:" ̔͂";s:3:"ῠ";s:4:"ῠ";s:3:"ῡ";s:4:"ῡ";s:3:"ῢ";s:6:"ῢ";s:3:"ΰ";s:6:"ΰ";s:3:"ῤ";s:4:"ῤ";s:3:"ῥ";s:4:"ῥ";s:3:"ῦ";s:4:"ῦ";s:3:"ῧ";s:6:"ῧ";s:3:"Ῠ";s:4:"Ῠ";s:3:"Ῡ";s:4:"Ῡ";s:3:"Ὺ";s:4:"Ὺ";s:3:"Ύ";s:4:"Ύ";s:3:"Ῥ";s:4:"Ῥ";s:3:"῭";s:5:" ̈̀";s:3:"΅";s:5:" ̈́";s:3:"`";s:1:"`";s:3:"ῲ";s:6:"ῲ";s:3:"ῳ";s:4:"ῳ";s:3:"ῴ";s:6:"ῴ";s:3:"ῶ";s:4:"ῶ";s:3:"ῷ";s:6:"ῷ";s:3:"Ὸ";s:4:"Ὸ";s:3:"Ό";s:4:"Ό";s:3:"Ὼ";s:4:"Ὼ";s:3:"Ώ";s:4:"Ώ";s:3:"ῼ";s:4:"ῼ";s:3:"´";s:3:" ́";s:3:"῾";s:3:" ̔";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:"‑";s:3:"‐";s:3:"‗";s:3:" ̳";s:3:"․";s:1:".";s:3:"‥";s:2:"..";s:3:"…";s:3:"...";s:3:" ";s:1:" ";s:3:"″";s:6:"′′";s:3:"‴";s:9:"′′′";s:3:"‶";s:6:"‵‵";s:3:"‷";s:9:"‵‵‵";s:3:"‼";s:2:"!!";s:3:"‾";s:3:" ̅";s:3:"⁇";s:2:"??";s:3:"⁈";s:2:"?!";s:3:"⁉";s:2:"!?";s:3:"⁗";s:12:"′′′′";s:3:" ";s:1:" ";s:3:"⁰";s:1:"0";s:3:"ⁱ";s:1:"i";s:3:"⁴";s:1:"4";s:3:"⁵";s:1:"5";s:3:"⁶";s:1:"6";s:3:"⁷";s:1:"7";s:3:"⁸";s:1:"8";s:3:"⁹";s:1:"9";s:3:"⁺";s:1:"+";s:3:"⁻";s:3:"−";s:3:"⁼";s:1:"=";s:3:"⁽";s:1:"(";s:3:"⁾";s:1:")";s:3:"ⁿ";s:1:"n";s:3:"₀";s:1:"0";s:3:"₁";s:1:"1";s:3:"₂";s:1:"2";s:3:"₃";s:1:"3";s:3:"₄";s:1:"4";s:3:"₅";s:1:"5";s:3:"₆";s:1:"6";s:3:"₇";s:1:"7";s:3:"₈";s:1:"8";s:3:"₉";s:1:"9";s:3:"₊";s:1:"+";s:3:"₋";s:3:"−";s:3:"₌";s:1:"=";s:3:"₍";s:1:"(";s:3:"₎";s:1:")";s:3:"ₐ";s:1:"a";s:3:"ₑ";s:1:"e";s:3:"ₒ";s:1:"o";s:3:"ₓ";s:1:"x";s:3:"ₔ";s:2:"ə";s:3:"ₕ";s:1:"h";s:3:"ₖ";s:1:"k";s:3:"ₗ";s:1:"l";s:3:"ₘ";s:1:"m";s:3:"ₙ";s:1:"n";s:3:"ₚ";s:1:"p";s:3:"ₛ";s:1:"s";s:3:"ₜ";s:1:"t";s:3:"₨";s:2:"Rs";s:3:"℀";s:3:"a/c";s:3:"℁";s:3:"a/s";s:3:"ℂ";s:1:"C";s:3:"℃";s:3:"°C";s:3:"℅";s:3:"c/o";s:3:"℆";s:3:"c/u";s:3:"ℇ";s:2:"Ɛ";s:3:"℉";s:3:"°F";s:3:"ℊ";s:1:"g";s:3:"ℋ";s:1:"H";s:3:"ℌ";s:1:"H";s:3:"ℍ";s:1:"H";s:3:"ℎ";s:1:"h";s:3:"ℏ";s:2:"ħ";s:3:"ℐ";s:1:"I";s:3:"ℑ";s:1:"I";s:3:"ℒ";s:1:"L";s:3:"ℓ";s:1:"l";s:3:"ℕ";s:1:"N";s:3:"№";s:2:"No";s:3:"ℙ";s:1:"P";s:3:"ℚ";s:1:"Q";s:3:"ℛ";s:1:"R";s:3:"ℜ";s:1:"R";s:3:"ℝ";s:1:"R";s:3:"℠";s:2:"SM";s:3:"℡";s:3:"TEL";s:3:"™";s:2:"TM";s:3:"ℤ";s:1:"Z";s:3:"Ω";s:2:"Ω";s:3:"ℨ";s:1:"Z";s:3:"K";s:1:"K";s:3:"Å";s:3:"Å";s:3:"ℬ";s:1:"B";s:3:"ℭ";s:1:"C";s:3:"ℯ";s:1:"e";s:3:"ℰ";s:1:"E";s:3:"ℱ";s:1:"F";s:3:"ℳ";s:1:"M";s:3:"ℴ";s:1:"o";s:3:"ℵ";s:2:"א";s:3:"ℶ";s:2:"ב";s:3:"ℷ";s:2:"ג";s:3:"ℸ";s:2:"ד";s:3:"ℹ";s:1:"i";s:3:"℻";s:3:"FAX";s:3:"ℼ";s:2:"π";s:3:"ℽ";s:2:"γ";s:3:"ℾ";s:2:"Γ";s:3:"ℿ";s:2:"Π";s:3:"⅀";s:3:"∑";s:3:"ⅅ";s:1:"D";s:3:"ⅆ";s:1:"d";s:3:"ⅇ";s:1:"e";s:3:"ⅈ";s:1:"i";s:3:"ⅉ";s:1:"j";s:3:"⅐";s:5:"1⁄7";s:3:"⅑";s:5:"1⁄9";s:3:"⅒";s:6:"1⁄10";s:3:"⅓";s:5:"1⁄3";s:3:"⅔";s:5:"2⁄3";s:3:"⅕";s:5:"1⁄5";s:3:"⅖";s:5:"2⁄5";s:3:"⅗";s:5:"3⁄5";s:3:"⅘";s:5:"4⁄5";s:3:"⅙";s:5:"1⁄6";s:3:"⅚";s:5:"5⁄6";s:3:"⅛";s:5:"1⁄8";s:3:"⅜";s:5:"3⁄8";s:3:"⅝";s:5:"5⁄8";s:3:"⅞";s:5:"7⁄8";s:3:"⅟";s:4:"1⁄";s:3:"Ⅰ";s:1:"I";s:3:"Ⅱ";s:2:"II";s:3:"Ⅲ";s:3:"III";s:3:"Ⅳ";s:2:"IV";s:3:"Ⅴ";s:1:"V";s:3:"Ⅵ";s:2:"VI";s:3:"Ⅶ";s:3:"VII";s:3:"Ⅷ";s:4:"VIII";s:3:"Ⅸ";s:2:"IX";s:3:"Ⅹ";s:1:"X";s:3:"Ⅺ";s:2:"XI";s:3:"Ⅻ";s:3:"XII";s:3:"Ⅼ";s:1:"L";s:3:"Ⅽ";s:1:"C";s:3:"Ⅾ";s:1:"D";s:3:"Ⅿ";s:1:"M";s:3:"ⅰ";s:1:"i";s:3:"ⅱ";s:2:"ii";s:3:"ⅲ";s:3:"iii";s:3:"ⅳ";s:2:"iv";s:3:"ⅴ";s:1:"v";s:3:"ⅵ";s:2:"vi";s:3:"ⅶ";s:3:"vii";s:3:"ⅷ";s:4:"viii";s:3:"ⅸ";s:2:"ix";s:3:"ⅹ";s:1:"x";s:3:"ⅺ";s:2:"xi";s:3:"ⅻ";s:3:"xii";s:3:"ⅼ";s:1:"l";s:3:"ⅽ";s:1:"c";s:3:"ⅾ";s:1:"d";s:3:"ⅿ";s:1:"m";s:3:"↉";s:5:"0⁄3";s:3:"↚";s:5:"↚";s:3:"↛";s:5:"↛";s:3:"↮";s:5:"↮";s:3:"⇍";s:5:"⇍";s:3:"⇎";s:5:"⇎";s:3:"⇏";s:5:"⇏";s:3:"∄";s:5:"∄";s:3:"∉";s:5:"∉";s:3:"∌";s:5:"∌";s:3:"∤";s:5:"∤";s:3:"∦";s:5:"∦";s:3:"∬";s:6:"∫∫";s:3:"∭";s:9:"∫∫∫";s:3:"∯";s:6:"∮∮";s:3:"∰";s:9:"∮∮∮";s:3:"≁";s:5:"≁";s:3:"≄";s:5:"≄";s:3:"≇";s:5:"≇";s:3:"≉";s:5:"≉";s:3:"≠";s:3:"≠";s:3:"≢";s:5:"≢";s:3:"≭";s:5:"≭";s:3:"≮";s:3:"≮";s:3:"≯";s:3:"≯";s:3:"≰";s:5:"≰";s:3:"≱";s:5:"≱";s:3:"≴";s:5:"≴";s:3:"≵";s:5:"≵";s:3:"≸";s:5:"≸";s:3:"≹";s:5:"≹";s:3:"⊀";s:5:"⊀";s:3:"⊁";s:5:"⊁";s:3:"⊄";s:5:"⊄";s:3:"⊅";s:5:"⊅";s:3:"⊈";s:5:"⊈";s:3:"⊉";s:5:"⊉";s:3:"⊬";s:5:"⊬";s:3:"⊭";s:5:"⊭";s:3:"⊮";s:5:"⊮";s:3:"⊯";s:5:"⊯";s:3:"⋠";s:5:"⋠";s:3:"⋡";s:5:"⋡";s:3:"⋢";s:5:"⋢";s:3:"⋣";s:5:"⋣";s:3:"⋪";s:5:"⋪";s:3:"⋫";s:5:"⋫";s:3:"⋬";s:5:"⋬";s:3:"⋭";s:5:"⋭";s:3:"〈";s:3:"〈";s:3:"〉";s:3:"〉";s:3:"①";s:1:"1";s:3:"②";s:1:"2";s:3:"③";s:1:"3";s:3:"④";s:1:"4";s:3:"⑤";s:1:"5";s:3:"⑥";s:1:"6";s:3:"⑦";s:1:"7";s:3:"⑧";s:1:"8";s:3:"⑨";s:1:"9";s:3:"⑩";s:2:"10";s:3:"⑪";s:2:"11";s:3:"⑫";s:2:"12";s:3:"⑬";s:2:"13";s:3:"⑭";s:2:"14";s:3:"⑮";s:2:"15";s:3:"⑯";s:2:"16";s:3:"⑰";s:2:"17";s:3:"⑱";s:2:"18";s:3:"⑲";s:2:"19";s:3:"⑳";s:2:"20";s:3:"⑴";s:3:"(1)";s:3:"⑵";s:3:"(2)";s:3:"⑶";s:3:"(3)";s:3:"⑷";s:3:"(4)";s:3:"⑸";s:3:"(5)";s:3:"⑹";s:3:"(6)";s:3:"⑺";s:3:"(7)";s:3:"⑻";s:3:"(8)";s:3:"⑼";s:3:"(9)";s:3:"⑽";s:4:"(10)";s:3:"⑾";s:4:"(11)";s:3:"⑿";s:4:"(12)";s:3:"⒀";s:4:"(13)";s:3:"⒁";s:4:"(14)";s:3:"⒂";s:4:"(15)";s:3:"⒃";s:4:"(16)";s:3:"⒄";s:4:"(17)";s:3:"⒅";s:4:"(18)";s:3:"⒆";s:4:"(19)";s:3:"⒇";s:4:"(20)";s:3:"⒈";s:2:"1.";s:3:"⒉";s:2:"2.";s:3:"⒊";s:2:"3.";s:3:"⒋";s:2:"4.";s:3:"⒌";s:2:"5.";s:3:"⒍";s:2:"6.";s:3:"⒎";s:2:"7.";s:3:"⒏";s:2:"8.";s:3:"⒐";s:2:"9.";s:3:"⒑";s:3:"10.";s:3:"⒒";s:3:"11.";s:3:"⒓";s:3:"12.";s:3:"⒔";s:3:"13.";s:3:"⒕";s:3:"14.";s:3:"⒖";s:3:"15.";s:3:"⒗";s:3:"16.";s:3:"⒘";s:3:"17.";s:3:"⒙";s:3:"18.";s:3:"⒚";s:3:"19.";s:3:"⒛";s:3:"20.";s:3:"⒜";s:3:"(a)";s:3:"⒝";s:3:"(b)";s:3:"⒞";s:3:"(c)";s:3:"⒟";s:3:"(d)";s:3:"⒠";s:3:"(e)";s:3:"⒡";s:3:"(f)";s:3:"⒢";s:3:"(g)";s:3:"⒣";s:3:"(h)";s:3:"⒤";s:3:"(i)";s:3:"⒥";s:3:"(j)";s:3:"⒦";s:3:"(k)";s:3:"⒧";s:3:"(l)";s:3:"⒨";s:3:"(m)";s:3:"⒩";s:3:"(n)";s:3:"⒪";s:3:"(o)";s:3:"⒫";s:3:"(p)";s:3:"⒬";s:3:"(q)";s:3:"⒭";s:3:"(r)";s:3:"⒮";s:3:"(s)";s:3:"⒯";s:3:"(t)";s:3:"⒰";s:3:"(u)";s:3:"⒱";s:3:"(v)";s:3:"⒲";s:3:"(w)";s:3:"⒳";s:3:"(x)";s:3:"⒴";s:3:"(y)";s:3:"⒵";s:3:"(z)";s:3:"Ⓐ";s:1:"A";s:3:"Ⓑ";s:1:"B";s:3:"Ⓒ";s:1:"C";s:3:"Ⓓ";s:1:"D";s:3:"Ⓔ";s:1:"E";s:3:"Ⓕ";s:1:"F";s:3:"Ⓖ";s:1:"G";s:3:"Ⓗ";s:1:"H";s:3:"Ⓘ";s:1:"I";s:3:"Ⓙ";s:1:"J";s:3:"Ⓚ";s:1:"K";s:3:"Ⓛ";s:1:"L";s:3:"Ⓜ";s:1:"M";s:3:"Ⓝ";s:1:"N";s:3:"Ⓞ";s:1:"O";s:3:"Ⓟ";s:1:"P";s:3:"Ⓠ";s:1:"Q";s:3:"Ⓡ";s:1:"R";s:3:"Ⓢ";s:1:"S";s:3:"Ⓣ";s:1:"T";s:3:"Ⓤ";s:1:"U";s:3:"Ⓥ";s:1:"V";s:3:"Ⓦ";s:1:"W";s:3:"Ⓧ";s:1:"X";s:3:"Ⓨ";s:1:"Y";s:3:"Ⓩ";s:1:"Z";s:3:"ⓐ";s:1:"a";s:3:"ⓑ";s:1:"b";s:3:"ⓒ";s:1:"c";s:3:"ⓓ";s:1:"d";s:3:"ⓔ";s:1:"e";s:3:"ⓕ";s:1:"f";s:3:"ⓖ";s:1:"g";s:3:"ⓗ";s:1:"h";s:3:"ⓘ";s:1:"i";s:3:"ⓙ";s:1:"j";s:3:"ⓚ";s:1:"k";s:3:"ⓛ";s:1:"l";s:3:"ⓜ";s:1:"m";s:3:"ⓝ";s:1:"n";s:3:"ⓞ";s:1:"o";s:3:"ⓟ";s:1:"p";s:3:"ⓠ";s:1:"q";s:3:"ⓡ";s:1:"r";s:3:"ⓢ";s:1:"s";s:3:"ⓣ";s:1:"t";s:3:"ⓤ";s:1:"u";s:3:"ⓥ";s:1:"v";s:3:"ⓦ";s:1:"w";s:3:"ⓧ";s:1:"x";s:3:"ⓨ";s:1:"y";s:3:"ⓩ";s:1:"z";s:3:"⓪";s:1:"0";s:3:"⨌";s:12:"∫∫∫∫";s:3:"⩴";s:3:"::=";s:3:"⩵";s:2:"==";s:3:"⩶";s:3:"===";s:3:"⫝̸";s:5:"⫝̸";s:3:"ⱼ";s:1:"j";s:3:"ⱽ";s:1:"V";s:3:"ⵯ";s:3:"ⵡ";s:3:"⺟";s:3:"母";s:3:"⻳";s:3:"龟";s:3:"⼀";s:3:"一";s:3:"⼁";s:3:"丨";s:3:"⼂";s:3:"丶";s:3:"⼃";s:3:"丿";s:3:"⼄";s:3:"乙";s:3:"⼅";s:3:"亅";s:3:"⼆";s:3:"二";s:3:"⼇";s:3:"亠";s:3:"⼈";s:3:"人";s:3:"⼉";s:3:"儿";s:3:"⼊";s:3:"入";s:3:"⼋";s:3:"八";s:3:"⼌";s:3:"冂";s:3:"⼍";s:3:"冖";s:3:"⼎";s:3:"冫";s:3:"⼏";s:3:"几";s:3:"⼐";s:3:"凵";s:3:"⼑";s:3:"刀";s:3:"⼒";s:3:"力";s:3:"⼓";s:3:"勹";s:3:"⼔";s:3:"匕";s:3:"⼕";s:3:"匚";s:3:"⼖";s:3:"匸";s:3:"⼗";s:3:"十";s:3:"⼘";s:3:"卜";s:3:"⼙";s:3:"卩";s:3:"⼚";s:3:"厂";s:3:"⼛";s:3:"厶";s:3:"⼜";s:3:"又";s:3:"⼝";s:3:"口";s:3:"⼞";s:3:"囗";s:3:"⼟";s:3:"土";s:3:"⼠";s:3:"士";s:3:"⼡";s:3:"夂";s:3:"⼢";s:3:"夊";s:3:"⼣";s:3:"夕";s:3:"⼤";s:3:"大";s:3:"⼥";s:3:"女";s:3:"⼦";s:3:"子";s:3:"⼧";s:3:"宀";s:3:"⼨";s:3:"寸";s:3:"⼩";s:3:"小";s:3:"⼪";s:3:"尢";s:3:"⼫";s:3:"尸";s:3:"⼬";s:3:"屮";s:3:"⼭";s:3:"山";s:3:"⼮";s:3:"巛";s:3:"⼯";s:3:"工";s:3:"⼰";s:3:"己";s:3:"⼱";s:3:"巾";s:3:"⼲";s:3:"干";s:3:"⼳";s:3:"幺";s:3:"⼴";s:3:"广";s:3:"⼵";s:3:"廴";s:3:"⼶";s:3:"廾";s:3:"⼷";s:3:"弋";s:3:"⼸";s:3:"弓";s:3:"⼹";s:3:"彐";s:3:"⼺";s:3:"彡";s:3:"⼻";s:3:"彳";s:3:"⼼";s:3:"心";s:3:"⼽";s:3:"戈";s:3:"⼾";s:3:"戶";s:3:"⼿";s:3:"手";s:3:"⽀";s:3:"支";s:3:"⽁";s:3:"攴";s:3:"⽂";s:3:"文";s:3:"⽃";s:3:"斗";s:3:"⽄";s:3:"斤";s:3:"⽅";s:3:"方";s:3:"⽆";s:3:"无";s:3:"⽇";s:3:"日";s:3:"⽈";s:3:"曰";s:3:"⽉";s:3:"月";s:3:"⽊";s:3:"木";s:3:"⽋";s:3:"欠";s:3:"⽌";s:3:"止";s:3:"⽍";s:3:"歹";s:3:"⽎";s:3:"殳";s:3:"⽏";s:3:"毋";s:3:"⽐";s:3:"比";s:3:"⽑";s:3:"毛";s:3:"⽒";s:3:"氏";s:3:"⽓";s:3:"气";s:3:"⽔";s:3:"水";s:3:"⽕";s:3:"火";s:3:"⽖";s:3:"爪";s:3:"⽗";s:3:"父";s:3:"⽘";s:3:"爻";s:3:"⽙";s:3:"爿";s:3:"⽚";s:3:"片";s:3:"⽛";s:3:"牙";s:3:"⽜";s:3:"牛";s:3:"⽝";s:3:"犬";s:3:"⽞";s:3:"玄";s:3:"⽟";s:3:"玉";s:3:"⽠";s:3:"瓜";s:3:"⽡";s:3:"瓦";s:3:"⽢";s:3:"甘";s:3:"⽣";s:3:"生";s:3:"⽤";s:3:"用";s:3:"⽥";s:3:"田";s:3:"⽦";s:3:"疋";s:3:"⽧";s:3:"疒";s:3:"⽨";s:3:"癶";s:3:"⽩";s:3:"白";s:3:"⽪";s:3:"皮";s:3:"⽫";s:3:"皿";s:3:"⽬";s:3:"目";s:3:"⽭";s:3:"矛";s:3:"⽮";s:3:"矢";s:3:"⽯";s:3:"石";s:3:"⽰";s:3:"示";s:3:"⽱";s:3:"禸";s:3:"⽲";s:3:"禾";s:3:"⽳";s:3:"穴";s:3:"⽴";s:3:"立";s:3:"⽵";s:3:"竹";s:3:"⽶";s:3:"米";s:3:"⽷";s:3:"糸";s:3:"⽸";s:3:"缶";s:3:"⽹";s:3:"网";s:3:"⽺";s:3:"羊";s:3:"⽻";s:3:"羽";s:3:"⽼";s:3:"老";s:3:"⽽";s:3:"而";s:3:"⽾";s:3:"耒";s:3:"⽿";s:3:"耳";s:3:"⾀";s:3:"聿";s:3:"⾁";s:3:"肉";s:3:"⾂";s:3:"臣";s:3:"⾃";s:3:"自";s:3:"⾄";s:3:"至";s:3:"⾅";s:3:"臼";s:3:"⾆";s:3:"舌";s:3:"⾇";s:3:"舛";s:3:"⾈";s:3:"舟";s:3:"⾉";s:3:"艮";s:3:"⾊";s:3:"色";s:3:"⾋";s:3:"艸";s:3:"⾌";s:3:"虍";s:3:"⾍";s:3:"虫";s:3:"⾎";s:3:"血";s:3:"⾏";s:3:"行";s:3:"⾐";s:3:"衣";s:3:"⾑";s:3:"襾";s:3:"⾒";s:3:"見";s:3:"⾓";s:3:"角";s:3:"⾔";s:3:"言";s:3:"⾕";s:3:"谷";s:3:"⾖";s:3:"豆";s:3:"⾗";s:3:"豕";s:3:"⾘";s:3:"豸";s:3:"⾙";s:3:"貝";s:3:"⾚";s:3:"赤";s:3:"⾛";s:3:"走";s:3:"⾜";s:3:"足";s:3:"⾝";s:3:"身";s:3:"⾞";s:3:"車";s:3:"⾟";s:3:"辛";s:3:"⾠";s:3:"辰";s:3:"⾡";s:3:"辵";s:3:"⾢";s:3:"邑";s:3:"⾣";s:3:"酉";s:3:"⾤";s:3:"釆";s:3:"⾥";s:3:"里";s:3:"⾦";s:3:"金";s:3:"⾧";s:3:"長";s:3:"⾨";s:3:"門";s:3:"⾩";s:3:"阜";s:3:"⾪";s:3:"隶";s:3:"⾫";s:3:"隹";s:3:"⾬";s:3:"雨";s:3:"⾭";s:3:"靑";s:3:"⾮";s:3:"非";s:3:"⾯";s:3:"面";s:3:"⾰";s:3:"革";s:3:"⾱";s:3:"韋";s:3:"⾲";s:3:"韭";s:3:"⾳";s:3:"音";s:3:"⾴";s:3:"頁";s:3:"⾵";s:3:"風";s:3:"⾶";s:3:"飛";s:3:"⾷";s:3:"食";s:3:"⾸";s:3:"首";s:3:"⾹";s:3:"香";s:3:"⾺";s:3:"馬";s:3:"⾻";s:3:"骨";s:3:"⾼";s:3:"高";s:3:"⾽";s:3:"髟";s:3:"⾾";s:3:"鬥";s:3:"⾿";s:3:"鬯";s:3:"⿀";s:3:"鬲";s:3:"⿁";s:3:"鬼";s:3:"⿂";s:3:"魚";s:3:"⿃";s:3:"鳥";s:3:"⿄";s:3:"鹵";s:3:"⿅";s:3:"鹿";s:3:"⿆";s:3:"麥";s:3:"⿇";s:3:"麻";s:3:"⿈";s:3:"黃";s:3:"⿉";s:3:"黍";s:3:"⿊";s:3:"黑";s:3:"⿋";s:3:"黹";s:3:"⿌";s:3:"黽";s:3:"⿍";s:3:"鼎";s:3:"⿎";s:3:"鼓";s:3:"⿏";s:3:"鼠";s:3:"⿐";s:3:"鼻";s:3:"⿑";s:3:"齊";s:3:"⿒";s:3:"齒";s:3:"⿓";s:3:"龍";s:3:"⿔";s:3:"龜";s:3:"⿕";s:3:"龠";s:3:" ";s:1:" ";s:3:"〶";s:3:"〒";s:3:"〸";s:3:"十";s:3:"〹";s:3:"卄";s:3:"〺";s:3:"卅";s:3:"が";s:6:"が";s:3:"ぎ";s:6:"ぎ";s:3:"ぐ";s:6:"ぐ";s:3:"げ";s:6:"げ";s:3:"ご";s:6:"ご";s:3:"ざ";s:6:"ざ";s:3:"じ";s:6:"じ";s:3:"ず";s:6:"ず";s:3:"ぜ";s:6:"ぜ";s:3:"ぞ";s:6:"ぞ";s:3:"だ";s:6:"だ";s:3:"ぢ";s:6:"ぢ";s:3:"づ";s:6:"づ";s:3:"で";s:6:"で";s:3:"ど";s:6:"ど";s:3:"ば";s:6:"ば";s:3:"ぱ";s:6:"ぱ";s:3:"び";s:6:"び";s:3:"ぴ";s:6:"ぴ";s:3:"ぶ";s:6:"ぶ";s:3:"ぷ";s:6:"ぷ";s:3:"べ";s:6:"べ";s:3:"ぺ";s:6:"ぺ";s:3:"ぼ";s:6:"ぼ";s:3:"ぽ";s:6:"ぽ";s:3:"ゔ";s:6:"ゔ";s:3:"゛";s:4:" ゙";s:3:"゜";s:4:" ゚";s:3:"ゞ";s:6:"ゞ";s:3:"ゟ";s:6:"より";s:3:"ガ";s:6:"ガ";s:3:"ギ";s:6:"ギ";s:3:"グ";s:6:"グ";s:3:"ゲ";s:6:"ゲ";s:3:"ゴ";s:6:"ゴ";s:3:"ザ";s:6:"ザ";s:3:"ジ";s:6:"ジ";s:3:"ズ";s:6:"ズ";s:3:"ゼ";s:6:"ゼ";s:3:"ゾ";s:6:"ゾ";s:3:"ダ";s:6:"ダ";s:3:"ヂ";s:6:"ヂ";s:3:"ヅ";s:6:"ヅ";s:3:"デ";s:6:"デ";s:3:"ド";s:6:"ド";s:3:"バ";s:6:"バ";s:3:"パ";s:6:"パ";s:3:"ビ";s:6:"ビ";s:3:"ピ";s:6:"ピ";s:3:"ブ";s:6:"ブ";s:3:"プ";s:6:"プ";s:3:"ベ";s:6:"ベ";s:3:"ペ";s:6:"ペ";s:3:"ボ";s:6:"ボ";s:3:"ポ";s:6:"ポ";s:3:"ヴ";s:6:"ヴ";s:3:"ヷ";s:6:"ヷ";s:3:"ヸ";s:6:"ヸ";s:3:"ヹ";s:6:"ヹ";s:3:"ヺ";s:6:"ヺ";s:3:"ヾ";s:6:"ヾ";s:3:"ヿ";s:6:"コト";s:3:"ㄱ";s:3:"ᄀ";s:3:"ㄲ";s:3:"ᄁ";s:3:"ㄳ";s:3:"ᆪ";s:3:"ㄴ";s:3:"ᄂ";s:3:"ㄵ";s:3:"ᆬ";s:3:"ㄶ";s:3:"ᆭ";s:3:"ㄷ";s:3:"ᄃ";s:3:"ㄸ";s:3:"ᄄ";s:3:"ㄹ";s:3:"ᄅ";s:3:"ㄺ";s:3:"ᆰ";s:3:"ㄻ";s:3:"ᆱ";s:3:"ㄼ";s:3:"ᆲ";s:3:"ㄽ";s:3:"ᆳ";s:3:"ㄾ";s:3:"ᆴ";s:3:"ㄿ";s:3:"ᆵ";s:3:"ㅀ";s:3:"ᄚ";s:3:"ㅁ";s:3:"ᄆ";s:3:"ㅂ";s:3:"ᄇ";s:3:"ㅃ";s:3:"ᄈ";s:3:"ㅄ";s:3:"ᄡ";s:3:"ㅅ";s:3:"ᄉ";s:3:"ㅆ";s:3:"ᄊ";s:3:"ㅇ";s:3:"ᄋ";s:3:"ㅈ";s:3:"ᄌ";s:3:"ㅉ";s:3:"ᄍ";s:3:"ㅊ";s:3:"ᄎ";s:3:"ㅋ";s:3:"ᄏ";s:3:"ㅌ";s:3:"ᄐ";s:3:"ㅍ";s:3:"ᄑ";s:3:"ㅎ";s:3:"ᄒ";s:3:"ㅏ";s:3:"ᅡ";s:3:"ㅐ";s:3:"ᅢ";s:3:"ㅑ";s:3:"ᅣ";s:3:"ㅒ";s:3:"ᅤ";s:3:"ㅓ";s:3:"ᅥ";s:3:"ㅔ";s:3:"ᅦ";s:3:"ㅕ";s:3:"ᅧ";s:3:"ㅖ";s:3:"ᅨ";s:3:"ㅗ";s:3:"ᅩ";s:3:"ㅘ";s:3:"ᅪ";s:3:"ㅙ";s:3:"ᅫ";s:3:"ㅚ";s:3:"ᅬ";s:3:"ㅛ";s:3:"ᅭ";s:3:"ㅜ";s:3:"ᅮ";s:3:"ㅝ";s:3:"ᅯ";s:3:"ㅞ";s:3:"ᅰ";s:3:"ㅟ";s:3:"ᅱ";s:3:"ㅠ";s:3:"ᅲ";s:3:"ㅡ";s:3:"ᅳ";s:3:"ㅢ";s:3:"ᅴ";s:3:"ㅣ";s:3:"ᅵ";s:3:"ㅤ";s:3:"ᅠ";s:3:"ㅥ";s:3:"ᄔ";s:3:"ㅦ";s:3:"ᄕ";s:3:"ㅧ";s:3:"ᇇ";s:3:"ㅨ";s:3:"ᇈ";s:3:"ㅩ";s:3:"ᇌ";s:3:"ㅪ";s:3:"ᇎ";s:3:"ㅫ";s:3:"ᇓ";s:3:"ㅬ";s:3:"ᇗ";s:3:"ㅭ";s:3:"ᇙ";s:3:"ㅮ";s:3:"ᄜ";s:3:"ㅯ";s:3:"ᇝ";s:3:"ㅰ";s:3:"ᇟ";s:3:"ㅱ";s:3:"ᄝ";s:3:"ㅲ";s:3:"ᄞ";s:3:"ㅳ";s:3:"ᄠ";s:3:"ㅴ";s:3:"ᄢ";s:3:"ㅵ";s:3:"ᄣ";s:3:"ㅶ";s:3:"ᄧ";s:3:"ㅷ";s:3:"ᄩ";s:3:"ㅸ";s:3:"ᄫ";s:3:"ㅹ";s:3:"ᄬ";s:3:"ㅺ";s:3:"ᄭ";s:3:"ㅻ";s:3:"ᄮ";s:3:"ㅼ";s:3:"ᄯ";s:3:"ㅽ";s:3:"ᄲ";s:3:"ㅾ";s:3:"ᄶ";s:3:"ㅿ";s:3:"ᅀ";s:3:"ㆀ";s:3:"ᅇ";s:3:"ㆁ";s:3:"ᅌ";s:3:"ㆂ";s:3:"ᇱ";s:3:"ㆃ";s:3:"ᇲ";s:3:"ㆄ";s:3:"ᅗ";s:3:"ㆅ";s:3:"ᅘ";s:3:"ㆆ";s:3:"ᅙ";s:3:"ㆇ";s:3:"ᆄ";s:3:"ㆈ";s:3:"ᆅ";s:3:"ㆉ";s:3:"ᆈ";s:3:"ㆊ";s:3:"ᆑ";s:3:"ㆋ";s:3:"ᆒ";s:3:"ㆌ";s:3:"ᆔ";s:3:"ㆍ";s:3:"ᆞ";s:3:"ㆎ";s:3:"ᆡ";s:3:"㆒";s:3:"一";s:3:"㆓";s:3:"二";s:3:"㆔";s:3:"三";s:3:"㆕";s:3:"四";s:3:"㆖";s:3:"上";s:3:"㆗";s:3:"中";s:3:"㆘";s:3:"下";s:3:"㆙";s:3:"甲";s:3:"㆚";s:3:"乙";s:3:"㆛";s:3:"丙";s:3:"㆜";s:3:"丁";s:3:"㆝";s:3:"天";s:3:"㆞";s:3:"地";s:3:"㆟";s:3:"人";s:3:"㈀";s:5:"(ᄀ)";s:3:"㈁";s:5:"(ᄂ)";s:3:"㈂";s:5:"(ᄃ)";s:3:"㈃";s:5:"(ᄅ)";s:3:"㈄";s:5:"(ᄆ)";s:3:"㈅";s:5:"(ᄇ)";s:3:"㈆";s:5:"(ᄉ)";s:3:"㈇";s:5:"(ᄋ)";s:3:"㈈";s:5:"(ᄌ)";s:3:"㈉";s:5:"(ᄎ)";s:3:"㈊";s:5:"(ᄏ)";s:3:"㈋";s:5:"(ᄐ)";s:3:"㈌";s:5:"(ᄑ)";s:3:"㈍";s:5:"(ᄒ)";s:3:"㈎";s:8:"(가)";s:3:"㈏";s:8:"(나)";s:3:"㈐";s:8:"(다)";s:3:"㈑";s:8:"(라)";s:3:"㈒";s:8:"(마)";s:3:"㈓";s:8:"(바)";s:3:"㈔";s:8:"(사)";s:3:"㈕";s:8:"(아)";s:3:"㈖";s:8:"(자)";s:3:"㈗";s:8:"(차)";s:3:"㈘";s:8:"(카)";s:3:"㈙";s:8:"(타)";s:3:"㈚";s:8:"(파)";s:3:"㈛";s:8:"(하)";s:3:"㈜";s:8:"(주)";s:3:"㈝";s:17:"(오전)";s:3:"㈞";s:14:"(오후)";s:3:"㈠";s:5:"(一)";s:3:"㈡";s:5:"(二)";s:3:"㈢";s:5:"(三)";s:3:"㈣";s:5:"(四)";s:3:"㈤";s:5:"(五)";s:3:"㈥";s:5:"(六)";s:3:"㈦";s:5:"(七)";s:3:"㈧";s:5:"(八)";s:3:"㈨";s:5:"(九)";s:3:"㈩";s:5:"(十)";s:3:"㈪";s:5:"(月)";s:3:"㈫";s:5:"(火)";s:3:"㈬";s:5:"(水)";s:3:"㈭";s:5:"(木)";s:3:"㈮";s:5:"(金)";s:3:"㈯";s:5:"(土)";s:3:"㈰";s:5:"(日)";s:3:"㈱";s:5:"(株)";s:3:"㈲";s:5:"(有)";s:3:"㈳";s:5:"(社)";s:3:"㈴";s:5:"(名)";s:3:"㈵";s:5:"(特)";s:3:"㈶";s:5:"(財)";s:3:"㈷";s:5:"(祝)";s:3:"㈸";s:5:"(労)";s:3:"㈹";s:5:"(代)";s:3:"㈺";s:5:"(呼)";s:3:"㈻";s:5:"(学)";s:3:"㈼";s:5:"(監)";s:3:"㈽";s:5:"(企)";s:3:"㈾";s:5:"(資)";s:3:"㈿";s:5:"(協)";s:3:"㉀";s:5:"(祭)";s:3:"㉁";s:5:"(休)";s:3:"㉂";s:5:"(自)";s:3:"㉃";s:5:"(至)";s:3:"㉄";s:3:"問";s:3:"㉅";s:3:"幼";s:3:"㉆";s:3:"文";s:3:"㉇";s:3:"箏";s:3:"㉐";s:3:"PTE";s:3:"㉑";s:2:"21";s:3:"㉒";s:2:"22";s:3:"㉓";s:2:"23";s:3:"㉔";s:2:"24";s:3:"㉕";s:2:"25";s:3:"㉖";s:2:"26";s:3:"㉗";s:2:"27";s:3:"㉘";s:2:"28";s:3:"㉙";s:2:"29";s:3:"㉚";s:2:"30";s:3:"㉛";s:2:"31";s:3:"㉜";s:2:"32";s:3:"㉝";s:2:"33";s:3:"㉞";s:2:"34";s:3:"㉟";s:2:"35";s:3:"㉠";s:3:"ᄀ";s:3:"㉡";s:3:"ᄂ";s:3:"㉢";s:3:"ᄃ";s:3:"㉣";s:3:"ᄅ";s:3:"㉤";s:3:"ᄆ";s:3:"㉥";s:3:"ᄇ";s:3:"㉦";s:3:"ᄉ";s:3:"㉧";s:3:"ᄋ";s:3:"㉨";s:3:"ᄌ";s:3:"㉩";s:3:"ᄎ";s:3:"㉪";s:3:"ᄏ";s:3:"㉫";s:3:"ᄐ";s:3:"㉬";s:3:"ᄑ";s:3:"㉭";s:3:"ᄒ";s:3:"㉮";s:6:"가";s:3:"㉯";s:6:"나";s:3:"㉰";s:6:"다";s:3:"㉱";s:6:"라";s:3:"㉲";s:6:"마";s:3:"㉳";s:6:"바";s:3:"㉴";s:6:"사";s:3:"㉵";s:6:"아";s:3:"㉶";s:6:"자";s:3:"㉷";s:6:"차";s:3:"㉸";s:6:"카";s:3:"㉹";s:6:"타";s:3:"㉺";s:6:"파";s:3:"㉻";s:6:"하";s:3:"㉼";s:15:"참고";s:3:"㉽";s:12:"주의";s:3:"㉾";s:6:"우";s:3:"㊀";s:3:"一";s:3:"㊁";s:3:"二";s:3:"㊂";s:3:"三";s:3:"㊃";s:3:"四";s:3:"㊄";s:3:"五";s:3:"㊅";s:3:"六";s:3:"㊆";s:3:"七";s:3:"㊇";s:3:"八";s:3:"㊈";s:3:"九";s:3:"㊉";s:3:"十";s:3:"㊊";s:3:"月";s:3:"㊋";s:3:"火";s:3:"㊌";s:3:"水";s:3:"㊍";s:3:"木";s:3:"㊎";s:3:"金";s:3:"㊏";s:3:"土";s:3:"㊐";s:3:"日";s:3:"㊑";s:3:"株";s:3:"㊒";s:3:"有";s:3:"㊓";s:3:"社";s:3:"㊔";s:3:"名";s:3:"㊕";s:3:"特";s:3:"㊖";s:3:"財";s:3:"㊗";s:3:"祝";s:3:"㊘";s:3:"労";s:3:"㊙";s:3:"秘";s:3:"㊚";s:3:"男";s:3:"㊛";s:3:"女";s:3:"㊜";s:3:"適";s:3:"㊝";s:3:"優";s:3:"㊞";s:3:"印";s:3:"㊟";s:3:"注";s:3:"㊠";s:3:"項";s:3:"㊡";s:3:"休";s:3:"㊢";s:3:"写";s:3:"㊣";s:3:"正";s:3:"㊤";s:3:"上";s:3:"㊥";s:3:"中";s:3:"㊦";s:3:"下";s:3:"㊧";s:3:"左";s:3:"㊨";s:3:"右";s:3:"㊩";s:3:"医";s:3:"㊪";s:3:"宗";s:3:"㊫";s:3:"学";s:3:"㊬";s:3:"監";s:3:"㊭";s:3:"企";s:3:"㊮";s:3:"資";s:3:"㊯";s:3:"協";s:3:"㊰";s:3:"夜";s:3:"㊱";s:2:"36";s:3:"㊲";s:2:"37";s:3:"㊳";s:2:"38";s:3:"㊴";s:2:"39";s:3:"㊵";s:2:"40";s:3:"㊶";s:2:"41";s:3:"㊷";s:2:"42";s:3:"㊸";s:2:"43";s:3:"㊹";s:2:"44";s:3:"㊺";s:2:"45";s:3:"㊻";s:2:"46";s:3:"㊼";s:2:"47";s:3:"㊽";s:2:"48";s:3:"㊾";s:2:"49";s:3:"㊿";s:2:"50";s:3:"㋀";s:4:"1月";s:3:"㋁";s:4:"2月";s:3:"㋂";s:4:"3月";s:3:"㋃";s:4:"4月";s:3:"㋄";s:4:"5月";s:3:"㋅";s:4:"6月";s:3:"㋆";s:4:"7月";s:3:"㋇";s:4:"8月";s:3:"㋈";s:4:"9月";s:3:"㋉";s:5:"10月";s:3:"㋊";s:5:"11月";s:3:"㋋";s:5:"12月";s:3:"㋌";s:2:"Hg";s:3:"㋍";s:3:"erg";s:3:"㋎";s:2:"eV";s:3:"㋏";s:3:"LTD";s:3:"㋐";s:3:"ア";s:3:"㋑";s:3:"イ";s:3:"㋒";s:3:"ウ";s:3:"㋓";s:3:"エ";s:3:"㋔";s:3:"オ";s:3:"㋕";s:3:"カ";s:3:"㋖";s:3:"キ";s:3:"㋗";s:3:"ク";s:3:"㋘";s:3:"ケ";s:3:"㋙";s:3:"コ";s:3:"㋚";s:3:"サ";s:3:"㋛";s:3:"シ";s:3:"㋜";s:3:"ス";s:3:"㋝";s:3:"セ";s:3:"㋞";s:3:"ソ";s:3:"㋟";s:3:"タ";s:3:"㋠";s:3:"チ";s:3:"㋡";s:3:"ツ";s:3:"㋢";s:3:"テ";s:3:"㋣";s:3:"ト";s:3:"㋤";s:3:"ナ";s:3:"㋥";s:3:"ニ";s:3:"㋦";s:3:"ヌ";s:3:"㋧";s:3:"ネ";s:3:"㋨";s:3:"ノ";s:3:"㋩";s:3:"ハ";s:3:"㋪";s:3:"ヒ";s:3:"㋫";s:3:"フ";s:3:"㋬";s:3:"ヘ";s:3:"㋭";s:3:"ホ";s:3:"㋮";s:3:"マ";s:3:"㋯";s:3:"ミ";s:3:"㋰";s:3:"ム";s:3:"㋱";s:3:"メ";s:3:"㋲";s:3:"モ";s:3:"㋳";s:3:"ヤ";s:3:"㋴";s:3:"ユ";s:3:"㋵";s:3:"ヨ";s:3:"㋶";s:3:"ラ";s:3:"㋷";s:3:"リ";s:3:"㋸";s:3:"ル";s:3:"㋹";s:3:"レ";s:3:"㋺";s:3:"ロ";s:3:"㋻";s:3:"ワ";s:3:"㋼";s:3:"ヰ";s:3:"㋽";s:3:"ヱ";s:3:"㋾";s:3:"ヲ";s:3:"㌀";s:15:"アパート";s:3:"㌁";s:12:"アルファ";s:3:"㌂";s:15:"アンペア";s:3:"㌃";s:9:"アール";s:3:"㌄";s:15:"イニング";s:3:"㌅";s:9:"インチ";s:3:"㌆";s:9:"ウォン";s:3:"㌇";s:18:"エスクード";s:3:"㌈";s:12:"エーカー";s:3:"㌉";s:9:"オンス";s:3:"㌊";s:9:"オーム";s:3:"㌋";s:9:"カイリ";s:3:"㌌";s:12:"カラット";s:3:"㌍";s:12:"カロリー";s:3:"㌎";s:12:"ガロン";s:3:"㌏";s:12:"ガンマ";s:3:"㌐";s:12:"ギガ";s:3:"㌑";s:12:"ギニー";s:3:"㌒";s:12:"キュリー";s:3:"㌓";s:18:"ギルダー";s:3:"㌔";s:6:"キロ";s:3:"㌕";s:18:"キログラム";s:3:"㌖";s:18:"キロメートル";s:3:"㌗";s:15:"キロワット";s:3:"㌘";s:12:"グラム";s:3:"㌙";s:18:"グラムトン";s:3:"㌚";s:18:"クルゼイロ";s:3:"㌛";s:12:"クローネ";s:3:"㌜";s:9:"ケース";s:3:"㌝";s:9:"コルナ";s:3:"㌞";s:12:"コーポ";s:3:"㌟";s:12:"サイクル";s:3:"㌠";s:15:"サンチーム";s:3:"㌡";s:15:"シリング";s:3:"㌢";s:9:"センチ";s:3:"㌣";s:9:"セント";s:3:"㌤";s:12:"ダース";s:3:"㌥";s:9:"デシ";s:3:"㌦";s:9:"ドル";s:3:"㌧";s:6:"トン";s:3:"㌨";s:6:"ナノ";s:3:"㌩";s:9:"ノット";s:3:"㌪";s:9:"ハイツ";s:3:"㌫";s:18:"パーセント";s:3:"㌬";s:12:"パーツ";s:3:"㌭";s:15:"バーレル";s:3:"㌮";s:18:"ピアストル";s:3:"㌯";s:12:"ピクル";s:3:"㌰";s:9:"ピコ";s:3:"㌱";s:9:"ビル";s:3:"㌲";s:18:"ファラッド";s:3:"㌳";s:12:"フィート";s:3:"㌴";s:18:"ブッシェル";s:3:"㌵";s:9:"フラン";s:3:"㌶";s:15:"ヘクタール";s:3:"㌷";s:9:"ペソ";s:3:"㌸";s:12:"ペニヒ";s:3:"㌹";s:9:"ヘルツ";s:3:"㌺";s:12:"ペンス";s:3:"㌻";s:15:"ページ";s:3:"㌼";s:12:"ベータ";s:3:"㌽";s:15:"ポイント";s:3:"㌾";s:12:"ボルト";s:3:"㌿";s:6:"ホン";s:3:"㍀";s:15:"ポンド";s:3:"㍁";s:9:"ホール";s:3:"㍂";s:9:"ホーン";s:3:"㍃";s:12:"マイクロ";s:3:"㍄";s:9:"マイル";s:3:"㍅";s:9:"マッハ";s:3:"㍆";s:9:"マルク";s:3:"㍇";s:15:"マンション";s:3:"㍈";s:12:"ミクロン";s:3:"㍉";s:6:"ミリ";s:3:"㍊";s:18:"ミリバール";s:3:"㍋";s:9:"メガ";s:3:"㍌";s:15:"メガトン";s:3:"㍍";s:12:"メートル";s:3:"㍎";s:12:"ヤード";s:3:"㍏";s:9:"ヤール";s:3:"㍐";s:9:"ユアン";s:3:"㍑";s:12:"リットル";s:3:"㍒";s:6:"リラ";s:3:"㍓";s:12:"ルピー";s:3:"㍔";s:15:"ルーブル";s:3:"㍕";s:6:"レム";s:3:"㍖";s:18:"レントゲン";s:3:"㍗";s:9:"ワット";s:3:"㍘";s:4:"0点";s:3:"㍙";s:4:"1点";s:3:"㍚";s:4:"2点";s:3:"㍛";s:4:"3点";s:3:"㍜";s:4:"4点";s:3:"㍝";s:4:"5点";s:3:"㍞";s:4:"6点";s:3:"㍟";s:4:"7点";s:3:"㍠";s:4:"8点";s:3:"㍡";s:4:"9点";s:3:"㍢";s:5:"10点";s:3:"㍣";s:5:"11点";s:3:"㍤";s:5:"12点";s:3:"㍥";s:5:"13点";s:3:"㍦";s:5:"14点";s:3:"㍧";s:5:"15点";s:3:"㍨";s:5:"16点";s:3:"㍩";s:5:"17点";s:3:"㍪";s:5:"18点";s:3:"㍫";s:5:"19点";s:3:"㍬";s:5:"20点";s:3:"㍭";s:5:"21点";s:3:"㍮";s:5:"22点";s:3:"㍯";s:5:"23点";s:3:"㍰";s:5:"24点";s:3:"㍱";s:3:"hPa";s:3:"㍲";s:2:"da";s:3:"㍳";s:2:"AU";s:3:"㍴";s:3:"bar";s:3:"㍵";s:2:"oV";s:3:"㍶";s:2:"pc";s:3:"㍷";s:2:"dm";s:3:"㍸";s:3:"dm2";s:3:"㍹";s:3:"dm3";s:3:"㍺";s:2:"IU";s:3:"㍻";s:6:"平成";s:3:"㍼";s:6:"昭和";s:3:"㍽";s:6:"大正";s:3:"㍾";s:6:"明治";s:3:"㍿";s:12:"株式会社";s:3:"㎀";s:2:"pA";s:3:"㎁";s:2:"nA";s:3:"㎂";s:3:"μA";s:3:"㎃";s:2:"mA";s:3:"㎄";s:2:"kA";s:3:"㎅";s:2:"KB";s:3:"㎆";s:2:"MB";s:3:"㎇";s:2:"GB";s:3:"㎈";s:3:"cal";s:3:"㎉";s:4:"kcal";s:3:"㎊";s:2:"pF";s:3:"㎋";s:2:"nF";s:3:"㎌";s:3:"μF";s:3:"㎍";s:3:"μg";s:3:"㎎";s:2:"mg";s:3:"㎏";s:2:"kg";s:3:"㎐";s:2:"Hz";s:3:"㎑";s:3:"kHz";s:3:"㎒";s:3:"MHz";s:3:"㎓";s:3:"GHz";s:3:"㎔";s:3:"THz";s:3:"㎕";s:3:"μl";s:3:"㎖";s:2:"ml";s:3:"㎗";s:2:"dl";s:3:"㎘";s:2:"kl";s:3:"㎙";s:2:"fm";s:3:"㎚";s:2:"nm";s:3:"㎛";s:3:"μm";s:3:"㎜";s:2:"mm";s:3:"㎝";s:2:"cm";s:3:"㎞";s:2:"km";s:3:"㎟";s:3:"mm2";s:3:"㎠";s:3:"cm2";s:3:"㎡";s:2:"m2";s:3:"㎢";s:3:"km2";s:3:"㎣";s:3:"mm3";s:3:"㎤";s:3:"cm3";s:3:"㎥";s:2:"m3";s:3:"㎦";s:3:"km3";s:3:"㎧";s:5:"m∕s";s:3:"㎨";s:6:"m∕s2";s:3:"㎩";s:2:"Pa";s:3:"㎪";s:3:"kPa";s:3:"㎫";s:3:"MPa";s:3:"㎬";s:3:"GPa";s:3:"㎭";s:3:"rad";s:3:"㎮";s:7:"rad∕s";s:3:"㎯";s:8:"rad∕s2";s:3:"㎰";s:2:"ps";s:3:"㎱";s:2:"ns";s:3:"㎲";s:3:"μs";s:3:"㎳";s:2:"ms";s:3:"㎴";s:2:"pV";s:3:"㎵";s:2:"nV";s:3:"㎶";s:3:"μV";s:3:"㎷";s:2:"mV";s:3:"㎸";s:2:"kV";s:3:"㎹";s:2:"MV";s:3:"㎺";s:2:"pW";s:3:"㎻";s:2:"nW";s:3:"㎼";s:3:"μW";s:3:"㎽";s:2:"mW";s:3:"㎾";s:2:"kW";s:3:"㎿";s:2:"MW";s:3:"㏀";s:3:"kΩ";s:3:"㏁";s:3:"MΩ";s:3:"㏂";s:4:"a.m.";s:3:"㏃";s:2:"Bq";s:3:"㏄";s:2:"cc";s:3:"㏅";s:2:"cd";s:3:"㏆";s:6:"C∕kg";s:3:"㏇";s:3:"Co.";s:3:"㏈";s:2:"dB";s:3:"㏉";s:2:"Gy";s:3:"㏊";s:2:"ha";s:3:"㏋";s:2:"HP";s:3:"㏌";s:2:"in";s:3:"㏍";s:2:"KK";s:3:"㏎";s:2:"KM";s:3:"㏏";s:2:"kt";s:3:"㏐";s:2:"lm";s:3:"㏑";s:2:"ln";s:3:"㏒";s:3:"log";s:3:"㏓";s:2:"lx";s:3:"㏔";s:2:"mb";s:3:"㏕";s:3:"mil";s:3:"㏖";s:3:"mol";s:3:"㏗";s:2:"PH";s:3:"㏘";s:4:"p.m.";s:3:"㏙";s:3:"PPM";s:3:"㏚";s:2:"PR";s:3:"㏛";s:2:"sr";s:3:"㏜";s:2:"Sv";s:3:"㏝";s:2:"Wb";s:3:"㏞";s:5:"V∕m";s:3:"㏟";s:5:"A∕m";s:3:"㏠";s:4:"1日";s:3:"㏡";s:4:"2日";s:3:"㏢";s:4:"3日";s:3:"㏣";s:4:"4日";s:3:"㏤";s:4:"5日";s:3:"㏥";s:4:"6日";s:3:"㏦";s:4:"7日";s:3:"㏧";s:4:"8日";s:3:"㏨";s:4:"9日";s:3:"㏩";s:5:"10日";s:3:"㏪";s:5:"11日";s:3:"㏫";s:5:"12日";s:3:"㏬";s:5:"13日";s:3:"㏭";s:5:"14日";s:3:"㏮";s:5:"15日";s:3:"㏯";s:5:"16日";s:3:"㏰";s:5:"17日";s:3:"㏱";s:5:"18日";s:3:"㏲";s:5:"19日";s:3:"㏳";s:5:"20日";s:3:"㏴";s:5:"21日";s:3:"㏵";s:5:"22日";s:3:"㏶";s:5:"23日";s:3:"㏷";s:5:"24日";s:3:"㏸";s:5:"25日";s:3:"㏹";s:5:"26日";s:3:"㏺";s:5:"27日";s:3:"㏻";s:5:"28日";s:3:"㏼";s:5:"29日";s:3:"㏽";s:5:"30日";s:3:"㏾";s:5:"31日";s:3:"㏿";s:3:"gal";s:3:"ꝰ";s:3:"ꝯ";s:3:"豈";s:3:"豈";s:3:"更";s:3:"更";s:3:"車";s:3:"車";s:3:"賈";s:3:"賈";s:3:"滑";s:3:"滑";s:3:"串";s:3:"串";s:3:"句";s:3:"句";s:3:"龜";s:3:"龜";s:3:"龜";s:3:"龜";s:3:"契";s:3:"契";s:3:"金";s:3:"金";s:3:"喇";s:3:"喇";s:3:"奈";s:3:"奈";s:3:"懶";s:3:"懶";s:3:"癩";s:3:"癩";s:3:"羅";s:3:"羅";s:3:"蘿";s:3:"蘿";s:3:"螺";s:3:"螺";s:3:"裸";s:3:"裸";s:3:"邏";s:3:"邏";s:3:"樂";s:3:"樂";s:3:"洛";s:3:"洛";s:3:"烙";s:3:"烙";s:3:"珞";s:3:"珞";s:3:"落";s:3:"落";s:3:"酪";s:3:"酪";s:3:"駱";s:3:"駱";s:3:"亂";s:3:"亂";s:3:"卵";s:3:"卵";s:3:"欄";s:3:"欄";s:3:"爛";s:3:"爛";s:3:"蘭";s:3:"蘭";s:3:"鸞";s:3:"鸞";s:3:"嵐";s:3:"嵐";s:3:"濫";s:3:"濫";s:3:"藍";s:3:"藍";s:3:"襤";s:3:"襤";s:3:"拉";s:3:"拉";s:3:"臘";s:3:"臘";s:3:"蠟";s:3:"蠟";s:3:"廊";s:3:"廊";s:3:"朗";s:3:"朗";s:3:"浪";s:3:"浪";s:3:"狼";s:3:"狼";s:3:"郎";s:3:"郎";s:3:"來";s:3:"來";s:3:"冷";s:3:"冷";s:3:"勞";s:3:"勞";s:3:"擄";s:3:"擄";s:3:"櫓";s:3:"櫓";s:3:"爐";s:3:"爐";s:3:"盧";s:3:"盧";s:3:"老";s:3:"老";s:3:"蘆";s:3:"蘆";s:3:"虜";s:3:"虜";s:3:"路";s:3:"路";s:3:"露";s:3:"露";s:3:"魯";s:3:"魯";s:3:"鷺";s:3:"鷺";s:3:"碌";s:3:"碌";s:3:"祿";s:3:"祿";s:3:"綠";s:3:"綠";s:3:"菉";s:3:"菉";s:3:"錄";s:3:"錄";s:3:"鹿";s:3:"鹿";s:3:"論";s:3:"論";s:3:"壟";s:3:"壟";s:3:"弄";s:3:"弄";s:3:"籠";s:3:"籠";s:3:"聾";s:3:"聾";s:3:"牢";s:3:"牢";s:3:"磊";s:3:"磊";s:3:"賂";s:3:"賂";s:3:"雷";s:3:"雷";s:3:"壘";s:3:"壘";s:3:"屢";s:3:"屢";s:3:"樓";s:3:"樓";s:3:"淚";s:3:"淚";s:3:"漏";s:3:"漏";s:3:"累";s:3:"累";s:3:"縷";s:3:"縷";s:3:"陋";s:3:"陋";s:3:"勒";s:3:"勒";s:3:"肋";s:3:"肋";s:3:"凜";s:3:"凜";s:3:"凌";s:3:"凌";s:3:"稜";s:3:"稜";s:3:"綾";s:3:"綾";s:3:"菱";s:3:"菱";s:3:"陵";s:3:"陵";s:3:"讀";s:3:"讀";s:3:"拏";s:3:"拏";s:3:"樂";s:3:"樂";s:3:"諾";s:3:"諾";s:3:"丹";s:3:"丹";s:3:"寧";s:3:"寧";s:3:"怒";s:3:"怒";s:3:"率";s:3:"率";s:3:"異";s:3:"異";s:3:"北";s:3:"北";s:3:"磻";s:3:"磻";s:3:"便";s:3:"便";s:3:"復";s:3:"復";s:3:"不";s:3:"不";s:3:"泌";s:3:"泌";s:3:"數";s:3:"數";s:3:"索";s:3:"索";s:3:"參";s:3:"參";s:3:"塞";s:3:"塞";s:3:"省";s:3:"省";s:3:"葉";s:3:"葉";s:3:"說";s:3:"說";s:3:"殺";s:3:"殺";s:3:"辰";s:3:"辰";s:3:"沈";s:3:"沈";s:3:"拾";s:3:"拾";s:3:"若";s:3:"若";s:3:"掠";s:3:"掠";s:3:"略";s:3:"略";s:3:"亮";s:3:"亮";s:3:"兩";s:3:"兩";s:3:"凉";s:3:"凉";s:3:"梁";s:3:"梁";s:3:"糧";s:3:"糧";s:3:"良";s:3:"良";s:3:"諒";s:3:"諒";s:3:"量";s:3:"量";s:3:"勵";s:3:"勵";s:3:"呂";s:3:"呂";s:3:"女";s:3:"女";s:3:"廬";s:3:"廬";s:3:"旅";s:3:"旅";s:3:"濾";s:3:"濾";s:3:"礪";s:3:"礪";s:3:"閭";s:3:"閭";s:3:"驪";s:3:"驪";s:3:"麗";s:3:"麗";s:3:"黎";s:3:"黎";s:3:"力";s:3:"力";s:3:"曆";s:3:"曆";s:3:"歷";s:3:"歷";s:3:"轢";s:3:"轢";s:3:"年";s:3:"年";s:3:"憐";s:3:"憐";s:3:"戀";s:3:"戀";s:3:"撚";s:3:"撚";s:3:"漣";s:3:"漣";s:3:"煉";s:3:"煉";s:3:"璉";s:3:"璉";s:3:"秊";s:3:"秊";s:3:"練";s:3:"練";s:3:"聯";s:3:"聯";s:3:"輦";s:3:"輦";s:3:"蓮";s:3:"蓮";s:3:"連";s:3:"連";s:3:"鍊";s:3:"鍊";s:3:"列";s:3:"列";s:3:"劣";s:3:"劣";s:3:"咽";s:3:"咽";s:3:"烈";s:3:"烈";s:3:"裂";s:3:"裂";s:3:"說";s:3:"說";s:3:"廉";s:3:"廉";s:3:"念";s:3:"念";s:3:"捻";s:3:"捻";s:3:"殮";s:3:"殮";s:3:"簾";s:3:"簾";s:3:"獵";s:3:"獵";s:3:"令";s:3:"令";s:3:"囹";s:3:"囹";s:3:"寧";s:3:"寧";s:3:"嶺";s:3:"嶺";s:3:"怜";s:3:"怜";s:3:"玲";s:3:"玲";s:3:"瑩";s:3:"瑩";s:3:"羚";s:3:"羚";s:3:"聆";s:3:"聆";s:3:"鈴";s:3:"鈴";s:3:"零";s:3:"零";s:3:"靈";s:3:"靈";s:3:"領";s:3:"領";s:3:"例";s:3:"例";s:3:"禮";s:3:"禮";s:3:"醴";s:3:"醴";s:3:"隸";s:3:"隸";s:3:"惡";s:3:"惡";s:3:"了";s:3:"了";s:3:"僚";s:3:"僚";s:3:"寮";s:3:"寮";s:3:"尿";s:3:"尿";s:3:"料";s:3:"料";s:3:"樂";s:3:"樂";s:3:"燎";s:3:"燎";s:3:"療";s:3:"療";s:3:"蓼";s:3:"蓼";s:3:"遼";s:3:"遼";s:3:"龍";s:3:"龍";s:3:"暈";s:3:"暈";s:3:"阮";s:3:"阮";s:3:"劉";s:3:"劉";s:3:"杻";s:3:"杻";s:3:"柳";s:3:"柳";s:3:"流";s:3:"流";s:3:"溜";s:3:"溜";s:3:"琉";s:3:"琉";s:3:"留";s:3:"留";s:3:"硫";s:3:"硫";s:3:"紐";s:3:"紐";s:3:"類";s:3:"類";s:3:"六";s:3:"六";s:3:"戮";s:3:"戮";s:3:"陸";s:3:"陸";s:3:"倫";s:3:"倫";s:3:"崙";s:3:"崙";s:3:"淪";s:3:"淪";s:3:"輪";s:3:"輪";s:3:"律";s:3:"律";s:3:"慄";s:3:"慄";s:3:"栗";s:3:"栗";s:3:"率";s:3:"率";s:3:"隆";s:3:"隆";s:3:"利";s:3:"利";s:3:"吏";s:3:"吏";s:3:"履";s:3:"履";s:3:"易";s:3:"易";s:3:"李";s:3:"李";s:3:"梨";s:3:"梨";s:3:"泥";s:3:"泥";s:3:"理";s:3:"理";s:3:"痢";s:3:"痢";s:3:"罹";s:3:"罹";s:3:"裏";s:3:"裏";s:3:"裡";s:3:"裡";s:3:"里";s:3:"里";s:3:"離";s:3:"離";s:3:"匿";s:3:"匿";s:3:"溺";s:3:"溺";s:3:"吝";s:3:"吝";s:3:"燐";s:3:"燐";s:3:"璘";s:3:"璘";s:3:"藺";s:3:"藺";s:3:"隣";s:3:"隣";s:3:"鱗";s:3:"鱗";s:3:"麟";s:3:"麟";s:3:"林";s:3:"林";s:3:"淋";s:3:"淋";s:3:"臨";s:3:"臨";s:3:"立";s:3:"立";s:3:"笠";s:3:"笠";s:3:"粒";s:3:"粒";s:3:"狀";s:3:"狀";s:3:"炙";s:3:"炙";s:3:"識";s:3:"識";s:3:"什";s:3:"什";s:3:"茶";s:3:"茶";s:3:"刺";s:3:"刺";s:3:"切";s:3:"切";s:3:"度";s:3:"度";s:3:"拓";s:3:"拓";s:3:"糖";s:3:"糖";s:3:"宅";s:3:"宅";s:3:"洞";s:3:"洞";s:3:"暴";s:3:"暴";s:3:"輻";s:3:"輻";s:3:"行";s:3:"行";s:3:"降";s:3:"降";s:3:"見";s:3:"見";s:3:"廓";s:3:"廓";s:3:"兀";s:3:"兀";s:3:"嗀";s:3:"嗀";s:3:"塚";s:3:"塚";s:3:"晴";s:3:"晴";s:3:"凞";s:3:"凞";s:3:"猪";s:3:"猪";s:3:"益";s:3:"益";s:3:"礼";s:3:"礼";s:3:"神";s:3:"神";s:3:"祥";s:3:"祥";s:3:"福";s:3:"福";s:3:"靖";s:3:"靖";s:3:"精";s:3:"精";s:3:"羽";s:3:"羽";s:3:"蘒";s:3:"蘒";s:3:"諸";s:3:"諸";s:3:"逸";s:3:"逸";s:3:"都";s:3:"都";s:3:"飯";s:3:"飯";s:3:"飼";s:3:"飼";s:3:"館";s:3:"館";s:3:"鶴";s:3:"鶴";s:3:"侮";s:3:"侮";s:3:"僧";s:3:"僧";s:3:"免";s:3:"免";s:3:"勉";s:3:"勉";s:3:"勤";s:3:"勤";s:3:"卑";s:3:"卑";s:3:"喝";s:3:"喝";s:3:"嘆";s:3:"嘆";s:3:"器";s:3:"器";s:3:"塀";s:3:"塀";s:3:"墨";s:3:"墨";s:3:"層";s:3:"層";s:3:"屮";s:3:"屮";s:3:"悔";s:3:"悔";s:3:"慨";s:3:"慨";s:3:"憎";s:3:"憎";s:3:"懲";s:3:"懲";s:3:"敏";s:3:"敏";s:3:"既";s:3:"既";s:3:"暑";s:3:"暑";s:3:"梅";s:3:"梅";s:3:"海";s:3:"海";s:3:"渚";s:3:"渚";s:3:"漢";s:3:"漢";s:3:"煮";s:3:"煮";s:3:"爫";s:3:"爫";s:3:"琢";s:3:"琢";s:3:"碑";s:3:"碑";s:3:"社";s:3:"社";s:3:"祉";s:3:"祉";s:3:"祈";s:3:"祈";s:3:"祐";s:3:"祐";s:3:"祖";s:3:"祖";s:3:"祝";s:3:"祝";s:3:"禍";s:3:"禍";s:3:"禎";s:3:"禎";s:3:"穀";s:3:"穀";s:3:"突";s:3:"突";s:3:"節";s:3:"節";s:3:"練";s:3:"練";s:3:"縉";s:3:"縉";s:3:"繁";s:3:"繁";s:3:"署";s:3:"署";s:3:"者";s:3:"者";s:3:"臭";s:3:"臭";s:3:"艹";s:3:"艹";s:3:"艹";s:3:"艹";s:3:"著";s:3:"著";s:3:"褐";s:3:"褐";s:3:"視";s:3:"視";s:3:"謁";s:3:"謁";s:3:"謹";s:3:"謹";s:3:"賓";s:3:"賓";s:3:"贈";s:3:"贈";s:3:"辶";s:3:"辶";s:3:"逸";s:3:"逸";s:3:"難";s:3:"難";s:3:"響";s:3:"響";s:3:"頻";s:3:"頻";s:3:"恵";s:3:"恵";s:3:"𤋮";s:4:"𤋮";s:3:"舘";s:3:"舘";s:3:"並";s:3:"並";s:3:"况";s:3:"况";s:3:"全";s:3:"全";s:3:"侀";s:3:"侀";s:3:"充";s:3:"充";s:3:"冀";s:3:"冀";s:3:"勇";s:3:"勇";s:3:"勺";s:3:"勺";s:3:"喝";s:3:"喝";s:3:"啕";s:3:"啕";s:3:"喙";s:3:"喙";s:3:"嗢";s:3:"嗢";s:3:"塚";s:3:"塚";s:3:"墳";s:3:"墳";s:3:"奄";s:3:"奄";s:3:"奔";s:3:"奔";s:3:"婢";s:3:"婢";s:3:"嬨";s:3:"嬨";s:3:"廒";s:3:"廒";s:3:"廙";s:3:"廙";s:3:"彩";s:3:"彩";s:3:"徭";s:3:"徭";s:3:"惘";s:3:"惘";s:3:"慎";s:3:"慎";s:3:"愈";s:3:"愈";s:3:"憎";s:3:"憎";s:3:"慠";s:3:"慠";s:3:"懲";s:3:"懲";s:3:"戴";s:3:"戴";s:3:"揄";s:3:"揄";s:3:"搜";s:3:"搜";s:3:"摒";s:3:"摒";s:3:"敖";s:3:"敖";s:3:"晴";s:3:"晴";s:3:"朗";s:3:"朗";s:3:"望";s:3:"望";s:3:"杖";s:3:"杖";s:3:"歹";s:3:"歹";s:3:"殺";s:3:"殺";s:3:"流";s:3:"流";s:3:"滛";s:3:"滛";s:3:"滋";s:3:"滋";s:3:"漢";s:3:"漢";s:3:"瀞";s:3:"瀞";s:3:"煮";s:3:"煮";s:3:"瞧";s:3:"瞧";s:3:"爵";s:3:"爵";s:3:"犯";s:3:"犯";s:3:"猪";s:3:"猪";s:3:"瑱";s:3:"瑱";s:3:"甆";s:3:"甆";s:3:"画";s:3:"画";s:3:"瘝";s:3:"瘝";s:3:"瘟";s:3:"瘟";s:3:"益";s:3:"益";s:3:"盛";s:3:"盛";s:3:"直";s:3:"直";s:3:"睊";s:3:"睊";s:3:"着";s:3:"着";s:3:"磌";s:3:"磌";s:3:"窱";s:3:"窱";s:3:"節";s:3:"節";s:3:"类";s:3:"类";s:3:"絛";s:3:"絛";s:3:"練";s:3:"練";s:3:"缾";s:3:"缾";s:3:"者";s:3:"者";s:3:"荒";s:3:"荒";s:3:"華";s:3:"華";s:3:"蝹";s:3:"蝹";s:3:"襁";s:3:"襁";s:3:"覆";s:3:"覆";s:3:"視";s:3:"視";s:3:"調";s:3:"調";s:3:"諸";s:3:"諸";s:3:"請";s:3:"請";s:3:"謁";s:3:"謁";s:3:"諾";s:3:"諾";s:3:"諭";s:3:"諭";s:3:"謹";s:3:"謹";s:3:"變";s:3:"變";s:3:"贈";s:3:"贈";s:3:"輸";s:3:"輸";s:3:"遲";s:3:"遲";s:3:"醙";s:3:"醙";s:3:"鉶";s:3:"鉶";s:3:"陼";s:3:"陼";s:3:"難";s:3:"難";s:3:"靖";s:3:"靖";s:3:"韛";s:3:"韛";s:3:"響";s:3:"響";s:3:"頋";s:3:"頋";s:3:"頻";s:3:"頻";s:3:"鬒";s:3:"鬒";s:3:"龜";s:3:"龜";s:3:"𢡊";s:4:"𢡊";s:3:"𢡄";s:4:"𢡄";s:3:"𣏕";s:4:"𣏕";s:3:"㮝";s:3:"㮝";s:3:"䀘";s:3:"䀘";s:3:"䀹";s:3:"䀹";s:3:"𥉉";s:4:"𥉉";s:3:"𥳐";s:4:"𥳐";s:3:"𧻓";s:4:"𧻓";s:3:"齃";s:3:"齃";s:3:"龎";s:3:"龎";s:3:"ff";s:2:"ff";s:3:"fi";s:2:"fi";s:3:"fl";s:2:"fl";s:3:"ffi";s:3:"ffi";s:3:"ffl";s:3:"ffl";s:3:"ſt";s:2:"st";s:3:"st";s:2:"st";s:3:"ﬓ";s:4:"մն";s:3:"ﬔ";s:4:"մե";s:3:"ﬕ";s:4:"մի";s:3:"ﬖ";s:4:"վն";s:3:"ﬗ";s:4:"մխ";s:3:"יִ";s:4:"יִ";s:3:"ײַ";s:4:"ײַ";s:3:"ﬠ";s:2:"ע";s:3:"ﬡ";s:2:"א";s:3:"ﬢ";s:2:"ד";s:3:"ﬣ";s:2:"ה";s:3:"ﬤ";s:2:"כ";s:3:"ﬥ";s:2:"ל";s:3:"ﬦ";s:2:"ם";s:3:"ﬧ";s:2:"ר";s:3:"ﬨ";s:2:"ת";s:3:"﬩";s:1:"+";s:3:"שׁ";s:4:"שׁ";s:3:"שׂ";s:4:"שׂ";s:3:"שּׁ";s:6:"שּׁ";s:3:"שּׂ";s:6:"שּׂ";s:3:"אַ";s:4:"אַ";s:3:"אָ";s:4:"אָ";s:3:"אּ";s:4:"אּ";s:3:"בּ";s:4:"בּ";s:3:"גּ";s:4:"גּ";s:3:"דּ";s:4:"דּ";s:3:"הּ";s:4:"הּ";s:3:"וּ";s:4:"וּ";s:3:"זּ";s:4:"זּ";s:3:"טּ";s:4:"טּ";s:3:"יּ";s:4:"יּ";s:3:"ךּ";s:4:"ךּ";s:3:"כּ";s:4:"כּ";s:3:"לּ";s:4:"לּ";s:3:"מּ";s:4:"מּ";s:3:"נּ";s:4:"נּ";s:3:"סּ";s:4:"סּ";s:3:"ףּ";s:4:"ףּ";s:3:"פּ";s:4:"פּ";s:3:"צּ";s:4:"צּ";s:3:"קּ";s:4:"קּ";s:3:"רּ";s:4:"רּ";s:3:"שּ";s:4:"שּ";s:3:"תּ";s:4:"תּ";s:3:"וֹ";s:4:"וֹ";s:3:"בֿ";s:4:"בֿ";s:3:"כֿ";s:4:"כֿ";s:3:"פֿ";s:4:"פֿ";s:3:"ﭏ";s:4:"אל";s:3:"ﭐ";s:2:"ٱ";s:3:"ﭑ";s:2:"ٱ";s:3:"ﭒ";s:2:"ٻ";s:3:"ﭓ";s:2:"ٻ";s:3:"ﭔ";s:2:"ٻ";s:3:"ﭕ";s:2:"ٻ";s:3:"ﭖ";s:2:"پ";s:3:"ﭗ";s:2:"پ";s:3:"ﭘ";s:2:"پ";s:3:"ﭙ";s:2:"پ";s:3:"ﭚ";s:2:"ڀ";s:3:"ﭛ";s:2:"ڀ";s:3:"ﭜ";s:2:"ڀ";s:3:"ﭝ";s:2:"ڀ";s:3:"ﭞ";s:2:"ٺ";s:3:"ﭟ";s:2:"ٺ";s:3:"ﭠ";s:2:"ٺ";s:3:"ﭡ";s:2:"ٺ";s:3:"ﭢ";s:2:"ٿ";s:3:"ﭣ";s:2:"ٿ";s:3:"ﭤ";s:2:"ٿ";s:3:"ﭥ";s:2:"ٿ";s:3:"ﭦ";s:2:"ٹ";s:3:"ﭧ";s:2:"ٹ";s:3:"ﭨ";s:2:"ٹ";s:3:"ﭩ";s:2:"ٹ";s:3:"ﭪ";s:2:"ڤ";s:3:"ﭫ";s:2:"ڤ";s:3:"ﭬ";s:2:"ڤ";s:3:"ﭭ";s:2:"ڤ";s:3:"ﭮ";s:2:"ڦ";s:3:"ﭯ";s:2:"ڦ";s:3:"ﭰ";s:2:"ڦ";s:3:"ﭱ";s:2:"ڦ";s:3:"ﭲ";s:2:"ڄ";s:3:"ﭳ";s:2:"ڄ";s:3:"ﭴ";s:2:"ڄ";s:3:"ﭵ";s:2:"ڄ";s:3:"ﭶ";s:2:"ڃ";s:3:"ﭷ";s:2:"ڃ";s:3:"ﭸ";s:2:"ڃ";s:3:"ﭹ";s:2:"ڃ";s:3:"ﭺ";s:2:"چ";s:3:"ﭻ";s:2:"چ";s:3:"ﭼ";s:2:"چ";s:3:"ﭽ";s:2:"چ";s:3:"ﭾ";s:2:"ڇ";s:3:"ﭿ";s:2:"ڇ";s:3:"ﮀ";s:2:"ڇ";s:3:"ﮁ";s:2:"ڇ";s:3:"ﮂ";s:2:"ڍ";s:3:"ﮃ";s:2:"ڍ";s:3:"ﮄ";s:2:"ڌ";s:3:"ﮅ";s:2:"ڌ";s:3:"ﮆ";s:2:"ڎ";s:3:"ﮇ";s:2:"ڎ";s:3:"ﮈ";s:2:"ڈ";s:3:"ﮉ";s:2:"ڈ";s:3:"ﮊ";s:2:"ژ";s:3:"ﮋ";s:2:"ژ";s:3:"ﮌ";s:2:"ڑ";s:3:"ﮍ";s:2:"ڑ";s:3:"ﮎ";s:2:"ک";s:3:"ﮏ";s:2:"ک";s:3:"ﮐ";s:2:"ک";s:3:"ﮑ";s:2:"ک";s:3:"ﮒ";s:2:"گ";s:3:"ﮓ";s:2:"گ";s:3:"ﮔ";s:2:"گ";s:3:"ﮕ";s:2:"گ";s:3:"ﮖ";s:2:"ڳ";s:3:"ﮗ";s:2:"ڳ";s:3:"ﮘ";s:2:"ڳ";s:3:"ﮙ";s:2:"ڳ";s:3:"ﮚ";s:2:"ڱ";s:3:"ﮛ";s:2:"ڱ";s:3:"ﮜ";s:2:"ڱ";s:3:"ﮝ";s:2:"ڱ";s:3:"ﮞ";s:2:"ں";s:3:"ﮟ";s:2:"ں";s:3:"ﮠ";s:2:"ڻ";s:3:"ﮡ";s:2:"ڻ";s:3:"ﮢ";s:2:"ڻ";s:3:"ﮣ";s:2:"ڻ";s:3:"ﮤ";s:4:"ۀ";s:3:"ﮥ";s:4:"ۀ";s:3:"ﮦ";s:2:"ہ";s:3:"ﮧ";s:2:"ہ";s:3:"ﮨ";s:2:"ہ";s:3:"ﮩ";s:2:"ہ";s:3:"ﮪ";s:2:"ھ";s:3:"ﮫ";s:2:"ھ";s:3:"ﮬ";s:2:"ھ";s:3:"ﮭ";s:2:"ھ";s:3:"ﮮ";s:2:"ے";s:3:"ﮯ";s:2:"ے";s:3:"ﮰ";s:4:"ۓ";s:3:"ﮱ";s:4:"ۓ";s:3:"ﯓ";s:2:"ڭ";s:3:"ﯔ";s:2:"ڭ";s:3:"ﯕ";s:2:"ڭ";s:3:"ﯖ";s:2:"ڭ";s:3:"ﯗ";s:2:"ۇ";s:3:"ﯘ";s:2:"ۇ";s:3:"ﯙ";s:2:"ۆ";s:3:"ﯚ";s:2:"ۆ";s:3:"ﯛ";s:2:"ۈ";s:3:"ﯜ";s:2:"ۈ";s:3:"ﯝ";s:4:"ۇٴ";s:3:"ﯞ";s:2:"ۋ";s:3:"ﯟ";s:2:"ۋ";s:3:"ﯠ";s:2:"ۅ";s:3:"ﯡ";s:2:"ۅ";s:3:"ﯢ";s:2:"ۉ";s:3:"ﯣ";s:2:"ۉ";s:3:"ﯤ";s:2:"ې";s:3:"ﯥ";s:2:"ې";s:3:"ﯦ";s:2:"ې";s:3:"ﯧ";s:2:"ې";s:3:"ﯨ";s:2:"ى";s:3:"ﯩ";s:2:"ى";s:3:"ﯪ";s:6:"ئا";s:3:"ﯫ";s:6:"ئا";s:3:"ﯬ";s:6:"ئە";s:3:"ﯭ";s:6:"ئە";s:3:"ﯮ";s:6:"ئو";s:3:"ﯯ";s:6:"ئو";s:3:"ﯰ";s:6:"ئۇ";s:3:"ﯱ";s:6:"ئۇ";s:3:"ﯲ";s:6:"ئۆ";s:3:"ﯳ";s:6:"ئۆ";s:3:"ﯴ";s:6:"ئۈ";s:3:"ﯵ";s:6:"ئۈ";s:3:"ﯶ";s:6:"ئې";s:3:"ﯷ";s:6:"ئې";s:3:"ﯸ";s:6:"ئې";s:3:"ﯹ";s:6:"ئى";s:3:"ﯺ";s:6:"ئى";s:3:"ﯻ";s:6:"ئى";s:3:"ﯼ";s:2:"ی";s:3:"ﯽ";s:2:"ی";s:3:"ﯾ";s:2:"ی";s:3:"ﯿ";s:2:"ی";s:3:"ﰀ";s:6:"ئج";s:3:"ﰁ";s:6:"ئح";s:3:"ﰂ";s:6:"ئم";s:3:"ﰃ";s:6:"ئى";s:3:"ﰄ";s:6:"ئي";s:3:"ﰅ";s:4:"بج";s:3:"ﰆ";s:4:"بح";s:3:"ﰇ";s:4:"بخ";s:3:"ﰈ";s:4:"بم";s:3:"ﰉ";s:4:"بى";s:3:"ﰊ";s:4:"بي";s:3:"ﰋ";s:4:"تج";s:3:"ﰌ";s:4:"تح";s:3:"ﰍ";s:4:"تخ";s:3:"ﰎ";s:4:"تم";s:3:"ﰏ";s:4:"تى";s:3:"ﰐ";s:4:"تي";s:3:"ﰑ";s:4:"ثج";s:3:"ﰒ";s:4:"ثم";s:3:"ﰓ";s:4:"ثى";s:3:"ﰔ";s:4:"ثي";s:3:"ﰕ";s:4:"جح";s:3:"ﰖ";s:4:"جم";s:3:"ﰗ";s:4:"حج";s:3:"ﰘ";s:4:"حم";s:3:"ﰙ";s:4:"خج";s:3:"ﰚ";s:4:"خح";s:3:"ﰛ";s:4:"خم";s:3:"ﰜ";s:4:"سج";s:3:"ﰝ";s:4:"سح";s:3:"ﰞ";s:4:"سخ";s:3:"ﰟ";s:4:"سم";s:3:"ﰠ";s:4:"صح";s:3:"ﰡ";s:4:"صم";s:3:"ﰢ";s:4:"ضج";s:3:"ﰣ";s:4:"ضح";s:3:"ﰤ";s:4:"ضخ";s:3:"ﰥ";s:4:"ضم";s:3:"ﰦ";s:4:"طح";s:3:"ﰧ";s:4:"طم";s:3:"ﰨ";s:4:"ظم";s:3:"ﰩ";s:4:"عج";s:3:"ﰪ";s:4:"عم";s:3:"ﰫ";s:4:"غج";s:3:"ﰬ";s:4:"غم";s:3:"ﰭ";s:4:"فج";s:3:"ﰮ";s:4:"فح";s:3:"ﰯ";s:4:"فخ";s:3:"ﰰ";s:4:"فم";s:3:"ﰱ";s:4:"فى";s:3:"ﰲ";s:4:"في";s:3:"ﰳ";s:4:"قح";s:3:"ﰴ";s:4:"قم";s:3:"ﰵ";s:4:"قى";s:3:"ﰶ";s:4:"قي";s:3:"ﰷ";s:4:"كا";s:3:"ﰸ";s:4:"كج";s:3:"ﰹ";s:4:"كح";s:3:"ﰺ";s:4:"كخ";s:3:"ﰻ";s:4:"كل";s:3:"ﰼ";s:4:"كم";s:3:"ﰽ";s:4:"كى";s:3:"ﰾ";s:4:"كي";s:3:"ﰿ";s:4:"لج";s:3:"ﱀ";s:4:"لح";s:3:"ﱁ";s:4:"لخ";s:3:"ﱂ";s:4:"لم";s:3:"ﱃ";s:4:"لى";s:3:"ﱄ";s:4:"لي";s:3:"ﱅ";s:4:"مج";s:3:"ﱆ";s:4:"مح";s:3:"ﱇ";s:4:"مخ";s:3:"ﱈ";s:4:"مم";s:3:"ﱉ";s:4:"مى";s:3:"ﱊ";s:4:"مي";s:3:"ﱋ";s:4:"نج";s:3:"ﱌ";s:4:"نح";s:3:"ﱍ";s:4:"نخ";s:3:"ﱎ";s:4:"نم";s:3:"ﱏ";s:4:"نى";s:3:"ﱐ";s:4:"ني";s:3:"ﱑ";s:4:"هج";s:3:"ﱒ";s:4:"هم";s:3:"ﱓ";s:4:"هى";s:3:"ﱔ";s:4:"هي";s:3:"ﱕ";s:4:"يج";s:3:"ﱖ";s:4:"يح";s:3:"ﱗ";s:4:"يخ";s:3:"ﱘ";s:4:"يم";s:3:"ﱙ";s:4:"يى";s:3:"ﱚ";s:4:"يي";s:3:"ﱛ";s:4:"ذٰ";s:3:"ﱜ";s:4:"رٰ";s:3:"ﱝ";s:4:"ىٰ";s:3:"ﱞ";s:5:" ٌّ";s:3:"ﱟ";s:5:" ٍّ";s:3:"ﱠ";s:5:" َّ";s:3:"ﱡ";s:5:" ُّ";s:3:"ﱢ";s:5:" ِّ";s:3:"ﱣ";s:5:" ّٰ";s:3:"ﱤ";s:6:"ئر";s:3:"ﱥ";s:6:"ئز";s:3:"ﱦ";s:6:"ئم";s:3:"ﱧ";s:6:"ئن";s:3:"ﱨ";s:6:"ئى";s:3:"ﱩ";s:6:"ئي";s:3:"ﱪ";s:4:"بر";s:3:"ﱫ";s:4:"بز";s:3:"ﱬ";s:4:"بم";s:3:"ﱭ";s:4:"بن";s:3:"ﱮ";s:4:"بى";s:3:"ﱯ";s:4:"بي";s:3:"ﱰ";s:4:"تر";s:3:"ﱱ";s:4:"تز";s:3:"ﱲ";s:4:"تم";s:3:"ﱳ";s:4:"تن";s:3:"ﱴ";s:4:"تى";s:3:"ﱵ";s:4:"تي";s:3:"ﱶ";s:4:"ثر";s:3:"ﱷ";s:4:"ثز";s:3:"ﱸ";s:4:"ثم";s:3:"ﱹ";s:4:"ثن";s:3:"ﱺ";s:4:"ثى";s:3:"ﱻ";s:4:"ثي";s:3:"ﱼ";s:4:"فى";s:3:"ﱽ";s:4:"في";s:3:"ﱾ";s:4:"قى";s:3:"ﱿ";s:4:"قي";s:3:"ﲀ";s:4:"كا";s:3:"ﲁ";s:4:"كل";s:3:"ﲂ";s:4:"كم";s:3:"ﲃ";s:4:"كى";s:3:"ﲄ";s:4:"كي";s:3:"ﲅ";s:4:"لم";s:3:"ﲆ";s:4:"لى";s:3:"ﲇ";s:4:"لي";s:3:"ﲈ";s:4:"ما";s:3:"ﲉ";s:4:"مم";s:3:"ﲊ";s:4:"نر";s:3:"ﲋ";s:4:"نز";s:3:"ﲌ";s:4:"نم";s:3:"ﲍ";s:4:"نن";s:3:"ﲎ";s:4:"نى";s:3:"ﲏ";s:4:"ني";s:3:"ﲐ";s:4:"ىٰ";s:3:"ﲑ";s:4:"ير";s:3:"ﲒ";s:4:"يز";s:3:"ﲓ";s:4:"يم";s:3:"ﲔ";s:4:"ين";s:3:"ﲕ";s:4:"يى";s:3:"ﲖ";s:4:"يي";s:3:"ﲗ";s:6:"ئج";s:3:"ﲘ";s:6:"ئح";s:3:"ﲙ";s:6:"ئخ";s:3:"ﲚ";s:6:"ئم";s:3:"ﲛ";s:6:"ئه";s:3:"ﲜ";s:4:"بج";s:3:"ﲝ";s:4:"بح";s:3:"ﲞ";s:4:"بخ";s:3:"ﲟ";s:4:"بم";s:3:"ﲠ";s:4:"به";s:3:"ﲡ";s:4:"تج";s:3:"ﲢ";s:4:"تح";s:3:"ﲣ";s:4:"تخ";s:3:"ﲤ";s:4:"تم";s:3:"ﲥ";s:4:"ته";s:3:"ﲦ";s:4:"ثم";s:3:"ﲧ";s:4:"جح";s:3:"ﲨ";s:4:"جم";s:3:"ﲩ";s:4:"حج";s:3:"ﲪ";s:4:"حم";s:3:"ﲫ";s:4:"خج";s:3:"ﲬ";s:4:"خم";s:3:"ﲭ";s:4:"سج";s:3:"ﲮ";s:4:"سح";s:3:"ﲯ";s:4:"سخ";s:3:"ﲰ";s:4:"سم";s:3:"ﲱ";s:4:"صح";s:3:"ﲲ";s:4:"صخ";s:3:"ﲳ";s:4:"صم";s:3:"ﲴ";s:4:"ضج";s:3:"ﲵ";s:4:"ضح";s:3:"ﲶ";s:4:"ضخ";s:3:"ﲷ";s:4:"ضم";s:3:"ﲸ";s:4:"طح";s:3:"ﲹ";s:4:"ظم";s:3:"ﲺ";s:4:"عج";s:3:"ﲻ";s:4:"عم";s:3:"ﲼ";s:4:"غج";s:3:"ﲽ";s:4:"غم";s:3:"ﲾ";s:4:"فج";s:3:"ﲿ";s:4:"فح";s:3:"ﳀ";s:4:"فخ";s:3:"ﳁ";s:4:"فم";s:3:"ﳂ";s:4:"قح";s:3:"ﳃ";s:4:"قم";s:3:"ﳄ";s:4:"كج";s:3:"ﳅ";s:4:"كح";s:3:"ﳆ";s:4:"كخ";s:3:"ﳇ";s:4:"كل";s:3:"ﳈ";s:4:"كم";s:3:"ﳉ";s:4:"لج";s:3:"ﳊ";s:4:"لح";s:3:"ﳋ";s:4:"لخ";s:3:"ﳌ";s:4:"لم";s:3:"ﳍ";s:4:"له";s:3:"ﳎ";s:4:"مج";s:3:"ﳏ";s:4:"مح";s:3:"ﳐ";s:4:"مخ";s:3:"ﳑ";s:4:"مم";s:3:"ﳒ";s:4:"نج";s:3:"ﳓ";s:4:"نح";s:3:"ﳔ";s:4:"نخ";s:3:"ﳕ";s:4:"نم";s:3:"ﳖ";s:4:"نه";s:3:"ﳗ";s:4:"هج";s:3:"ﳘ";s:4:"هم";s:3:"ﳙ";s:4:"هٰ";s:3:"ﳚ";s:4:"يج";s:3:"ﳛ";s:4:"يح";s:3:"ﳜ";s:4:"يخ";s:3:"ﳝ";s:4:"يم";s:3:"ﳞ";s:4:"يه";s:3:"ﳟ";s:6:"ئم";s:3:"ﳠ";s:6:"ئه";s:3:"ﳡ";s:4:"بم";s:3:"ﳢ";s:4:"به";s:3:"ﳣ";s:4:"تم";s:3:"ﳤ";s:4:"ته";s:3:"ﳥ";s:4:"ثم";s:3:"ﳦ";s:4:"ثه";s:3:"ﳧ";s:4:"سم";s:3:"ﳨ";s:4:"سه";s:3:"ﳩ";s:4:"شم";s:3:"ﳪ";s:4:"شه";s:3:"ﳫ";s:4:"كل";s:3:"ﳬ";s:4:"كم";s:3:"ﳭ";s:4:"لم";s:3:"ﳮ";s:4:"نم";s:3:"ﳯ";s:4:"نه";s:3:"ﳰ";s:4:"يم";s:3:"ﳱ";s:4:"يه";s:3:"ﳲ";s:6:"ـَّ";s:3:"ﳳ";s:6:"ـُّ";s:3:"ﳴ";s:6:"ـِّ";s:3:"ﳵ";s:4:"طى";s:3:"ﳶ";s:4:"طي";s:3:"ﳷ";s:4:"عى";s:3:"ﳸ";s:4:"عي";s:3:"ﳹ";s:4:"غى";s:3:"ﳺ";s:4:"غي";s:3:"ﳻ";s:4:"سى";s:3:"ﳼ";s:4:"سي";s:3:"ﳽ";s:4:"شى";s:3:"ﳾ";s:4:"شي";s:3:"ﳿ";s:4:"حى";s:3:"ﴀ";s:4:"حي";s:3:"ﴁ";s:4:"جى";s:3:"ﴂ";s:4:"جي";s:3:"ﴃ";s:4:"خى";s:3:"ﴄ";s:4:"خي";s:3:"ﴅ";s:4:"صى";s:3:"ﴆ";s:4:"صي";s:3:"ﴇ";s:4:"ضى";s:3:"ﴈ";s:4:"ضي";s:3:"ﴉ";s:4:"شج";s:3:"ﴊ";s:4:"شح";s:3:"ﴋ";s:4:"شخ";s:3:"ﴌ";s:4:"شم";s:3:"ﴍ";s:4:"شر";s:3:"ﴎ";s:4:"سر";s:3:"ﴏ";s:4:"صر";s:3:"ﴐ";s:4:"ضر";s:3:"ﴑ";s:4:"طى";s:3:"ﴒ";s:4:"طي";s:3:"ﴓ";s:4:"عى";s:3:"ﴔ";s:4:"عي";s:3:"ﴕ";s:4:"غى";s:3:"ﴖ";s:4:"غي";s:3:"ﴗ";s:4:"سى";s:3:"ﴘ";s:4:"سي";s:3:"ﴙ";s:4:"شى";s:3:"ﴚ";s:4:"شي";s:3:"ﴛ";s:4:"حى";s:3:"ﴜ";s:4:"حي";s:3:"ﴝ";s:4:"جى";s:3:"ﴞ";s:4:"جي";s:3:"ﴟ";s:4:"خى";s:3:"ﴠ";s:4:"خي";s:3:"ﴡ";s:4:"صى";s:3:"ﴢ";s:4:"صي";s:3:"ﴣ";s:4:"ضى";s:3:"ﴤ";s:4:"ضي";s:3:"ﴥ";s:4:"شج";s:3:"ﴦ";s:4:"شح";s:3:"ﴧ";s:4:"شخ";s:3:"ﴨ";s:4:"شم";s:3:"ﴩ";s:4:"شر";s:3:"ﴪ";s:4:"سر";s:3:"ﴫ";s:4:"صر";s:3:"ﴬ";s:4:"ضر";s:3:"ﴭ";s:4:"شج";s:3:"ﴮ";s:4:"شح";s:3:"ﴯ";s:4:"شخ";s:3:"ﴰ";s:4:"شم";s:3:"ﴱ";s:4:"سه";s:3:"ﴲ";s:4:"شه";s:3:"ﴳ";s:4:"طم";s:3:"ﴴ";s:4:"سج";s:3:"ﴵ";s:4:"سح";s:3:"ﴶ";s:4:"سخ";s:3:"ﴷ";s:4:"شج";s:3:"ﴸ";s:4:"شح";s:3:"ﴹ";s:4:"شخ";s:3:"ﴺ";s:4:"طم";s:3:"ﴻ";s:4:"ظم";s:3:"ﴼ";s:4:"اً";s:3:"ﴽ";s:4:"اً";s:3:"ﵐ";s:6:"تجم";s:3:"ﵑ";s:6:"تحج";s:3:"ﵒ";s:6:"تحج";s:3:"ﵓ";s:6:"تحم";s:3:"ﵔ";s:6:"تخم";s:3:"ﵕ";s:6:"تمج";s:3:"ﵖ";s:6:"تمح";s:3:"ﵗ";s:6:"تمخ";s:3:"ﵘ";s:6:"جمح";s:3:"ﵙ";s:6:"جمح";s:3:"ﵚ";s:6:"حمي";s:3:"ﵛ";s:6:"حمى";s:3:"ﵜ";s:6:"سحج";s:3:"ﵝ";s:6:"سجح";s:3:"ﵞ";s:6:"سجى";s:3:"ﵟ";s:6:"سمح";s:3:"ﵠ";s:6:"سمح";s:3:"ﵡ";s:6:"سمج";s:3:"ﵢ";s:6:"سمم";s:3:"ﵣ";s:6:"سمم";s:3:"ﵤ";s:6:"صحح";s:3:"ﵥ";s:6:"صحح";s:3:"ﵦ";s:6:"صمم";s:3:"ﵧ";s:6:"شحم";s:3:"ﵨ";s:6:"شحم";s:3:"ﵩ";s:6:"شجي";s:3:"ﵪ";s:6:"شمخ";s:3:"ﵫ";s:6:"شمخ";s:3:"ﵬ";s:6:"شمم";s:3:"ﵭ";s:6:"شمم";s:3:"ﵮ";s:6:"ضحى";s:3:"ﵯ";s:6:"ضخم";s:3:"ﵰ";s:6:"ضخم";s:3:"ﵱ";s:6:"طمح";s:3:"ﵲ";s:6:"طمح";s:3:"ﵳ";s:6:"طمم";s:3:"ﵴ";s:6:"طمي";s:3:"ﵵ";s:6:"عجم";s:3:"ﵶ";s:6:"عمم";s:3:"ﵷ";s:6:"عمم";s:3:"ﵸ";s:6:"عمى";s:3:"ﵹ";s:6:"غمم";s:3:"ﵺ";s:6:"غمي";s:3:"ﵻ";s:6:"غمى";s:3:"ﵼ";s:6:"فخم";s:3:"ﵽ";s:6:"فخم";s:3:"ﵾ";s:6:"قمح";s:3:"ﵿ";s:6:"قمم";s:3:"ﶀ";s:6:"لحم";s:3:"ﶁ";s:6:"لحي";s:3:"ﶂ";s:6:"لحى";s:3:"ﶃ";s:6:"لجج";s:3:"ﶄ";s:6:"لجج";s:3:"ﶅ";s:6:"لخم";s:3:"ﶆ";s:6:"لخم";s:3:"ﶇ";s:6:"لمح";s:3:"ﶈ";s:6:"لمح";s:3:"ﶉ";s:6:"محج";s:3:"ﶊ";s:6:"محم";s:3:"ﶋ";s:6:"محي";s:3:"ﶌ";s:6:"مجح";s:3:"ﶍ";s:6:"مجم";s:3:"ﶎ";s:6:"مخج";s:3:"ﶏ";s:6:"مخم";s:3:"ﶒ";s:6:"مجخ";s:3:"ﶓ";s:6:"همج";s:3:"ﶔ";s:6:"همم";s:3:"ﶕ";s:6:"نحم";s:3:"ﶖ";s:6:"نحى";s:3:"ﶗ";s:6:"نجم";s:3:"ﶘ";s:6:"نجم";s:3:"ﶙ";s:6:"نجى";s:3:"ﶚ";s:6:"نمي";s:3:"ﶛ";s:6:"نمى";s:3:"ﶜ";s:6:"يمم";s:3:"ﶝ";s:6:"يمم";s:3:"ﶞ";s:6:"بخي";s:3:"ﶟ";s:6:"تجي";s:3:"ﶠ";s:6:"تجى";s:3:"ﶡ";s:6:"تخي";s:3:"ﶢ";s:6:"تخى";s:3:"ﶣ";s:6:"تمي";s:3:"ﶤ";s:6:"تمى";s:3:"ﶥ";s:6:"جمي";s:3:"ﶦ";s:6:"جحى";s:3:"ﶧ";s:6:"جمى";s:3:"ﶨ";s:6:"سخى";s:3:"ﶩ";s:6:"صحي";s:3:"ﶪ";s:6:"شحي";s:3:"ﶫ";s:6:"ضحي";s:3:"ﶬ";s:6:"لجي";s:3:"ﶭ";s:6:"لمي";s:3:"ﶮ";s:6:"يحي";s:3:"ﶯ";s:6:"يجي";s:3:"ﶰ";s:6:"يمي";s:3:"ﶱ";s:6:"ممي";s:3:"ﶲ";s:6:"قمي";s:3:"ﶳ";s:6:"نحي";s:3:"ﶴ";s:6:"قمح";s:3:"ﶵ";s:6:"لحم";s:3:"ﶶ";s:6:"عمي";s:3:"ﶷ";s:6:"كمي";s:3:"ﶸ";s:6:"نجح";s:3:"ﶹ";s:6:"مخي";s:3:"ﶺ";s:6:"لجم";s:3:"ﶻ";s:6:"كمم";s:3:"ﶼ";s:6:"لجم";s:3:"ﶽ";s:6:"نجح";s:3:"ﶾ";s:6:"جحي";s:3:"ﶿ";s:6:"حجي";s:3:"ﷀ";s:6:"مجي";s:3:"ﷁ";s:6:"فمي";s:3:"ﷂ";s:6:"بحي";s:3:"ﷃ";s:6:"كمم";s:3:"ﷄ";s:6:"عجم";s:3:"ﷅ";s:6:"صمم";s:3:"ﷆ";s:6:"سخي";s:3:"ﷇ";s:6:"نجي";s:3:"ﷰ";s:6:"صلے";s:3:"ﷱ";s:6:"قلے";s:3:"ﷲ";s:8:"الله";s:3:"ﷳ";s:8:"اكبر";s:3:"ﷴ";s:8:"محمد";s:3:"ﷵ";s:8:"صلعم";s:3:"ﷶ";s:8:"رسول";s:3:"ﷷ";s:8:"عليه";s:3:"ﷸ";s:8:"وسلم";s:3:"ﷹ";s:6:"صلى";s:3:"ﷺ";s:33:"صلى الله عليه وسلم";s:3:"ﷻ";s:15:"جل جلاله";s:3:"﷼";s:8:"ریال";s:3:"︐";s:1:",";s:3:"︑";s:3:"、";s:3:"︒";s:3:"。";s:3:"︓";s:1:":";s:3:"︔";s:1:";";s:3:"︕";s:1:"!";s:3:"︖";s:1:"?";s:3:"︗";s:3:"〖";s:3:"︘";s:3:"〗";s:3:"︙";s:3:"...";s:3:"︰";s:2:"..";s:3:"︱";s:3:"—";s:3:"︲";s:3:"–";s:3:"︳";s:1:"_";s:3:"︴";s:1:"_";s:3:"︵";s:1:"(";s:3:"︶";s:1:")";s:3:"︷";s:1:"{";s:3:"︸";s:1:"}";s:3:"︹";s:3:"〔";s:3:"︺";s:3:"〕";s:3:"︻";s:3:"【";s:3:"︼";s:3:"】";s:3:"︽";s:3:"《";s:3:"︾";s:3:"》";s:3:"︿";s:3:"〈";s:3:"﹀";s:3:"〉";s:3:"﹁";s:3:"「";s:3:"﹂";s:3:"」";s:3:"﹃";s:3:"『";s:3:"﹄";s:3:"』";s:3:"﹇";s:1:"[";s:3:"﹈";s:1:"]";s:3:"﹉";s:3:" ̅";s:3:"﹊";s:3:" ̅";s:3:"﹋";s:3:" ̅";s:3:"﹌";s:3:" ̅";s:3:"﹍";s:1:"_";s:3:"﹎";s:1:"_";s:3:"﹏";s:1:"_";s:3:"﹐";s:1:",";s:3:"﹑";s:3:"、";s:3:"﹒";s:1:".";s:3:"﹔";s:1:";";s:3:"﹕";s:1:":";s:3:"﹖";s:1:"?";s:3:"﹗";s:1:"!";s:3:"﹘";s:3:"—";s:3:"﹙";s:1:"(";s:3:"﹚";s:1:")";s:3:"﹛";s:1:"{";s:3:"﹜";s:1:"}";s:3:"﹝";s:3:"〔";s:3:"﹞";s:3:"〕";s:3:"﹟";s:1:"#";s:3:"﹠";s:1:"&";s:3:"﹡";s:1:"*";s:3:"﹢";s:1:"+";s:3:"﹣";s:1:"-";s:3:"﹤";s:1:"<";s:3:"﹥";s:1:">";s:3:"﹦";s:1:"=";s:3:"﹨";s:1:"\\";s:3:"﹩";s:1:"$";s:3:"﹪";s:1:"%";s:3:"﹫";s:1:"@";s:3:"ﹰ";s:3:" ً";s:3:"ﹱ";s:4:"ـً";s:3:"ﹲ";s:3:" ٌ";s:3:"ﹴ";s:3:" ٍ";s:3:"ﹶ";s:3:" َ";s:3:"ﹷ";s:4:"ـَ";s:3:"ﹸ";s:3:" ُ";s:3:"ﹹ";s:4:"ـُ";s:3:"ﹺ";s:3:" ِ";s:3:"ﹻ";s:4:"ـِ";s:3:"ﹼ";s:3:" ّ";s:3:"ﹽ";s:4:"ـّ";s:3:"ﹾ";s:3:" ْ";s:3:"ﹿ";s:4:"ـْ";s:3:"ﺀ";s:2:"ء";s:3:"ﺁ";s:4:"آ";s:3:"ﺂ";s:4:"آ";s:3:"ﺃ";s:4:"أ";s:3:"ﺄ";s:4:"أ";s:3:"ﺅ";s:4:"ؤ";s:3:"ﺆ";s:4:"ؤ";s:3:"ﺇ";s:4:"إ";s:3:"ﺈ";s:4:"إ";s:3:"ﺉ";s:4:"ئ";s:3:"ﺊ";s:4:"ئ";s:3:"ﺋ";s:4:"ئ";s:3:"ﺌ";s:4:"ئ";s:3:"ﺍ";s:2:"ا";s:3:"ﺎ";s:2:"ا";s:3:"ﺏ";s:2:"ب";s:3:"ﺐ";s:2:"ب";s:3:"ﺑ";s:2:"ب";s:3:"ﺒ";s:2:"ب";s:3:"ﺓ";s:2:"ة";s:3:"ﺔ";s:2:"ة";s:3:"ﺕ";s:2:"ت";s:3:"ﺖ";s:2:"ت";s:3:"ﺗ";s:2:"ت";s:3:"ﺘ";s:2:"ت";s:3:"ﺙ";s:2:"ث";s:3:"ﺚ";s:2:"ث";s:3:"ﺛ";s:2:"ث";s:3:"ﺜ";s:2:"ث";s:3:"ﺝ";s:2:"ج";s:3:"ﺞ";s:2:"ج";s:3:"ﺟ";s:2:"ج";s:3:"ﺠ";s:2:"ج";s:3:"ﺡ";s:2:"ح";s:3:"ﺢ";s:2:"ح";s:3:"ﺣ";s:2:"ح";s:3:"ﺤ";s:2:"ح";s:3:"ﺥ";s:2:"خ";s:3:"ﺦ";s:2:"خ";s:3:"ﺧ";s:2:"خ";s:3:"ﺨ";s:2:"خ";s:3:"ﺩ";s:2:"د";s:3:"ﺪ";s:2:"د";s:3:"ﺫ";s:2:"ذ";s:3:"ﺬ";s:2:"ذ";s:3:"ﺭ";s:2:"ر";s:3:"ﺮ";s:2:"ر";s:3:"ﺯ";s:2:"ز";s:3:"ﺰ";s:2:"ز";s:3:"ﺱ";s:2:"س";s:3:"ﺲ";s:2:"س";s:3:"ﺳ";s:2:"س";s:3:"ﺴ";s:2:"س";s:3:"ﺵ";s:2:"ش";s:3:"ﺶ";s:2:"ش";s:3:"ﺷ";s:2:"ش";s:3:"ﺸ";s:2:"ش";s:3:"ﺹ";s:2:"ص";s:3:"ﺺ";s:2:"ص";s:3:"ﺻ";s:2:"ص";s:3:"ﺼ";s:2:"ص";s:3:"ﺽ";s:2:"ض";s:3:"ﺾ";s:2:"ض";s:3:"ﺿ";s:2:"ض";s:3:"ﻀ";s:2:"ض";s:3:"ﻁ";s:2:"ط";s:3:"ﻂ";s:2:"ط";s:3:"ﻃ";s:2:"ط";s:3:"ﻄ";s:2:"ط";s:3:"ﻅ";s:2:"ظ";s:3:"ﻆ";s:2:"ظ";s:3:"ﻇ";s:2:"ظ";s:3:"ﻈ";s:2:"ظ";s:3:"ﻉ";s:2:"ع";s:3:"ﻊ";s:2:"ع";s:3:"ﻋ";s:2:"ع";s:3:"ﻌ";s:2:"ع";s:3:"ﻍ";s:2:"غ";s:3:"ﻎ";s:2:"غ";s:3:"ﻏ";s:2:"غ";s:3:"ﻐ";s:2:"غ";s:3:"ﻑ";s:2:"ف";s:3:"ﻒ";s:2:"ف";s:3:"ﻓ";s:2:"ف";s:3:"ﻔ";s:2:"ف";s:3:"ﻕ";s:2:"ق";s:3:"ﻖ";s:2:"ق";s:3:"ﻗ";s:2:"ق";s:3:"ﻘ";s:2:"ق";s:3:"ﻙ";s:2:"ك";s:3:"ﻚ";s:2:"ك";s:3:"ﻛ";s:2:"ك";s:3:"ﻜ";s:2:"ك";s:3:"ﻝ";s:2:"ل";s:3:"ﻞ";s:2:"ل";s:3:"ﻟ";s:2:"ل";s:3:"ﻠ";s:2:"ل";s:3:"ﻡ";s:2:"م";s:3:"ﻢ";s:2:"م";s:3:"ﻣ";s:2:"م";s:3:"ﻤ";s:2:"م";s:3:"ﻥ";s:2:"ن";s:3:"ﻦ";s:2:"ن";s:3:"ﻧ";s:2:"ن";s:3:"ﻨ";s:2:"ن";s:3:"ﻩ";s:2:"ه";s:3:"ﻪ";s:2:"ه";s:3:"ﻫ";s:2:"ه";s:3:"ﻬ";s:2:"ه";s:3:"ﻭ";s:2:"و";s:3:"ﻮ";s:2:"و";s:3:"ﻯ";s:2:"ى";s:3:"ﻰ";s:2:"ى";s:3:"ﻱ";s:2:"ي";s:3:"ﻲ";s:2:"ي";s:3:"ﻳ";s:2:"ي";s:3:"ﻴ";s:2:"ي";s:3:"ﻵ";s:6:"لآ";s:3:"ﻶ";s:6:"لآ";s:3:"ﻷ";s:6:"لأ";s:3:"ﻸ";s:6:"لأ";s:3:"ﻹ";s:6:"لإ";s:3:"ﻺ";s:6:"لإ";s:3:"ﻻ";s:4:"لا";s:3:"ﻼ";s:4:"لا";s:3:"!";s:1:"!";s:3:""";s:1:""";s:3:"#";s:1:"#";s:3:"$";s:1:"$";s:3:"%";s:1:"%";s:3:"&";s:1:"&";s:3:"'";s:1:"\'";s:3:"(";s:1:"(";s:3:")";s:1:")";s:3:"*";s:1:"*";s:3:"+";s:1:"+";s:3:",";s:1:",";s:3:"-";s:1:"-";s:3:".";s:1:".";s:3:"/";s:1:"/";s:3:"0";s:1:"0";s:3:"1";s:1:"1";s:3:"2";s:1:"2";s:3:"3";s:1:"3";s:3:"4";s:1:"4";s:3:"5";s:1:"5";s:3:"6";s:1:"6";s:3:"7";s:1:"7";s:3:"8";s:1:"8";s:3:"9";s:1:"9";s:3:":";s:1:":";s:3:";";s:1:";";s:3:"<";s:1:"<";s:3:"=";s:1:"=";s:3:">";s:1:">";s:3:"?";s:1:"?";s:3:"@";s:1:"@";s:3:"A";s:1:"A";s:3:"B";s:1:"B";s:3:"C";s:1:"C";s:3:"D";s:1:"D";s:3:"E";s:1:"E";s:3:"F";s:1:"F";s:3:"G";s:1:"G";s:3:"H";s:1:"H";s:3:"I";s:1:"I";s:3:"J";s:1:"J";s:3:"K";s:1:"K";s:3:"L";s:1:"L";s:3:"M";s:1:"M";s:3:"N";s:1:"N";s:3:"O";s:1:"O";s:3:"P";s:1:"P";s:3:"Q";s:1:"Q";s:3:"R";s:1:"R";s:3:"S";s:1:"S";s:3:"T";s:1:"T";s:3:"U";s:1:"U";s:3:"V";s:1:"V";s:3:"W";s:1:"W";s:3:"X";s:1:"X";s:3:"Y";s:1:"Y";s:3:"Z";s:1:"Z";s:3:"[";s:1:"[";s:3:"\";s:1:"\\";s:3:"]";s:1:"]";s:3:"^";s:1:"^";s:3:"_";s:1:"_";s:3:"`";s:1:"`";s:3:"a";s:1:"a";s:3:"b";s:1:"b";s:3:"c";s:1:"c";s:3:"d";s:1:"d";s:3:"e";s:1:"e";s:3:"f";s:1:"f";s:3:"g";s:1:"g";s:3:"h";s:1:"h";s:3:"i";s:1:"i";s:3:"j";s:1:"j";s:3:"k";s:1:"k";s:3:"l";s:1:"l";s:3:"m";s:1:"m";s:3:"n";s:1:"n";s:3:"o";s:1:"o";s:3:"p";s:1:"p";s:3:"q";s:1:"q";s:3:"r";s:1:"r";s:3:"s";s:1:"s";s:3:"t";s:1:"t";s:3:"u";s:1:"u";s:3:"v";s:1:"v";s:3:"w";s:1:"w";s:3:"x";s:1:"x";s:3:"y";s:1:"y";s:3:"z";s:1:"z";s:3:"{";s:1:"{";s:3:"|";s:1:"|";s:3:"}";s:1:"}";s:3:"~";s:1:"~";s:3:"⦅";s:3:"⦅";s:3:"⦆";s:3:"⦆";s:3:"。";s:3:"。";s:3:"「";s:3:"「";s:3:"」";s:3:"」";s:3:"、";s:3:"、";s:3:"・";s:3:"・";s:3:"ヲ";s:3:"ヲ";s:3:"ァ";s:3:"ァ";s:3:"ィ";s:3:"ィ";s:3:"ゥ";s:3:"ゥ";s:3:"ェ";s:3:"ェ";s:3:"ォ";s:3:"ォ";s:3:"ャ";s:3:"ャ";s:3:"ュ";s:3:"ュ";s:3:"ョ";s:3:"ョ";s:3:"ッ";s:3:"ッ";s:3:"ー";s:3:"ー";s:3:"ア";s:3:"ア";s:3:"イ";s:3:"イ";s:3:"ウ";s:3:"ウ";s:3:"エ";s:3:"エ";s:3:"オ";s:3:"オ";s:3:"カ";s:3:"カ";s:3:"キ";s:3:"キ";s:3:"ク";s:3:"ク";s:3:"ケ";s:3:"ケ";s:3:"コ";s:3:"コ";s:3:"サ";s:3:"サ";s:3:"シ";s:3:"シ";s:3:"ス";s:3:"ス";s:3:"セ";s:3:"セ";s:3:"ソ";s:3:"ソ";s:3:"タ";s:3:"タ";s:3:"チ";s:3:"チ";s:3:"ツ";s:3:"ツ";s:3:"テ";s:3:"テ";s:3:"ト";s:3:"ト";s:3:"ナ";s:3:"ナ";s:3:"ニ";s:3:"ニ";s:3:"ヌ";s:3:"ヌ";s:3:"ネ";s:3:"ネ";s:3:"ノ";s:3:"ノ";s:3:"ハ";s:3:"ハ";s:3:"ヒ";s:3:"ヒ";s:3:"フ";s:3:"フ";s:3:"ヘ";s:3:"ヘ";s:3:"ホ";s:3:"ホ";s:3:"マ";s:3:"マ";s:3:"ミ";s:3:"ミ";s:3:"ム";s:3:"ム";s:3:"メ";s:3:"メ";s:3:"モ";s:3:"モ";s:3:"ヤ";s:3:"ヤ";s:3:"ユ";s:3:"ユ";s:3:"ヨ";s:3:"ヨ";s:3:"ラ";s:3:"ラ";s:3:"リ";s:3:"リ";s:3:"ル";s:3:"ル";s:3:"レ";s:3:"レ";s:3:"ロ";s:3:"ロ";s:3:"ワ";s:3:"ワ";s:3:"ン";s:3:"ン";s:3:"゙";s:3:"゙";s:3:"゚";s:3:"゚";s:3:"ᅠ";s:3:"ᅠ";s:3:"ᄀ";s:3:"ᄀ";s:3:"ᄁ";s:3:"ᄁ";s:3:"ᆪ";s:3:"ᆪ";s:3:"ᄂ";s:3:"ᄂ";s:3:"ᆬ";s:3:"ᆬ";s:3:"ᆭ";s:3:"ᆭ";s:3:"ᄃ";s:3:"ᄃ";s:3:"ᄄ";s:3:"ᄄ";s:3:"ᄅ";s:3:"ᄅ";s:3:"ᆰ";s:3:"ᆰ";s:3:"ᆱ";s:3:"ᆱ";s:3:"ᆲ";s:3:"ᆲ";s:3:"ᆳ";s:3:"ᆳ";s:3:"ᆴ";s:3:"ᆴ";s:3:"ᆵ";s:3:"ᆵ";s:3:"ᄚ";s:3:"ᄚ";s:3:"ᄆ";s:3:"ᄆ";s:3:"ᄇ";s:3:"ᄇ";s:3:"ᄈ";s:3:"ᄈ";s:3:"ᄡ";s:3:"ᄡ";s:3:"ᄉ";s:3:"ᄉ";s:3:"ᄊ";s:3:"ᄊ";s:3:"ᄋ";s:3:"ᄋ";s:3:"ᄌ";s:3:"ᄌ";s:3:"ᄍ";s:3:"ᄍ";s:3:"ᄎ";s:3:"ᄎ";s:3:"ᄏ";s:3:"ᄏ";s:3:"ᄐ";s:3:"ᄐ";s:3:"ᄑ";s:3:"ᄑ";s:3:"ᄒ";s:3:"ᄒ";s:3:"ᅡ";s:3:"ᅡ";s:3:"ᅢ";s:3:"ᅢ";s:3:"ᅣ";s:3:"ᅣ";s:3:"ᅤ";s:3:"ᅤ";s:3:"ᅥ";s:3:"ᅥ";s:3:"ᅦ";s:3:"ᅦ";s:3:"ᅧ";s:3:"ᅧ";s:3:"ᅨ";s:3:"ᅨ";s:3:"ᅩ";s:3:"ᅩ";s:3:"ᅪ";s:3:"ᅪ";s:3:"ᅫ";s:3:"ᅫ";s:3:"ᅬ";s:3:"ᅬ";s:3:"ᅭ";s:3:"ᅭ";s:3:"ᅮ";s:3:"ᅮ";s:3:"ᅯ";s:3:"ᅯ";s:3:"ᅰ";s:3:"ᅰ";s:3:"ᅱ";s:3:"ᅱ";s:3:"ᅲ";s:3:"ᅲ";s:3:"ᅳ";s:3:"ᅳ";s:3:"ᅴ";s:3:"ᅴ";s:3:"ᅵ";s:3:"ᅵ";s:3:"¢";s:2:"¢";s:3:"£";s:2:"£";s:3:"¬";s:2:"¬";s:3:" ̄";s:3:" ̄";s:3:"¦";s:2:"¦";s:3:"¥";s:2:"¥";s:3:"₩";s:3:"₩";s:3:"│";s:3:"│";s:3:"←";s:3:"←";s:3:"↑";s:3:"↑";s:3:"→";s:3:"→";s:3:"↓";s:3:"↓";s:3:"■";s:3:"■";s:3:"○";s:3:"○";s:4:"𑂚";s:8:"𑂚";s:4:"𑂜";s:8:"𑂜";s:4:"𑂫";s:8:"𑂫";s:4:"𝅗𝅥";s:8:"𝅗𝅥";s:4:"𝅘𝅥";s:8:"𝅘𝅥";s:4:"𝅘𝅥𝅮";s:12:"𝅘𝅥𝅮";s:4:"𝅘𝅥𝅯";s:12:"𝅘𝅥𝅯";s:4:"𝅘𝅥𝅰";s:12:"𝅘𝅥𝅰";s:4:"𝅘𝅥𝅱";s:12:"𝅘𝅥𝅱";s:4:"𝅘𝅥𝅲";s:12:"𝅘𝅥𝅲";s:4:"𝆹𝅥";s:8:"𝆹𝅥";s:4:"𝆺𝅥";s:8:"𝆺𝅥";s:4:"𝆹𝅥𝅮";s:12:"𝆹𝅥𝅮";s:4:"𝆺𝅥𝅮";s:12:"𝆺𝅥𝅮";s:4:"𝆹𝅥𝅯";s:12:"𝆹𝅥𝅯";s:4:"𝆺𝅥𝅯";s:12:"𝆺𝅥𝅯";s:4:"𝐀";s:1:"A";s:4:"𝐁";s:1:"B";s:4:"𝐂";s:1:"C";s:4:"𝐃";s:1:"D";s:4:"𝐄";s:1:"E";s:4:"𝐅";s:1:"F";s:4:"𝐆";s:1:"G";s:4:"𝐇";s:1:"H";s:4:"𝐈";s:1:"I";s:4:"𝐉";s:1:"J";s:4:"𝐊";s:1:"K";s:4:"𝐋";s:1:"L";s:4:"𝐌";s:1:"M";s:4:"𝐍";s:1:"N";s:4:"𝐎";s:1:"O";s:4:"𝐏";s:1:"P";s:4:"𝐐";s:1:"Q";s:4:"𝐑";s:1:"R";s:4:"𝐒";s:1:"S";s:4:"𝐓";s:1:"T";s:4:"𝐔";s:1:"U";s:4:"𝐕";s:1:"V";s:4:"𝐖";s:1:"W";s:4:"𝐗";s:1:"X";s:4:"𝐘";s:1:"Y";s:4:"𝐙";s:1:"Z";s:4:"𝐚";s:1:"a";s:4:"𝐛";s:1:"b";s:4:"𝐜";s:1:"c";s:4:"𝐝";s:1:"d";s:4:"𝐞";s:1:"e";s:4:"𝐟";s:1:"f";s:4:"𝐠";s:1:"g";s:4:"𝐡";s:1:"h";s:4:"𝐢";s:1:"i";s:4:"𝐣";s:1:"j";s:4:"𝐤";s:1:"k";s:4:"𝐥";s:1:"l";s:4:"𝐦";s:1:"m";s:4:"𝐧";s:1:"n";s:4:"𝐨";s:1:"o";s:4:"𝐩";s:1:"p";s:4:"𝐪";s:1:"q";s:4:"𝐫";s:1:"r";s:4:"𝐬";s:1:"s";s:4:"𝐭";s:1:"t";s:4:"𝐮";s:1:"u";s:4:"𝐯";s:1:"v";s:4:"𝐰";s:1:"w";s:4:"𝐱";s:1:"x";s:4:"𝐲";s:1:"y";s:4:"𝐳";s:1:"z";s:4:"𝐴";s:1:"A";s:4:"𝐵";s:1:"B";s:4:"𝐶";s:1:"C";s:4:"𝐷";s:1:"D";s:4:"𝐸";s:1:"E";s:4:"𝐹";s:1:"F";s:4:"𝐺";s:1:"G";s:4:"𝐻";s:1:"H";s:4:"𝐼";s:1:"I";s:4:"𝐽";s:1:"J";s:4:"𝐾";s:1:"K";s:4:"𝐿";s:1:"L";s:4:"𝑀";s:1:"M";s:4:"𝑁";s:1:"N";s:4:"𝑂";s:1:"O";s:4:"𝑃";s:1:"P";s:4:"𝑄";s:1:"Q";s:4:"𝑅";s:1:"R";s:4:"𝑆";s:1:"S";s:4:"𝑇";s:1:"T";s:4:"𝑈";s:1:"U";s:4:"𝑉";s:1:"V";s:4:"𝑊";s:1:"W";s:4:"𝑋";s:1:"X";s:4:"𝑌";s:1:"Y";s:4:"𝑍";s:1:"Z";s:4:"𝑎";s:1:"a";s:4:"𝑏";s:1:"b";s:4:"𝑐";s:1:"c";s:4:"𝑑";s:1:"d";s:4:"𝑒";s:1:"e";s:4:"𝑓";s:1:"f";s:4:"𝑔";s:1:"g";s:4:"𝑖";s:1:"i";s:4:"𝑗";s:1:"j";s:4:"𝑘";s:1:"k";s:4:"𝑙";s:1:"l";s:4:"𝑚";s:1:"m";s:4:"𝑛";s:1:"n";s:4:"𝑜";s:1:"o";s:4:"𝑝";s:1:"p";s:4:"𝑞";s:1:"q";s:4:"𝑟";s:1:"r";s:4:"𝑠";s:1:"s";s:4:"𝑡";s:1:"t";s:4:"𝑢";s:1:"u";s:4:"𝑣";s:1:"v";s:4:"𝑤";s:1:"w";s:4:"𝑥";s:1:"x";s:4:"𝑦";s:1:"y";s:4:"𝑧";s:1:"z";s:4:"𝑨";s:1:"A";s:4:"𝑩";s:1:"B";s:4:"𝑪";s:1:"C";s:4:"𝑫";s:1:"D";s:4:"𝑬";s:1:"E";s:4:"𝑭";s:1:"F";s:4:"𝑮";s:1:"G";s:4:"𝑯";s:1:"H";s:4:"𝑰";s:1:"I";s:4:"𝑱";s:1:"J";s:4:"𝑲";s:1:"K";s:4:"𝑳";s:1:"L";s:4:"𝑴";s:1:"M";s:4:"𝑵";s:1:"N";s:4:"𝑶";s:1:"O";s:4:"𝑷";s:1:"P";s:4:"𝑸";s:1:"Q";s:4:"𝑹";s:1:"R";s:4:"𝑺";s:1:"S";s:4:"𝑻";s:1:"T";s:4:"𝑼";s:1:"U";s:4:"𝑽";s:1:"V";s:4:"𝑾";s:1:"W";s:4:"𝑿";s:1:"X";s:4:"𝒀";s:1:"Y";s:4:"𝒁";s:1:"Z";s:4:"𝒂";s:1:"a";s:4:"𝒃";s:1:"b";s:4:"𝒄";s:1:"c";s:4:"𝒅";s:1:"d";s:4:"𝒆";s:1:"e";s:4:"𝒇";s:1:"f";s:4:"𝒈";s:1:"g";s:4:"𝒉";s:1:"h";s:4:"𝒊";s:1:"i";s:4:"𝒋";s:1:"j";s:4:"𝒌";s:1:"k";s:4:"𝒍";s:1:"l";s:4:"𝒎";s:1:"m";s:4:"𝒏";s:1:"n";s:4:"𝒐";s:1:"o";s:4:"𝒑";s:1:"p";s:4:"𝒒";s:1:"q";s:4:"𝒓";s:1:"r";s:4:"𝒔";s:1:"s";s:4:"𝒕";s:1:"t";s:4:"𝒖";s:1:"u";s:4:"𝒗";s:1:"v";s:4:"𝒘";s:1:"w";s:4:"𝒙";s:1:"x";s:4:"𝒚";s:1:"y";s:4:"𝒛";s:1:"z";s:4:"𝒜";s:1:"A";s:4:"𝒞";s:1:"C";s:4:"𝒟";s:1:"D";s:4:"𝒢";s:1:"G";s:4:"𝒥";s:1:"J";s:4:"𝒦";s:1:"K";s:4:"𝒩";s:1:"N";s:4:"𝒪";s:1:"O";s:4:"𝒫";s:1:"P";s:4:"𝒬";s:1:"Q";s:4:"𝒮";s:1:"S";s:4:"𝒯";s:1:"T";s:4:"𝒰";s:1:"U";s:4:"𝒱";s:1:"V";s:4:"𝒲";s:1:"W";s:4:"𝒳";s:1:"X";s:4:"𝒴";s:1:"Y";s:4:"𝒵";s:1:"Z";s:4:"𝒶";s:1:"a";s:4:"𝒷";s:1:"b";s:4:"𝒸";s:1:"c";s:4:"𝒹";s:1:"d";s:4:"𝒻";s:1:"f";s:4:"𝒽";s:1:"h";s:4:"𝒾";s:1:"i";s:4:"𝒿";s:1:"j";s:4:"𝓀";s:1:"k";s:4:"𝓁";s:1:"l";s:4:"𝓂";s:1:"m";s:4:"𝓃";s:1:"n";s:4:"𝓅";s:1:"p";s:4:"𝓆";s:1:"q";s:4:"𝓇";s:1:"r";s:4:"𝓈";s:1:"s";s:4:"𝓉";s:1:"t";s:4:"𝓊";s:1:"u";s:4:"𝓋";s:1:"v";s:4:"𝓌";s:1:"w";s:4:"𝓍";s:1:"x";s:4:"𝓎";s:1:"y";s:4:"𝓏";s:1:"z";s:4:"𝓐";s:1:"A";s:4:"𝓑";s:1:"B";s:4:"𝓒";s:1:"C";s:4:"𝓓";s:1:"D";s:4:"𝓔";s:1:"E";s:4:"𝓕";s:1:"F";s:4:"𝓖";s:1:"G";s:4:"𝓗";s:1:"H";s:4:"𝓘";s:1:"I";s:4:"𝓙";s:1:"J";s:4:"𝓚";s:1:"K";s:4:"𝓛";s:1:"L";s:4:"𝓜";s:1:"M";s:4:"𝓝";s:1:"N";s:4:"𝓞";s:1:"O";s:4:"𝓟";s:1:"P";s:4:"𝓠";s:1:"Q";s:4:"𝓡";s:1:"R";s:4:"𝓢";s:1:"S";s:4:"𝓣";s:1:"T";s:4:"𝓤";s:1:"U";s:4:"𝓥";s:1:"V";s:4:"𝓦";s:1:"W";s:4:"𝓧";s:1:"X";s:4:"𝓨";s:1:"Y";s:4:"𝓩";s:1:"Z";s:4:"𝓪";s:1:"a";s:4:"𝓫";s:1:"b";s:4:"𝓬";s:1:"c";s:4:"𝓭";s:1:"d";s:4:"𝓮";s:1:"e";s:4:"𝓯";s:1:"f";s:4:"𝓰";s:1:"g";s:4:"𝓱";s:1:"h";s:4:"𝓲";s:1:"i";s:4:"𝓳";s:1:"j";s:4:"𝓴";s:1:"k";s:4:"𝓵";s:1:"l";s:4:"𝓶";s:1:"m";s:4:"𝓷";s:1:"n";s:4:"𝓸";s:1:"o";s:4:"𝓹";s:1:"p";s:4:"𝓺";s:1:"q";s:4:"𝓻";s:1:"r";s:4:"𝓼";s:1:"s";s:4:"𝓽";s:1:"t";s:4:"𝓾";s:1:"u";s:4:"𝓿";s:1:"v";s:4:"𝔀";s:1:"w";s:4:"𝔁";s:1:"x";s:4:"𝔂";s:1:"y";s:4:"𝔃";s:1:"z";s:4:"𝔄";s:1:"A";s:4:"𝔅";s:1:"B";s:4:"𝔇";s:1:"D";s:4:"𝔈";s:1:"E";s:4:"𝔉";s:1:"F";s:4:"𝔊";s:1:"G";s:4:"𝔍";s:1:"J";s:4:"𝔎";s:1:"K";s:4:"𝔏";s:1:"L";s:4:"𝔐";s:1:"M";s:4:"𝔑";s:1:"N";s:4:"𝔒";s:1:"O";s:4:"𝔓";s:1:"P";s:4:"𝔔";s:1:"Q";s:4:"𝔖";s:1:"S";s:4:"𝔗";s:1:"T";s:4:"𝔘";s:1:"U";s:4:"𝔙";s:1:"V";s:4:"𝔚";s:1:"W";s:4:"𝔛";s:1:"X";s:4:"𝔜";s:1:"Y";s:4:"𝔞";s:1:"a";s:4:"𝔟";s:1:"b";s:4:"𝔠";s:1:"c";s:4:"𝔡";s:1:"d";s:4:"𝔢";s:1:"e";s:4:"𝔣";s:1:"f";s:4:"𝔤";s:1:"g";s:4:"𝔥";s:1:"h";s:4:"𝔦";s:1:"i";s:4:"𝔧";s:1:"j";s:4:"𝔨";s:1:"k";s:4:"𝔩";s:1:"l";s:4:"𝔪";s:1:"m";s:4:"𝔫";s:1:"n";s:4:"𝔬";s:1:"o";s:4:"𝔭";s:1:"p";s:4:"𝔮";s:1:"q";s:4:"𝔯";s:1:"r";s:4:"𝔰";s:1:"s";s:4:"𝔱";s:1:"t";s:4:"𝔲";s:1:"u";s:4:"𝔳";s:1:"v";s:4:"𝔴";s:1:"w";s:4:"𝔵";s:1:"x";s:4:"𝔶";s:1:"y";s:4:"𝔷";s:1:"z";s:4:"𝔸";s:1:"A";s:4:"𝔹";s:1:"B";s:4:"𝔻";s:1:"D";s:4:"𝔼";s:1:"E";s:4:"𝔽";s:1:"F";s:4:"𝔾";s:1:"G";s:4:"𝕀";s:1:"I";s:4:"𝕁";s:1:"J";s:4:"𝕂";s:1:"K";s:4:"𝕃";s:1:"L";s:4:"𝕄";s:1:"M";s:4:"𝕆";s:1:"O";s:4:"𝕊";s:1:"S";s:4:"𝕋";s:1:"T";s:4:"𝕌";s:1:"U";s:4:"𝕍";s:1:"V";s:4:"𝕎";s:1:"W";s:4:"𝕏";s:1:"X";s:4:"𝕐";s:1:"Y";s:4:"𝕒";s:1:"a";s:4:"𝕓";s:1:"b";s:4:"𝕔";s:1:"c";s:4:"𝕕";s:1:"d";s:4:"𝕖";s:1:"e";s:4:"𝕗";s:1:"f";s:4:"𝕘";s:1:"g";s:4:"𝕙";s:1:"h";s:4:"𝕚";s:1:"i";s:4:"𝕛";s:1:"j";s:4:"𝕜";s:1:"k";s:4:"𝕝";s:1:"l";s:4:"𝕞";s:1:"m";s:4:"𝕟";s:1:"n";s:4:"𝕠";s:1:"o";s:4:"𝕡";s:1:"p";s:4:"𝕢";s:1:"q";s:4:"𝕣";s:1:"r";s:4:"𝕤";s:1:"s";s:4:"𝕥";s:1:"t";s:4:"𝕦";s:1:"u";s:4:"𝕧";s:1:"v";s:4:"𝕨";s:1:"w";s:4:"𝕩";s:1:"x";s:4:"𝕪";s:1:"y";s:4:"𝕫";s:1:"z";s:4:"𝕬";s:1:"A";s:4:"𝕭";s:1:"B";s:4:"𝕮";s:1:"C";s:4:"𝕯";s:1:"D";s:4:"𝕰";s:1:"E";s:4:"𝕱";s:1:"F";s:4:"𝕲";s:1:"G";s:4:"𝕳";s:1:"H";s:4:"𝕴";s:1:"I";s:4:"𝕵";s:1:"J";s:4:"𝕶";s:1:"K";s:4:"𝕷";s:1:"L";s:4:"𝕸";s:1:"M";s:4:"𝕹";s:1:"N";s:4:"𝕺";s:1:"O";s:4:"𝕻";s:1:"P";s:4:"𝕼";s:1:"Q";s:4:"𝕽";s:1:"R";s:4:"𝕾";s:1:"S";s:4:"𝕿";s:1:"T";s:4:"𝖀";s:1:"U";s:4:"𝖁";s:1:"V";s:4:"𝖂";s:1:"W";s:4:"𝖃";s:1:"X";s:4:"𝖄";s:1:"Y";s:4:"𝖅";s:1:"Z";s:4:"𝖆";s:1:"a";s:4:"𝖇";s:1:"b";s:4:"𝖈";s:1:"c";s:4:"𝖉";s:1:"d";s:4:"𝖊";s:1:"e";s:4:"𝖋";s:1:"f";s:4:"𝖌";s:1:"g";s:4:"𝖍";s:1:"h";s:4:"𝖎";s:1:"i";s:4:"𝖏";s:1:"j";s:4:"𝖐";s:1:"k";s:4:"𝖑";s:1:"l";s:4:"𝖒";s:1:"m";s:4:"𝖓";s:1:"n";s:4:"𝖔";s:1:"o";s:4:"𝖕";s:1:"p";s:4:"𝖖";s:1:"q";s:4:"𝖗";s:1:"r";s:4:"𝖘";s:1:"s";s:4:"𝖙";s:1:"t";s:4:"𝖚";s:1:"u";s:4:"𝖛";s:1:"v";s:4:"𝖜";s:1:"w";s:4:"𝖝";s:1:"x";s:4:"𝖞";s:1:"y";s:4:"𝖟";s:1:"z";s:4:"𝖠";s:1:"A";s:4:"𝖡";s:1:"B";s:4:"𝖢";s:1:"C";s:4:"𝖣";s:1:"D";s:4:"𝖤";s:1:"E";s:4:"𝖥";s:1:"F";s:4:"𝖦";s:1:"G";s:4:"𝖧";s:1:"H";s:4:"𝖨";s:1:"I";s:4:"𝖩";s:1:"J";s:4:"𝖪";s:1:"K";s:4:"𝖫";s:1:"L";s:4:"𝖬";s:1:"M";s:4:"𝖭";s:1:"N";s:4:"𝖮";s:1:"O";s:4:"𝖯";s:1:"P";s:4:"𝖰";s:1:"Q";s:4:"𝖱";s:1:"R";s:4:"𝖲";s:1:"S";s:4:"𝖳";s:1:"T";s:4:"𝖴";s:1:"U";s:4:"𝖵";s:1:"V";s:4:"𝖶";s:1:"W";s:4:"𝖷";s:1:"X";s:4:"𝖸";s:1:"Y";s:4:"𝖹";s:1:"Z";s:4:"𝖺";s:1:"a";s:4:"𝖻";s:1:"b";s:4:"𝖼";s:1:"c";s:4:"𝖽";s:1:"d";s:4:"𝖾";s:1:"e";s:4:"𝖿";s:1:"f";s:4:"𝗀";s:1:"g";s:4:"𝗁";s:1:"h";s:4:"𝗂";s:1:"i";s:4:"𝗃";s:1:"j";s:4:"𝗄";s:1:"k";s:4:"𝗅";s:1:"l";s:4:"𝗆";s:1:"m";s:4:"𝗇";s:1:"n";s:4:"𝗈";s:1:"o";s:4:"𝗉";s:1:"p";s:4:"𝗊";s:1:"q";s:4:"𝗋";s:1:"r";s:4:"𝗌";s:1:"s";s:4:"𝗍";s:1:"t";s:4:"𝗎";s:1:"u";s:4:"𝗏";s:1:"v";s:4:"𝗐";s:1:"w";s:4:"𝗑";s:1:"x";s:4:"𝗒";s:1:"y";s:4:"𝗓";s:1:"z";s:4:"𝗔";s:1:"A";s:4:"𝗕";s:1:"B";s:4:"𝗖";s:1:"C";s:4:"𝗗";s:1:"D";s:4:"𝗘";s:1:"E";s:4:"𝗙";s:1:"F";s:4:"𝗚";s:1:"G";s:4:"𝗛";s:1:"H";s:4:"𝗜";s:1:"I";s:4:"𝗝";s:1:"J";s:4:"𝗞";s:1:"K";s:4:"𝗟";s:1:"L";s:4:"𝗠";s:1:"M";s:4:"𝗡";s:1:"N";s:4:"𝗢";s:1:"O";s:4:"𝗣";s:1:"P";s:4:"𝗤";s:1:"Q";s:4:"𝗥";s:1:"R";s:4:"𝗦";s:1:"S";s:4:"𝗧";s:1:"T";s:4:"𝗨";s:1:"U";s:4:"𝗩";s:1:"V";s:4:"𝗪";s:1:"W";s:4:"𝗫";s:1:"X";s:4:"𝗬";s:1:"Y";s:4:"𝗭";s:1:"Z";s:4:"𝗮";s:1:"a";s:4:"𝗯";s:1:"b";s:4:"𝗰";s:1:"c";s:4:"𝗱";s:1:"d";s:4:"𝗲";s:1:"e";s:4:"𝗳";s:1:"f";s:4:"𝗴";s:1:"g";s:4:"𝗵";s:1:"h";s:4:"𝗶";s:1:"i";s:4:"𝗷";s:1:"j";s:4:"𝗸";s:1:"k";s:4:"𝗹";s:1:"l";s:4:"𝗺";s:1:"m";s:4:"𝗻";s:1:"n";s:4:"𝗼";s:1:"o";s:4:"𝗽";s:1:"p";s:4:"𝗾";s:1:"q";s:4:"𝗿";s:1:"r";s:4:"𝘀";s:1:"s";s:4:"𝘁";s:1:"t";s:4:"𝘂";s:1:"u";s:4:"𝘃";s:1:"v";s:4:"𝘄";s:1:"w";s:4:"𝘅";s:1:"x";s:4:"𝘆";s:1:"y";s:4:"𝘇";s:1:"z";s:4:"𝘈";s:1:"A";s:4:"𝘉";s:1:"B";s:4:"𝘊";s:1:"C";s:4:"𝘋";s:1:"D";s:4:"𝘌";s:1:"E";s:4:"𝘍";s:1:"F";s:4:"𝘎";s:1:"G";s:4:"𝘏";s:1:"H";s:4:"𝘐";s:1:"I";s:4:"𝘑";s:1:"J";s:4:"𝘒";s:1:"K";s:4:"𝘓";s:1:"L";s:4:"𝘔";s:1:"M";s:4:"𝘕";s:1:"N";s:4:"𝘖";s:1:"O";s:4:"𝘗";s:1:"P";s:4:"𝘘";s:1:"Q";s:4:"𝘙";s:1:"R";s:4:"𝘚";s:1:"S";s:4:"𝘛";s:1:"T";s:4:"𝘜";s:1:"U";s:4:"𝘝";s:1:"V";s:4:"𝘞";s:1:"W";s:4:"𝘟";s:1:"X";s:4:"𝘠";s:1:"Y";s:4:"𝘡";s:1:"Z";s:4:"𝘢";s:1:"a";s:4:"𝘣";s:1:"b";s:4:"𝘤";s:1:"c";s:4:"𝘥";s:1:"d";s:4:"𝘦";s:1:"e";s:4:"𝘧";s:1:"f";s:4:"𝘨";s:1:"g";s:4:"𝘩";s:1:"h";s:4:"𝘪";s:1:"i";s:4:"𝘫";s:1:"j";s:4:"𝘬";s:1:"k";s:4:"𝘭";s:1:"l";s:4:"𝘮";s:1:"m";s:4:"𝘯";s:1:"n";s:4:"𝘰";s:1:"o";s:4:"𝘱";s:1:"p";s:4:"𝘲";s:1:"q";s:4:"𝘳";s:1:"r";s:4:"𝘴";s:1:"s";s:4:"𝘵";s:1:"t";s:4:"𝘶";s:1:"u";s:4:"𝘷";s:1:"v";s:4:"𝘸";s:1:"w";s:4:"𝘹";s:1:"x";s:4:"𝘺";s:1:"y";s:4:"𝘻";s:1:"z";s:4:"𝘼";s:1:"A";s:4:"𝘽";s:1:"B";s:4:"𝘾";s:1:"C";s:4:"𝘿";s:1:"D";s:4:"𝙀";s:1:"E";s:4:"𝙁";s:1:"F";s:4:"𝙂";s:1:"G";s:4:"𝙃";s:1:"H";s:4:"𝙄";s:1:"I";s:4:"𝙅";s:1:"J";s:4:"𝙆";s:1:"K";s:4:"𝙇";s:1:"L";s:4:"𝙈";s:1:"M";s:4:"𝙉";s:1:"N";s:4:"𝙊";s:1:"O";s:4:"𝙋";s:1:"P";s:4:"𝙌";s:1:"Q";s:4:"𝙍";s:1:"R";s:4:"𝙎";s:1:"S";s:4:"𝙏";s:1:"T";s:4:"𝙐";s:1:"U";s:4:"𝙑";s:1:"V";s:4:"𝙒";s:1:"W";s:4:"𝙓";s:1:"X";s:4:"𝙔";s:1:"Y";s:4:"𝙕";s:1:"Z";s:4:"𝙖";s:1:"a";s:4:"𝙗";s:1:"b";s:4:"𝙘";s:1:"c";s:4:"𝙙";s:1:"d";s:4:"𝙚";s:1:"e";s:4:"𝙛";s:1:"f";s:4:"𝙜";s:1:"g";s:4:"𝙝";s:1:"h";s:4:"𝙞";s:1:"i";s:4:"𝙟";s:1:"j";s:4:"𝙠";s:1:"k";s:4:"𝙡";s:1:"l";s:4:"𝙢";s:1:"m";s:4:"𝙣";s:1:"n";s:4:"𝙤";s:1:"o";s:4:"𝙥";s:1:"p";s:4:"𝙦";s:1:"q";s:4:"𝙧";s:1:"r";s:4:"𝙨";s:1:"s";s:4:"𝙩";s:1:"t";s:4:"𝙪";s:1:"u";s:4:"𝙫";s:1:"v";s:4:"𝙬";s:1:"w";s:4:"𝙭";s:1:"x";s:4:"𝙮";s:1:"y";s:4:"𝙯";s:1:"z";s:4:"𝙰";s:1:"A";s:4:"𝙱";s:1:"B";s:4:"𝙲";s:1:"C";s:4:"𝙳";s:1:"D";s:4:"𝙴";s:1:"E";s:4:"𝙵";s:1:"F";s:4:"𝙶";s:1:"G";s:4:"𝙷";s:1:"H";s:4:"𝙸";s:1:"I";s:4:"𝙹";s:1:"J";s:4:"𝙺";s:1:"K";s:4:"𝙻";s:1:"L";s:4:"𝙼";s:1:"M";s:4:"𝙽";s:1:"N";s:4:"𝙾";s:1:"O";s:4:"𝙿";s:1:"P";s:4:"𝚀";s:1:"Q";s:4:"𝚁";s:1:"R";s:4:"𝚂";s:1:"S";s:4:"𝚃";s:1:"T";s:4:"𝚄";s:1:"U";s:4:"𝚅";s:1:"V";s:4:"𝚆";s:1:"W";s:4:"𝚇";s:1:"X";s:4:"𝚈";s:1:"Y";s:4:"𝚉";s:1:"Z";s:4:"𝚊";s:1:"a";s:4:"𝚋";s:1:"b";s:4:"𝚌";s:1:"c";s:4:"𝚍";s:1:"d";s:4:"𝚎";s:1:"e";s:4:"𝚏";s:1:"f";s:4:"𝚐";s:1:"g";s:4:"𝚑";s:1:"h";s:4:"𝚒";s:1:"i";s:4:"𝚓";s:1:"j";s:4:"𝚔";s:1:"k";s:4:"𝚕";s:1:"l";s:4:"𝚖";s:1:"m";s:4:"𝚗";s:1:"n";s:4:"𝚘";s:1:"o";s:4:"𝚙";s:1:"p";s:4:"𝚚";s:1:"q";s:4:"𝚛";s:1:"r";s:4:"𝚜";s:1:"s";s:4:"𝚝";s:1:"t";s:4:"𝚞";s:1:"u";s:4:"𝚟";s:1:"v";s:4:"𝚠";s:1:"w";s:4:"𝚡";s:1:"x";s:4:"𝚢";s:1:"y";s:4:"𝚣";s:1:"z";s:4:"𝚤";s:2:"ı";s:4:"𝚥";s:2:"ȷ";s:4:"𝚨";s:2:"Α";s:4:"𝚩";s:2:"Β";s:4:"𝚪";s:2:"Γ";s:4:"𝚫";s:2:"Δ";s:4:"𝚬";s:2:"Ε";s:4:"𝚭";s:2:"Ζ";s:4:"𝚮";s:2:"Η";s:4:"𝚯";s:2:"Θ";s:4:"𝚰";s:2:"Ι";s:4:"𝚱";s:2:"Κ";s:4:"𝚲";s:2:"Λ";s:4:"𝚳";s:2:"Μ";s:4:"𝚴";s:2:"Ν";s:4:"𝚵";s:2:"Ξ";s:4:"𝚶";s:2:"Ο";s:4:"𝚷";s:2:"Π";s:4:"𝚸";s:2:"Ρ";s:4:"𝚹";s:2:"Θ";s:4:"𝚺";s:2:"Σ";s:4:"𝚻";s:2:"Τ";s:4:"𝚼";s:2:"Υ";s:4:"𝚽";s:2:"Φ";s:4:"𝚾";s:2:"Χ";s:4:"𝚿";s:2:"Ψ";s:4:"𝛀";s:2:"Ω";s:4:"𝛁";s:3:"∇";s:4:"𝛂";s:2:"α";s:4:"𝛃";s:2:"β";s:4:"𝛄";s:2:"γ";s:4:"𝛅";s:2:"δ";s:4:"𝛆";s:2:"ε";s:4:"𝛇";s:2:"ζ";s:4:"𝛈";s:2:"η";s:4:"𝛉";s:2:"θ";s:4:"𝛊";s:2:"ι";s:4:"𝛋";s:2:"κ";s:4:"𝛌";s:2:"λ";s:4:"𝛍";s:2:"μ";s:4:"𝛎";s:2:"ν";s:4:"𝛏";s:2:"ξ";s:4:"𝛐";s:2:"ο";s:4:"𝛑";s:2:"π";s:4:"𝛒";s:2:"ρ";s:4:"𝛓";s:2:"ς";s:4:"𝛔";s:2:"σ";s:4:"𝛕";s:2:"τ";s:4:"𝛖";s:2:"υ";s:4:"𝛗";s:2:"φ";s:4:"𝛘";s:2:"χ";s:4:"𝛙";s:2:"ψ";s:4:"𝛚";s:2:"ω";s:4:"𝛛";s:3:"∂";s:4:"𝛜";s:2:"ε";s:4:"𝛝";s:2:"θ";s:4:"𝛞";s:2:"κ";s:4:"𝛟";s:2:"φ";s:4:"𝛠";s:2:"ρ";s:4:"𝛡";s:2:"π";s:4:"𝛢";s:2:"Α";s:4:"𝛣";s:2:"Β";s:4:"𝛤";s:2:"Γ";s:4:"𝛥";s:2:"Δ";s:4:"𝛦";s:2:"Ε";s:4:"𝛧";s:2:"Ζ";s:4:"𝛨";s:2:"Η";s:4:"𝛩";s:2:"Θ";s:4:"𝛪";s:2:"Ι";s:4:"𝛫";s:2:"Κ";s:4:"𝛬";s:2:"Λ";s:4:"𝛭";s:2:"Μ";s:4:"𝛮";s:2:"Ν";s:4:"𝛯";s:2:"Ξ";s:4:"𝛰";s:2:"Ο";s:4:"𝛱";s:2:"Π";s:4:"𝛲";s:2:"Ρ";s:4:"𝛳";s:2:"Θ";s:4:"𝛴";s:2:"Σ";s:4:"𝛵";s:2:"Τ";s:4:"𝛶";s:2:"Υ";s:4:"𝛷";s:2:"Φ";s:4:"𝛸";s:2:"Χ";s:4:"𝛹";s:2:"Ψ";s:4:"𝛺";s:2:"Ω";s:4:"𝛻";s:3:"∇";s:4:"𝛼";s:2:"α";s:4:"𝛽";s:2:"β";s:4:"𝛾";s:2:"γ";s:4:"𝛿";s:2:"δ";s:4:"𝜀";s:2:"ε";s:4:"𝜁";s:2:"ζ";s:4:"𝜂";s:2:"η";s:4:"𝜃";s:2:"θ";s:4:"𝜄";s:2:"ι";s:4:"𝜅";s:2:"κ";s:4:"𝜆";s:2:"λ";s:4:"𝜇";s:2:"μ";s:4:"𝜈";s:2:"ν";s:4:"𝜉";s:2:"ξ";s:4:"𝜊";s:2:"ο";s:4:"𝜋";s:2:"π";s:4:"𝜌";s:2:"ρ";s:4:"𝜍";s:2:"ς";s:4:"𝜎";s:2:"σ";s:4:"𝜏";s:2:"τ";s:4:"𝜐";s:2:"υ";s:4:"𝜑";s:2:"φ";s:4:"𝜒";s:2:"χ";s:4:"𝜓";s:2:"ψ";s:4:"𝜔";s:2:"ω";s:4:"𝜕";s:3:"∂";s:4:"𝜖";s:2:"ε";s:4:"𝜗";s:2:"θ";s:4:"𝜘";s:2:"κ";s:4:"𝜙";s:2:"φ";s:4:"𝜚";s:2:"ρ";s:4:"𝜛";s:2:"π";s:4:"𝜜";s:2:"Α";s:4:"𝜝";s:2:"Β";s:4:"𝜞";s:2:"Γ";s:4:"𝜟";s:2:"Δ";s:4:"𝜠";s:2:"Ε";s:4:"𝜡";s:2:"Ζ";s:4:"𝜢";s:2:"Η";s:4:"𝜣";s:2:"Θ";s:4:"𝜤";s:2:"Ι";s:4:"𝜥";s:2:"Κ";s:4:"𝜦";s:2:"Λ";s:4:"𝜧";s:2:"Μ";s:4:"𝜨";s:2:"Ν";s:4:"𝜩";s:2:"Ξ";s:4:"𝜪";s:2:"Ο";s:4:"𝜫";s:2:"Π";s:4:"𝜬";s:2:"Ρ";s:4:"𝜭";s:2:"Θ";s:4:"𝜮";s:2:"Σ";s:4:"𝜯";s:2:"Τ";s:4:"𝜰";s:2:"Υ";s:4:"𝜱";s:2:"Φ";s:4:"𝜲";s:2:"Χ";s:4:"𝜳";s:2:"Ψ";s:4:"𝜴";s:2:"Ω";s:4:"𝜵";s:3:"∇";s:4:"𝜶";s:2:"α";s:4:"𝜷";s:2:"β";s:4:"𝜸";s:2:"γ";s:4:"𝜹";s:2:"δ";s:4:"𝜺";s:2:"ε";s:4:"𝜻";s:2:"ζ";s:4:"𝜼";s:2:"η";s:4:"𝜽";s:2:"θ";s:4:"𝜾";s:2:"ι";s:4:"𝜿";s:2:"κ";s:4:"𝝀";s:2:"λ";s:4:"𝝁";s:2:"μ";s:4:"𝝂";s:2:"ν";s:4:"𝝃";s:2:"ξ";s:4:"𝝄";s:2:"ο";s:4:"𝝅";s:2:"π";s:4:"𝝆";s:2:"ρ";s:4:"𝝇";s:2:"ς";s:4:"𝝈";s:2:"σ";s:4:"𝝉";s:2:"τ";s:4:"𝝊";s:2:"υ";s:4:"𝝋";s:2:"φ";s:4:"𝝌";s:2:"χ";s:4:"𝝍";s:2:"ψ";s:4:"𝝎";s:2:"ω";s:4:"𝝏";s:3:"∂";s:4:"𝝐";s:2:"ε";s:4:"𝝑";s:2:"θ";s:4:"𝝒";s:2:"κ";s:4:"𝝓";s:2:"φ";s:4:"𝝔";s:2:"ρ";s:4:"𝝕";s:2:"π";s:4:"𝝖";s:2:"Α";s:4:"𝝗";s:2:"Β";s:4:"𝝘";s:2:"Γ";s:4:"𝝙";s:2:"Δ";s:4:"𝝚";s:2:"Ε";s:4:"𝝛";s:2:"Ζ";s:4:"𝝜";s:2:"Η";s:4:"𝝝";s:2:"Θ";s:4:"𝝞";s:2:"Ι";s:4:"𝝟";s:2:"Κ";s:4:"𝝠";s:2:"Λ";s:4:"𝝡";s:2:"Μ";s:4:"𝝢";s:2:"Ν";s:4:"𝝣";s:2:"Ξ";s:4:"𝝤";s:2:"Ο";s:4:"𝝥";s:2:"Π";s:4:"𝝦";s:2:"Ρ";s:4:"𝝧";s:2:"Θ";s:4:"𝝨";s:2:"Σ";s:4:"𝝩";s:2:"Τ";s:4:"𝝪";s:2:"Υ";s:4:"𝝫";s:2:"Φ";s:4:"𝝬";s:2:"Χ";s:4:"𝝭";s:2:"Ψ";s:4:"𝝮";s:2:"Ω";s:4:"𝝯";s:3:"∇";s:4:"𝝰";s:2:"α";s:4:"𝝱";s:2:"β";s:4:"𝝲";s:2:"γ";s:4:"𝝳";s:2:"δ";s:4:"𝝴";s:2:"ε";s:4:"𝝵";s:2:"ζ";s:4:"𝝶";s:2:"η";s:4:"𝝷";s:2:"θ";s:4:"𝝸";s:2:"ι";s:4:"𝝹";s:2:"κ";s:4:"𝝺";s:2:"λ";s:4:"𝝻";s:2:"μ";s:4:"𝝼";s:2:"ν";s:4:"𝝽";s:2:"ξ";s:4:"𝝾";s:2:"ο";s:4:"𝝿";s:2:"π";s:4:"𝞀";s:2:"ρ";s:4:"𝞁";s:2:"ς";s:4:"𝞂";s:2:"σ";s:4:"𝞃";s:2:"τ";s:4:"𝞄";s:2:"υ";s:4:"𝞅";s:2:"φ";s:4:"𝞆";s:2:"χ";s:4:"𝞇";s:2:"ψ";s:4:"𝞈";s:2:"ω";s:4:"𝞉";s:3:"∂";s:4:"𝞊";s:2:"ε";s:4:"𝞋";s:2:"θ";s:4:"𝞌";s:2:"κ";s:4:"𝞍";s:2:"φ";s:4:"𝞎";s:2:"ρ";s:4:"𝞏";s:2:"π";s:4:"𝞐";s:2:"Α";s:4:"𝞑";s:2:"Β";s:4:"𝞒";s:2:"Γ";s:4:"𝞓";s:2:"Δ";s:4:"𝞔";s:2:"Ε";s:4:"𝞕";s:2:"Ζ";s:4:"𝞖";s:2:"Η";s:4:"𝞗";s:2:"Θ";s:4:"𝞘";s:2:"Ι";s:4:"𝞙";s:2:"Κ";s:4:"𝞚";s:2:"Λ";s:4:"𝞛";s:2:"Μ";s:4:"𝞜";s:2:"Ν";s:4:"𝞝";s:2:"Ξ";s:4:"𝞞";s:2:"Ο";s:4:"𝞟";s:2:"Π";s:4:"𝞠";s:2:"Ρ";s:4:"𝞡";s:2:"Θ";s:4:"𝞢";s:2:"Σ";s:4:"𝞣";s:2:"Τ";s:4:"𝞤";s:2:"Υ";s:4:"𝞥";s:2:"Φ";s:4:"𝞦";s:2:"Χ";s:4:"𝞧";s:2:"Ψ";s:4:"𝞨";s:2:"Ω";s:4:"𝞩";s:3:"∇";s:4:"𝞪";s:2:"α";s:4:"𝞫";s:2:"β";s:4:"𝞬";s:2:"γ";s:4:"𝞭";s:2:"δ";s:4:"𝞮";s:2:"ε";s:4:"𝞯";s:2:"ζ";s:4:"𝞰";s:2:"η";s:4:"𝞱";s:2:"θ";s:4:"𝞲";s:2:"ι";s:4:"𝞳";s:2:"κ";s:4:"𝞴";s:2:"λ";s:4:"𝞵";s:2:"μ";s:4:"𝞶";s:2:"ν";s:4:"𝞷";s:2:"ξ";s:4:"𝞸";s:2:"ο";s:4:"𝞹";s:2:"π";s:4:"𝞺";s:2:"ρ";s:4:"𝞻";s:2:"ς";s:4:"𝞼";s:2:"σ";s:4:"𝞽";s:2:"τ";s:4:"𝞾";s:2:"υ";s:4:"𝞿";s:2:"φ";s:4:"𝟀";s:2:"χ";s:4:"𝟁";s:2:"ψ";s:4:"𝟂";s:2:"ω";s:4:"𝟃";s:3:"∂";s:4:"𝟄";s:2:"ε";s:4:"𝟅";s:2:"θ";s:4:"𝟆";s:2:"κ";s:4:"𝟇";s:2:"φ";s:4:"𝟈";s:2:"ρ";s:4:"𝟉";s:2:"π";s:4:"𝟊";s:2:"Ϝ";s:4:"𝟋";s:2:"ϝ";s:4:"𝟎";s:1:"0";s:4:"𝟏";s:1:"1";s:4:"𝟐";s:1:"2";s:4:"𝟑";s:1:"3";s:4:"𝟒";s:1:"4";s:4:"𝟓";s:1:"5";s:4:"𝟔";s:1:"6";s:4:"𝟕";s:1:"7";s:4:"𝟖";s:1:"8";s:4:"𝟗";s:1:"9";s:4:"𝟘";s:1:"0";s:4:"𝟙";s:1:"1";s:4:"𝟚";s:1:"2";s:4:"𝟛";s:1:"3";s:4:"𝟜";s:1:"4";s:4:"𝟝";s:1:"5";s:4:"𝟞";s:1:"6";s:4:"𝟟";s:1:"7";s:4:"𝟠";s:1:"8";s:4:"𝟡";s:1:"9";s:4:"𝟢";s:1:"0";s:4:"𝟣";s:1:"1";s:4:"𝟤";s:1:"2";s:4:"𝟥";s:1:"3";s:4:"𝟦";s:1:"4";s:4:"𝟧";s:1:"5";s:4:"𝟨";s:1:"6";s:4:"𝟩";s:1:"7";s:4:"𝟪";s:1:"8";s:4:"𝟫";s:1:"9";s:4:"𝟬";s:1:"0";s:4:"𝟭";s:1:"1";s:4:"𝟮";s:1:"2";s:4:"𝟯";s:1:"3";s:4:"𝟰";s:1:"4";s:4:"𝟱";s:1:"5";s:4:"𝟲";s:1:"6";s:4:"𝟳";s:1:"7";s:4:"𝟴";s:1:"8";s:4:"𝟵";s:1:"9";s:4:"𝟶";s:1:"0";s:4:"𝟷";s:1:"1";s:4:"𝟸";s:1:"2";s:4:"𝟹";s:1:"3";s:4:"𝟺";s:1:"4";s:4:"𝟻";s:1:"5";s:4:"𝟼";s:1:"6";s:4:"𝟽";s:1:"7";s:4:"𝟾";s:1:"8";s:4:"𝟿";s:1:"9";s:4:"🄀";s:2:"0.";s:4:"🄁";s:2:"0,";s:4:"🄂";s:2:"1,";s:4:"🄃";s:2:"2,";s:4:"🄄";s:2:"3,";s:4:"🄅";s:2:"4,";s:4:"🄆";s:2:"5,";s:4:"🄇";s:2:"6,";s:4:"🄈";s:2:"7,";s:4:"🄉";s:2:"8,";s:4:"🄊";s:2:"9,";s:4:"🄐";s:3:"(A)";s:4:"🄑";s:3:"(B)";s:4:"🄒";s:3:"(C)";s:4:"🄓";s:3:"(D)";s:4:"🄔";s:3:"(E)";s:4:"🄕";s:3:"(F)";s:4:"🄖";s:3:"(G)";s:4:"🄗";s:3:"(H)";s:4:"🄘";s:3:"(I)";s:4:"🄙";s:3:"(J)";s:4:"🄚";s:3:"(K)";s:4:"🄛";s:3:"(L)";s:4:"🄜";s:3:"(M)";s:4:"🄝";s:3:"(N)";s:4:"🄞";s:3:"(O)";s:4:"🄟";s:3:"(P)";s:4:"🄠";s:3:"(Q)";s:4:"🄡";s:3:"(R)";s:4:"🄢";s:3:"(S)";s:4:"🄣";s:3:"(T)";s:4:"🄤";s:3:"(U)";s:4:"🄥";s:3:"(V)";s:4:"🄦";s:3:"(W)";s:4:"🄧";s:3:"(X)";s:4:"🄨";s:3:"(Y)";s:4:"🄩";s:3:"(Z)";s:4:"🄪";s:7:"〔S〕";s:4:"🄫";s:1:"C";s:4:"🄬";s:1:"R";s:4:"🄭";s:2:"CD";s:4:"🄮";s:2:"WZ";s:4:"🄰";s:1:"A";s:4:"🄱";s:1:"B";s:4:"🄲";s:1:"C";s:4:"🄳";s:1:"D";s:4:"🄴";s:1:"E";s:4:"🄵";s:1:"F";s:4:"🄶";s:1:"G";s:4:"🄷";s:1:"H";s:4:"🄸";s:1:"I";s:4:"🄹";s:1:"J";s:4:"🄺";s:1:"K";s:4:"🄻";s:1:"L";s:4:"🄼";s:1:"M";s:4:"🄽";s:1:"N";s:4:"🄾";s:1:"O";s:4:"🄿";s:1:"P";s:4:"🅀";s:1:"Q";s:4:"🅁";s:1:"R";s:4:"🅂";s:1:"S";s:4:"🅃";s:1:"T";s:4:"🅄";s:1:"U";s:4:"🅅";s:1:"V";s:4:"🅆";s:1:"W";s:4:"🅇";s:1:"X";s:4:"🅈";s:1:"Y";s:4:"🅉";s:1:"Z";s:4:"🅊";s:2:"HV";s:4:"🅋";s:2:"MV";s:4:"🅌";s:2:"SD";s:4:"🅍";s:2:"SS";s:4:"🅎";s:3:"PPV";s:4:"🅏";s:2:"WC";s:4:"🆐";s:2:"DJ";s:4:"🈀";s:6:"ほか";s:4:"🈁";s:6:"ココ";s:4:"🈂";s:3:"サ";s:4:"🈐";s:3:"手";s:4:"🈑";s:3:"字";s:4:"🈒";s:3:"双";s:4:"🈓";s:6:"デ";s:4:"🈔";s:3:"二";s:4:"🈕";s:3:"多";s:4:"🈖";s:3:"解";s:4:"🈗";s:3:"天";s:4:"🈘";s:3:"交";s:4:"🈙";s:3:"映";s:4:"🈚";s:3:"無";s:4:"🈛";s:3:"料";s:4:"🈜";s:3:"前";s:4:"🈝";s:3:"後";s:4:"🈞";s:3:"再";s:4:"🈟";s:3:"新";s:4:"🈠";s:3:"初";s:4:"🈡";s:3:"終";s:4:"🈢";s:3:"生";s:4:"🈣";s:3:"販";s:4:"🈤";s:3:"声";s:4:"🈥";s:3:"吹";s:4:"🈦";s:3:"演";s:4:"🈧";s:3:"投";s:4:"🈨";s:3:"捕";s:4:"🈩";s:3:"一";s:4:"🈪";s:3:"三";s:4:"🈫";s:3:"遊";s:4:"🈬";s:3:"左";s:4:"🈭";s:3:"中";s:4:"🈮";s:3:"右";s:4:"🈯";s:3:"指";s:4:"🈰";s:3:"走";s:4:"🈱";s:3:"打";s:4:"🈲";s:3:"禁";s:4:"🈳";s:3:"空";s:4:"🈴";s:3:"合";s:4:"🈵";s:3:"満";s:4:"🈶";s:3:"有";s:4:"🈷";s:3:"月";s:4:"🈸";s:3:"申";s:4:"🈹";s:3:"割";s:4:"🈺";s:3:"営";s:4:"🉀";s:9:"〔本〕";s:4:"🉁";s:9:"〔三〕";s:4:"🉂";s:9:"〔二〕";s:4:"🉃";s:9:"〔安〕";s:4:"🉄";s:9:"〔点〕";s:4:"🉅";s:9:"〔打〕";s:4:"🉆";s:9:"〔盗〕";s:4:"🉇";s:9:"〔勝〕";s:4:"🉈";s:9:"〔敗〕";s:4:"🉐";s:3:"得";s:4:"🉑";s:3:"可";s:4:"丽";s:3:"丽";s:4:"丸";s:3:"丸";s:4:"乁";s:3:"乁";s:4:"𠄢";s:4:"𠄢";s:4:"你";s:3:"你";s:4:"侮";s:3:"侮";s:4:"侻";s:3:"侻";s:4:"倂";s:3:"倂";s:4:"偺";s:3:"偺";s:4:"備";s:3:"備";s:4:"僧";s:3:"僧";s:4:"像";s:3:"像";s:4:"㒞";s:3:"㒞";s:4:"𠘺";s:4:"𠘺";s:4:"免";s:3:"免";s:4:"兔";s:3:"兔";s:4:"兤";s:3:"兤";s:4:"具";s:3:"具";s:4:"𠔜";s:4:"𠔜";s:4:"㒹";s:3:"㒹";s:4:"內";s:3:"內";s:4:"再";s:3:"再";s:4:"𠕋";s:4:"𠕋";s:4:"冗";s:3:"冗";s:4:"冤";s:3:"冤";s:4:"仌";s:3:"仌";s:4:"冬";s:3:"冬";s:4:"况";s:3:"况";s:4:"𩇟";s:4:"𩇟";s:4:"凵";s:3:"凵";s:4:"刃";s:3:"刃";s:4:"㓟";s:3:"㓟";s:4:"刻";s:3:"刻";s:4:"剆";s:3:"剆";s:4:"割";s:3:"割";s:4:"剷";s:3:"剷";s:4:"㔕";s:3:"㔕";s:4:"勇";s:3:"勇";s:4:"勉";s:3:"勉";s:4:"勤";s:3:"勤";s:4:"勺";s:3:"勺";s:4:"包";s:3:"包";s:4:"匆";s:3:"匆";s:4:"北";s:3:"北";s:4:"卉";s:3:"卉";s:4:"卑";s:3:"卑";s:4:"博";s:3:"博";s:4:"即";s:3:"即";s:4:"卽";s:3:"卽";s:4:"卿";s:3:"卿";s:4:"卿";s:3:"卿";s:4:"卿";s:3:"卿";s:4:"𠨬";s:4:"𠨬";s:4:"灰";s:3:"灰";s:4:"及";s:3:"及";s:4:"叟";s:3:"叟";s:4:"𠭣";s:4:"𠭣";s:4:"叫";s:3:"叫";s:4:"叱";s:3:"叱";s:4:"吆";s:3:"吆";s:4:"咞";s:3:"咞";s:4:"吸";s:3:"吸";s:4:"呈";s:3:"呈";s:4:"周";s:3:"周";s:4:"咢";s:3:"咢";s:4:"哶";s:3:"哶";s:4:"唐";s:3:"唐";s:4:"啓";s:3:"啓";s:4:"啣";s:3:"啣";s:4:"善";s:3:"善";s:4:"善";s:3:"善";s:4:"喙";s:3:"喙";s:4:"喫";s:3:"喫";s:4:"喳";s:3:"喳";s:4:"嗂";s:3:"嗂";s:4:"圖";s:3:"圖";s:4:"嘆";s:3:"嘆";s:4:"圗";s:3:"圗";s:4:"噑";s:3:"噑";s:4:"噴";s:3:"噴";s:4:"切";s:3:"切";s:4:"壮";s:3:"壮";s:4:"城";s:3:"城";s:4:"埴";s:3:"埴";s:4:"堍";s:3:"堍";s:4:"型";s:3:"型";s:4:"堲";s:3:"堲";s:4:"報";s:3:"報";s:4:"墬";s:3:"墬";s:4:"𡓤";s:4:"𡓤";s:4:"売";s:3:"売";s:4:"壷";s:3:"壷";s:4:"夆";s:3:"夆";s:4:"多";s:3:"多";s:4:"夢";s:3:"夢";s:4:"奢";s:3:"奢";s:4:"𡚨";s:4:"𡚨";s:4:"𡛪";s:4:"𡛪";s:4:"姬";s:3:"姬";s:4:"娛";s:3:"娛";s:4:"娧";s:3:"娧";s:4:"姘";s:3:"姘";s:4:"婦";s:3:"婦";s:4:"㛮";s:3:"㛮";s:4:"㛼";s:3:"㛼";s:4:"嬈";s:3:"嬈";s:4:"嬾";s:3:"嬾";s:4:"嬾";s:3:"嬾";s:4:"𡧈";s:4:"𡧈";s:4:"寃";s:3:"寃";s:4:"寘";s:3:"寘";s:4:"寧";s:3:"寧";s:4:"寳";s:3:"寳";s:4:"𡬘";s:4:"𡬘";s:4:"寿";s:3:"寿";s:4:"将";s:3:"将";s:4:"当";s:3:"当";s:4:"尢";s:3:"尢";s:4:"㞁";s:3:"㞁";s:4:"屠";s:3:"屠";s:4:"屮";s:3:"屮";s:4:"峀";s:3:"峀";s:4:"岍";s:3:"岍";s:4:"𡷤";s:4:"𡷤";s:4:"嵃";s:3:"嵃";s:4:"𡷦";s:4:"𡷦";s:4:"嵮";s:3:"嵮";s:4:"嵫";s:3:"嵫";s:4:"嵼";s:3:"嵼";s:4:"巡";s:3:"巡";s:4:"巢";s:3:"巢";s:4:"㠯";s:3:"㠯";s:4:"巽";s:3:"巽";s:4:"帨";s:3:"帨";s:4:"帽";s:3:"帽";s:4:"幩";s:3:"幩";s:4:"㡢";s:3:"㡢";s:4:"𢆃";s:4:"𢆃";s:4:"㡼";s:3:"㡼";s:4:"庰";s:3:"庰";s:4:"庳";s:3:"庳";s:4:"庶";s:3:"庶";s:4:"廊";s:3:"廊";s:4:"𪎒";s:4:"𪎒";s:4:"廾";s:3:"廾";s:4:"𢌱";s:4:"𢌱";s:4:"𢌱";s:4:"𢌱";s:4:"舁";s:3:"舁";s:4:"弢";s:3:"弢";s:4:"弢";s:3:"弢";s:4:"㣇";s:3:"㣇";s:4:"𣊸";s:4:"𣊸";s:4:"𦇚";s:4:"𦇚";s:4:"形";s:3:"形";s:4:"彫";s:3:"彫";s:4:"㣣";s:3:"㣣";s:4:"徚";s:3:"徚";s:4:"忍";s:3:"忍";s:4:"志";s:3:"志";s:4:"忹";s:3:"忹";s:4:"悁";s:3:"悁";s:4:"㤺";s:3:"㤺";s:4:"㤜";s:3:"㤜";s:4:"悔";s:3:"悔";s:4:"𢛔";s:4:"𢛔";s:4:"惇";s:3:"惇";s:4:"慈";s:3:"慈";s:4:"慌";s:3:"慌";s:4:"慎";s:3:"慎";s:4:"慌";s:3:"慌";s:4:"慺";s:3:"慺";s:4:"憎";s:3:"憎";s:4:"憲";s:3:"憲";s:4:"憤";s:3:"憤";s:4:"憯";s:3:"憯";s:4:"懞";s:3:"懞";s:4:"懲";s:3:"懲";s:4:"懶";s:3:"懶";s:4:"成";s:3:"成";s:4:"戛";s:3:"戛";s:4:"扝";s:3:"扝";s:4:"抱";s:3:"抱";s:4:"拔";s:3:"拔";s:4:"捐";s:3:"捐";s:4:"𢬌";s:4:"𢬌";s:4:"挽";s:3:"挽";s:4:"拼";s:3:"拼";s:4:"捨";s:3:"捨";s:4:"掃";s:3:"掃";s:4:"揤";s:3:"揤";s:4:"𢯱";s:4:"𢯱";s:4:"搢";s:3:"搢";s:4:"揅";s:3:"揅";s:4:"掩";s:3:"掩";s:4:"㨮";s:3:"㨮";s:4:"摩";s:3:"摩";s:4:"摾";s:3:"摾";s:4:"撝";s:3:"撝";s:4:"摷";s:3:"摷";s:4:"㩬";s:3:"㩬";s:4:"敏";s:3:"敏";s:4:"敬";s:3:"敬";s:4:"𣀊";s:4:"𣀊";s:4:"旣";s:3:"旣";s:4:"書";s:3:"書";s:4:"晉";s:3:"晉";s:4:"㬙";s:3:"㬙";s:4:"暑";s:3:"暑";s:4:"㬈";s:3:"㬈";s:4:"㫤";s:3:"㫤";s:4:"冒";s:3:"冒";s:4:"冕";s:3:"冕";s:4:"最";s:3:"最";s:4:"暜";s:3:"暜";s:4:"肭";s:3:"肭";s:4:"䏙";s:3:"䏙";s:4:"朗";s:3:"朗";s:4:"望";s:3:"望";s:4:"朡";s:3:"朡";s:4:"杞";s:3:"杞";s:4:"杓";s:3:"杓";s:4:"𣏃";s:4:"𣏃";s:4:"㭉";s:3:"㭉";s:4:"柺";s:3:"柺";s:4:"枅";s:3:"枅";s:4:"桒";s:3:"桒";s:4:"梅";s:3:"梅";s:4:"𣑭";s:4:"𣑭";s:4:"梎";s:3:"梎";s:4:"栟";s:3:"栟";s:4:"椔";s:3:"椔";s:4:"㮝";s:3:"㮝";s:4:"楂";s:3:"楂";s:4:"榣";s:3:"榣";s:4:"槪";s:3:"槪";s:4:"檨";s:3:"檨";s:4:"𣚣";s:4:"𣚣";s:4:"櫛";s:3:"櫛";s:4:"㰘";s:3:"㰘";s:4:"次";s:3:"次";s:4:"𣢧";s:4:"𣢧";s:4:"歔";s:3:"歔";s:4:"㱎";s:3:"㱎";s:4:"歲";s:3:"歲";s:4:"殟";s:3:"殟";s:4:"殺";s:3:"殺";s:4:"殻";s:3:"殻";s:4:"𣪍";s:4:"𣪍";s:4:"𡴋";s:4:"𡴋";s:4:"𣫺";s:4:"𣫺";s:4:"汎";s:3:"汎";s:4:"𣲼";s:4:"𣲼";s:4:"沿";s:3:"沿";s:4:"泍";s:3:"泍";s:4:"汧";s:3:"汧";s:4:"洖";s:3:"洖";s:4:"派";s:3:"派";s:4:"海";s:3:"海";s:4:"流";s:3:"流";s:4:"浩";s:3:"浩";s:4:"浸";s:3:"浸";s:4:"涅";s:3:"涅";s:4:"𣴞";s:4:"𣴞";s:4:"洴";s:3:"洴";s:4:"港";s:3:"港";s:4:"湮";s:3:"湮";s:4:"㴳";s:3:"㴳";s:4:"滋";s:3:"滋";s:4:"滇";s:3:"滇";s:4:"𣻑";s:4:"𣻑";s:4:"淹";s:3:"淹";s:4:"潮";s:3:"潮";s:4:"𣽞";s:4:"𣽞";s:4:"𣾎";s:4:"𣾎";s:4:"濆";s:3:"濆";s:4:"瀹";s:3:"瀹";s:4:"瀞";s:3:"瀞";s:4:"瀛";s:3:"瀛";s:4:"㶖";s:3:"㶖";s:4:"灊";s:3:"灊";s:4:"災";s:3:"災";s:4:"灷";s:3:"灷";s:4:"炭";s:3:"炭";s:4:"𠔥";s:4:"𠔥";s:4:"煅";s:3:"煅";s:4:"𤉣";s:4:"𤉣";s:4:"熜";s:3:"熜";s:4:"𤎫";s:4:"𤎫";s:4:"爨";s:3:"爨";s:4:"爵";s:3:"爵";s:4:"牐";s:3:"牐";s:4:"𤘈";s:4:"𤘈";s:4:"犀";s:3:"犀";s:4:"犕";s:3:"犕";s:4:"𤜵";s:4:"𤜵";s:4:"𤠔";s:4:"𤠔";s:4:"獺";s:3:"獺";s:4:"王";s:3:"王";s:4:"㺬";s:3:"㺬";s:4:"玥";s:3:"玥";s:4:"㺸";s:3:"㺸";s:4:"㺸";s:3:"㺸";s:4:"瑇";s:3:"瑇";s:4:"瑜";s:3:"瑜";s:4:"瑱";s:3:"瑱";s:4:"璅";s:3:"璅";s:4:"瓊";s:3:"瓊";s:4:"㼛";s:3:"㼛";s:4:"甤";s:3:"甤";s:4:"𤰶";s:4:"𤰶";s:4:"甾";s:3:"甾";s:4:"𤲒";s:4:"𤲒";s:4:"異";s:3:"異";s:4:"𢆟";s:4:"𢆟";s:4:"瘐";s:3:"瘐";s:4:"𤾡";s:4:"𤾡";s:4:"𤾸";s:4:"𤾸";s:4:"𥁄";s:4:"𥁄";s:4:"㿼";s:3:"㿼";s:4:"䀈";s:3:"䀈";s:4:"直";s:3:"直";s:4:"𥃳";s:4:"𥃳";s:4:"𥃲";s:4:"𥃲";s:4:"𥄙";s:4:"𥄙";s:4:"𥄳";s:4:"𥄳";s:4:"眞";s:3:"眞";s:4:"真";s:3:"真";s:4:"真";s:3:"真";s:4:"睊";s:3:"睊";s:4:"䀹";s:3:"䀹";s:4:"瞋";s:3:"瞋";s:4:"䁆";s:3:"䁆";s:4:"䂖";s:3:"䂖";s:4:"𥐝";s:4:"𥐝";s:4:"硎";s:3:"硎";s:4:"碌";s:3:"碌";s:4:"磌";s:3:"磌";s:4:"䃣";s:3:"䃣";s:4:"𥘦";s:4:"𥘦";s:4:"祖";s:3:"祖";s:4:"𥚚";s:4:"𥚚";s:4:"𥛅";s:4:"𥛅";s:4:"福";s:3:"福";s:4:"秫";s:3:"秫";s:4:"䄯";s:3:"䄯";s:4:"穀";s:3:"穀";s:4:"穊";s:3:"穊";s:4:"穏";s:3:"穏";s:4:"𥥼";s:4:"𥥼";s:4:"𥪧";s:4:"𥪧";s:4:"𥪧";s:4:"𥪧";s:4:"竮";s:3:"竮";s:4:"䈂";s:3:"䈂";s:4:"𥮫";s:4:"𥮫";s:4:"篆";s:3:"篆";s:4:"築";s:3:"築";s:4:"䈧";s:3:"䈧";s:4:"𥲀";s:4:"𥲀";s:4:"糒";s:3:"糒";s:4:"䊠";s:3:"䊠";s:4:"糨";s:3:"糨";s:4:"糣";s:3:"糣";s:4:"紀";s:3:"紀";s:4:"𥾆";s:4:"𥾆";s:4:"絣";s:3:"絣";s:4:"䌁";s:3:"䌁";s:4:"緇";s:3:"緇";s:4:"縂";s:3:"縂";s:4:"繅";s:3:"繅";s:4:"䌴";s:3:"䌴";s:4:"𦈨";s:4:"𦈨";s:4:"𦉇";s:4:"𦉇";s:4:"䍙";s:3:"䍙";s:4:"𦋙";s:4:"𦋙";s:4:"罺";s:3:"罺";s:4:"𦌾";s:4:"𦌾";s:4:"羕";s:3:"羕";s:4:"翺";s:3:"翺";s:4:"者";s:3:"者";s:4:"𦓚";s:4:"𦓚";s:4:"𦔣";s:4:"𦔣";s:4:"聠";s:3:"聠";s:4:"𦖨";s:4:"𦖨";s:4:"聰";s:3:"聰";s:4:"𣍟";s:4:"𣍟";s:4:"䏕";s:3:"䏕";s:4:"育";s:3:"育";s:4:"脃";s:3:"脃";s:4:"䐋";s:3:"䐋";s:4:"脾";s:3:"脾";s:4:"媵";s:3:"媵";s:4:"𦞧";s:4:"𦞧";s:4:"𦞵";s:4:"𦞵";s:4:"𣎓";s:4:"𣎓";s:4:"𣎜";s:4:"𣎜";s:4:"舁";s:3:"舁";s:4:"舄";s:3:"舄";s:4:"辞";s:3:"辞";s:4:"䑫";s:3:"䑫";s:4:"芑";s:3:"芑";s:4:"芋";s:3:"芋";s:4:"芝";s:3:"芝";s:4:"劳";s:3:"劳";s:4:"花";s:3:"花";s:4:"芳";s:3:"芳";s:4:"芽";s:3:"芽";s:4:"苦";s:3:"苦";s:4:"𦬼";s:4:"𦬼";s:4:"若";s:3:"若";s:4:"茝";s:3:"茝";s:4:"荣";s:3:"荣";s:4:"莭";s:3:"莭";s:4:"茣";s:3:"茣";s:4:"莽";s:3:"莽";s:4:"菧";s:3:"菧";s:4:"著";s:3:"著";s:4:"荓";s:3:"荓";s:4:"菊";s:3:"菊";s:4:"菌";s:3:"菌";s:4:"菜";s:3:"菜";s:4:"𦰶";s:4:"𦰶";s:4:"𦵫";s:4:"𦵫";s:4:"𦳕";s:4:"𦳕";s:4:"䔫";s:3:"䔫";s:4:"蓱";s:3:"蓱";s:4:"蓳";s:3:"蓳";s:4:"蔖";s:3:"蔖";s:4:"𧏊";s:4:"𧏊";s:4:"蕤";s:3:"蕤";s:4:"𦼬";s:4:"𦼬";s:4:"䕝";s:3:"䕝";s:4:"䕡";s:3:"䕡";s:4:"𦾱";s:4:"𦾱";s:4:"𧃒";s:4:"𧃒";s:4:"䕫";s:3:"䕫";s:4:"虐";s:3:"虐";s:4:"虜";s:3:"虜";s:4:"虧";s:3:"虧";s:4:"虩";s:3:"虩";s:4:"蚩";s:3:"蚩";s:4:"蚈";s:3:"蚈";s:4:"蜎";s:3:"蜎";s:4:"蛢";s:3:"蛢";s:4:"蝹";s:3:"蝹";s:4:"蜨";s:3:"蜨";s:4:"蝫";s:3:"蝫";s:4:"螆";s:3:"螆";s:4:"䗗";s:3:"䗗";s:4:"蟡";s:3:"蟡";s:4:"蠁";s:3:"蠁";s:4:"䗹";s:3:"䗹";s:4:"衠";s:3:"衠";s:4:"衣";s:3:"衣";s:4:"𧙧";s:4:"𧙧";s:4:"裗";s:3:"裗";s:4:"裞";s:3:"裞";s:4:"䘵";s:3:"䘵";s:4:"裺";s:3:"裺";s:4:"㒻";s:3:"㒻";s:4:"𧢮";s:4:"𧢮";s:4:"𧥦";s:4:"𧥦";s:4:"䚾";s:3:"䚾";s:4:"䛇";s:3:"䛇";s:4:"誠";s:3:"誠";s:4:"諭";s:3:"諭";s:4:"變";s:3:"變";s:4:"豕";s:3:"豕";s:4:"𧲨";s:4:"𧲨";s:4:"貫";s:3:"貫";s:4:"賁";s:3:"賁";s:4:"贛";s:3:"贛";s:4:"起";s:3:"起";s:4:"𧼯";s:4:"𧼯";s:4:"𠠄";s:4:"𠠄";s:4:"跋";s:3:"跋";s:4:"趼";s:3:"趼";s:4:"跰";s:3:"跰";s:4:"𠣞";s:4:"𠣞";s:4:"軔";s:3:"軔";s:4:"輸";s:3:"輸";s:4:"𨗒";s:4:"𨗒";s:4:"𨗭";s:4:"𨗭";s:4:"邔";s:3:"邔";s:4:"郱";s:3:"郱";s:4:"鄑";s:3:"鄑";s:4:"𨜮";s:4:"𨜮";s:4:"鄛";s:3:"鄛";s:4:"鈸";s:3:"鈸";s:4:"鋗";s:3:"鋗";s:4:"鋘";s:3:"鋘";s:4:"鉼";s:3:"鉼";s:4:"鏹";s:3:"鏹";s:4:"鐕";s:3:"鐕";s:4:"𨯺";s:4:"𨯺";s:4:"開";s:3:"開";s:4:"䦕";s:3:"䦕";s:4:"閷";s:3:"閷";s:4:"𨵷";s:4:"𨵷";s:4:"䧦";s:3:"䧦";s:4:"雃";s:3:"雃";s:4:"嶲";s:3:"嶲";s:4:"霣";s:3:"霣";s:4:"𩅅";s:4:"𩅅";s:4:"𩈚";s:4:"𩈚";s:4:"䩮";s:3:"䩮";s:4:"䩶";s:3:"䩶";s:4:"韠";s:3:"韠";s:4:"𩐊";s:4:"𩐊";s:4:"䪲";s:3:"䪲";s:4:"𩒖";s:4:"𩒖";s:4:"頋";s:3:"頋";s:4:"頋";s:3:"頋";s:4:"頩";s:3:"頩";s:4:"𩖶";s:4:"𩖶";s:4:"飢";s:3:"飢";s:4:"䬳";s:3:"䬳";s:4:"餩";s:3:"餩";s:4:"馧";s:3:"馧";s:4:"駂";s:3:"駂";s:4:"駾";s:3:"駾";s:4:"䯎";s:3:"䯎";s:4:"𩬰";s:4:"𩬰";s:4:"鬒";s:3:"鬒";s:4:"鱀";s:3:"鱀";s:4:"鳽";s:3:"鳽";s:4:"䳎";s:3:"䳎";s:4:"䳭";s:3:"䳭";s:4:"鵧";s:3:"鵧";s:4:"𪃎";s:4:"𪃎";s:4:"䳸";s:3:"䳸";s:4:"𪄅";s:4:"𪄅";s:4:"𪈎";s:4:"𪈎";s:4:"𪊑";s:4:"𪊑";s:4:"麻";s:3:"麻";s:4:"䵖";s:3:"䵖";s:4:"黹";s:3:"黹";s:4:"黾";s:3:"黾";s:4:"鼅";s:3:"鼅";s:4:"鼏";s:3:"鼏";s:4:"鼖";s:3:"鼖";s:4:"鼻";s:3:"鼻";s:4:"𪘀";s:4:"𪘀";}' );
-
diff --git a/includes/normal/UtfNormalDefines.php b/includes/normal/UtfNormalDefines.php
deleted file mode 100644 (file)
index 18d89f6..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
-<?php
-/**
- * Some constant definitions for the unicode normalization module.
- *
- * Note: these constants must all be resolvable at compile time by HipHop,
- * since this file will not be executed during request startup for a compiled
- * MediaWiki.
- *
- * 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 UtfNormal
- */
-
-define( 'UNICODE_HANGUL_FIRST', 0xac00 );
-define( 'UNICODE_HANGUL_LAST', 0xd7a3 );
-
-define( 'UNICODE_HANGUL_LBASE', 0x1100 );
-define( 'UNICODE_HANGUL_VBASE', 0x1161 );
-define( 'UNICODE_HANGUL_TBASE', 0x11a7 );
-
-define( 'UNICODE_HANGUL_LCOUNT', 19 );
-define( 'UNICODE_HANGUL_VCOUNT', 21 );
-define( 'UNICODE_HANGUL_TCOUNT', 28 );
-define( 'UNICODE_HANGUL_NCOUNT', UNICODE_HANGUL_VCOUNT * UNICODE_HANGUL_TCOUNT );
-
-define( 'UNICODE_HANGUL_LEND', UNICODE_HANGUL_LBASE + UNICODE_HANGUL_LCOUNT - 1 );
-define( 'UNICODE_HANGUL_VEND', UNICODE_HANGUL_VBASE + UNICODE_HANGUL_VCOUNT - 1 );
-define( 'UNICODE_HANGUL_TEND', UNICODE_HANGUL_TBASE + UNICODE_HANGUL_TCOUNT - 1 );
-
-define( 'UNICODE_SURROGATE_FIRST', 0xd800 );
-define( 'UNICODE_SURROGATE_LAST', 0xdfff );
-define( 'UNICODE_MAX', 0x10ffff );
-define( 'UNICODE_REPLACEMENT', 0xfffd );
-
-define( 'UTF8_HANGUL_FIRST', "\xea\xb0\x80" /*codepointToUtf8( UNICODE_HANGUL_FIRST )*/ );
-define( 'UTF8_HANGUL_LAST', "\xed\x9e\xa3" /*codepointToUtf8( UNICODE_HANGUL_LAST )*/ );
-
-define( 'UTF8_HANGUL_LBASE', "\xe1\x84\x80" /*codepointToUtf8( UNICODE_HANGUL_LBASE )*/ );
-define( 'UTF8_HANGUL_VBASE', "\xe1\x85\xa1" /*codepointToUtf8( UNICODE_HANGUL_VBASE )*/ );
-define( 'UTF8_HANGUL_TBASE', "\xe1\x86\xa7" /*codepointToUtf8( UNICODE_HANGUL_TBASE )*/ );
-
-define( 'UTF8_HANGUL_LEND', "\xe1\x84\x92" /*codepointToUtf8( UNICODE_HANGUL_LEND )*/ );
-define( 'UTF8_HANGUL_VEND', "\xe1\x85\xb5" /*codepointToUtf8( UNICODE_HANGUL_VEND )*/ );
-define( 'UTF8_HANGUL_TEND', "\xe1\x87\x82" /*codepointToUtf8( UNICODE_HANGUL_TEND )*/ );
-
-define( 'UTF8_SURROGATE_FIRST', "\xed\xa0\x80" /*codepointToUtf8( UNICODE_SURROGATE_FIRST )*/ );
-define( 'UTF8_SURROGATE_LAST', "\xed\xbf\xbf" /*codepointToUtf8( UNICODE_SURROGATE_LAST )*/ );
-define( 'UTF8_MAX', "\xf4\x8f\xbf\xbf" /*codepointToUtf8( UNICODE_MAX )*/ );
-define( 'UTF8_REPLACEMENT', "\xef\xbf\xbd" /*codepointToUtf8( UNICODE_REPLACEMENT )*/ );
-#define( 'UTF8_REPLACEMENT', '!' );
-
-define( 'UTF8_OVERLONG_A', "\xc1\xbf" );
-define( 'UTF8_OVERLONG_B', "\xe0\x9f\xbf" );
-define( 'UTF8_OVERLONG_C', "\xf0\x8f\xbf\xbf" );
-
-# These two ranges are illegal
-define( 'UTF8_FDD0', "\xef\xb7\x90" /*codepointToUtf8( 0xfdd0 )*/ );
-define( 'UTF8_FDEF', "\xef\xb7\xaf" /*codepointToUtf8( 0xfdef )*/ );
-define( 'UTF8_FFFE', "\xef\xbf\xbe" /*codepointToUtf8( 0xfffe )*/ );
-define( 'UTF8_FFFF', "\xef\xbf\xbf" /*codepointToUtf8( 0xffff )*/ );
-
-define( 'UTF8_HEAD', false );
-define( 'UTF8_TAIL', true );
diff --git a/includes/normal/UtfNormalGenerate.php b/includes/normal/UtfNormalGenerate.php
deleted file mode 100644 (file)
index f57aa6c..0000000
+++ /dev/null
@@ -1,250 +0,0 @@
-<?php
-/**
- * This script generates UniNormalData.inc from the Unicode Character Database
- * and supplementary files.
- *
- * Copyright (C) 2004 Brion Vibber <brion@pobox.com>
- * https://www.mediawiki.org/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup UtfNormal
- */
-
-if ( PHP_SAPI != 'cli' ) {
-       die( "Run me from the command line please.\n" );
-}
-
-require_once 'UtfNormalDefines.php';
-require_once 'UtfNormalUtil.php';
-
-$in = fopen( "DerivedNormalizationProps.txt", "rt" );
-if ( !$in ) {
-       print "Can't open DerivedNormalizationProps.txt for reading.\n";
-       print "If necessary, fetch this file from the internet:\n";
-       print "http://www.unicode.org/Public/UNIDATA/DerivedNormalizationProps.txt\n";
-       exit( -1 );
-}
-print "Initializing normalization quick check tables...\n";
-$checkNFC = array();
-while ( false !== ( $line = fgets( $in ) ) ) {
-       $matches = array();
-       if ( preg_match(
-               '/^([0-9A-F]+)(?:..([0-9A-F]+))?\s*;\s*(NFC_QC)\s*;\s*([MN])/',
-               $line,
-               $matches )
-       ) {
-               list( $junk, $first, $last, $prop, $value ) = $matches;
-               #print "$first $last $prop $value\n";
-               if ( !$last ) {
-                       $last = $first;
-               }
-
-               $lastInDecimal = hexdec( $last );
-               for ( $i = hexdec( $first ); $i <= $lastInDecimal; $i++ ) {
-                       $char = codepointToUtf8( $i );
-                       $checkNFC[$char] = $value;
-               }
-       }
-}
-fclose( $in );
-
-$in = fopen( "CompositionExclusions.txt", "rt" );
-if ( !$in ) {
-       print "Can't open CompositionExclusions.txt for reading.\n";
-       print "If necessary, fetch this file from the internet:\n";
-       print "http://www.unicode.org/Public/UNIDATA/CompositionExclusions.txt\n";
-       exit( -1 );
-}
-$exclude = array();
-while ( false !== ( $line = fgets( $in ) ) ) {
-       if ( preg_match( '/^([0-9A-F]+)/i', $line, $matches ) ) {
-               $codepoint = $matches[1];
-               $source = codepointToUtf8( hexdec( $codepoint ) );
-               $exclude[$source] = true;
-       }
-}
-fclose( $in );
-
-$in = fopen( "UnicodeData.txt", "rt" );
-if ( !$in ) {
-       print "Can't open UnicodeData.txt for reading.\n";
-       print "If necessary, fetch this file from the internet:\n";
-       print "http://www.unicode.org/Public/UNIDATA/UnicodeData.txt\n";
-       exit( -1 );
-}
-
-$compatibilityDecomp = array();
-$canonicalDecomp = array();
-$canonicalComp = array();
-$combiningClass = array();
-$total = 0;
-$compat = 0;
-$canon = 0;
-
-print "Reading character definitions...\n";
-while ( false !== ( $line = fgets( $in ) ) ) {
-       $columns = explode( ';', $line );
-       $codepoint = $columns[0];
-       $name = $columns[1];
-       $canonicalCombiningClass = $columns[3];
-       $decompositionMapping = $columns[5];
-
-       $source = codepointToUtf8( hexdec( $codepoint ) );
-
-       if ( $canonicalCombiningClass != 0 ) {
-               $combiningClass[$source] = intval( $canonicalCombiningClass );
-       }
-
-       if ( $decompositionMapping === '' ) continue;
-       if ( preg_match( '/^<(.+)> (.*)$/', $decompositionMapping, $matches ) ) {
-               # Compatibility decomposition
-               $canonical = false;
-               $decompositionMapping = $matches[2];
-               $compat++;
-       } else {
-               $canonical = true;
-               $canon++;
-       }
-       $total++;
-       $dest = hexSequenceToUtf8( $decompositionMapping );
-
-       $compatibilityDecomp[$source] = $dest;
-       if ( $canonical ) {
-               $canonicalDecomp[$source] = $dest;
-               if ( empty( $exclude[$source] ) ) {
-                       $canonicalComp[$dest] = $source;
-               }
-       }
-       #print "$codepoint | $canonicalCombiningClasses | $decompositionMapping\n";
-}
-fclose( $in );
-
-print "Recursively expanding canonical mappings...\n";
-$changed = 42;
-$pass = 1;
-while ( $changed > 0 ) {
-       print "pass $pass\n";
-       $changed = 0;
-       foreach ( $canonicalDecomp as $source => $dest ) {
-               $newDest = preg_replace_callback(
-                       '/([\xc0-\xff][\x80-\xbf]+)/',
-                       'callbackCanonical',
-                       $dest );
-               if ( $newDest === $dest ) continue;
-               $changed++;
-               $canonicalDecomp[$source] = $newDest;
-       }
-       $pass++;
-}
-
-print "Recursively expanding compatibility mappings...\n";
-$changed = 42;
-$pass = 1;
-while ( $changed > 0 ) {
-       print "pass $pass\n";
-       $changed = 0;
-       foreach ( $compatibilityDecomp as $source => $dest ) {
-               $newDest = preg_replace_callback(
-                       '/([\xc0-\xff][\x80-\xbf]+)/',
-                       'callbackCompat',
-                       $dest );
-               if ( $newDest === $dest ) continue;
-               $changed++;
-               $compatibilityDecomp[$source] = $newDest;
-       }
-       $pass++;
-}
-
-print "$total decomposition mappings ($canon canonical, $compat compatibility)\n";
-
-$out = fopen( "UtfNormalData.inc", "wt" );
-if ( $out ) {
-       $serCombining = escapeSingleString( serialize( $combiningClass ) );
-       $serComp = escapeSingleString( serialize( $canonicalComp ) );
-       $serCanon = escapeSingleString( serialize( $canonicalDecomp ) );
-       $serCheckNFC = escapeSingleString( serialize( $checkNFC ) );
-       $outdata = "<" . "?php
-/**
- * This file was automatically generated -- do not edit!
- * Run UtfNormalGenerate.php to create this file again (make clean && make)
- *
- * @file
- */
-// @codingStandardsIgnoreFile
-
-UtfNormal::\$utfCombiningClass = unserialize( '$serCombining' );
-UtfNormal::\$utfCanonicalComp = unserialize( '$serComp' );
-UtfNormal::\$utfCanonicalDecomp = unserialize( '$serCanon' );
-UtfNormal::\$utfCheckNFC = unserialize( '$serCheckNFC' );
-\n";
-       fputs( $out, $outdata );
-       fclose( $out );
-       print "Wrote out UtfNormalData.inc\n";
-} else {
-       print "Can't create file UtfNormalData.inc\n";
-       exit( -1 );
-}
-
-$out = fopen( "UtfNormalDataK.inc", "wt" );
-if ( $out ) {
-       $serCompat = escapeSingleString( serialize( $compatibilityDecomp ) );
-       $outdata = "<" . "?php
-/**
- * This file was automatically generated -- do not edit!
- * Run UtfNormalGenerate.php to create this file again (make clean && make)
- *
- * @file
- */
-// @codingStandardsIgnoreFile
-
-UtfNormal::\$utfCompatibilityDecomp = unserialize( '$serCompat' );
-\n";
-       fputs( $out, $outdata );
-       fclose( $out );
-       print "Wrote out UtfNormalDataK.inc\n";
-       exit( 0 );
-} else {
-       print "Can't create file UtfNormalDataK.inc\n";
-       exit( -1 );
-}
-
-# ---------------
-
-function callbackCanonical( $matches ) {
-       // @codingStandardsIgnoreStart MediaWiki.NamingConventions.ValidGlobalName.wgPrefix
-       global $canonicalDecomp;
-       // @codingStandardsIgnoreEnd
-
-       if ( isset( $canonicalDecomp[$matches[1]] ) ) {
-               return $canonicalDecomp[$matches[1]];
-       }
-
-       return $matches[1];
-}
-
-function callbackCompat( $matches ) {
-       // @codingStandardsIgnoreStart MediaWiki.NamingConventions.ValidGlobalName.wgPrefix
-       global $compatibilityDecomp;
-       // @codingStandardsIgnoreEnd
-
-       if ( isset( $compatibilityDecomp[$matches[1]] ) ) {
-               return $compatibilityDecomp[$matches[1]];
-       }
-
-       return $matches[1];
-}
diff --git a/includes/normal/UtfNormalMemStress.php b/includes/normal/UtfNormalMemStress.php
deleted file mode 100644 (file)
index f133e4d..0000000
+++ /dev/null
@@ -1,107 +0,0 @@
-<?php
-/**
- * Approximate benchmark for some basic operations.
- * Runs large chunks of text through cleanup with a lowish memory limit,
- * to test regression on mem usage (bug 28146)
- *
- * Copyright © 2004-2011 Brion Vibber <brion@wikimedia.org>
- * https://www.mediawiki.org/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup UtfNormal
- */
-
-if ( PHP_SAPI != 'cli' ) {
-       die( "Run me from the command line please.\n" );
-}
-
-if ( isset( $_SERVER['argv'] ) && in_array( '--icu', $_SERVER['argv'] ) ) {
-       dl( 'php_utfnormal.so' );
-}
-
-require_once 'UtfNormalDefines.php';
-require_once 'UtfNormalUtil.php';
-require_once 'UtfNormal.php';
-
-define( 'BENCH_CYCLES', 1 );
-define( 'BIGSIZE', 1024 * 1024 * 10 ); // 10m
-ini_set( 'memory_limit', BIGSIZE + 120 * 1024 * 1024 );
-
-$testfiles = array(
-       'testdata/washington.txt' => 'English text',
-       'testdata/berlin.txt' => 'German text',
-       'testdata/bulgakov.txt' => 'Russian text',
-       'testdata/tokyo.txt' => 'Japanese text',
-       'testdata/young.txt' => 'Korean text'
-);
-$normalizer = new UtfNormal;
-UtfNormal::loadData();
-foreach ( $testfiles as $file => $desc ) {
-       benchmarkTest( $normalizer, $file, $desc );
-}
-
-# -------
-
-function benchmarkTest( &$u, $filename, $desc ) {
-       print "Testing $filename ($desc)...\n";
-       $data = file_get_contents( $filename );
-       $all = $data;
-       while ( strlen( $all ) < BIGSIZE ) {
-               $all .= $all;
-       }
-       $data = $all;
-       echo "Data is " . strlen( $data ) . " bytes.\n";
-       $forms = array(
-               'quickIsNFCVerify',
-               'cleanUp',
-       );
-
-       foreach ( $forms as $form ) {
-               if ( is_array( $form ) ) {
-                       $str = $data;
-                       foreach ( $form as $step ) {
-                               $str = benchmarkForm( $u, $str, $step );
-                       }
-               } else {
-                       benchmarkForm( $u, $data, $form );
-               }
-       }
-}
-
-function benchmarkForm( &$u, &$data, $form ) {
-       #$start = microtime( true );
-       for ( $i = 0; $i < BENCH_CYCLES; $i++ ) {
-               $start = microtime( true );
-               $out = $u->$form( $data, UtfNormal::$utfCanonicalDecomp );
-               $deltas[] = ( microtime( true ) - $start );
-       }
-       #$delta = (microtime( true ) - $start) / BENCH_CYCLES;
-       sort( $deltas );
-       $delta = $deltas[0]; # Take shortest time
-
-       $rate = intval( strlen( $data ) / $delta );
-       $same = ( 0 == strcmp( $data, $out ) );
-
-       printf( " %20s %6.1fms %12s bytes/s (%s)\n",
-               $form,
-               $delta * 1000.0,
-               number_format( $rate ),
-               ( $same ? 'no change' : 'changed' ) );
-
-       return $out;
-}
diff --git a/includes/normal/UtfNormalTest.php b/includes/normal/UtfNormalTest.php
deleted file mode 100644 (file)
index 10cd0f0..0000000
+++ /dev/null
@@ -1,257 +0,0 @@
-<?php
-/**
- * Implements the conformance test at:
- * http://www.unicode.org/Public/UNIDATA/NormalizationTest.txt
- *
- * Copyright © 2004 Brion Vibber <brion@pobox.com>
- * https://www.mediawiki.org/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup UtfNormal
- */
-
-if ( PHP_SAPI != 'cli' ) {
-       die( "Run me from the command line please.\n" );
-}
-
-$verbose = true;
-#define( 'PRETTY_UTF8', true );
-
-if ( defined( 'PRETTY_UTF8' ) ) {
-       function pretty( $string ) {
-               return strtoupper( bin2hex( $string ) );
-       }
-} else {
-       /**
-        * @ignore
-        * @param string $string
-        * @return string
-        */
-       function pretty( $string ) {
-               return strtoupper( utf8ToHexSequence( $string ) );
-       }
-}
-
-if ( isset( $_SERVER['argv'] ) && in_array( '--icu', $_SERVER['argv'] ) ) {
-       dl( 'php_utfnormal.so' );
-}
-
-require_once 'UtfNormalDefines.php';
-require_once 'UtfNormalUtil.php';
-require_once 'UtfNormal.php';
-
-$in = fopen( "NormalizationTest.txt", "rt" );
-if ( !$in ) {
-       print "Couldn't open NormalizationTest.txt -- can't run tests.\n";
-       print "If necessary, manually download this file. It can be obtained at\n";
-       print "http://www.unicode.org/Public/UNIDATA/NormalizationTest.txt";
-       exit( -1 );
-}
-
-$normalizer = new UtfNormal;
-
-$total = 0;
-$success = 0;
-$failure = 0;
-$ok = true;
-$testedChars = array();
-
-while ( false !== ( $line = fgets( $in ) ) ) {
-       list( $data, $comment ) = explode( '#', $line );
-       if ( $data === '' ) continue;
-       $matches = array();
-       if ( preg_match( '/@Part([\d])/', $data, $matches ) ) {
-               if ( $matches[1] > 0 ) {
-                       $ok = reportResults( $total, $success, $failure ) && $ok;
-               }
-               print "Part {$matches[1]}: $comment";
-               continue;
-       }
-
-       $columns = array_map( "hexSequenceToUtf8", explode( ";", $data ) );
-       array_unshift( $columns, '' );
-
-       $testedChars[$columns[1]] = true;
-       $total++;
-       if ( testNormals( $normalizer, $columns, $comment, $verbose ) ) {
-               $success++;
-       } else {
-               $failure++;
-               # print "FAILED: $comment";
-       }
-       if ( $total % 100 == 0 ) print "$total ";
-}
-fclose( $in );
-
-$ok = reportResults( $total, $success, $failure ) && $ok;
-
-$in = fopen( "UnicodeData.txt", "rt" );
-if ( !$in ) {
-       print "Can't open UnicodeData.txt for reading.\n";
-       print "If necessary, fetch this file from the internet:\n";
-       print "http://www.unicode.org/Public/UNIDATA/UnicodeData.txt\n";
-       exit( -1 );
-}
-print "Now testing invariants...\n";
-
-while ( false !== ( $line = fgets( $in ) ) ) {
-       $cols = explode( ';', $line );
-       $char = codepointToUtf8( hexdec( $cols[0] ) );
-       $desc = $cols[0] . ": " . $cols[1];
-       if ( $char < "\x20" || $char >= UTF8_SURROGATE_FIRST && $char <= UTF8_SURROGATE_LAST ) {
-               # Can't check NULL with the ICU plugin, as null bytes fail in C land.
-               # Skip other control characters, as we strip them for XML safety.
-               # Surrogates are illegal on their own or in UTF-8, ignore.
-               continue;
-       }
-       if ( empty( $testedChars[$char] ) ) {
-               $total++;
-               if ( testInvariant( $normalizer, $char, $desc, $verbose ) ) {
-                       $success++;
-               } else {
-                       $failure++;
-               }
-               if ( $total % 100 == 0 ) print "$total ";
-       }
-}
-fclose( $in );
-
-$ok = reportResults( $total, $success, $failure ) && $ok;
-
-if ( $ok ) {
-       print "TEST SUCCEEDED!\n";
-       exit( 0 );
-} else {
-       print "TEST FAILED!\n";
-       exit( -1 );
-}
-
-## ------
-
-function reportResults( &$total, &$success, &$failure ) {
-       $percSucc = intval( $success * 100 / $total );
-       $percFail = intval( $failure * 100 / $total );
-       print "\n";
-       print "$success tests successful ($percSucc%)\n";
-       print "$failure tests failed ($percFail%)\n\n";
-       $ok = ( $success > 0 && $failure == 0 );
-       $total = 0;
-       $success = 0;
-       $failure = 0;
-
-       return $ok;
-}
-
-function testNormals( &$u, $c, $comment, $verbose, $reportFailure = false ) {
-       $result = testNFC( $u, $c, $comment, $reportFailure );
-       $result = testNFD( $u, $c, $comment, $reportFailure ) && $result;
-       $result = testNFKC( $u, $c, $comment, $reportFailure ) && $result;
-       $result = testNFKD( $u, $c, $comment, $reportFailure ) && $result;
-       $result = testCleanUp( $u, $c, $comment, $reportFailure ) && $result;
-
-       if ( $verbose && !$result && !$reportFailure ) {
-               print $comment;
-               testNormals( $u, $c, $comment, $verbose, true );
-       }
-
-       return $result;
-}
-
-function verbosify( $a, $b, $col, $form, $verbose ) {
-       #$result = ($a === $b);
-       $result = ( strcmp( $a, $b ) == 0 );
-       if ( $verbose ) {
-               $aa = pretty( $a );
-               $bb = pretty( $b );
-               $ok = $result ? "succeed" : " failed";
-               $eq = $result ? "==" : "!=";
-               print "  $ok $form c$col '$aa' $eq '$bb'\n";
-       }
-
-       return $result;
-}
-
-function testNFC( &$u, $c, $comment, $verbose ) {
-       $result = verbosify( $c[2], $u->toNFC( $c[1] ), 1, 'NFC', $verbose );
-       $result = verbosify( $c[2], $u->toNFC( $c[2] ), 2, 'NFC', $verbose ) && $result;
-       $result = verbosify( $c[2], $u->toNFC( $c[3] ), 3, 'NFC', $verbose ) && $result;
-       $result = verbosify( $c[4], $u->toNFC( $c[4] ), 4, 'NFC', $verbose ) && $result;
-       $result = verbosify( $c[4], $u->toNFC( $c[5] ), 5, 'NFC', $verbose ) && $result;
-
-       return $result;
-}
-
-function testCleanUp( &$u, $c, $comment, $verbose ) {
-       $x = $c[1];
-       $result = verbosify( $c[2], $u->cleanUp( $x ), 1, 'cleanUp', $verbose );
-       $x = $c[2];
-       $result = verbosify( $c[2], $u->cleanUp( $x ), 2, 'cleanUp', $verbose ) && $result;
-       $x = $c[3];
-       $result = verbosify( $c[2], $u->cleanUp( $x ), 3, 'cleanUp', $verbose ) && $result;
-       $x = $c[4];
-       $result = verbosify( $c[4], $u->cleanUp( $x ), 4, 'cleanUp', $verbose ) && $result;
-       $x = $c[5];
-       $result = verbosify( $c[4], $u->cleanUp( $x ), 5, 'cleanUp', $verbose ) && $result;
-
-       return $result;
-}
-
-function testNFD( &$u, $c, $comment, $verbose ) {
-       $result = verbosify( $c[3], $u->toNFD( $c[1] ), 1, 'NFD', $verbose );
-       $result = verbosify( $c[3], $u->toNFD( $c[2] ), 2, 'NFD', $verbose ) && $result;
-       $result = verbosify( $c[3], $u->toNFD( $c[3] ), 3, 'NFD', $verbose ) && $result;
-       $result = verbosify( $c[5], $u->toNFD( $c[4] ), 4, 'NFD', $verbose ) && $result;
-       $result = verbosify( $c[5], $u->toNFD( $c[5] ), 5, 'NFD', $verbose ) && $result;
-
-       return $result;
-}
-
-function testNFKC( &$u, $c, $comment, $verbose ) {
-       $result = verbosify( $c[4], $u->toNFKC( $c[1] ), 1, 'NFKC', $verbose );
-       $result = verbosify( $c[4], $u->toNFKC( $c[2] ), 2, 'NFKC', $verbose ) && $result;
-       $result = verbosify( $c[4], $u->toNFKC( $c[3] ), 3, 'NFKC', $verbose ) && $result;
-       $result = verbosify( $c[4], $u->toNFKC( $c[4] ), 4, 'NFKC', $verbose ) && $result;
-       $result = verbosify( $c[4], $u->toNFKC( $c[5] ), 5, 'NFKC', $verbose ) && $result;
-
-       return $result;
-}
-
-function testNFKD( &$u, $c, $comment, $verbose ) {
-       $result = verbosify( $c[5], $u->toNFKD( $c[1] ), 1, 'NFKD', $verbose );
-       $result = verbosify( $c[5], $u->toNFKD( $c[2] ), 2, 'NFKD', $verbose ) && $result;
-       $result = verbosify( $c[5], $u->toNFKD( $c[3] ), 3, 'NFKD', $verbose ) && $result;
-       $result = verbosify( $c[5], $u->toNFKD( $c[4] ), 4, 'NFKD', $verbose ) && $result;
-       $result = verbosify( $c[5], $u->toNFKD( $c[5] ), 5, 'NFKD', $verbose ) && $result;
-
-       return $result;
-}
-
-function testInvariant( &$u, $char, $desc, $verbose, $reportFailure = false ) {
-       $result = verbosify( $char, $u->toNFC( $char ), 1, 'NFC', $reportFailure );
-       $result = verbosify( $char, $u->toNFD( $char ), 1, 'NFD', $reportFailure ) && $result;
-       $result = verbosify( $char, $u->toNFKC( $char ), 1, 'NFKC', $reportFailure ) && $result;
-       $result = verbosify( $char, $u->toNFKD( $char ), 1, 'NFKD', $reportFailure ) && $result;
-       $result = verbosify( $char, $u->cleanUp( $char ), 1, 'cleanUp', $reportFailure ) && $result;
-
-       if ( $verbose && !$result && !$reportFailure ) {
-               print $desc;
-               testInvariant( $u, $char, $desc, $verbose, true );
-       }
-
-       return $result;
-}
diff --git a/includes/normal/UtfNormalTest2.php b/includes/normal/UtfNormalTest2.php
deleted file mode 100644 (file)
index 53e68c2..0000000
+++ /dev/null
@@ -1,275 +0,0 @@
-#!/usr/bin/env php
-<?php
-/**
- * Other tests for the unicode normalization module.
- *
- * 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 UtfNormal
- */
-
-if ( PHP_SAPI != 'cli' ) {
-       die( "Run me from the command line please.\n" );
-}
-
-// From http://unicode.org/Public/UNIDATA/NormalizationTest.txt
-$file = "NormalizationTest.txt";
-
-// Anything after this character is a comment
-define ( 'COMMENT', '#' );
-
-// Semicolons are used to separate the columns
-define ( 'SEPARATOR', ';' );
-
-$f = fopen( $file, "r" );
-
-/**
- * The following section will be used for testing different normalization methods.
- * - Pure PHP
- * ~ no assertion errors
- * ~ 6.25 minutes
- * - php_utfnormal.so or intl extension: both are wrappers around
- * libicu so we list the version of libicu when making the
- * comparison
- * - libicu Ubuntu 3.8.1-3ubuntu1.1 php 5.2.6-3ubuntu4.5
- * ~ 2200 assertion errors
- * ~ 5 seconds
- * ~ output: http://paste2.org/p/921566
- * - libicu Ubuntu 4.2.1-3 php 5.3.2-1ubuntu4.2
- * ~ 1384 assertion errors
- * ~ 15 seconds
- * ~ output: http://paste2.org/p/921435
- * - libicu Debian 4.4.1-5 php 5.3.2-1ubuntu4.2
- * ~ no assertion errors
- * ~ 13 seconds
- * - Tests comparing pure PHP output with libicu output were added
- * later and slow down the runtime.
- */
-
-require_once './UtfNormal.php';
-function normalize_form_c( $c ) {
-       return UtfNormal::toNFC( $c );
-}
-
-function normalize_form_d( $c ) {
-       return UtfNormal::toNFD( $c );
-}
-
-function normalize_form_kc( $c ) {
-       return UtfNormal::toNFKC( $c );
-}
-
-function normalize_form_kd( $c ) {
-       return UtfNormal::toNFKD( $c );
-}
-
-/**
- * This set of functions is only useful if youve added a param to the
- * following functions to force pure PHP usage.  I decided not to
- * commit that code since might produce a slowdown in the UTF
- * normalization code just for the sake of these tests. -- hexmode
- * @return string
- */
-function normalize_form_c_php( $c ) {
-       return UtfNormal::toNFC( $c, "php" );
-}
-
-function normalize_form_d_php( $c ) {
-       return UtfNormal::toNFD( $c, "php" );
-}
-
-function normalize_form_kc_php( $c ) {
-       return UtfNormal::toNFKC( $c, "php" );
-}
-
-function normalize_form_kd_php( $c ) {
-       return UtfNormal::toNFKD( $c, "php" );
-}
-
-assert_options( ASSERT_ACTIVE, 1 );
-assert_options( ASSERT_WARNING, 0 );
-assert_options( ASSERT_QUIET_EVAL, 1 );
-assert_options( ASSERT_CALLBACK, 'my_assert' );
-
-function my_assert( $file, $line, $code ) {
-       // @codingStandardsIgnoreStart MediaWiki.NamingConventions.ValidGlobalName.wgPrefix
-       global $col, $lineNo;
-       // @codingStandardsIgnoreEnd
-
-       echo "Assertion that '$code' failed on line $lineNo ($col[5])\n";
-}
-
-$count = 0;
-$lineNo = 0;
-if ( $f !== false ) {
-       while ( ( $col = getRow( $f ) ) !== false ) {
-               $lineNo++;
-
-               if ( count( $col ) == 6 ) {
-                       $count++;
-                       if ( $count % 100 === 0 ) echo "Count: $count\n";
-               } else {
-                       continue;
-               }
-
-               # verify that the pure PHP version is correct
-               $NFCc1 = normalize_form_c( $col[0] );
-               $NFCc1p = normalize_form_c_php( $col[0] );
-               assert( '$NFCc1 === $NFCc1p' );
-               $NFCc2 = normalize_form_c( $col[1] );
-               $NFCc2p = normalize_form_c_php( $col[1] );
-               assert( '$NFCc2 === $NFCc2p' );
-               $NFCc3 = normalize_form_c( $col[2] );
-               $NFCc3p = normalize_form_c_php( $col[2] );
-               assert( '$NFCc3 === $NFCc3p' );
-               $NFCc4 = normalize_form_c( $col[3] );
-               $NFCc4p = normalize_form_c_php( $col[3] );
-               assert( '$NFCc4 === $NFCc4p' );
-               $NFCc5 = normalize_form_c( $col[4] );
-               $NFCc5p = normalize_form_c_php( $col[4] );
-               assert( '$NFCc5 === $NFCc5p' );
-
-               $NFDc1 = normalize_form_d( $col[0] );
-               $NFDc1p = normalize_form_d_php( $col[0] );
-               assert( '$NFDc1 === $NFDc1p' );
-               $NFDc2 = normalize_form_d( $col[1] );
-               $NFDc2p = normalize_form_d_php( $col[1] );
-               assert( '$NFDc2 === $NFDc2p' );
-               $NFDc3 = normalize_form_d( $col[2] );
-               $NFDc3p = normalize_form_d_php( $col[2] );
-               assert( '$NFDc3 === $NFDc3p' );
-               $NFDc4 = normalize_form_d( $col[3] );
-               $NFDc4p = normalize_form_d_php( $col[3] );
-               assert( '$NFDc4 === $NFDc4p' );
-               $NFDc5 = normalize_form_d( $col[4] );
-               $NFDc5p = normalize_form_d_php( $col[4] );
-               assert( '$NFDc5 === $NFDc5p' );
-
-               $NFKDc1 = normalize_form_kd( $col[0] );
-               $NFKDc1p = normalize_form_kd_php( $col[0] );
-               assert( '$NFKDc1 === $NFKDc1p' );
-               $NFKDc2 = normalize_form_kd( $col[1] );
-               $NFKDc2p = normalize_form_kd_php( $col[1] );
-               assert( '$NFKDc2 === $NFKDc2p' );
-               $NFKDc3 = normalize_form_kd( $col[2] );
-               $NFKDc3p = normalize_form_kd_php( $col[2] );
-               assert( '$NFKDc3 === $NFKDc3p' );
-               $NFKDc4 = normalize_form_kd( $col[3] );
-               $NFKDc4p = normalize_form_kd_php( $col[3] );
-               assert( '$NFKDc4 === $NFKDc4p' );
-               $NFKDc5 = normalize_form_kd( $col[4] );
-               $NFKDc5p = normalize_form_kd_php( $col[4] );
-               assert( '$NFKDc5 === $NFKDc5p' );
-
-               $NFKCc1 = normalize_form_kc( $col[0] );
-               $NFKCc1p = normalize_form_kc_php( $col[0] );
-               assert( '$NFKCc1 === $NFKCc1p' );
-               $NFKCc2 = normalize_form_kc( $col[1] );
-               $NFKCc2p = normalize_form_kc_php( $col[1] );
-               assert( '$NFKCc2 === $NFKCc2p' );
-               $NFKCc3 = normalize_form_kc( $col[2] );
-               $NFKCc3p = normalize_form_kc_php( $col[2] );
-               assert( '$NFKCc3 === $NFKCc3p' );
-               $NFKCc4 = normalize_form_kc( $col[3] );
-               $NFKCc4p = normalize_form_kc_php( $col[3] );
-               assert( '$NFKCc4 === $NFKCc4p' );
-               $NFKCc5 = normalize_form_kc( $col[4] );
-               $NFKCc5p = normalize_form_kc_php( $col[4] );
-               assert( '$NFKCc5 === $NFKCc5p' );
-
-               # c2 ==  NFC(c1) ==      NFC(c2) ==      NFC(c3)
-               assert( '$col[1] === $NFCc1' );
-               assert( '$col[1] === $NFCc2' );
-               assert( '$col[1] === $NFCc3' );
-
-               # c4 ==  NFC(c4) ==      NFC(c5)
-               assert( '$col[3] === $NFCc4' );
-               assert( '$col[3] === $NFCc5' );
-
-               # c3 ==  NFD(c1) ==      NFD(c2) ==      NFD(c3)
-               assert( '$col[2] === $NFDc1' );
-               assert( '$col[2] === $NFDc2' );
-               assert( '$col[2] === $NFDc3' );
-
-               # c5 ==  NFD(c4) ==      NFD(c5)
-               assert( '$col[4] === $NFDc4' );
-               assert( '$col[4] === $NFDc5' );
-
-               # c4 == NFKC(c1) == NFKC(c2) == NFKC(c3) == NFKC(c4) == NFKC(c5)
-               assert( '$col[3] === $NFKCc1' );
-               assert( '$col[3] === $NFKCc2' );
-               assert( '$col[3] === $NFKCc3' );
-               assert( '$col[3] === $NFKCc4' );
-               assert( '$col[3] === $NFKCc5' );
-
-               # c5 == NFKD(c1) == NFKD(c2) == NFKD(c3) == NFKD(c4) == NFKD(c5)
-               assert( '$col[4] === $NFKDc1' );
-               assert( '$col[4] === $NFKDc2' );
-               assert( '$col[4] === $NFKDc3' );
-               assert( '$col[4] === $NFKDc4' );
-               assert( '$col[4] === $NFKDc5' );
-       }
-}
-echo "done.\n";
-
-// Compare against http://en.wikipedia.org/wiki/UTF-8#Description
-function unichr( $c ) {
-       if ( $c <= 0x7F ) {
-               return chr( $c );
-       } elseif ( $c <= 0x7FF ) {
-               return chr( 0xC0 | $c >> 6 ) . chr( 0x80 | $c & 0x3F );
-       } elseif ( $c <= 0xFFFF ) {
-               return chr( 0xE0 | $c >> 12 ) . chr( 0x80 | $c >> 6 & 0x3F )
-               . chr( 0x80 | $c & 0x3F );
-       } elseif ( $c <= 0x10FFFF ) {
-               return chr( 0xF0 | $c >> 18 ) . chr( 0x80 | $c >> 12 & 0x3F )
-               . chr( 0x80 | $c >> 6 & 0x3F )
-               . chr( 0x80 | $c & 0x3F );
-       } else {
-               return false;
-       }
-}
-
-function unistr( $c ) {
-       return implode( "", array_map( "unichr", array_map( "hexdec", explode( " ", $c ) ) ) );
-}
-
-function getRow( $f ) {
-       $row = fgets( $f );
-       if ( $row === false ) return false;
-       $row = rtrim( $row );
-       $pos = strpos( $row, COMMENT );
-       $pos2 = strpos( $row, ")" );
-       if ( $pos === 0 ) return array( $row );
-       $c = "";
-
-       if ( $pos ) {
-               if ( $pos2 ) $c = substr( $row, $pos2 + 2 );
-               else      $c = substr( $row, $pos );
-               $row = substr( $row, 0, $pos );
-       }
-
-       $ret = array();
-       foreach ( explode( SEPARATOR, $row ) as $ent ) {
-               if ( trim( $ent ) !== "" ) {
-                       $ret[] = unistr( $ent );
-               }
-       }
-       $ret[] = $c;
-
-       return $ret;
-}
diff --git a/includes/normal/UtfNormalUtil.php b/includes/normal/UtfNormalUtil.php
deleted file mode 100644 (file)
index 6c925df..0000000
+++ /dev/null
@@ -1,154 +0,0 @@
-<?php
-/**
- * Some of these functions are adapted from places in MediaWiki.
- * Should probably merge them for consistency.
- *
- * Copyright © 2004 Brion Vibber <brion@pobox.com>
- * https://www.mediawiki.org/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup UtfNormal
- */
-
-/**
- * Return UTF-8 sequence for a given Unicode code point.
- * May die if fed out of range data.
- *
- * @param $codepoint Integer:
- * @return String
- * @public
- */
-function codepointToUtf8( $codepoint ) {
-       if ( $codepoint < 0x80 ) {
-               return chr( $codepoint );
-       }
-
-       if ( $codepoint < 0x800 ) {
-               return chr( $codepoint >> 6 & 0x3f | 0xc0 ) .
-                       chr( $codepoint & 0x3f | 0x80 );
-       }
-
-       if ( $codepoint < 0x10000 ) {
-               return chr( $codepoint >> 12 & 0x0f | 0xe0 ) .
-                       chr( $codepoint >> 6 & 0x3f | 0x80 ) .
-                       chr( $codepoint & 0x3f | 0x80 );
-       }
-
-       if ( $codepoint < 0x110000 ) {
-               return chr( $codepoint >> 18 & 0x07 | 0xf0 ) .
-                       chr( $codepoint >> 12 & 0x3f | 0x80 ) .
-                       chr( $codepoint >> 6 & 0x3f | 0x80 ) .
-                       chr( $codepoint & 0x3f | 0x80 );
-       }
-
-       echo "Asked for code outside of range ($codepoint)\n";
-       die( -1 );
-}
-
-/**
- * Take a series of space-separated hexadecimal numbers representing
- * Unicode code points and return a UTF-8 string composed of those
- * characters. Used by UTF-8 data generation and testing routines.
- *
- * @param $sequence String
- * @return String
- * @private
- */
-function hexSequenceToUtf8( $sequence ) {
-       $utf = '';
-       foreach ( explode( ' ', $sequence ) as $hex ) {
-               $n = hexdec( $hex );
-               $utf .= codepointToUtf8( $n );
-       }
-
-       return $utf;
-}
-
-/**
- * Take a UTF-8 string and return a space-separated series of hex
- * numbers representing Unicode code points. For debugging.
- *
- * @param string $str UTF-8 string.
- * @return string
- * @private
- */
-function utf8ToHexSequence( $str ) {
-       $buf = '';
-       foreach ( preg_split( '//u', $str, -1, PREG_SPLIT_NO_EMPTY ) as $cp ) {
-               $buf .= sprintf( '%04x ', utf8ToCodepoint( $cp ) );
-       }
-
-       return rtrim( $buf );
-}
-
-/**
- * Determine the Unicode codepoint of a single-character UTF-8 sequence.
- * Does not check for invalid input data.
- *
- * @param $char String
- * @return Integer
- * @public
- */
-function utf8ToCodepoint( $char ) {
-       # Find the length
-       $z = ord( $char[0] );
-       if ( $z & 0x80 ) {
-               $length = 0;
-               while ( $z & 0x80 ) {
-                       $length++;
-                       $z <<= 1;
-               }
-       } else {
-               $length = 1;
-       }
-
-       if ( $length != strlen( $char ) ) {
-               return false;
-       }
-
-       if ( $length == 1 ) {
-               return ord( $char );
-       }
-
-       # Mask off the length-determining bits and shift back to the original location
-       $z &= 0xff;
-       $z >>= $length;
-
-       # Add in the free bits from subsequent bytes
-       for ( $i = 1; $i < $length; $i++ ) {
-               $z <<= 6;
-               $z |= ord( $char[$i] ) & 0x3f;
-       }
-
-       return $z;
-}
-
-/**
- * Escape a string for inclusion in a PHP single-quoted string literal.
- *
- * @param string $string string to be escaped.
- * @return String: escaped string.
- * @public
- */
-function escapeSingleString( $string ) {
-       return strtr( $string,
-               array(
-                       '\\' => '\\\\',
-                       '\'' => '\\\''
-               ) );
-}
index d879ca8..afc0f0a 100644 (file)
@@ -72,17 +72,16 @@ class APCBagOStuff extends BagOStuff {
         * @return bool
         * @throws MWException
         */
-       public function cas( $casToken, $key, $value, $exptime = 0 ) {
+       protected function cas( $casToken, $key, $value, $exptime = 0 ) {
                // APC's CAS functions only work on integers
                throw new MWException( "CAS is not implemented in " . __CLASS__ );
        }
 
        /**
         * @param string $key
-        * @param int $time
         * @return bool
         */
-       public function delete( $key, $time = 0 ) {
+       public function delete( $key ) {
                apc_delete( $key );
 
                return true;
@@ -90,12 +89,12 @@ class APCBagOStuff extends BagOStuff {
 
        /**
         * @param string $key
-        * @param Closure $callback Callback method to be executed
+        * @param callable $callback Callback method to be executed
         * @param int $exptime Either an interval in seconds or a unix timestamp for expiry
         * @param int $attempts The amount of times to attempt a merge in case of failure
         * @return bool Success
         */
-       public function merge( $key, Closure $callback, $exptime = 0, $attempts = 10 ) {
+       public function merge( $key, $callback, $exptime = 0, $attempts = 10 ) {
                return $this->mergeViaLock( $key, $callback, $exptime, $attempts );
        }
 
index 0a23446..2c10742 100644 (file)
  * @defgroup Cache Cache
  */
 
+use Psr\Log\LoggerAwareInterface;
+use Psr\Log\LoggerInterface;
+use Psr\Log\NullLogger;
+
 /**
  * interface is intended to be more or less compatible with
  * the PHP memcached client.
  *
  * @ingroup Cache
  */
-abstract class BagOStuff {
+abstract class BagOStuff implements LoggerAwareInterface {
        private $debugMode = false;
 
        protected $lastError = self::ERR_NONE;
 
+       /**
+        * @var LoggerInterface
+        */
+       protected $logger;
+
        /** Possible values for getLastError() */
        const ERR_NONE = 0; // no error
        const ERR_NO_RESPONSE = 1; // no response
        const ERR_UNREACHABLE = 2; // can't connect
        const ERR_UNEXPECTED = 3; // response gave some error
 
+       public function __construct( array $params = array() ) {
+               if ( isset( $params['logger'] ) ) {
+                       $this->setLogger( $params['logger'] );
+               } else {
+                       $this->setLogger( new NullLogger() );
+               }
+       }
+
+       /**
+        * @param LoggerInterface $logger
+        * @return null
+        */
+       public function setLogger( LoggerInterface $logger ) {
+               $this->logger = $logger;
+       }
+
        /**
         * @param bool $bool
         */
@@ -58,9 +83,6 @@ abstract class BagOStuff {
                $this->debugMode = $bool;
        }
 
-       /* *** THE GUTS OF THE OPERATION *** */
-       /* Override these with functional things in subclasses */
-
        /**
         * Get an item with the given key. Returns false if it does not exist.
         * @param string $key
@@ -78,23 +100,12 @@ abstract class BagOStuff {
         */
        abstract public function set( $key, $value, $exptime = 0 );
 
-       /**
-        * Check and set an item.
-        * @param mixed $casToken
-        * @param string $key
-        * @param mixed $value
-        * @param int $exptime Either an interval in seconds or a unix timestamp for expiry
-        * @return bool Success
-        */
-       abstract public function cas( $casToken, $key, $value, $exptime = 0 );
-
        /**
         * Delete an item.
         * @param string $key
-        * @param int $time Amount of time to delay the operation (mostly memcached-specific)
         * @return bool True if the item was deleted or not found, false on failure
         */
-       abstract public function delete( $key, $time = 0 );
+       abstract public function delete( $key );
 
        /**
         * Merge changes into the existing cache value (possibly creating a new one).
@@ -102,12 +113,16 @@ abstract class BagOStuff {
         * and takes the arguments: (this BagOStuff object, cache key, current value).
         *
         * @param string $key
-        * @param Closure $callback Callback method to be executed
+        * @param callable $callback Callback method to be executed
         * @param int $exptime Either an interval in seconds or a unix timestamp for expiry
         * @param int $attempts The amount of times to attempt a merge in case of failure
         * @return bool Success
         */
-       public function merge( $key, Closure $callback, $exptime = 0, $attempts = 10 ) {
+       public function merge( $key, $callback, $exptime = 0, $attempts = 10 ) {
+               if ( !is_callable( $callback ) ) {
+                       throw new Exception( "Got invalid callback." );
+               }
+
                return $this->mergeViaCas( $key, $callback, $exptime, $attempts );
        }
 
@@ -115,16 +130,17 @@ abstract class BagOStuff {
         * @see BagOStuff::merge()
         *
         * @param string $key
-        * @param Closure $callback Callback method to be executed
+        * @param callable $callback Callback method to be executed
         * @param int $exptime Either an interval in seconds or a unix timestamp for expiry
         * @param int $attempts The amount of times to attempt a merge in case of failure
         * @return bool Success
         */
-       protected function mergeViaCas( $key, Closure $callback, $exptime = 0, $attempts = 10 ) {
+       protected function mergeViaCas( $key, $callback, $exptime = 0, $attempts = 10 ) {
                do {
                        $casToken = null; // passed by reference
-                       $currentValue = $this->get( $key, $casToken ); // get the old value
-                       $value = $callback( $this, $key, $currentValue ); // derive the new value
+                       $currentValue = $this->get( $key, $casToken );
+                       // Derive the new value from the old value
+                       $value = call_user_func( $callback, $this, $key, $currentValue );
 
                        if ( $value === false ) {
                                $success = true; // do nothing
@@ -140,22 +156,33 @@ abstract class BagOStuff {
                return $success;
        }
 
+       /**
+        * Check and set an item.
+        * @param mixed $casToken
+        * @param string $key
+        * @param mixed $value
+        * @param int $exptime Either an interval in seconds or a unix timestamp for expiry
+        * @return bool Success
+        */
+       abstract protected function cas( $casToken, $key, $value, $exptime = 0 );
+
        /**
         * @see BagOStuff::merge()
         *
         * @param string $key
-        * @param Closure $callback Callback method to be executed
+        * @param callable $callback Callback method to be executed
         * @param int $exptime Either an interval in seconds or a unix timestamp for expiry
         * @param int $attempts The amount of times to attempt a merge in case of failure
         * @return bool Success
         */
-       protected function mergeViaLock( $key, Closure $callback, $exptime = 0, $attempts = 10 ) {
+       protected function mergeViaLock( $key, $callback, $exptime = 0, $attempts = 10 ) {
                if ( !$this->lock( $key, 6 ) ) {
                        return false;
                }
 
-               $currentValue = $this->get( $key ); // get the old value
-               $value = $callback( $this, $key, $currentValue ); // derive the new value
+               $currentValue = $this->get( $key );
+               // Derive the new value from the old value
+               $value = call_user_func( $callback, $this, $key, $currentValue );
 
                if ( $value === false ) {
                        $success = true; // do nothing
@@ -192,7 +219,7 @@ abstract class BagOStuff {
                $locked = false; // lock acquired
                $attempts = 0; // failed attempts
                do {
-                       if ( ++$attempts >= 3 && $sleep <= 1e6 ) {
+                       if ( ++$attempts >= 3 && $sleep <= 5e5 ) {
                                // Exponentially back off after failed attempts to avoid network spam.
                                // About 2*$uRTT*(2^n-1) us of "sleep" happen for the next n attempts.
                                $sleep *= 2;
@@ -356,10 +383,11 @@ abstract class BagOStuff {
        /**
         * @param string $text
         */
-       public function debug( $text ) {
+       protected function debug( $text ) {
                if ( $this->debugMode ) {
-                       $class = get_class( $this );
-                       wfDebug( "$class debug: $text\n" );
+                       $this->logger->debug( "{class} debug: $text", array(
+                               'class' => get_class( $this ),
+                       ) );
                }
        }
 
index 9595b83..0fc65d9 100644 (file)
@@ -33,7 +33,7 @@ class EmptyBagOStuff extends BagOStuff {
         * @param mixed $casToken [optional]
         * @return bool
         */
-       function get( $key, &$casToken = null ) {
+       public function get( $key, &$casToken = null ) {
                return false;
        }
 
@@ -43,7 +43,7 @@ class EmptyBagOStuff extends BagOStuff {
         * @param int $exp
         * @return bool
         */
-       function set( $key, $value, $exp = 0 ) {
+       public function set( $key, $value, $exp = 0 ) {
                return true;
        }
 
@@ -54,27 +54,26 @@ class EmptyBagOStuff extends BagOStuff {
         * @param int $exp
         * @return bool
         */
-       function cas( $casToken, $key, $value, $exp = 0 ) {
+       protected function cas( $casToken, $key, $value, $exp = 0 ) {
                return true;
        }
 
        /**
         * @param string $key
-        * @param int $time
         * @return bool
         */
-       function delete( $key, $time = 0 ) {
+       public function delete( $key ) {
                return true;
        }
 
        /**
         * @param string $key
-        * @param Closure $callback Callback method to be executed
+        * @param callable $callback Callback method to be executed
         * @param int $exptime Either an interval in seconds or a unix timestamp for expiry
         * @param int $attempts The amount of times to attempt a merge in case of failure
         * @return bool Success
         */
-       public function merge( $key, Closure $callback, $exptime = 0, $attempts = 10 ) {
+       public function merge( $key, $callback, $exptime = 0, $attempts = 10 ) {
                return true;
        }
 }
index 06a0865..278a74e 100644 (file)
@@ -31,7 +31,8 @@ class HashBagOStuff extends BagOStuff {
        /** @var array */
        protected $bag;
 
-       function __construct() {
+       function __construct( $params = array() ) {
+               parent::__construct( $params );
                $this->bag = array();
        }
 
@@ -56,7 +57,7 @@ class HashBagOStuff extends BagOStuff {
         * @param mixed $casToken [optional]
         * @return bool|mixed
         */
-       function get( $key, &$casToken = null ) {
+       public function get( $key, &$casToken = null ) {
                if ( !isset( $this->bag[$key] ) ) {
                        return false;
                }
@@ -76,7 +77,7 @@ class HashBagOStuff extends BagOStuff {
         * @param int $exptime
         * @return bool
         */
-       function set( $key, $value, $exptime = 0 ) {
+       public function set( $key, $value, $exptime = 0 ) {
                $this->bag[$key] = array( $value, $this->convertExpiry( $exptime ) );
                return true;
        }
@@ -88,7 +89,7 @@ class HashBagOStuff extends BagOStuff {
         * @param int $exptime
         * @return bool
         */
-       function cas( $casToken, $key, $value, $exptime = 0 ) {
+       protected function cas( $casToken, $key, $value, $exptime = 0 ) {
                if ( $this->get( $key ) === $casToken ) {
                        return $this->set( $key, $value, $exptime );
                }
@@ -98,10 +99,9 @@ class HashBagOStuff extends BagOStuff {
 
        /**
         * @param string $key
-        * @param int $time
         * @return bool
         */
-       function delete( $key, $time = 0 ) {
+       function delete( $key ) {
                if ( !isset( $this->bag[$key] ) ) {
                        return false;
                }
index 0e133a8..ac34570 100644 (file)
@@ -84,18 +84,17 @@ class MemcachedBagOStuff extends BagOStuff {
         * @param int $exptime
         * @return bool
         */
-       public function cas( $casToken, $key, $value, $exptime = 0 ) {
+       protected function cas( $casToken, $key, $value, $exptime = 0 ) {
                return $this->client->cas( $casToken, $this->encodeKey( $key ),
                        $value, $this->fixExpiry( $exptime ) );
        }
 
        /**
         * @param string $key
-        * @param int $time
         * @return bool
         */
-       public function delete( $key, $time = 0 ) {
-               return $this->client->delete( $this->encodeKey( $key ), $time );
+       public function delete( $key ) {
+               return $this->client->delete( $this->encodeKey( $key ) );
        }
 
        /**
@@ -174,6 +173,6 @@ class MemcachedBagOStuff extends BagOStuff {
         * @param string $text
         */
        protected function debugLog( $text ) {
-               wfDebugLog( 'memcached', $text );
+               $this->logger->debug( $text );
        }
 }
index 1e04d45..bc4a00b 100644 (file)
@@ -64,6 +64,9 @@
  * @version 0.1.2
  */
 
+use Psr\Log\LoggerInterface;
+use Psr\Log\NullLogger;
+
 // {{{ requirements
 // }}}
 
@@ -233,6 +236,11 @@ class MWMemcached {
         */
        public $_connect_attempts;
 
+       /**
+        * @var LoggerInterface
+        */
+       private $_logger;
+
        // }}}
        // }}}
        // {{{ methods
@@ -263,6 +271,8 @@ class MWMemcached {
 
                $this->_connect_timeout = isset( $args['connect_timeout'] ) ? $args['connect_timeout'] : 0.1;
                $this->_connect_attempts = 2;
+
+               $this->_logger = isset( $args['logger'] ) ? $args['logger'] : new NullLogger();
        }
 
        // }}}
@@ -1104,14 +1114,14 @@ class MWMemcached {
         * @param string $text
         */
        function _debugprint( $text ) {
-               wfDebugLog( 'memcached', $text );
+               $this->_logger->debug( $text );
        }
 
        /**
         * @param string $text
         */
        function _error_log( $text ) {
-               wfDebugLog( 'memcached-serious', "Memcached error: $text" );
+               $this->_logger->error( "Memcached error: $text" );
        }
 
        /**
index 7c0a645..f2c4928 100644 (file)
@@ -46,6 +46,7 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
         * @throws MWException
         */
        function __construct( $params ) {
+               parent::__construct( $params );
                $params = $this->applyDefaultParams( $params );
 
                if ( $params['persistent'] ) {
@@ -54,7 +55,7 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
                        // We can only reuse a pool ID if we keep the config consistent.
                        $this->client = new Memcached( md5( serialize( $params ) ) );
                        if ( count( $this->client->getServerList() ) ) {
-                               wfDebug( __METHOD__ . ": persistent Memcached object already loaded.\n" );
+                               $this->logger->debug( __METHOD__ . ": persistent Memcached object already loaded." );
                                return; // already initialized; don't add duplicate servers
                        }
                } else {
@@ -144,19 +145,18 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
         * @param int $exptime
         * @return bool
         */
-       public function cas( $casToken, $key, $value, $exptime = 0 ) {
+       protected function cas( $casToken, $key, $value, $exptime = 0 ) {
                $this->debugLog( "cas($key)" );
                return $this->checkResult( $key, parent::cas( $casToken, $key, $value, $exptime ) );
        }
 
        /**
         * @param string $key
-        * @param int $time
         * @return bool
         */
-       public function delete( $key, $time = 0 ) {
+       public function delete( $key ) {
                $this->debugLog( "delete($key)" );
-               $result = parent::delete( $key, $time );
+               $result = parent::delete( $key );
                if ( $result === false && $this->client->getResultCode() === Memcached::RES_NOTFOUND ) {
                        // "Not found" is counted as success in our interface
                        return true;
@@ -223,14 +223,16 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
                                break;
                        default:
                                $msg = $this->client->getResultMessage();
+                               $logCtx = array();
                                if ( $key !== false ) {
                                        $server = $this->client->getServerByKey( $key );
-                                       $serverName = "{$server['host']}:{$server['port']}";
-                                       $msg = "Memcached error for key \"$key\" on server \"$serverName\": $msg";
+                                       $logCtx['memcached-server'] = "{$server['host']}:{$server['port']}";
+                                       $logCtx['memcached-key'] = $key;
+                                       $msg = "Memcached error for key \"{memcached-key}\" on server \"{memcached-server}\": $msg";
                                } else {
                                        $msg = "Memcached error: $msg";
                                }
-                               wfDebugLog( 'memcached-serious', $msg );
+                               $this->logger->error( $msg, $logCtx );
                                $this->setLastError( BagOStuff::ERR_UNEXPECTED );
                }
                return $result;
index 939a715..6fba61b 100644 (file)
@@ -42,6 +42,7 @@ class MemcachedPhpBagOStuff extends MemcachedBagOStuff {
         * @param array $params
         */
        function __construct( $params ) {
+               parent::__construct( $params );
                $params = $this->applyDefaultParams( $params );
 
                $this->client = new MemCachedClientforWiki( $params );
index 04ed894..f9a8cfe 100644 (file)
@@ -43,6 +43,7 @@ class MultiWriteBagOStuff extends BagOStuff {
         * @throws MWException
         */
        public function __construct( $params ) {
+               parent::__construct( $params );
                if ( !isset( $params['caches'] ) ) {
                        throw new MWException( __METHOD__ . ': the caches parameter is required' );
                }
@@ -83,7 +84,7 @@ class MultiWriteBagOStuff extends BagOStuff {
         * @return bool
         * @throws MWException
         */
-       public function cas( $casToken, $key, $value, $exptime = 0 ) {
+       protected function cas( $casToken, $key, $value, $exptime = 0 ) {
                throw new MWException( "CAS is not implemented in " . __CLASS__ );
        }
 
@@ -99,11 +100,10 @@ class MultiWriteBagOStuff extends BagOStuff {
 
        /**
         * @param string $key
-        * @param int $time
         * @return bool
         */
-       public function delete( $key, $time = 0 ) {
-               return $this->doWrite( 'delete', $key, $time );
+       public function delete( $key ) {
+               return $this->doWrite( 'delete', $key );
        }
 
        /**
@@ -163,12 +163,12 @@ class MultiWriteBagOStuff extends BagOStuff {
 
        /**
         * @param string $key
-        * @param Closure $callback Callback method to be executed
+        * @param callable $callback Callback method to be executed
         * @param int $exptime Either an interval in seconds or a unix timestamp for expiry
         * @param int $attempts The amount of times to attempt a merge in case of failure
         * @return bool Success
         */
-       public function merge( $key, Closure $callback, $exptime = 0, $attempts = 10 ) {
+       public function merge( $key, $callback, $exptime = 0, $attempts = 10 ) {
                return $this->doWrite( 'merge', $key, $callback, $exptime );
        }
 
index 62856f9..1f2c9c0 100644 (file)
@@ -81,6 +81,13 @@ class ObjectCache {
         * @return BagOStuff
         */
        static function newFromParams( $params ) {
+               if ( isset( $params['loggroup'] ) ) {
+                       $params['logger'] = MWLoggerFactory::getInstance( $params['loggroup'] );
+               } else {
+                       // For backwards-compatability with custom parameters, lets not
+                       // have all logging suddenly disappear
+                       $params['logger'] = MWLoggerFactory::getInstance( 'objectcache' );
+               }
                if ( isset( $params['factory'] ) ) {
                        return call_user_func( $params['factory'], $params );
                } elseif ( isset( $params['class'] ) ) {
index 40b40d1..24d2a22 100644 (file)
@@ -28,6 +28,9 @@
  * @ingroup Cache
  */
 class ObjectCacheSessionHandler {
+       /** @var array Map of (session ID => SHA-1 of the data) */
+       protected static $hashCache = array();
+
        /**
         * Install a session handler for the current web request
         */
@@ -51,8 +54,9 @@ class ObjectCacheSessionHandler {
         * Get the cache storage object to use for session storage
         * @return BagOStuff
         */
-       static function getCache() {
+       protected static function getCache() {
                global $wgSessionCacheType;
+
                return ObjectCache::getInstance( $wgSessionCacheType );
        }
 
@@ -62,10 +66,18 @@ class ObjectCacheSessionHandler {
         * @param string $id Session id
         * @return string Cache key
         */
-       static function getKey( $id ) {
+       protected static function getKey( $id ) {
                return wfMemcKey( 'session', $id );
        }
 
+       /**
+        * @param mixed $data
+        * @return string
+        */
+       protected static function getHash( $data ) {
+               return sha1( serialize( $data ) );
+       }
+
        /**
         * Callback when opening a session.
         *
@@ -95,10 +107,10 @@ class ObjectCacheSessionHandler {
         */
        static function read( $id ) {
                $data = self::getCache()->get( self::getKey( $id ) );
-               if ( $data === false ) {
-                       return '';
-               }
-               return $data;
+
+               self::$hashCache = array( $id => self::getHash( $data ) );
+
+               return ( $data === false ) ? '' : $data;
        }
 
        /**
@@ -110,7 +122,14 @@ class ObjectCacheSessionHandler {
         */
        static function write( $id, $data ) {
                global $wgObjectCacheSessionExpiry;
-               self::getCache()->set( self::getKey( $id ), $data, $wgObjectCacheSessionExpiry );
+
+               // Only issue a write if anything changed (PHP 5.6 already does this)
+               if ( !isset( self::$hashCache[$id] )
+                       || self::getHash( $data ) !== self::$hashCache[$id]
+               ) {
+                       self::getCache()->set( self::getKey( $id ), $data, $wgObjectCacheSessionExpiry );
+               }
+
                return true;
        }
 
@@ -122,6 +141,7 @@ class ObjectCacheSessionHandler {
         */
        static function destroy( $id ) {
                self::getCache()->delete( self::getKey( $id ) );
+
                return true;
        }
 
index 6836f74..b1be9d8 100644 (file)
@@ -56,6 +56,7 @@ class RedisBagOStuff extends BagOStuff {
         * @param array $params
         */
        function __construct( $params ) {
+               parent::__construct( $params );
                $redisConf = array( 'serializer' => 'none' ); // manage that in this class
                foreach ( array( 'connectTimeout', 'persistent', 'password' ) as $opt ) {
                        if ( isset( $params[$opt] ) ) {
@@ -114,7 +115,7 @@ class RedisBagOStuff extends BagOStuff {
                return $result;
        }
 
-       public function cas( $casToken, $key, $value, $expiry = 0 ) {
+       protected function cas( $casToken, $key, $value, $expiry = 0 ) {
 
                list( $server, $conn ) = $this->getConnection( $key );
                if ( !$conn ) {
@@ -147,7 +148,7 @@ class RedisBagOStuff extends BagOStuff {
                return $result;
        }
 
-       public function delete( $key, $time = 0 ) {
+       public function delete( $key ) {
 
                list( $server, $conn ) = $this->getConnection( $key );
                if ( !$conn ) {
@@ -363,7 +364,7 @@ class RedisBagOStuff extends BagOStuff {
         * @param string $msg
         */
        protected function logError( $msg ) {
-               wfDebugLog( 'redis', "Redis error: $msg" );
+               $this->logger->error( "Redis error: $msg" );
        }
 
        /**
index 7524240..b9a9985 100644 (file)
@@ -88,6 +88,7 @@ class SqlBagOStuff extends BagOStuff {
         * @param array $params
         */
        public function __construct( $params ) {
+               parent::__construct( $params );
                if ( isset( $params['servers'] ) ) {
                        $this->serverInfos = $params['servers'];
                        $this->numServers = count( $this->serverInfos );
@@ -138,12 +139,12 @@ class SqlBagOStuff extends BagOStuff {
                        # If server connection info was given, use that
                        if ( $this->serverInfos ) {
                                if ( $wgDebugDBTransactions ) {
-                                       wfDebug( "Using provided serverInfo for SqlBagOStuff\n" );
+                                       $this->logger->debug( "Using provided serverInfo for SqlBagOStuff" );
                                }
                                $info = $this->serverInfos[$serverIndex];
                                $type = isset( $info['type'] ) ? $info['type'] : 'mysql';
                                $host = isset( $info['host'] ) ? $info['host'] : '[unknown]';
-                               wfDebug( __CLASS__ . ": connecting to $host\n" );
+                               $this->logger->debug( __CLASS__ . ": connecting to $host" );
                                $db = DatabaseBase::factory( $type, $info );
                                $db->clearFlag( DBO_TRX );
                        } else {
@@ -161,7 +162,7 @@ class SqlBagOStuff extends BagOStuff {
                                }
                        }
                        if ( $wgDebugDBTransactions ) {
-                               wfDebug( sprintf( "Connection %s will be used for SqlBagOStuff\n", $db ) );
+                               $this->logger->debug( sprintf( "Connection %s will be used for SqlBagOStuff", $db ) );
                        }
                        $this->conns[$serverIndex] = $db;
                }
@@ -404,7 +405,7 @@ class SqlBagOStuff extends BagOStuff {
         * @param int $exptime
         * @return bool
         */
-       public function cas( $casToken, $key, $value, $exptime = 0 ) {
+       protected function cas( $casToken, $key, $value, $exptime = 0 ) {
                list( $serverIndex, $tableName ) = $this->getTableByKey( $key );
                try {
                        $db = $this->getDB( $serverIndex );
@@ -446,10 +447,9 @@ class SqlBagOStuff extends BagOStuff {
 
        /**
         * @param string $key
-        * @param int $time
         * @return bool
         */
-       public function delete( $key, $time = 0 ) {
+       public function delete( $key ) {
                list( $serverIndex, $tableName ) = $this->getTableByKey( $key );
                try {
                        $db = $this->getDB( $serverIndex );
@@ -702,13 +702,13 @@ class SqlBagOStuff extends BagOStuff {
                if ( $exception instanceof DBConnectionError ) {
                        $this->markServerDown( $exception, $serverIndex );
                }
-               wfDebugLog( 'SQLBagOStuff', "DBError: {$exception->getMessage()}" );
+               $this->logger->error( "DBError: {$exception->getMessage()}" );
                if ( $exception instanceof DBConnectionError ) {
                        $this->setLastError( BagOStuff::ERR_UNREACHABLE );
-                       wfDebug( __METHOD__ . ": ignoring connection error\n" );
+                       $this->logger->debug( __METHOD__ . ": ignoring connection error" );
                } else {
                        $this->setLastError( BagOStuff::ERR_UNEXPECTED );
-                       wfDebug( __METHOD__ . ": ignoring query error\n" );
+                       $this->logger->debug( __METHOD__ . ": ignoring query error" );
                }
        }
 
@@ -728,13 +728,14 @@ class SqlBagOStuff extends BagOStuff {
                        } catch ( DBError $e ) {
                        }
                }
-               wfDebugLog( 'SQLBagOStuff', "DBError: {$exception->getMessage()}" );
+
+               $this->logger->error( "DBError: {$exception->getMessage()}" );
                if ( $exception instanceof DBConnectionError ) {
                        $this->setLastError( BagOStuff::ERR_UNREACHABLE );
-                       wfDebug( __METHOD__ . ": ignoring connection error\n" );
+                       $this->logger->debug( __METHOD__ . ": ignoring connection error" );
                } else {
                        $this->setLastError( BagOStuff::ERR_UNEXPECTED );
-                       wfDebug( __METHOD__ . ": ignoring query error\n" );
+                       $this->logger->debug( __METHOD__ . ": ignoring query error" );
                }
        }
 
@@ -750,12 +751,12 @@ class SqlBagOStuff extends BagOStuff {
                                unset( $this->connFailureTimes[$serverIndex] );
                                unset( $this->connFailureErrors[$serverIndex] );
                        } else {
-                               wfDebug( __METHOD__ . ": Server #$serverIndex already down\n" );
+                               $this->logger->debug( __METHOD__ . ": Server #$serverIndex already down" );
                                return;
                        }
                }
                $now = time();
-               wfDebug( __METHOD__ . ": Server #$serverIndex down until " . ( $now + 60 ) . "\n" );
+               $this->logger->info( __METHOD__ . ": Server #$serverIndex down until " . ( $now + 60 ) );
                $this->connFailureTimes[$serverIndex] = $now;
                $this->connFailureErrors[$serverIndex] = $exception;
        }
@@ -779,9 +780,3 @@ class SqlBagOStuff extends BagOStuff {
                }
        }
 }
-
-/**
- * Backwards compatibility alias
- */
-class MediaWikiBagOStuff extends SqlBagOStuff {
-}
index 78a512c..f59ed4e 100644 (file)
@@ -73,7 +73,7 @@ class WinCacheBagOStuff extends BagOStuff {
         * @param int $exptime Expiration time
         * @return bool
         */
-       public function cas( $casToken, $key, $value, $exptime = 0 ) {
+       protected function cas( $casToken, $key, $value, $exptime = 0 ) {
                return wincache_ucache_cas( $key, $casToken, serialize( $value ) );
        }
 
@@ -81,10 +81,9 @@ class WinCacheBagOStuff extends BagOStuff {
         * Remove a value from the WinCache object cache
         *
         * @param string $key Cache key
-        * @param int $time Not used in this implementation
         * @return bool
         */
-       public function delete( $key, $time = 0 ) {
+       public function delete( $key ) {
                wincache_ucache_delete( $key );
 
                return true;
index d7603b1..9be6624 100644 (file)
@@ -76,7 +76,7 @@ class XCacheBagOStuff extends BagOStuff {
         * @return bool
         * @throws MWException
         */
-       public function cas( $casToken, $key, $value, $exptime = 0 ) {
+       protected function cas( $casToken, $key, $value, $exptime = 0 ) {
                // Can't find any documentation on xcache cas
                throw new MWException( "CAS is not implemented in " . __CLASS__ );
        }
@@ -85,10 +85,9 @@ class XCacheBagOStuff extends BagOStuff {
         * Remove a value from the XCache object cache
         *
         * @param string $key Cache key
-        * @param int $time Not used in this implementation
         * @return bool
         */
-       public function delete( $key, $time = 0 ) {
+       public function delete( $key ) {
                xcache_unset( $key );
                return true;
        }
@@ -99,12 +98,12 @@ class XCacheBagOStuff extends BagOStuff {
         * provide a way to perform CAS-like functionality.
         *
         * @param string $key
-        * @param Closure $callback Callback method to be executed
+        * @param callable $callback Callback method to be executed
         * @param int $exptime Either an interval in seconds or a unix timestamp for expiry
         * @param int $attempts The amount of times to attempt a merge in case of failure
         * @return bool Success
         */
-       public function merge( $key, Closure $callback, $exptime = 0, $attempts = 10 ) {
+       public function merge( $key, $callback, $exptime = 0, $attempts = 10 ) {
                return $this->mergeViaLock( $key, $callback, $exptime, $attempts );
        }
 
index 0fc251e..83c3241 100644 (file)
@@ -687,9 +687,8 @@ class Article implements Page {
                                        $this->mParserOutput = $poolArticleView->getParserOutput();
                                        $outputPage->addParserOutput( $this->mParserOutput );
                                        if ( $content->getRedirectTarget() ) {
-                                               $outputPage->addSubtitle(
-                                                       "<span id=\"redirectsub\">" . wfMessage( 'redirectpagesub' )->parse() . "</span>"
-                                               );
+                                               $outputPage->addSubtitle( "<span id=\"redirectsub\">" .
+                                                       $this->getContext()->msg( 'redirectpagesub' )->parse() . "</span>" );
                                        }
 
                                        # Don't cache a dirty ParserOutput object
@@ -708,7 +707,7 @@ class Article implements Page {
                }
 
                # Get the ParserOutput actually *displayed* here.
-               # Note that $this->mParserOutput is the *current* version output.
+               # Note that $this->mParserOutput is the *current*/oldid version output.
                $pOutput = ( $outputDone instanceof ParserOutput )
                        ? $outputDone // object fetched by hook
                        : $this->mParserOutput;
@@ -757,9 +756,8 @@ class Article implements Page {
         * Show a diff page according to current request variables. For use within
         * Article::view() only, other callers should use the DifferenceEngine class.
         *
-        * @todo Make protected
         */
-       public function showDiffPage() {
+       protected function showDiffPage() {
                $request = $this->getContext()->getRequest();
                $user = $this->getContext()->getUser();
                $diff = $request->getVal( 'diff' );
@@ -1326,7 +1324,8 @@ class Article implements Page {
                        return;
                }
 
-               $unhide = $this->getContext()->getRequest()->getInt( 'unhide' ) == 1;
+               $context = $this->getContext();
+               $unhide = $context->getRequest()->getInt( 'unhide' ) == 1;
 
                # Cascade unhide param in links for easy deletion browsing
                $extraParams = array();
@@ -1343,8 +1342,8 @@ class Article implements Page {
                $timestamp = $revision->getTimestamp();
 
                $current = ( $oldid == $this->mPage->getLatest() );
-               $language = $this->getContext()->getLanguage();
-               $user = $this->getContext()->getUser();
+               $language = $context->getLanguage();
+               $user = $context->getUser();
 
                $td = $language->userTimeAndDate( $timestamp, $user );
                $tddate = $language->userDate( $timestamp, $user );
@@ -1353,13 +1352,13 @@ class Article implements Page {
                # Show user links if allowed to see them. If hidden, then show them only if requested...
                $userlinks = Linker::revUserTools( $revision, !$unhide );
 
-               $infomsg = $current && !wfMessage( 'revision-info-current' )->isDisabled()
+               $infomsg = $current && !$context->msg( 'revision-info-current' )->isDisabled()
                        ? 'revision-info-current'
                        : 'revision-info';
 
-               $outputPage = $this->getContext()->getOutput();
+               $outputPage = $context->getOutput();
                $outputPage->addSubtitle( "<div id=\"mw-{$infomsg}\">" .
-                       wfMessage( $infomsg, $td )
+                       $context->msg( $infomsg, $td )
                                ->rawParams( $userlinks )
                                ->params( $revision->getID(), $tddate, $tdtime, $revision->getUserText() )
                                ->rawParams( Linker::revComment( $revision, true, true ) )
@@ -1368,18 +1367,18 @@ class Article implements Page {
                );
 
                $lnk = $current
-                       ? wfMessage( 'currentrevisionlink' )->escaped()
+                       ? $context->msg( 'currentrevisionlink' )->escaped()
                        : Linker::linkKnown(
                                $this->getTitle(),
-                               wfMessage( 'currentrevisionlink' )->escaped(),
+                               $context->msg( 'currentrevisionlink' )->escaped(),
                                array(),
                                $extraParams
                        );
                $curdiff = $current
-                       ? wfMessage( 'diff' )->escaped()
+                       ? $context->msg( 'diff' )->escaped()
                        : Linker::linkKnown(
                                $this->getTitle(),
-                               wfMessage( 'diff' )->escaped(),
+                               $context->msg( 'diff' )->escaped(),
                                array(),
                                array(
                                        'diff' => 'cur',
@@ -1390,30 +1389,30 @@ class Article implements Page {
                $prevlink = $prev
                        ? Linker::linkKnown(
                                $this->getTitle(),
-                               wfMessage( 'previousrevision' )->escaped(),
+                               $context->msg( 'previousrevision' )->escaped(),
                                array(),
                                array(
                                        'direction' => 'prev',
                                        'oldid' => $oldid
                                ) + $extraParams
                        )
-                       : wfMessage( 'previousrevision' )->escaped();
+                       : $context->msg( 'previousrevision' )->escaped();
                $prevdiff = $prev
                        ? Linker::linkKnown(
                                $this->getTitle(),
-                               wfMessage( 'diff' )->escaped(),
+                               $context->msg( 'diff' )->escaped(),
                                array(),
                                array(
                                        'diff' => 'prev',
                                        'oldid' => $oldid
                                ) + $extraParams
                        )
-                       : wfMessage( 'diff' )->escaped();
+                       : $context->msg( 'diff' )->escaped();
                $nextlink = $current
-                       ? wfMessage( 'nextrevision' )->escaped()
+                       ? $context->msg( 'nextrevision' )->escaped()
                        : Linker::linkKnown(
                                $this->getTitle(),
-                               wfMessage( 'nextrevision' )->escaped(),
+                               $context->msg( 'nextrevision' )->escaped(),
                                array(),
                                array(
                                        'direction' => 'next',
@@ -1421,10 +1420,10 @@ class Article implements Page {
                                ) + $extraParams
                        );
                $nextdiff = $current
-                       ? wfMessage( 'diff' )->escaped()
+                       ? $context->msg( 'diff' )->escaped()
                        : Linker::linkKnown(
                                $this->getTitle(),
-                               wfMessage( 'diff' )->escaped(),
+                               $context->msg( 'diff' )->escaped(),
                                array(),
                                array(
                                        'diff' => 'next',
@@ -1438,7 +1437,7 @@ class Article implements Page {
                }
 
                $outputPage->addSubtitle( "<div id=\"mw-revision-nav\">" . $cdel .
-                       wfMessage( 'revision-nav' )->rawParams(
+                       $context->msg( 'revision-nav' )->rawParams(
                                $prevdiff, $prevlink, $lnk, $curdiff, $nextlink, $nextdiff
                        )->escaped() . "</div>" );
        }
@@ -1458,7 +1457,7 @@ class Article implements Page {
                $lang = $this->getTitle()->getPageLanguage();
                $out = $this->getContext()->getOutput();
                if ( $appendSubtitle ) {
-                       $out->addSubtitle( wfMessage( 'redirectpagesub' )->parse() );
+                       $out->addSubtitle( wfMessage( 'redirectpagesub' ) );
                }
                $out->addModuleStyles( 'mediawiki.action.view.redirectPage' );
                return static::getRedirectHeaderHtml( $lang, $target, $forceKnown );
@@ -1494,6 +1493,7 @@ class Article implements Page {
                                ( $forceKnown ? array( 'known', 'noclasses' ) : array() )
                        ) . '</li>';
                }
+               $html .= '</ul>';
 
                $redirectToText = wfMessage( 'redirectto' )->inLanguage( $lang )->text();
 
index b8f67c2..855f233 100644 (file)
@@ -1365,7 +1365,6 @@ class ImageHistoryList extends ContextSource {
                } else {
                        if ( $local ) {
                                $row .= Linker::userLink( $userId, $userText );
-                               $row .= $this->msg( 'word-separator' )->escaped();
                                $row .= '<span style="white-space: nowrap;">';
                                $row .= Linker::userToolLinks( $userId, $userText );
                                $row .= '</span>';
index 8373dc0..fe61f6f 100644 (file)
@@ -2029,7 +2029,8 @@ class WikiPage implements Page, IDBAccessObject {
         * Returns a stdClass with source, pst and output members
         *
         * @param Content $content
-        * @param int|null $revid
+        * @param Revision|int|null $revision Revision object. For backwards compatibility, a
+        *        revision ID is also accepted, but this is deprecated.
         * @param User|null $user
         * @param string|null $serialFormat
         * @param bool $useCache Check shared prepared edit cache
@@ -2039,10 +2040,23 @@ class WikiPage implements Page, IDBAccessObject {
         * @since 1.21
         */
        public function prepareContentForEdit(
-               Content $content, $revid = null, User $user = null, $serialFormat = null, $useCache = true
+               Content $content, $revision = null, User $user = null, $serialFormat = null, $useCache = true
        ) {
                global $wgContLang, $wgUser, $wgAjaxEditStash;
 
+               if ( is_object( $revision ) ) {
+                       $revid = $revision->getId();
+               } else {
+                       $revid = $revision;
+                       // This code path is deprecated, and nothing is known to
+                       // use it, so performance here shouldn't be a worry.
+                       if ( $revid !== null ) {
+                               $revision = Revision::newFromId( $revid, Revision::READ_LATEST );
+                       } else {
+                               $revision = null;
+                       }
+               }
+
                $user = is_null( $user ) ? $wgUser : $user;
                //XXX: check $user->getId() here???
 
@@ -2092,6 +2106,25 @@ class WikiPage implements Page, IDBAccessObject {
                if ( $cachedEdit ) {
                        $edit->output = $cachedEdit->output;
                } else {
+                       if ( $revision ) {
+                               // We get here if vary-revision is set. This means that this page references
+                               // itself (such as via self-transclusion). In this case, we need to make sure
+                               // that any such self-references refer to the newly-saved revision, and not
+                               // to the previous one, which could otherwise happen due to slave lag.
+                               $oldCallback = $edit->popts->setCurrentRevisionCallback(
+                                       function ( $title, $parser = false ) use ( $revision, &$oldCallback ) {
+                                               if ( $title->equals( $revision->getTitle() ) ) {
+                                                       return $revision;
+                                               } else {
+                                                       return call_user_func(
+                                                               $oldCallback,
+                                                               $title,
+                                                               $parser
+                                                       );
+                                               }
+                                       }
+                               );
+                       }
                        $edit->output = $edit->pstContent
                                ? $edit->pstContent->getParserOutput( $this->mTitle, $revid, $edit->popts )
                                : null;
@@ -2121,10 +2154,12 @@ class WikiPage implements Page, IDBAccessObject {
         * - changed: boolean, whether the revision changed the content (default true)
         * - created: boolean, whether the revision created the page (default false)
         * - moved: boolean, whether the page was moved (default false)
-        * - oldcountable: boolean or null (default null):
+        * - oldcountable: boolean, null, or string 'no-change' (default null):
         *   - boolean: whether the page was counted as an article before that
         *     revision, only used in changed is true and created is false
-        *   - null: don't change the article count
+        *   - null: if created is false, don't update the article count; if created
+        *     is true, do update the article count
+        *   - 'no-change': don't update the article count, ever
         */
        public function doEditUpdates( Revision $revision, User $user, array $options = array() ) {
                global $wgEnableParserCache;
@@ -2142,7 +2177,7 @@ class WikiPage implements Page, IDBAccessObject {
                // already pre-save transformed once.
                if ( !$this->mPreparedEdit || $this->mPreparedEdit->output->getFlag( 'vary-revision' ) ) {
                        wfDebug( __METHOD__ . ": No prepared edit or vary-revision is set...\n" );
-                       $editInfo = $this->prepareContentForEdit( $content, $revision->getId(), $user );
+                       $editInfo = $this->prepareContentForEdit( $content, $revision, $user );
                } else {
                        wfDebug( __METHOD__ . ": No vary-revision, using prepared edit...\n" );
                        $editInfo = $this->mPreparedEdit;
@@ -2167,11 +2202,8 @@ class WikiPage implements Page, IDBAccessObject {
                Hooks::run( 'ArticleEditUpdates', array( &$this, &$editInfo, $options['changed'] ) );
 
                if ( Hooks::run( 'ArticleEditUpdatesDeleteFromRecentchanges', array( &$this ) ) ) {
-                       if ( 0 == mt_rand( 0, 99 ) ) {
-                               // Flush old entries from the `recentchanges` table; we do this on
-                               // random requests so as to avoid an increase in writes for no good reason
-                               RecentChange::purgeExpiredChanges();
-                       }
+                       // Flush old entries from the `recentchanges` table
+                       JobQueueGroup::singleton()->push( RecentChangesUpdateJob::newPurgeJob() );
                }
 
                if ( !$this->exists() ) {
@@ -2182,7 +2214,9 @@ class WikiPage implements Page, IDBAccessObject {
                $title = $this->mTitle->getPrefixedDBkey();
                $shortTitle = $this->mTitle->getDBkey();
 
-               if ( !$options['changed'] && !$options['moved'] ) {
+               if ( $options['oldcountable'] === 'no-change' ||
+                       ( !$options['changed'] && !$options['moved'] )
+               ) {
                        $good = 0;
                } elseif ( $options['created'] ) {
                        $good = (int)$this->isCountable( $editInfo );
@@ -2983,8 +3017,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(),
@@ -3344,70 +3378,35 @@ class WikiPage implements Page, IDBAccessObject {
        }
 
        /**
-        * Updates cascading protections
+        * Opportunistically enqueue link update jobs given fresh parser output if useful
         *
-        * @param ParserOutput $parserOutput ParserOutput object for the current version
+        * @param ParserOutput $parserOutput Current version page output
+        * @return bool Whether a job was pushed
+        * @since 1.25
         */
-       public function doCascadeProtectionUpdates( ParserOutput $parserOutput ) {
-               if ( wfReadOnly() || !$this->mTitle->areRestrictionsCascading() ) {
-                       return;
-               }
-
-               // templatelinks or imagelinks tables may have become out of sync,
-               // especially if using variable-based transclusions.
-               // For paranoia, check if things have changed and if
-               // so apply updates to the database. This will ensure
-               // that cascaded protections apply as soon as the changes
-               // are visible.
-
-               // Get templates from templatelinks and images from imagelinks
-               $id = $this->getId();
-
-               $dbLinks = array();
-
-               $dbr = wfGetDB( DB_SLAVE );
-               $res = $dbr->select( array( 'templatelinks' ),
-                       array( 'tl_namespace', 'tl_title' ),
-                       array( 'tl_from' => $id ),
-                       __METHOD__
-               );
-
-               foreach ( $res as $row ) {
-                       $dbLinks["{$row->tl_namespace}:{$row->tl_title}"] = true;
+       public function triggerOpportunisticLinksUpdate( ParserOutput $parserOutput ) {
+               if ( wfReadOnly() ) {
+                       return false;
                }
 
-               $dbr = wfGetDB( DB_SLAVE );
-               $res = $dbr->select( array( 'imagelinks' ),
-                       array( 'il_to' ),
-                       array( 'il_from' => $id ),
-                       __METHOD__
-               );
-
-               foreach ( $res as $row ) {
-                       $dbLinks[NS_FILE . ":{$row->il_to}"] = true;
+               if ( $this->mTitle->areRestrictionsCascading() ) {
+                       // If the page is cascade protecting, the links should really be up-to-date
+                       $params = array( 'prioritize' => true );
+               } elseif ( $parserOutput->hasDynamicContent() ) {
+                       // Assume the output contains time/random based magic words
+                       $params = array();
+               } else {
+                       // If the inclusions are deterministic, the edit-triggered link jobs are enough
+                       return false;
                }
 
-               // Get templates and images from parser output.
-               $poLinks = array();
-               foreach ( $parserOutput->getTemplates() as $ns => $templates ) {
-                       foreach ( $templates as $dbk => $id ) {
-                               $poLinks["$ns:$dbk"] = true;
-                       }
-               }
-               foreach ( $parserOutput->getImages() as $dbk => $id ) {
-                       $poLinks[NS_FILE . ":$dbk"] = true;
+               // Check if the last link refresh was before page_touched
+               if ( $this->getLinksTimestamp() < $this->getTouched() ) {
+                       JobQueueGroup::singleton()->push( new RefreshLinksJob( $this->mTitle, $params ) );
+                       return true;
                }
 
-               // Get the diff
-               $links_diff = array_diff_key( $poLinks, $dbLinks );
-
-               if ( count( $links_diff ) > 0 ) {
-                       // Whee, link updates time.
-                       // Note: we are only interested in links here. We don't need to get
-                       // other DataUpdate items from the parser output.
-                       $u = new LinksUpdate( $this->mTitle, $parserOutput, false );
-                       $u->doUpdate();
-               }
+               return false;
        }
 
        /**
index 82f0e9d..3db8d1e 100644 (file)
@@ -315,8 +315,8 @@ class DateFormatter {
        }
 
        /**
-        * @todo document
-        * @return string
+        * Return a regex that can be used to find month names in string
+        * @return string regex to find the months with
         */
        public function getMonthRegex() {
                $names = array();
@@ -338,7 +338,7 @@ class DateFormatter {
        }
 
        /**
-        * @todo document
+        * Make an ISO year from a year name, for instance: '-1199' from '1200 BC'
         * @param string $year Year name
         * @return string ISO year name
         */
@@ -356,9 +356,10 @@ class DateFormatter {
        }
 
        /**
-        * @todo document
-        * @param string $iso
-        * @return int|string
+        * Make a year one from an ISO year, for instance: '400 BC' from '-0399'.
+        * @param string $iso ISO year
+        * @return int|string int representing year number in case of AD dates, or string containing
+        *   year number and 'BC' at the end otherwise.
         */
        public function makeNormalYear( $iso ) {
                if ( $iso[0] == '-' ) {
index fc7040a..a9b0c82 100644 (file)
@@ -4384,7 +4384,7 @@ class Parser {
                # links - this is for later, but we need the number of headlines right now
                $matches = array();
                $numMatches = preg_match_all(
-                       '/<H(?P<level>[1-6])(?P<attrib>.*?' . '>)\s*(?P<header>[\s\S]*?)\s*<\/H[1-6] *>/i',
+                       '/<H(?P<level>[1-6])(?P<attrib>.*?>)\s*(?P<header>[\s\S]*?)\s*<\/H[1-6] *>/i',
                        $text,
                        $matches
                );
@@ -4538,8 +4538,8 @@ class Parser {
                        # to allow setting directionality in toc items.
                        $tocline = preg_replace(
                                array(
-                                       '#<(?!/?(span|sup|sub|bdi|i|b)(?: [^>]*)?>).*?' . '>#',
-                                       '#<(/?(?:span(?: dir="(?:rtl|ltr)")?|sup|sub|bdi|i|b))(?: .*?)?' . '>#'
+                                       '#<(?!/?(span|sup|sub|bdi|i|b)(?: [^>]*)?>).*?>#',
+                                       '#<(/?(?:span(?: dir="(?:rtl|ltr)")?|sup|sub|bdi|i|b))(?: .*?)?>#'
                                ),
                                array( '', '<$1>' ),
                                $safeHeadline
@@ -4547,7 +4547,7 @@ class Parser {
                        $tocline = trim( $tocline );
 
                        # For the anchor, strip out HTML-y stuff period
-                       $safeHeadline = preg_replace( '/<.*?' . '>/', '', $safeHeadline );
+                       $safeHeadline = preg_replace( '/<.*?>/', '', $safeHeadline );
                        $safeHeadline = Sanitizer::normalizeSectionNameWhitespace( $safeHeadline );
 
                        # Save headline for section edit hint before it's escaped
@@ -4580,7 +4580,7 @@ class Parser {
 
                        # HTML names must be case-insensitively unique (bug 10721).
                        # This does not apply to Unicode characters per
-                       # http://dev.w3.org/html5/spec/infrastructure.html#case-sensitivity-and-string-comparison
+                       # http://www.w3.org/TR/html5/infrastructure.html#case-sensitivity-and-string-comparison
                        # @todo FIXME: We may be changing them depending on the current locale.
                        $arrayKey = strtolower( $safeHeadline );
                        if ( $legacyHeadline === false ) {
@@ -4589,16 +4589,22 @@ class Parser {
                                $legacyArrayKey = strtolower( $legacyHeadline );
                        }
 
-                       # count how many in assoc. array so we can track dupes in anchors
+                       # Create the anchor for linking from the TOC to the section
+                       $anchor = $safeHeadline;
+                       $legacyAnchor = $legacyHeadline;
                        if ( isset( $refers[$arrayKey] ) ) {
-                               $refers[$arrayKey]++;
+                               for ( $i = 2; isset( $refers["${arrayKey}_$i"] ); ++$i );
+                               $anchor .= "_$i";
+                               $refers["${arrayKey}_$i"] = true;
                        } else {
-                               $refers[$arrayKey] = 1;
+                               $refers[$arrayKey] = true;
                        }
-                       if ( isset( $refers[$legacyArrayKey] ) ) {
-                               $refers[$legacyArrayKey]++;
+                       if ( $legacyHeadline !== false && isset( $refers[$legacyArrayKey] ) ) {
+                               for ( $i = 2; isset( $refers["${legacyArrayKey}_$i"] ); ++$i );
+                               $legacyAnchor .= "_$i";
+                               $refers["${legacyArrayKey}_$i"] = true;
                        } else {
-                               $refers[$legacyArrayKey] = 1;
+                               $refers[$legacyArrayKey] = true;
                        }
 
                        # Don't number the heading if it is the only one (looks silly)
@@ -4611,15 +4617,6 @@ class Parser {
                                ) . ' ' . $headline;
                        }
 
-                       # Create the anchor for linking from the TOC to the section
-                       $anchor = $safeHeadline;
-                       $legacyAnchor = $legacyHeadline;
-                       if ( $refers[$arrayKey] > 1 ) {
-                               $anchor .= '_' . $refers[$arrayKey];
-                       }
-                       if ( $legacyHeadline !== false && $refers[$legacyArrayKey] > 1 ) {
-                               $legacyAnchor .= '_' . $refers[$legacyArrayKey];
-                       }
                        if ( $enoughToc && ( !isset( $wgMaxTocLevel ) || $toclevel < $wgMaxTocLevel ) ) {
                                $toc .= Linker::tocLine( $anchor, $tocline,
                                        $numbering, $toclevel, ( $isTemplate ? false : $sectionIndex ) );
@@ -4715,7 +4712,7 @@ class Parser {
                }
 
                # split up and insert constructed headlines
-               $blocks = preg_split( '/<H[1-6].*?' . '>[\s\S]*?<\/H[1-6]>/i', $text );
+               $blocks = preg_split( '/<H[1-6].*?>[\s\S]*?<\/H[1-6]>/i', $text );
                $i = 0;
 
                // build an array of document sections
index 117e04a..da7842a 100644 (file)
@@ -489,9 +489,10 @@ class ParserOutput extends CacheTime {
         * Add a tracking category, getting the title from a system message,
         * or print a debug message if the title is invalid.
         *
-        * Please add any message that you use with this function to
-        * $wgTrackingCategories. That way they will be listed on
-        * Special:TrackingCategories.
+        * Any message used with this function should be registered so it will
+        * show up on Special:TrackingCategories. Core messages should be added
+        * to SpecialTrackingCategories::$coreTrackingCategories, and extensions
+        * should add to "TrackingCategories" in their extension.json.
         *
         * @param string $msg Message key
         * @param Title $title title of the page which is being tracked
@@ -878,6 +879,22 @@ class ParserOutput extends CacheTime {
                $this->mLimitReportData[$key] = $value;
        }
 
+       /**
+        * Check whether the cache TTL was lowered due to dynamic content
+        *
+        * When content is determined by more than hard state (e.g. page edits),
+        * such as template/file transclusions based on the current timestamp or
+        * extension tags that generate lists based on queries, this return true.
+        *
+        * @return bool
+        * @since 1.25
+        */
+       public function hasDynamicContent() {
+               global $wgParserCacheExpireTime;
+
+               return $this->getCacheExpiry() < $wgParserCacheExpireTime;
+       }
+
        /**
         * Get or set the prevent-clickjacking flag
         *
index da20f94..54cbb27 100644 (file)
@@ -159,7 +159,7 @@ class PoolWorkArticleView extends PoolCounterWork {
                }
 
                if ( $isCurrent ) {
-                       $this->page->doCascadeProtectionUpdates( $this->parserOutput );
+                       $this->page->triggerOpportunisticLinksUpdate( $this->parserOutput );
                }
 
                return true;
index 9bb2db9..4b74206 100644 (file)
@@ -48,10 +48,8 @@ abstract class Profiler {
                'udp' => 'ProfilerOutputUdp',
        );
 
-       // @codingStandardsIgnoreStart PSR2.Classes.PropertyDeclaration.Underscore
-       /** @var Profiler Do not call this outside Profiler and ProfileSection */
-       public static $__instance = null;
-       // @codingStandardsIgnoreEnd
+       /** @var Profiler */
+       private static $instance = null;
 
        /**
         * @param array $params
@@ -69,7 +67,7 @@ abstract class Profiler {
         * @return Profiler
         */
        final public static function instance() {
-               if ( self::$__instance === null ) {
+               if ( self::$instance === null ) {
                        global $wgProfiler;
                        if ( is_array( $wgProfiler ) ) {
                                $class = isset( $wgProfiler['class'] ) ? $wgProfiler['class'] : 'ProfilerStub';
@@ -77,12 +75,12 @@ abstract class Profiler {
                                if ( PHP_SAPI === 'cli' || mt_rand( 0, $factor - 1 ) != 0 ) {
                                        $class = 'ProfilerStub';
                                }
-                               self::$__instance = new $class( $wgProfiler );
+                               self::$instance = new $class( $wgProfiler );
                        } else {
-                               self::$__instance = new ProfilerStub( array() );
+                               self::$instance = new ProfilerStub( array() );
                        }
                }
-               return self::$__instance;
+               return self::$instance;
        }
 
        /**
@@ -93,10 +91,10 @@ abstract class Profiler {
         * @since 1.25
         */
        final public static function replaceStubInstance( Profiler $profiler ) {
-               if ( self::$__instance && !( self::$__instance instanceof ProfilerStub ) ) {
+               if ( self::$instance && !( self::$instance instanceof ProfilerStub ) ) {
                        throw new MWException( 'Could not replace non-stub profiler instance.' );
                } else {
-                       self::$__instance = $profiler;
+                       self::$instance = $profiler;
                }
        }
 
index 886bc5a..b313558 100644 (file)
@@ -40,6 +40,79 @@ class TransactionProfiler {
        /** @var array transaction ID => list of (query name, start time, end time) */
        protected $dbTrxMethodTimes = array();
 
+       /** @var array */
+       protected $hits = array(
+               'writes'      => 0,
+               'queries'     => 0,
+               'conns'       => 0,
+               'masterConns' => 0
+       );
+       /** @var array */
+       protected $expect = array(
+               'writes'      => INF,
+               'queries'     => INF,
+               'conns'       => INF,
+               'masterConns' => INF,
+               'maxAffected' => INF
+       );
+       /** @var array */
+       protected $expectBy = array();
+
+       /**
+        * Set performance expectations
+        *
+        * With conflicting expect, the most specific ones will be used
+        *
+        * @param string $event (writes,queries,conns,mConns)
+        * @param integer $value Maximum count of the event
+        * @param string $fname Caller
+        * @since 1.25
+        */
+       public function setExpectation( $event, $value, $fname ) {
+               $this->expect[$event] = isset( $this->expect[$event] )
+                       ? min( $this->expect[$event], $value )
+                       : $value;
+               if ( $this->expect[$event] == $value ) {
+                       $this->expectBy[$event] = $fname;
+               }
+       }
+
+       /**
+        * Reset performance expectations and hit counters
+        *
+        * @since 1.25
+        */
+       public function resetExpectations() {
+               foreach ( $this->hits as &$val ) {
+                       $val = 0;
+               }
+               unset( $val );
+               foreach ( $this->expect as &$val ) {
+                       $val = INF;
+               }
+               unset( $val );
+               $this->expectBy = array();
+       }
+
+       /**
+        * Mark a DB as having been connected to with a new handle
+        *
+        * Note that there can be multiple connections to a single DB.
+        *
+        * @param string $server DB server
+        * @param string $db DB name
+        * @param bool $isMaster
+        */
+       public function recordConnection( $server, $db, $isMaster ) {
+               // Report when too many connections happen...
+               if ( $this->hits['conns']++ == $this->expect['conns'] ) {
+                       $this->reportExpectationViolated( 'conns', "[connect to $server ($db)]" );
+               }
+               if ( $isMaster && $this->hits['masterConns']++ == $this->expect['masterConns'] ) {
+                       $this->reportExpectationViolated( 'masterConns', "[connect to $server ($db)]" );
+               }
+       }
+
        /**
         * Mark a DB as in a transaction with one or more writes pending
         *
@@ -71,14 +144,28 @@ class TransactionProfiler {
         *
         * This assumes that all queries are synchronous (non-overlapping)
         *
-        * @param string $query Function name
+        * @param string $query Function name or generalized SQL
         * @param float $sTime Starting UNIX wall time
         * @param bool $isWrite Whether this is a write query
+        * @param integer $n Number of affected rows
         */
-       public function recordQueryCompletion( $query, $sTime, $isWrite = false ) {
+       public function recordQueryCompletion( $query, $sTime, $isWrite = false, $n = 0 ) {
                $eTime = microtime( true );
                $elapsed = ( $eTime - $sTime );
 
+               if ( $isWrite && $n > $this->expect['maxAffected'] ) {
+                       wfDebugLog( 'DBPerformance',
+                               "Query affected $n row(s):\n" . $query . "\n" . wfBacktrace( true ) );
+               }
+
+               // Report when too many writes/queries happen...
+               if ( $this->hits['queries']++ == $this->expect['queries'] ) {
+                       $this->reportExpectationViolated( 'queries', $query );
+               }
+               if ( $isWrite && $this->hits['writes']++ == $this->expect['writes'] ) {
+                       $this->reportExpectationViolated( 'writes', $query );
+               }
+
                if ( !$this->dbTrxHoldingLocks ) {
                        // Short-circuit
                        return;
@@ -155,4 +242,15 @@ class TransactionProfiler {
                unset( $this->dbTrxHoldingLocks[$name] );
                unset( $this->dbTrxMethodTimes[$name] );
        }
+
+       /**
+        * @param string $expect
+        * @param string $query
+        */
+       protected function reportExpectationViolated( $expect, $query ) {
+               $n = $this->expect[$expect];
+               $by = $this->expectBy[$expect];
+               wfDebugLog( 'DBPerformance',
+                       "Expectation ($expect <= $n) by $by not met:\n$query\n" . wfBacktrace( true ) );
+       }
 }
index 45bea64..a2dcd59 100644 (file)
@@ -11,7 +11,6 @@ class ExtensionProcessor implements Processor {
                'ResourceLoaderSources',
                'ResourceLoaderLESSVars',
                'ResourceLoaderLESSImportPaths',
-               'TrackingCategories',
                'DefaultUserOptions',
                'HiddenPrefs',
                'GroupPermissions',
@@ -117,7 +116,8 @@ class ExtensionProcessor implements Processor {
                $this->extractConfig( $info );
                $this->extractHooks( $info );
                $dir = dirname( $path );
-               $this->extractMessageSettings( $dir, $info );
+               $this->extractExtensionMessagesFiles( $dir, $info );
+               $this->extractMessagesDirs( $dir, $info );
                $this->extractNamespaces( $info );
                $this->extractResourceLoaderModules( $dir, $info );
                if ( isset( $info['callback'] ) ) {
@@ -129,7 +129,8 @@ class ExtensionProcessor implements Processor {
                foreach ( $info as $key => $val ) {
                        if ( in_array( $key, self::$globalSettings ) ) {
                                $this->storeToArray( "wg$key", $val, $this->globals );
-                       } elseif ( !in_array( $key, $this->processed ) ) {
+                       // Ignore anything that starts with a @
+                       } elseif ( $key[0] !== '@' && !in_array( $key, $this->processed ) ) {
                                $this->storeToArray( $key, $val, $this->attributes );
                        }
                }
@@ -184,16 +185,35 @@ class ExtensionProcessor implements Processor {
        }
 
        protected function extractResourceLoaderModules( $dir, array $info ) {
+               $defaultPaths = isset( $info['ResourceFileModulePaths'] )
+                       ? $info['ResourceFileModulePaths']
+                       : false;
+               if ( isset( $defaultPaths['localBasePath'] ) ) {
+                       $defaultPaths['localBasePath'] = "$dir/{$defaultPaths['localBasePath']}";
+               }
+
                if ( isset( $info['ResourceModules'] ) ) {
                        foreach ( $info['ResourceModules'] as $name => $data ) {
                                if ( isset( $data['localBasePath'] ) ) {
                                        $data['localBasePath'] = "$dir/{$data['localBasePath']}";
                                }
+                               if ( $defaultPaths ) {
+                                       $data += $defaultPaths;
+                               }
                                $this->globals['wgResourceModules'][$name] = $data;
                        }
                }
        }
 
+       protected function extractExtensionMessagesFiles( $dir, array $info ) {
+               if ( isset( $info['ExtensionMessagesFiles'] ) ) {
+                       $this->globals["wgExtensionMessagesFiles"] += array_map( function( $file ) use ( $dir ) {
+                               return "$dir/$file";
+                       }, $info['ExtensionMessagesFiles'] );
+                       $this->processed[] = 'ExtensionMessagesFiles';
+               }
+       }
+
        /**
         * Set message-related settings, which need to be expanded to use
         * absolute paths
@@ -201,14 +221,14 @@ class ExtensionProcessor implements Processor {
         * @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 extractMessagesDirs( $dir, array $info ) {
+               if ( isset( $info['MessagesDirs'] ) ) {
+                       foreach ( $info['MessagesDirs'] as $name => $files ) {
+                               foreach ( (array)$files as $file ) {
+                                       $this->globals["wgMessagesDirs"][$name][] = "$dir/$file";
+                               }
                        }
+                       $this->processed[] = 'MessagesDirs';
                }
        }
 
@@ -237,7 +257,9 @@ class ExtensionProcessor implements Processor {
        protected function extractConfig( array $info ) {
                if ( isset( $info['config'] ) ) {
                        foreach ( $info['config'] as $key => $val ) {
-                               $this->globals["wg$key"] = $val;
+                               if ( $key[0] !== '@' ) {
+                                       $this->globals["wg$key"] = $val;
+                               }
                        }
                        $this->processed[] = 'config';
                }
index 44855d8..5b18e72 100644 (file)
@@ -96,6 +96,9 @@ class ExtensionRegistry {
                        foreach ( $this->queued as $path => $mtime ) {
                                $json = file_get_contents( $path );
                                $info = json_decode( $json, /* $assoc = */ true );
+                               if ( !is_array( $info ) ) {
+                                       throw new Exception( "$path is not a valid JSON file." );
+                               }
                                $autoload = $this->processAutoLoader( dirname( $path ), $info );
                                // Set up the autoloader now so custom processors will work
                                $GLOBALS['wgAutoloadClasses'] += $autoload;
@@ -139,8 +142,21 @@ class ExtensionRegistry {
                foreach ( $info['globals'] as $key => $val ) {
                        if ( !isset( $GLOBALS[$key] ) || !$GLOBALS[$key] ) {
                                $GLOBALS[$key] = $val;
-                       } elseif ( is_array( $GLOBALS[$key] ) && is_array( $val ) ) {
+                       } elseif ( $key === 'wgHooks' ) {
+                               // Special case $wgHooks, which requires a recursive merge.
+                               // Ideally it would have been taken care of in the first if block though.
                                $GLOBALS[$key] = array_merge_recursive( $GLOBALS[$key], $val );
+                       } elseif ( $key === 'wgGroupPermissions' ) {
+                               // First merge individual groups
+                               foreach ( $GLOBALS[$key] as $name => &$groupVal ) {
+                                       if ( isset( $val[$name] ) ) {
+                                               $groupVal += $val[$name];
+                                       }
+                               }
+                               // Now merge groups that didn't exist yet
+                               $GLOBALS[$key] += $val;
+                       } elseif ( is_array( $GLOBALS[$key] ) && is_array( $val ) ) {
+                               $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 ) {
@@ -232,29 +248,4 @@ class ExtensionRegistry {
                        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;
-       }
 }
index 15bb13f..1922999 100644 (file)
@@ -35,6 +35,9 @@ class ResourceLoader {
        /** @var bool */
        protected static $debugMode = null;
 
+       /** @var array */
+       private static $lessVars = null;
+
        /**
         * Module name/ResourceLoaderModule object pairs
         * @var array
@@ -1557,9 +1560,13 @@ class ResourceLoader {
         * @return array Map of variable names to string CSS values.
         */
        public static function getLessVars( Config $config ) {
-               $lessVars = $config->get( 'ResourceLoaderLESSVars' );
-               // Sort by key to ensure consistent hashing for cache lookups.
-               ksort( $lessVars );
-               return $lessVars;
+               if ( !self::$lessVars ) {
+                       $lessVars = $config->get( 'ResourceLoaderLESSVars' );
+                       Hooks::run( 'ResourceLoaderGetLessVars', array( &$lessVars ) );
+                       // Sort by key to ensure consistent hashing for cache lookups.
+                       ksort( $lessVars );
+                       self::$lessVars = $lessVars;
+               }
+               return self::$lessVars;
        }
 }
index 0e43f65..c6e345f 100644 (file)
@@ -200,18 +200,22 @@ class ResourceLoaderImage {
                        $format = $context->getFormat();
                }
 
+               $path = $this->getPath( $context );
                if ( $this->getExtension() !== 'svg' ) {
-                       return file_get_contents( $this->getPath( $context ) );
+                       return file_get_contents( $path );
                }
 
                if ( $variant && isset( $this->variants[$variant] ) ) {
                        $data = $this->variantize( $this->variants[$variant], $context );
                } else {
-                       $data = file_get_contents( $this->getPath( $context ) );
+                       $data = file_get_contents( $path );
                }
 
                if ( $format === 'rasterized' ) {
                        $data = $this->rasterize( $data );
+                       if ( !$data ) {
+                               wfDebugLog( 'ResourceLoaderImage', __METHOD__  . " failed to rasterize for $path" );
+                       }
                }
 
                return $data;
@@ -307,8 +311,9 @@ class ResourceLoaderImage {
 
                $svg = $this->massageSvgPathdata( $svg );
 
-               if ( $wgSVGConverter === 'rsvg' ) {
-                       $command = 'rsvg-convert'; // Should be just 'rsvg'? T76476
+               // Sometimes this might be 'rsvg-secure'. Long as it's rsvg.
+               if ( strpos( $wgSVGConverter, 'rsvg' ) === 0 ) {
+                       $command = 'rsvg-convert';
                        if ( $wgSVGConverterPath ) {
                                $command = wfEscapeShellArg( "$wgSVGConverterPath/" ) . $command;
                        }
@@ -339,16 +344,19 @@ class ResourceLoaderImage {
 
                        $metadata = SVGMetadataExtractor::getMetadata( $tempFilenameSvg );
                        if ( !isset( $metadata['width'] ) || !isset( $metadata['height'] ) ) {
+                               unlink( $tempFilenameSvg );
                                return false;
                        }
 
                        $handler = new SvgHandler;
-                       $handler->rasterize( $tempFilenameSvg, $tempFilenamePng, $metadata['width'], $metadata['height'] );
-
-                       $png = file_get_contents( $tempFilenamePng );
-
+                       $res = $handler->rasterize( $tempFilenameSvg, $tempFilenamePng, $metadata['width'], $metadata['height'] );
                        unlink( $tempFilenameSvg );
-                       unlink( $tempFilenamePng );
+
+                       $png = null;
+                       if ( $res === true ) {
+                               $png = file_get_contents( $tempFilenamePng );
+                               unlink( $tempFilenamePng );
+                       }
 
                        return $png ?: false;
                }
index 4c2c2b2..d689044 100644 (file)
@@ -524,8 +524,8 @@ abstract class ResourceLoaderModule {
                        return $data;
                }
 
-               wfDebugLog( 'resourceloader', __METHOD__ . ": New definition hash for module "
-                       . "{$this->getName()} in context {$context->getHash()}: $hash." );
+               wfDebugLog( 'resourceloader', __METHOD__ . ": New definition for module "
+                       . "{$this->getName()} in context \"{$context->getHash()}\"" );
 
                $timestamp = time();
                $cache->set( $key, $timestamp );
index 7315538..4a0fff8 100644 (file)
@@ -137,7 +137,7 @@ class RevDelRevisionList extends RevDelList {
        public function doPostCommitUpdates() {
                $this->title->purgeSquid();
                // Extensions that require referencing previous revisions may need this
-               Hooks::run( 'ArticleRevisionVisibilitySet', array( &$this->title ) );
+               Hooks::run( 'ArticleRevisionVisibilitySet', array( $this->title, $this->ids ) );
                return Status::newGood();
        }
 }
index 255d005..223a2fe 100644 (file)
@@ -45,8 +45,6 @@ class SearchHighlighter {
        public function highlightText( $text, $terms, $contextlines, $contextchars ) {
                global $wgContLang, $wgSearchHighlightBoundaries;
 
-               $fname = __METHOD__;
-
                if ( $text == '' ) {
                        return '';
                }
@@ -444,14 +442,6 @@ class SearchHighlighter {
         * @return mixed
         */
        function removeWiki( $text ) {
-               $fname = __METHOD__;
-
-               // $text = preg_replace( "/'{2,5}/", "", $text );
-               // $text = preg_replace( "/\[[a-z]+:\/\/[^ ]+ ([^]]+)\]/", "\\2", $text );
-               // $text = preg_replace( "/\[\[([^]|]+)\]\]/", "\\1", $text );
-               // $text = preg_replace( "/\[\[([^]]+\|)?([^|]]+)\]\]/", "\\2", $text );
-               // $text = preg_replace( "/\\{\\|(.*?)\\|\\}/", "", $text );
-               // $text = preg_replace( "/\\[\\[[A-Za-z_-]+:([^|]+?)\\]\\]/", "", $text );
                $text = preg_replace( "/\\{\\{([^|]+?)\\}\\}/", "", $text );
                $text = preg_replace( "/\\{\\{([^|]+\\|)(.*?)\\}\\}/", "\\2", $text );
                $text = preg_replace( "/\\[\\[([^|]+?)\\]\\]/", "\\1", $text );
@@ -460,7 +450,6 @@ class SearchHighlighter {
                        array( $this, 'linkReplace' ),
                        $text
                );
-               // $text = preg_replace("/\\[\\[([^|]+\\|)(.*?)\\]\\]/", "\\2", $text);
                $text = preg_replace( "/<\/?[^>]+>/", "", $text );
                $text = preg_replace( "/'''''/", "", $text );
                $text = preg_replace( "/('''|<\/?[iIuUbB]>)/", "", $text );
@@ -503,7 +492,6 @@ class SearchHighlighter {
         */
        public function highlightSimple( $text, $terms, $contextlines, $contextchars ) {
                global $wgContLang;
-               $fname = __METHOD__;
 
                $lines = explode( "\n", $text );
 
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 999dda8..26ee164 100644 (file)
@@ -646,17 +646,17 @@ abstract class Skin extends ContextSource {
 
                return $this->msg( 'retrievedfrom' )
                        ->rawParams( '<a dir="ltr" href="' . $url. '">' . $url . '</a>' )
-                       ->escaped();
+                       ->parse();
        }
 
        /**
-        * @return string
+        * @return string HTML
         */
        function getUndeleteLink() {
                $action = $this->getRequest()->getVal( 'action', 'view' );
 
                if ( $this->getTitle()->userCan( 'deletedhistory', $this->getUser() ) &&
-                       ( $this->getTitle()->getArticleID() == 0 || $action == 'history' ) ) {
+                       ( !$this->getTitle()->exists() || $action == 'history' ) ) {
                        $n = $this->getTitle()->isDeleted();
 
                        if ( $n ) {
@@ -670,7 +670,7 @@ abstract class Skin extends ContextSource {
                                        Linker::linkKnown(
                                                SpecialPage::getTitleFor( 'Undelete', $this->getTitle()->getPrefixedDBkey() ),
                                                $this->msg( 'restorelink' )->numParams( $n )->escaped() )
-                                       )->text();
+                                       )->escaped();
                        }
                }
 
@@ -837,9 +837,12 @@ abstract class Skin extends ContextSource {
        function getPoweredBy() {
                global $wgResourceBasePath;
 
-               $url = htmlspecialchars( "$wgResourceBasePath/resources/assets/poweredby_mediawiki_88x31.png" );
-               $text = '<a href="//www.mediawiki.org/"><img src="' . $url
-                       . '" height="31" width="88" alt="Powered by MediaWiki" /></a>';
+               $url1 = htmlspecialchars( "$wgResourceBasePath/resources/assets/poweredby_mediawiki_88x31.png" );
+               $url1_5 = htmlspecialchars( "$wgResourceBasePath/resources/assets/poweredby_mediawiki_132x47.png" );
+               $url2 = htmlspecialchars( "$wgResourceBasePath/resources/assets/poweredby_mediawiki_176x62.png" );
+               $text = '<a href="//www.mediawiki.org/"><img src="' . $url1
+                       . '" srcset="' . $url1_5 . ' 1.5x, ' . $url2 . ' 2x" '
+                       . 'height="31" width="88" alt="Powered by MediaWiki" /></a>';
                Hooks::run( 'SkinGetPoweredBy', array( &$text, $this ) );
                return $text;
        }
@@ -860,7 +863,7 @@ 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 )->escaped();
+                       $s = ' ' . $this->msg( 'lastmodifiedat', $d, $t )->parse();
                } else {
                        $s = '';
                }
@@ -1163,7 +1166,7 @@ abstract class Skin extends ContextSource {
 
                return array(
                        'href' => $title->getLocalURL( $urlaction ),
-                       'exists' => $title->getArticleID() != 0,
+                       'exists' => $title->isKnown(),
                );
        }
 
@@ -1581,18 +1584,40 @@ abstract class Skin extends ContextSource {
                        $attribs['title'] = wfMessage( 'editsectionhint' )->rawParams( $tooltip )
                                ->inLanguage( $lang )->text();
                }
-               $link = Linker::link( $nt, wfMessage( 'editsection' )->inLanguage( $lang )->text(),
-                       $attribs,
-                       array( 'action' => 'edit', 'section' => $section ),
-                       array( 'noclasses', 'known' )
+
+               $links = array(
+                       'editsection' => array(
+                               'text' => wfMessage( 'editsection' )->inLanguage( $lang )->text(),
+                               'targetTitle' => $nt,
+                               'attribs' => $attribs,
+                               'query' => array( 'action' => 'edit', 'section' => $section ),
+                               'options' => array( 'noclasses', 'known' )
+                       )
+               );
+
+               Hooks::run( 'SkinEditSectionLinks', array( $this, $nt, $section, $tooltip, &$links, $lang ) );
+
+               $result = '<span class="mw-editsection"><span class="mw-editsection-bracket">[</span>';
+
+               $linksHtml = array();
+               foreach ( $links as $k => $linkDetails ) {
+                       $linksHtml[] = Linker::link(
+                               $linkDetails['targetTitle'],
+                               $linkDetails['text'],
+                               $linkDetails['attribs'],
+                               $linkDetails['query'],
+                               $linkDetails['options']
+                       );
+               }
+
+               $result .= implode(
+                       '<span class="mw-editsection-divider">'
+                               . wfMessage( 'pipe-separator' )->inLanguage( $lang )->text()
+                               . '</span>',
+                       $linksHtml
                );
 
-               # Add the brackets and the span and run the hook.
-               $result = '<span class="mw-editsection">'
-                       . '<span class="mw-editsection-bracket">[</span>'
-                       . $link
-                       . '<span class="mw-editsection-bracket">]</span>'
-                       . '</span>';
+               $result .= '<span class="mw-editsection-bracket">]</span></span>';
 
                Hooks::run( 'DoEditSectionLink', array( $this, $nt, $section, $tooltip, &$result, $lang ) );
                return $result;
index 2062da8..97b7038 100644 (file)
@@ -36,9 +36,7 @@ class SkinApiTemplate extends BaseTemplate {
                $this->html( 'headelement' ) ?>
 
                <div class="mw-body" role="main">
-                       <h1 class="firstHeading">
-                               <span dir="auto"><?php $this->html( 'title' ) ?></span>
-                       </h1>
+                       <h1 class="firstHeading"><?php $this->html( 'title' ) ?></h1>
                        <div class="mw-body-content">
                                <?php $this->html( 'bodytext' ) ?>
                        </div>
index 0d072ab..9cb4ea0 100644 (file)
@@ -91,7 +91,7 @@ class SkinFallbackTemplate extends BaseTemplate {
                </form>
 
                <div class="mw-body" role="main">
-                       <h1 class="firstHeading"><span dir="auto"><?php $this->html( 'title' ) ?></span></h1>
+                       <h1 class="firstHeading"><?php $this->html( 'title' ) ?></h1>
 
                        <div class="mw-body-content">
                                <?php $this->html( 'bodytext' ) ?>
index 45a1a8b..98a1b03 100644 (file)
@@ -54,7 +54,8 @@ class SkinTemplate extends Skin {
                $out->addModuleStyles( array(
                        'mediawiki.legacy.shared',
                        'mediawiki.legacy.commonPrint',
-                       'mediawiki.ui.button'
+                       'mediawiki.ui.button',
+                       'mediawiki.sectionAnchor'
                ) );
        }
 
@@ -743,17 +744,20 @@ class SkinTemplate extends Skin {
                self::checkTitle( $title, $name );
                return array(
                        'href' => $title->getLocalURL( $urlaction ),
-                       'exists' => $title->getArticleID() != 0,
+                       'exists' => $title->isKnown(),
                );
        }
 
+       /**
+        * @todo is this even used?
+        */
        function makeArticleUrlDetails( $name, $urlaction = '' ) {
                $title = Title::newFromText( $name );
                $title = $title->getSubjectPage();
                self::checkTitle( $title, $name );
                return array(
                        'href' => $title->getLocalURL( $urlaction ),
-                       'exists' => $title->getArticleID() != 0,
+                       'exists' => $title->exists(),
                );
        }
 
@@ -1213,7 +1217,7 @@ class SkinTemplate extends Skin {
                                'href' => $this->getTitle()->getLocalURL( "action=info" )
                        );
 
-                       if ( $this->getTitle()->getArticleID() ) {
+                       if ( $this->getTitle()->exists() ) {
                                $nav_urls['recentchangeslinked'] = array(
                                        'href' => SpecialPage::getTitleFor( 'Recentchangeslinked', $this->thispage )->getLocalURL()
                                );
index 66f1f03..a031dad 100644 (file)
@@ -311,7 +311,10 @@ class SpecialActiveUsers extends SpecialPage {
                if ( !wfReadOnly() ) {
                        if ( !$cTime || ( time() - wfTimestamp( TS_UNIX, $cTime ) ) > $period ) {
                                $dbw = wfGetDB( DB_MASTER );
-                               if ( $dbw->estimateRowCount( 'recentchanges' ) <= 10000 ) {
+                               $cond = $cTime
+                                       ? array( 'rc_timestamp > ' . $dbw->addQuotes( $cTime ) )
+                                       : array();
+                               if ( $dbw->estimateRowCount( 'recentchanges', '*', $cond ) <= 10000 ) {
                                        $window = $days * 86400; // small wiki
                                } else {
                                        $window = $period * 2;
index 7cf94cc..0008b10 100644 (file)
@@ -224,15 +224,16 @@ class AllMessagesTablePager extends TablePager {
 
        function getAllMessages( $descending ) {
                $messageNames = Language::getLocalisationCache()->getSubitemList( 'en', 'messages' );
+
+               // Normalise message names so they look like page titles and sort correctly - T86139
+               $messageNames = array_map( array( $this->lang, 'ucfirst' ), $messageNames );
+
                if ( $descending ) {
                        rsort( $messageNames );
                } else {
                        asort( $messageNames );
                }
 
-               // Normalise message names so they look like page titles
-               $messageNames = array_map( array( $this->lang, 'ucfirst' ), $messageNames );
-
                return $messageNames;
        }
 
index 0ebbbc9..606f837 100644 (file)
@@ -196,7 +196,7 @@ class FileDuplicateSearchPage extends QueryPage {
         *
         * @param Skin $skin
         * @param File $result
-        * @return string
+        * @return string HTML
         */
        function formatResult( $skin, $result ) {
                global $wgContLang;
@@ -204,15 +204,14 @@ class FileDuplicateSearchPage extends QueryPage {
                $nt = $result->getTitle();
                $text = $wgContLang->convert( $nt->getText() );
                $plink = Linker::link(
-                       Title::newFromText( $nt->getPrefixedText() ),
-                       $text
+                       $nt,
+                       htmlspecialchars( $text )
                );
 
                $userText = $result->getUser( 'text' );
                if ( $result->isLocal() ) {
                        $userId = $result->getUser( 'id' );
                        $user = Linker::userLink( $userId, $userText );
-                       $user .= $this->getContext()->msg( 'word-separator' )->escaped();
                        $user .= '<span style="white-space: nowrap;">';
                        $user .= Linker::userToolLinks( $userId, $userText );
                        $user .= '</span>';
@@ -220,7 +219,8 @@ class FileDuplicateSearchPage extends QueryPage {
                        $user = htmlspecialchars( $userText );
                }
 
-               $time = $this->getLanguage()->userTimeAndDate( $result->getTimestamp(), $this->getUser() );
+               $time = htmlspecialchars( $this->getLanguage()->userTimeAndDate(
+                       $result->getTimestamp(), $this->getUser() ) );
 
                return "$plink . . $user . . $time";
        }
index f6cb84d..20aac18 100644 (file)
@@ -27,6 +27,8 @@
  * @ingroup SpecialPage
  */
 class LinkSearchPage extends QueryPage {
+       /** @var array|bool */
+       private $mungedQuery = false;
 
        /**
         * @var PageLinkRenderer
@@ -162,7 +164,7 @@ class LinkSearchPage extends QueryPage {
                                'namespace' => $namespace,
                                'protocol' => $protocol ) );
                        parent::execute( $par );
-                       if ( $this->mMungedQuery === false ) {
+                       if ( $this->mungedQuery === false ) {
                                $out->addWikiMsg( 'linksearch-error' );
                        }
                }
@@ -221,13 +223,13 @@ class LinkSearchPage extends QueryPage {
                $dbr = wfGetDB( DB_SLAVE );
                // strip everything past first wildcard, so that
                // index-based-only lookup would be done
-               list( $this->mMungedQuery, $clause ) = self::mungeQuery( $this->mQuery, $this->mProt );
-               if ( $this->mMungedQuery === false ) {
+               list( $this->mungedQuery, $clause ) = self::mungeQuery( $this->mQuery, $this->mProt );
+               if ( $this->mungedQuery === false ) {
                        // Invalid query; return no results
                        return array( 'tables' => 'page', 'fields' => 'page_id', 'conds' => '0=1' );
                }
 
-               $stripped = LinkFilter::keepOneWildcard( $this->mMungedQuery );
+               $stripped = LinkFilter::keepOneWildcard( $this->mungedQuery );
                $like = $dbr->buildLike( $stripped );
                $retval = array(
                        'tables' => array( 'page', 'externallinks' ),
index 923283e..9315eb8 100644 (file)
@@ -237,8 +237,9 @@ class SpecialLog extends SpecialPage {
         */
        protected function addHeader( $type ) {
                $page = new LogPage( $type );
-               $this->getOutput()->setPageTitle( $page->getName()->text() );
-               $this->getOutput()->addHTML( $page->getDescription()->parseAsBlock() );
+               $this->getOutput()->setPageTitle( $page->getName() );
+               $this->getOutput()->addHTML( $page->getDescription()
+                       ->setContext( $this->getContext() )->parseAsBlock() );
        }
 
        protected function getGroupName() {
index e3c7e3a..1056cda 100644 (file)
@@ -322,9 +322,9 @@ class MediaStatisticsPage extends QueryPage {
        public function preprocessResults( $dbr, $res ) {
                $this->totalCount = $this->totalBytes = 0;
                foreach ( $res as $row ) {
-                       list( , , $count, $bytes ) = $this->splitFakeTitle( $row->title );
-                       $this->totalCount += $count;
-                       $this->totalBytes += $bytes;
+                       $mediaStats = $this->splitFakeTitle( $row->title );
+                       $this->totalCount += isset( $mediaStats[2] ) ? $mediaStats[2] : 0;
+                       $this->totalBytes += isset( $mediaStats[3] ) ? $mediaStats[3] : 0;
                }
                $res->seek( 0 );
        }
index 2a7e435..cac324a 100644 (file)
@@ -165,17 +165,7 @@ class MovePageForm extends UnlistedSpecialPage {
                        $out->addWikiMsg( 'delete_and_move_text', $newTitle->getPrefixedText() );
                        $movepagebtn = $this->msg( 'delete_and_move' )->text();
                        $submitVar = 'wpDeleteAndMove';
-                       $confirm = "
-                               <tr>
-                                       <td></td>
-                                       <td class='mw-input'>" .
-                               Xml::checkLabel(
-                                       $this->msg( 'delete_and_move_confirm' )->text(),
-                                       'wpConfirm',
-                                       'wpConfirm'
-                               ) .
-                               "</td>
-                               </tr>";
+                       $confirm = true;
                        $err = array();
                } else {
                        if ( $this->oldTitle->getNamespace() == NS_USER && !$this->oldTitle->isSubpage() ) {
@@ -310,12 +300,15 @@ class MovePageForm extends UnlistedSpecialPage {
                                        'id' => 'movepage'
                                )
                        ) .
-                               Xml::openElement( 'fieldset' ) .
-                               Xml::element( 'legend', null, $this->msg( 'move-page-legend' )->text() ) .
-                               Xml::openElement( 'table', array( 'id' => 'mw-movepage-table' ) ) .
-                               "<tr>
+                       Xml::openElement( 'fieldset' ) .
+                       Xml::element( 'legend', null, $this->msg( 'move-page-legend' )->text() ) .
+                       Xml::openElement( 'table', array( 'id' => 'mw-movepage-table' ) )
+               );
+
+               $out->addHTML(
+                       "<tr>
                                <td class='mw-label'>" .
-                               $this->msg( 'movearticle' )->escaped() .
+                                       $this->msg( 'movearticle' )->escaped() .
                                "</td>
                                <td class='mw-input'>
                                        <strong>{$oldTitleLink}</strong>
@@ -323,32 +316,32 @@ class MovePageForm extends UnlistedSpecialPage {
                        </tr>
                        <tr>
                                <td class='mw-label'>" .
-                               Xml::label( $this->msg( 'newtitle' )->text(), 'wpNewTitleMain' ) .
+                                       Xml::label( $this->msg( 'newtitle' )->text(), 'wpNewTitleMain' ) .
                                "</td>
                                <td class='mw-input'>" .
-                               Html::namespaceSelector(
-                                       array(
-                                               'selected' => $newTitle->getNamespace(),
-                                               'exclude' => $immovableNamespaces
-                                       ),
-                                       array( 'name' => 'wpNewTitleNs', 'id' => 'wpNewTitleNs' )
-                               ) .
-                               Xml::input(
-                                       'wpNewTitleMain',
-                                       60,
-                                       $wgContLang->recodeForEdit( $newTitle->getText() ),
-                                       array(
-                                               'type' => 'text',
-                                               'id' => 'wpNewTitleMain',
-                                               'maxlength' => 255
-                                       )
-                               ) .
-                               Html::hidden( 'wpOldTitle', $this->oldTitle->getPrefixedText() ) .
+                                       Html::namespaceSelector(
+                                               array(
+                                                       'selected' => $newTitle->getNamespace(),
+                                                       'exclude' => $immovableNamespaces
+                                               ),
+                                               array( 'name' => 'wpNewTitleNs', 'id' => 'wpNewTitleNs' )
+                                       ) .
+                                       Xml::input(
+                                               'wpNewTitleMain',
+                                               60,
+                                               $wgContLang->recodeForEdit( $newTitle->getText() ),
+                                               array(
+                                                       'type' => 'text',
+                                                       'id' => 'wpNewTitleMain',
+                                                       'maxlength' => 255
+                                               )
+                                       ) .
+                                       Html::hidden( 'wpOldTitle', $this->oldTitle->getPrefixedText() ) .
                                "</td>
                        </tr>
                        <tr>
                                <td class='mw-label'>" .
-                               Xml::label( $this->msg( 'movereason' )->text(), 'wpReason' ) .
+                                       Xml::label( $this->msg( 'movereason' )->text(), 'wpReason' ) .
                                "</td>
                                <td class='mw-input'>" .
                                        Xml::input( 'wpReason', 60, $this->reason, array(
@@ -365,12 +358,12 @@ class MovePageForm extends UnlistedSpecialPage {
                                <tr>
                                        <td></td>
                                        <td class='mw-input'>" .
-                                       Xml::checkLabel(
-                                               $this->msg( 'movetalk' )->text(),
-                                               'wpMovetalk',
-                                               'wpMovetalk',
-                                               $this->moveTalk
-                                       ) .
+                                               Xml::checkLabel(
+                                                       $this->msg( 'movetalk' )->text(),
+                                                       'wpMovetalk',
+                                                       'wpMovetalk',
+                                                       $this->moveTalk
+                                               ) .
                                        "</td>
                                </tr>"
                        );
@@ -389,14 +382,14 @@ class MovePageForm extends UnlistedSpecialPage {
                        $out->addHTML( "
                                <tr>
                                        <td></td>
-                                       <td class='mw-input' >" .
-                                       Xml::checkLabel(
-                                               $this->msg( 'move-leave-redirect' )->text(),
-                                               'wpLeaveRedirect',
-                                               'wpLeaveRedirect',
-                                               $isChecked,
-                                               $options
-                                       ) .
+                                       <td class='mw-input'>" .
+                                               Xml::checkLabel(
+                                                       $this->msg( 'move-leave-redirect' )->text(),
+                                                       'wpLeaveRedirect',
+                                                       'wpLeaveRedirect',
+                                                       $isChecked,
+                                                       $options
+                                               ) .
                                        "</td>
                                </tr>"
                        );
@@ -406,13 +399,13 @@ class MovePageForm extends UnlistedSpecialPage {
                        $out->addHTML( "
                                <tr>
                                        <td></td>
-                                       <td class='mw-input' >" .
-                                       Xml::checkLabel(
-                                               $this->msg( 'fix-double-redirects' )->text(),
-                                               'wpFixRedirects',
-                                               'wpFixRedirects',
-                                               $this->fixRedirects
-                                       ) .
+                                       <td class='mw-input'>" .
+                                               Xml::checkLabel(
+                                                       $this->msg( 'fix-double-redirects' )->text(),
+                                                       'wpFixRedirects',
+                                                       'wpFixRedirects',
+                                                       $this->fixRedirects
+                                               ) .
                                        "</td>
                                </tr>"
                        );
@@ -423,21 +416,23 @@ class MovePageForm extends UnlistedSpecialPage {
                        $out->addHTML( "
                                <tr>
                                        <td></td>
-                                       <td class=\"mw-input\">" .
-                                       Xml::check(
-                                               'wpMovesubpages',
-                                               # Don't check the box if we only have talk subpages to
-                                               # move and we aren't moving the talk page.
-                                               $this->moveSubpages && ( $this->oldTitle->hasSubpages() || $this->moveTalk ),
-                                               array( 'id' => 'wpMovesubpages' )
-                                       ) . '&#160;' .
-                                       Xml::tags( 'label', array( 'for' => 'wpMovesubpages' ),
-                                               $this->msg(
-                                                       ( $this->oldTitle->hasSubpages()
-                                                               ? 'move-subpages'
-                                                               : 'move-talk-subpages' )
-                                               )->numParams( $maximumMovedPages )->params( $maximumMovedPages )->parse()
-                                       ) .
+                                       <td class='mw-input'>" .
+                                               Xml::check(
+                                                       'wpMovesubpages',
+                                                       # Don't check the box if we only have talk subpages to
+                                                       # move and we aren't moving the talk page.
+                                                       $this->moveSubpages && ( $this->oldTitle->hasSubpages() || $this->moveTalk ),
+                                                       array( 'id' => 'wpMovesubpages' )
+                                               ) . '&#160;' .
+                                               Xml::tags(
+                                                       'label',
+                                                       array( 'for' => 'wpMovesubpages' ),
+                                                       $this->msg(
+                                                               ( $this->oldTitle->hasSubpages()
+                                                                       ? 'move-subpages'
+                                                                       : 'move-talk-subpages' )
+                                                       )->numParams( $maximumMovedPages )->params( $maximumMovedPages )->parse()
+                                               ) .
                                        "</td>
                                </tr>"
                        );
@@ -448,32 +443,50 @@ class MovePageForm extends UnlistedSpecialPage {
                # Don't allow watching if user is not logged in
                if ( $user->isLoggedIn() ) {
                        $out->addHTML( "
-                       <tr>
-                               <td></td>
-                               <td class='mw-input'>" .
-                               Xml::checkLabel(
-                                       $this->msg( 'move-watch' )->text(),
-                                       'wpWatch',
-                                       'watch',
-                                       $watchChecked
-                               ) .
-                               "</td>
-                       </tr>" );
+                               <tr>
+                                       <td></td>
+                                       <td class='mw-input'>" .
+                                               Xml::checkLabel(
+                                                       $this->msg( 'move-watch' )->text(),
+                                                       'wpWatch',
+                                                       'watch',
+                                                       $watchChecked
+                                               ) .
+                                       "</td>
+                               </tr>"
+                       );
+               }
+
+               if ( $confirm ) {
+                       $out->addHTML( "
+                               <tr>
+                                       <td></td>
+                                       <td class='mw-input'>" .
+                                               Xml::checkLabel(
+                                                       $this->msg( 'delete_and_move_confirm' )->text(),
+                                                       'wpConfirm',
+                                                       'wpConfirm'
+                                               ) .
+                                       "</td>
+                               </tr>"
+                       );
                }
 
                $out->addHTML( "
-                               {$confirm}
                        <tr>
-                               <td>&#160;</td>
+                               <td></td>
                                <td class='mw-submit'>" .
-                               Xml::submitButton( $movepagebtn, array( 'name' => $submitVar ) ) .
+                                       Xml::submitButton( $movepagebtn, array( 'name' => $submitVar ) ) .
                                "</td>
-                       </tr>" .
-                               Xml::closeElement( 'table' ) .
-                               Html::hidden( 'wpEditToken', $user->getEditToken() ) .
-                               Xml::closeElement( 'fieldset' ) .
-                               Xml::closeElement( 'form' ) .
-                               "\n"
+                       </tr>"
+               );
+
+               $out->addHTML(
+                       Xml::closeElement( 'table' ) .
+                       Html::hidden( 'wpEditToken', $user->getEditToken() ) .
+                       Xml::closeElement( 'fieldset' ) .
+                       Xml::closeElement( 'form' ) .
+                       "\n"
                );
 
                $this->showLogFragment( $this->oldTitle );
@@ -685,7 +698,10 @@ class MovePageForm extends UnlistedSpecialPage {
                                $oldSubpage->getDBkey()
                        );
 
-                       if ( $oldSubpage->isTalkPage() ) {
+                       if ( $oldSubpage->isSubpage() && ( $ot->isTalkPage() xor $nt->isTalkPage() ) ) {
+                               // Moving a subpage from a subject namespace to a talk namespace or vice-versa
+                               $newNs = $nt->getNamespace();
+                       } elseif ( $oldSubpage->isTalkPage() ) {
                                $newNs = $nt->getTalkPage()->getNamespace();
                        } else {
                                $newNs = $nt->getSubjectPage()->getNamespace();
index 82cd0a1..994a2e5 100644 (file)
@@ -333,12 +333,12 @@ class SpecialNewpages extends IncludableSpecialPage {
                $hist = Html::rawElement( 'span', array( 'class' => 'mw-newpages-history' ),
                        $this->msg( 'parentheses' )->rawParams( $histLink )->escaped() );
 
-               $length = Html::element(
+               $length = Html::rawElement(
                        'span',
                        array( 'class' => 'mw-newpages-length' ),
-                       $this->msg( 'brackets' )->params( $this->msg( 'nbytes' )
-                               ->numParams( $result->length )->text()
-                       )
+                       $this->msg( 'brackets' )->rawParams(
+                               $this->msg( 'nbytes' )->numParams( $result->length )->escaped()
+                       )->escaped()
                );
 
                $ulink = Linker::revUserTools( $rev );
index 0ba7385..00e56c1 100644 (file)
@@ -39,11 +39,6 @@ class SpecialProtectedpages extends SpecialPage {
                $this->outputHeader();
                $this->getOutput()->addModuleStyles( 'mediawiki.special' );
 
-               // Purge expired entries on one in every 10 queries
-               if ( !mt_rand( 0, 10 ) ) {
-                       Title::purgeExpiredRestrictions();
-               }
-
                $request = $this->getRequest();
                $type = $request->getVal( $this->IdType );
                $level = $request->getVal( $this->IdLevel );
@@ -353,7 +348,7 @@ class ProtectedPagesPager extends TablePager {
        /**
         * @param string $field
         * @param string $value
-        * @return string
+        * @return string HTML
         * @throws MWException
         */
        function formatValue( $field, $value ) {
@@ -372,7 +367,8 @@ class ProtectedPagesPager extends TablePager {
                                                $this->msg( 'protectedpages-unknown-timestamp' )->escaped()
                                        );
                                } else {
-                                       $formatted = $this->getLanguage()->userTimeAndDate( $value, $this->getUser() );
+                                       $formatted = htmlspecialchars( $this->getLanguage()->userTimeAndDate(
+                                               $value, $this->getUser() ) );
                                }
                                break;
 
@@ -402,7 +398,8 @@ class ProtectedPagesPager extends TablePager {
                                break;
 
                        case 'pr_expiry':
-                               $formatted = $this->getLanguage()->formatExpiry( $value, /* User preference timezone */true );
+                               $formatted = htmlspecialchars( $this->getLanguage()->formatExpiry(
+                                       $value, /* User preference timezone */true ) );
                                $title = Title::makeTitleSafe( $row->page_namespace, $row->page_title );
                                if ( $this->getUser()->isAllowed( 'protect' ) && $title ) {
                                        $changeProtection = Linker::linkKnown(
@@ -454,7 +451,7 @@ class ProtectedPagesPager extends TablePager {
                                // Messages: restriction-level-sysop, restriction-level-autoconfirmed
                                $params[] = $this->msg( 'restriction-level-' . $row->pr_level )->escaped();
                                if ( $row->pr_cascade ) {
-                                       $params[] = $this->msg( 'protect-summary-cascade' )->text();
+                                       $params[] = $this->msg( 'protect-summary-cascade' )->escaped();
                                }
                                $formatted = $this->getLanguage()->commaList( $params );
                                break;
@@ -493,7 +490,7 @@ class ProtectedPagesPager extends TablePager {
        function getQueryInfo() {
                $conds = $this->mConds;
                $conds[] = 'pr_expiry > ' . $this->mDb->addQuotes( $this->mDb->timestamp() ) .
-                       'OR pr_expiry IS NULL';
+                       ' OR pr_expiry IS NULL';
                $conds[] = 'page_id=pr_page';
                $conds[] = 'pr_type=' . $this->mDb->addQuotes( $this->type );
 
index d25c2c8..dd9198c 100644 (file)
@@ -38,11 +38,6 @@ class SpecialProtectedtitles extends SpecialPage {
                $this->setHeaders();
                $this->outputHeader();
 
-               // Purge expired entries on one in every 10 queries
-               if ( !mt_rand( 0, 10 ) ) {
-                       Title::purgeExpiredRestrictions();
-               }
-
                $request = $this->getRequest();
                $type = $request->getVal( $this->IdType );
                $level = $request->getVal( $this->IdLevel );
@@ -252,7 +247,8 @@ class ProtectedTitlesPager extends AlphabeticPager {
         */
        function getQueryInfo() {
                $conds = $this->mConds;
-               $conds[] = 'pt_expiry>' . $this->mDb->addQuotes( $this->mDb->timestamp() );
+               $conds[] = 'pt_expiry > ' . $this->mDb->addQuotes( $this->mDb->timestamp() ) .
+                       ' OR pt_expiry IS NULL';
                if ( $this->level ) {
                        $conds['pt_create_perm'] = $this->level;
                }
index d4a06eb..1bafc61 100644 (file)
@@ -88,7 +88,7 @@ class SpecialRunJobs extends UnlistedSpecialPage {
 
                // Do all of the specified tasks...
                if ( in_array( 'jobs', explode( '|', $params['tasks'] ) ) ) {
-                       $runner = new JobRunner();
+                       $runner = new JobRunner( MWLoggerFactory::getInstance( 'runJobs' ) );
                        $response = $runner->run( array(
                                'type'     => $params['type'],
                                'maxJobs'  => $params['maxjobs'] ? $params['maxjobs'] : 1,
index 4429022..1f339d1 100644 (file)
@@ -199,10 +199,16 @@ class SpecialStatistics extends SpecialPage {
                                $grouppageLocalized = $msg->text();
                        }
                        $linkTarget = Title::newFromText( $grouppageLocalized );
-                       $grouppage = Linker::link(
-                               $linkTarget,
-                               htmlspecialchars( $groupnameLocalized )
-                       );
+
+                       if ( $linkTarget ) {
+                               $grouppage = Linker::link(
+                                       $linkTarget,
+                                       htmlspecialchars( $groupnameLocalized )
+                               );
+                       } else {
+                               $grouppage = htmlspecialchars( $groupnameLocalized );
+                       }
+
                        $grouplink = Linker::linkKnown(
                                SpecialPage::getTitleFor( 'Listusers' ),
                                $this->msg( 'listgrouprights-members' )->escaped(),
index b762728..ff263b6 100644 (file)
@@ -31,6 +31,10 @@ class SpecialTags extends SpecialPage {
         * @var array List of defined tags
         */
        public $definedTags;
+       /**
+        * @var array List of active tags
+        */
+       public $activeTags;
 
        function __construct() {
                parent::__construct( 'Tags' );
@@ -40,33 +44,108 @@ class SpecialTags extends SpecialPage {
                $this->setHeaders();
                $this->outputHeader();
 
+               $request = $this->getRequest();
+               switch ( $par ) {
+                       case 'delete':
+                               $this->showDeleteTagForm( $request->getVal( 'tag' ) );
+                               break;
+                       case 'activate':
+                               $this->showActivateDeactivateForm( $request->getVal( 'tag' ), true );
+                               break;
+                       case 'deactivate':
+                               $this->showActivateDeactivateForm( $request->getVal( 'tag' ), false );
+                               break;
+                       case 'create':
+                               // fall through, thanks to HTMLForm's logic
+                       default:
+                               $this->showTagList();
+                               break;
+               }
+       }
+
+       function showTagList() {
                $out = $this->getOutput();
                $out->setPageTitle( $this->msg( 'tags-title' ) );
                $out->wrapWikiMsg( "<div class='mw-tags-intro'>\n$1\n</div>", 'tags-intro' );
 
+               $user = $this->getUser();
+
+               // Show form to create a tag
+               if ( $user->isAllowed( 'managechangetags' ) ) {
+                       $fields = array(
+                               'Tag' => array(
+                                       'type' => 'text',
+                                       'label' => $this->msg( 'tags-create-tag-name' )->plain(),
+                                       'required' => true,
+                               ),
+                               'Reason' => array(
+                                       'type' => 'text',
+                                       'label' => $this->msg( 'tags-create-reason' )->plain(),
+                                       'size' => 50,
+                               ),
+                               'IgnoreWarnings' => array(
+                                       'type' => 'hidden',
+                               ),
+                       );
+
+                       $form = new HTMLForm( $fields, $this->getContext() );
+                       $form->setAction( $this->getPageTitle( 'create' )->getLocalURL() );
+                       $form->setWrapperLegendMsg( 'tags-create-heading' );
+                       $form->setHeaderText( $this->msg( 'tags-create-explanation' )->plain() );
+                       $form->setSubmitCallback( array( $this, 'processCreateTagForm' ) );
+                       $form->setSubmitTextMsg( 'tags-create-submit' );
+                       $form->show();
+
+                       // If processCreateTagForm generated a redirect, there's no point
+                       // continuing with this, as the user is just going to end up getting sent
+                       // somewhere else. Additionally, if we keep going here, we end up
+                       // populating the memcache of tag data (see ChangeTags::listDefinedTags)
+                       // with out-of-date data from the slave, because the slave hasn't caught
+                       // up to the fact that a new tag has been created as part of an implicit,
+                       // as yet uncommitted transaction on master.
+                       if ( $out->getRedirect() !== '' ) {
+                               return;
+                       }
+               }
+
+               // Whether to show the "Actions" column in the tag list
+               // If any actions added in the future require other user rights, add those
+               // rights here
+               $showActions = $user->isAllowed( 'managechangetags' );
+
                // Write the headers
                $html = Xml::tags( 'tr', null, Xml::tags( 'th', null, $this->msg( 'tags-tag' )->parse() ) .
                        Xml::tags( 'th', null, $this->msg( 'tags-display-header' )->parse() ) .
                        Xml::tags( 'th', null, $this->msg( 'tags-description-header' )->parse() ) .
+                       Xml::tags( 'th', null, $this->msg( 'tags-source-header' )->parse() ) .
                        Xml::tags( 'th', null, $this->msg( 'tags-active-header' )->parse() ) .
-                       Xml::tags( 'th', null, $this->msg( 'tags-hitcount-header' )->parse() )
+                       Xml::tags( 'th', null, $this->msg( 'tags-hitcount-header' )->parse() ) .
+                       ( $showActions ?
+                               Xml::tags( 'th', array( 'class' => 'unsortable' ),
+                                       $this->msg( 'tags-actions-header' )->parse() ) :
+                               '' )
                );
 
                // Used in #doTagRow()
-               $this->definedTags = array_fill_keys( ChangeTags::listDefinedTags(), true );
+               $this->explicitlyDefinedTags = array_fill_keys(
+                       ChangeTags::listExplicitlyDefinedTags(), true );
+               $this->extensionDefinedTags = array_fill_keys(
+                       ChangeTags::listExtensionDefinedTags(), true );
+               $this->extensionActivatedTags = array_fill_keys(
+                       ChangeTags::listExtensionActivatedTags(), true );
 
                foreach ( ChangeTags::tagUsageStatistics() as $tag => $hitcount ) {
-                       $html .= $this->doTagRow( $tag, $hitcount );
+                       $html .= $this->doTagRow( $tag, $hitcount, $showActions );
                }
 
                $out->addHTML( Xml::tags(
                        'table',
-                       array( 'class' => 'wikitable sortable mw-tags-table' ),
+                       array( 'class' => 'mw-datatable sortable mw-tags-table' ),
                        $html
                ) );
        }
 
-       function doTagRow( $tag, $hitcount ) {
+       function doTagRow( $tag, $hitcount, $showActions ) {
                $user = $this->getUser();
                $newRow = '';
                $newRow .= Xml::tags( 'td', null, Xml::element( 'code', null, $tag ) );
@@ -94,9 +173,23 @@ class SpecialTags extends SpecialPage {
                }
                $newRow .= Xml::tags( 'td', null, $desc );
 
-               $active = isset( $this->definedTags[$tag] ) ? 'tags-active-yes' : 'tags-active-no';
-               $active = $this->msg( $active )->escaped();
-               $newRow .= Xml::tags( 'td', null, $active );
+               $sourceMsgs = array();
+               $isExtension = isset( $this->extensionDefinedTags[$tag] );
+               $isExplicit = isset( $this->explicitlyDefinedTags[$tag] );
+               if ( $isExtension ) {
+                       $sourceMsgs[] = $this->msg( 'tags-source-extension' )->escaped();
+               }
+               if ( $isExplicit ) {
+                       $sourceMsgs[] = $this->msg( 'tags-source-manual' )->escaped();
+               }
+               if ( !$sourceMsgs ) {
+                       $sourceMsgs[] = $this->msg( 'tags-source-none' )->escaped();
+               }
+               $newRow .= Xml::tags( 'td', null, implode( Xml::element( 'br' ), $sourceMsgs ) );
+
+               $isActive = $isExplicit || isset( $this->extensionActivatedTags[$tag] );
+               $activeMsg = ( $isActive ? 'tags-active-yes' : 'tags-active-no' );
+               $newRow .= Xml::tags( 'td', null, $this->msg( $activeMsg )->escaped() );
 
                $hitcountLabel = $this->msg( 'tags-hitcount' )->numParams( $hitcount )->escaped();
                $hitcountLink = Linker::link(
@@ -109,9 +202,228 @@ class SpecialTags extends SpecialPage {
                // add raw $hitcount for sorting, because tags-hitcount contains numbers and letters
                $newRow .= Xml::tags( 'td', array( 'data-sort-value' => $hitcount ), $hitcountLink );
 
+               // actions
+               $actionLinks = array();
+               if ( $showActions ) {
+                       // delete
+                       if ( ChangeTags::canDeleteTag( $tag, $user )->isOK() ) {
+                               $actionLinks[] = Linker::linkKnown( $this->getPageTitle( 'delete' ),
+                                       $this->msg( 'tags-delete' )->escaped(),
+                                       array(),
+                                       array( 'tag' => $tag ) );
+                       }
+
+                       // activate
+                       if ( ChangeTags::canActivateTag( $tag, $user )->isOK() ) {
+                               $actionLinks[] = Linker::linkKnown( $this->getPageTitle( 'activate' ),
+                                       $this->msg( 'tags-activate' )->escaped(),
+                                       array(),
+                                       array( 'tag' => $tag ) );
+                       }
+
+                       // deactivate
+                       if ( ChangeTags::canDeactivateTag( $tag, $user )->isOK() ) {
+                               $actionLinks[] = Linker::linkKnown( $this->getPageTitle( 'deactivate' ),
+                                       $this->msg( 'tags-deactivate' )->escaped(),
+                                       array(),
+                                       array( 'tag' => $tag ) );
+                       }
+
+                       $newRow .= Xml::tags( 'td', null, $this->getLanguage()->pipeList( $actionLinks ) );
+               }
+
                return Xml::tags( 'tr', null, $newRow ) . "\n";
        }
 
+       public function processCreateTagForm( array $data, HTMLForm $form ) {
+               $context = $form->getContext();
+               $out = $context->getOutput();
+
+               $tag = trim( strval( $data['Tag'] ) );
+               $ignoreWarnings = isset( $data['IgnoreWarnings'] ) && $data['IgnoreWarnings'] === '1';
+               $status = ChangeTags::createTagWithChecks( $tag, $data['Reason'],
+                       $context->getUser(), $ignoreWarnings );
+
+               if ( $status->isGood() ) {
+                       $out->redirect( $this->getPageTitle()->getLocalURL() );
+                       return true;
+               } elseif ( $status->isOK() ) {
+                       // we have some warnings, so we show a confirmation form
+                       $fields = array(
+                               'Tag' => array(
+                                       'type' => 'hidden',
+                                       'default' => $data['Tag'],
+                               ),
+                               'Reason' => array(
+                                       'type' => 'hidden',
+                                       'default' => $data['Reason'],
+                               ),
+                               'IgnoreWarnings' => array(
+                                       'type' => 'hidden',
+                                       'default' => '1',
+                               ),
+                       );
+
+                       // fool HTMLForm into thinking the form hasn't been submitted yet. Otherwise
+                       // we get into an infinite loop!
+                       $context->getRequest()->unsetVal( 'wpEditToken' );
+
+                       $headerText = $this->msg( 'tags-create-warnings-above', $tag,
+                               count( $status->getWarningsArray() ) )->parseAsBlock() .
+                               $out->parse( $status->getWikitext() ) .
+                               $this->msg( 'tags-create-warnings-below' )->parseAsBlock();
+
+                       $subform = new HTMLForm( $fields, $this->getContext() );
+                       $subform->setAction( $this->getPageTitle( 'create' )->getLocalURL() );
+                       $subform->setWrapperLegendMsg( 'tags-create-heading' );
+                       $subform->setHeaderText( $headerText );
+                       $subform->setSubmitCallback( array( $this, 'processCreateTagForm' ) );
+                       $subform->setSubmitTextMsg( 'htmlform-yes' );
+                       $subform->show();
+
+                       $out->addBacklinkSubtitle( $this->getPageTitle() );
+                       return true;
+               } else {
+                       $out->addWikiText( "<div class=\"error\">\n" . $status->getWikitext() .
+                               "\n</div>" );
+                       return false;
+               }
+       }
+
+       protected function showDeleteTagForm( $tag ) {
+               $user = $this->getUser();
+               if ( !$user->isAllowed( 'managechangetags' ) ) {
+                       throw new PermissionsError( 'managechangetags' );
+               }
+
+               $out = $this->getOutput();
+               $out->setPageTitle( $this->msg( 'tags-delete-title' ) );
+               $out->addBacklinkSubtitle( $this->getPageTitle() );
+
+               // is the tag actually able to be deleted?
+               $canDeleteResult = ChangeTags::canDeleteTag( $tag, $user );
+               if ( !$canDeleteResult->isGood() ) {
+                       $out->addWikiText( "<div class=\"error\">\n" . $canDeleteResult->getWikiText() .
+                               "\n</div>" );
+                       if ( !$canDeleteResult->isOK() ) {
+                               return;
+                       }
+               }
+
+               $preText = $this->msg( 'tags-delete-explanation-initial', $tag )->parseAsBlock();
+               $tagUsage = ChangeTags::tagUsageStatistics();
+               if ( $tagUsage[$tag] > 0 ) {
+                       $preText .= $this->msg( 'tags-delete-explanation-in-use', $tag,
+                               $tagUsage[$tag] )->parseAsBlock();
+               }
+               $preText .= $this->msg( 'tags-delete-explanation-warning', $tag )->parseAsBlock();
+
+               // see if the tag is in use
+               $this->extensionActivatedTags = array_fill_keys(
+                       ChangeTags::listExtensionActivatedTags(), true );
+               if ( isset( $this->extensionActivatedTags[$tag] ) ) {
+                       $preText .= $this->msg( 'tags-delete-explanation-active', $tag )->parseAsBlock();
+               }
+
+               $fields = array();
+               $fields['Reason'] = array(
+                       'type' => 'text',
+                       'label' => $this->msg( 'tags-delete-reason' )->plain(),
+                       'size' => 50,
+               );
+               $fields['HiddenTag'] = array(
+                       'type' => 'hidden',
+                       'name' => 'tag',
+                       'default' => $tag,
+                       'required' => true,
+               );
+
+               $form = new HTMLForm( $fields, $this->getContext() );
+               $form->setAction( $this->getPageTitle( 'delete' )->getLocalURL() );
+               $form->tagAction = 'delete'; // custom property on HTMLForm object
+               $form->setSubmitCallback( array( $this, 'processTagForm' ) );
+               $form->setSubmitTextMsg( 'tags-delete-submit' );
+               $form->setSubmitDestructive(); // nasty!
+               $form->addPreText( $preText );
+               $form->show();
+       }
+
+       protected function showActivateDeactivateForm( $tag, $activate ) {
+               $actionStr = $activate ? 'activate' : 'deactivate';
+
+               $user = $this->getUser();
+               if ( !$user->isAllowed( 'managechangetags' ) ) {
+                       throw new PermissionsError( 'managechangetags' );
+               }
+
+               $out = $this->getOutput();
+               // tags-activate-title, tags-deactivate-title
+               $out->setPageTitle( $this->msg( "tags-$actionStr-title" ) );
+               $out->addBacklinkSubtitle( $this->getPageTitle() );
+
+               // is it possible to do this?
+               $func = $activate ? 'canActivateTag' : 'canDeactivateTag';
+               $result = ChangeTags::$func( $tag, $user );
+               if ( !$result->isGood() ) {
+                       $out->wrapWikiMsg( "<div class=\"error\">\n$1" . $result->getWikiText() .
+                               "\n</div>" );
+                       if ( !$result->isOK() ) {
+                               return;
+                       }
+               }
+
+               // tags-activate-question, tags-deactivate-question
+               $preText = $this->msg( "tags-$actionStr-question", $tag )->parseAsBlock();
+
+               $fields = array();
+               // tags-activate-reason, tags-deactivate-reason
+               $fields['Reason'] = array(
+                       'type' => 'text',
+                       'label' => $this->msg( "tags-$actionStr-reason" )->plain(),
+                       'size' => 50,
+               );
+               $fields['HiddenTag'] = array(
+                       'type' => 'hidden',
+                       'name' => 'tag',
+                       'default' => $tag,
+                       'required' => true,
+               );
+
+               $form = new HTMLForm( $fields, $this->getContext() );
+               $form->setAction( $this->getPageTitle( $actionStr )->getLocalURL() );
+               $form->tagAction = $actionStr;
+               $form->setSubmitCallback( array( $this, 'processTagForm' ) );
+               // tags-activate-submit, tags-deactivate-submit
+               $form->setSubmitTextMsg( "tags-$actionStr-submit" );
+               $form->addPreText( $preText );
+               $form->show();
+       }
+
+       public function processTagForm( array $data, HTMLForm $form ) {
+               $context = $form->getContext();
+               $out = $context->getOutput();
+
+               $tag = $data['HiddenTag'];
+               $status = call_user_func( array( 'ChangeTags', "{$form->tagAction}TagWithChecks" ),
+                       $tag, $data['Reason'], $context->getUser(), true );
+
+               if ( $status->isGood() ) {
+                       $out->redirect( $this->getPageTitle()->getLocalURL() );
+                       return true;
+               } elseif ( $status->isOK() && $form->tagAction === 'delete' ) {
+                       // deletion succeeded, but hooks raised a warning
+                       $out->addWikiText( $this->msg( 'tags-delete-warnings-after-delete', $tag,
+                               count( $status->getWarningsArray() ) )->text() . "\n" .
+                               $status->getWikitext() );
+                       $out->addReturnTo( $this->getPageTitle() );
+                       return true;
+               } else {
+                       $out->addWikiText( "<div class=\"error\">\n" . $status->getWikitext() .
+                               "\n</div>" );
+                       return false;
+               }
+       }
+
        protected function getGroupName() {
                return 'changes';
        }
index 7684c05..d219c99 100644 (file)
@@ -36,6 +36,24 @@ class SpecialTrackingCategories extends SpecialPage {
                parent::__construct( 'TrackingCategories' );
        }
 
+       /**
+        * Tracking categories that exist in core
+        *
+        * @var array
+        */
+       private static $coreTrackingCategories = array(
+               'index-category',
+               'noindex-category',
+               'duplicate-args-category',
+               'expensive-parserfunction-category',
+               'post-expand-template-argument-category',
+               'post-expand-template-inclusion-category',
+               'hidden-category-category',
+               'broken-file-category',
+               'node-count-exceeded-category',
+               'expansion-depth-exceeded-category',
+       );
+
        function execute( $par ) {
                $this->setHeaders();
                $this->outputHeader();
@@ -120,8 +138,13 @@ class SpecialTrackingCategories extends SpecialPage {
         * @return array Array( 'msg' => Title, 'cats' => Title[] )
         */
        private function prepareTrackingCategoriesData() {
+               $categories = array_merge(
+                       self::$coreTrackingCategories,
+                       ExtensionRegistry::getInstance()->getAttribute( 'TrackingCategories' ),
+                       $this->getConfig()->get( 'TrackingCategories' ) // deprecated
+               );
                $trackingCategories = array();
-               foreach ( $this->getConfig()->get( 'TrackingCategories' ) as $catMsg ) {
+               foreach ( $categories as $catMsg ) {
                        /*
                         * Check if the tracking category varies by namespace
                         * Otherwise only pages in the current namespace will be displayed
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 1b85ff8..ce8192b 100644 (file)
@@ -985,7 +985,7 @@ class UploadForm extends HTMLForm {
        protected function getDescriptionSection() {
                $config = $this->getConfig();
                if ( $this->mSessionKey ) {
-                       $stash = RepoGroup::singleton()->getLocalRepo()->getUploadStash();
+                       $stash = RepoGroup::singleton()->getLocalRepo()->getUploadStash( $this->getUser() );
                        try {
                                $file = $stash->getFile( $this->mSessionKey );
                        } catch ( Exception $e ) {
index ddb435d..462dbee 100644 (file)
@@ -49,7 +49,7 @@ class SpecialUploadStash extends UnlistedSpecialPage {
        public function __construct() {
                parent::__construct( 'UploadStash', 'upload' );
                try {
-                       $this->stash = RepoGroup::singleton()->getLocalRepo()->getUploadStash();
+                       $this->stash = RepoGroup::singleton()->getLocalRepo()->getUploadStash( $this->getUser() );
                } catch ( UploadStashNotAvailableException $e ) {
                }
        }
@@ -331,11 +331,12 @@ class SpecialUploadStash extends UnlistedSpecialPage {
         * This works, because there really is only one stash per logged-in user, despite appearances.
         *
         * @param array $formData
+        * @param HTMLForm $form
         * @return Status
         */
-       public static function tryClearStashedUploads( $formData ) {
+       public static function tryClearStashedUploads( $formData, $form ) {
                if ( isset( $formData['Clear'] ) ) {
-                       $stash = RepoGroup::singleton()->getLocalRepo()->getUploadStash();
+                       $stash = RepoGroup::singleton()->getLocalRepo()->getUploadStash( $form->getUser() );
                        wfDebug( 'stash has: ' . print_r( $stash->listFiles(), true ) . "\n" );
 
                        if ( !$stash->clear() ) {
index 36a31bd..a5edcb0 100644 (file)
@@ -218,7 +218,7 @@ class UserrightsPage extends SpecialPage {
        /**
         * Save user groups changes in the database.
         *
-        * @param User $user
+        * @param User|UserRightsProxy $user
         * @param array $add Array of groups to add
         * @param array $remove Array of groups to remove
         * @param string $reason Reason for group change
@@ -228,7 +228,7 @@ class UserrightsPage extends SpecialPage {
                global $wgAuth;
 
                // Validate input set...
-               $isself = $user->equals( $this->getUser() );
+               $isself = $user->getName() == $this->getUser()->getName();
                $groups = $user->getGroups();
                $changeable = $this->changeableGroups();
                $addable = array_merge( $changeable['add'], $isself ? $changeable['add-self'] : array() );
@@ -244,18 +244,22 @@ class UserrightsPage extends SpecialPage {
                $oldGroups = $user->getGroups();
                $newGroups = $oldGroups;
 
-               // remove then add groups
+               // Remove then add groups
                if ( $remove ) {
-                       $newGroups = array_diff( $newGroups, $remove );
-                       foreach ( $remove as $group ) {
-                               $user->removeGroup( $group );
+                       foreach ( $remove as $index => $group ) {
+                               if ( !$user->removeGroup( $group ) ) {
+                                       unset($remove[$index]);
+                               }
                        }
+                       $newGroups = array_diff( $newGroups, $remove );
                }
                if ( $add ) {
-                       $newGroups = array_merge( $newGroups, $add );
-                       foreach ( $add as $group ) {
-                               $user->addGroup( $group );
+                       foreach ( $add as $index => $group ) {
+                               if ( !$user->addGroup( $group ) ) {
+                                       unset($add[$index]);
+                               }
                        }
+                       $newGroups = array_merge( $newGroups, $add );
                }
                $newGroups = array_unique( $newGroups );
 
index 2aa629e..a7365bb 100644 (file)
@@ -109,12 +109,7 @@ class SpecialVersion extends SpecialPage {
                                        $file = $this->getExtLicenseFileName( dirname( $extNode['path'] ) );
                                        if ( $file ) {
                                                $wikiText = file_get_contents( $file );
-                                               if ( !isset( $extNode['license-name'] ) ) {
-                                                       // If the developer did not explicitly set license-name they probably
-                                                       // are unaware that we're now sucking this file in and thus it's probably
-                                                       // not wikitext friendly.
-                                                       $wikiText = "<pre>$wikiText</pre>";
-                                               }
+                                               $wikiText = "<pre>$wikiText</pre>";
                                        }
                                }
 
@@ -555,7 +550,7 @@ class SpecialVersion extends SpecialPage {
                if ( count( $tags ) ) {
                        $out = Html::rawElement(
                                'h2',
-                               array( 'class' => 'mw-headline' ),
+                               array( 'class' => 'mw-headline plainlinks' ),
                                Linker::makeExternalLink(
                                        '//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Tag_extensions',
                                        $this->msg( 'version-parser-extensiontags' )->parse(),
@@ -593,7 +588,7 @@ class SpecialVersion extends SpecialPage {
 
                $fhooks = $wgParser->getFunctionHooks();
                if ( count( $fhooks ) ) {
-                       $out = Html::rawElement( 'h2', array( 'class' => 'mw-headline' ), Linker::makeExternalLink(
+                       $out = Html::rawElement( 'h2', array( 'class' => 'mw-headline plainlinks' ), Linker::makeExternalLink(
                                '//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Parser_functions',
                                $this->msg( 'version-parser-function-hooks' )->parse(),
                                false /* msg()->parse() already escapes */
@@ -969,10 +964,10 @@ class SpecialVersion extends SpecialPage {
                                if ( $this->getExtAuthorsFileName( $extDir ) ) {
                                        $text = Linker::link(
                                                $this->getPageTitle( "Credits/$extName" ),
-                                               $this->msg( 'version-poweredby-others' )->text()
+                                               $this->msg( 'version-poweredby-others' )->escaped()
                                        );
                                } else {
-                                       $text = $this->msg( 'version-poweredby-others' )->text();
+                                       $text = $this->msg( 'version-poweredby-others' )->escaped();
                                }
                                $list[] = $text;
                        } elseif ( substr( $item, -5 ) == ' ...]' ) {
@@ -988,7 +983,7 @@ class SpecialVersion extends SpecialPage {
                if ( !$hasOthers && $this->getExtAuthorsFileName( $extDir ) ) {
                        $list[] = $text = Linker::link(
                                $this->getPageTitle( "Credits/$extName" ),
-                               $this->msg( 'version-poweredby-others' )->text()
+                               $this->msg( 'version-poweredby-others' )->escaped()
                        );
                }
 
index ca3386c..df9d363 100644 (file)
@@ -428,7 +428,7 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                        $filters[$key] = $params['msg'];
                }
                // Disable some if needed
-               if ( !$user->useNPPatrol() ) {
+               if ( !$user->useRCPatrol() ) {
                        unset( $filters['hidepatrolled'] );
                }
 
index bbc111f..28be790 100644 (file)
@@ -177,7 +177,7 @@ class SpecialWhatLinksHere extends IncludableSpecialPage {
                        );
                        return $dbr->select(
                                array( 'page', 'temp_backlink_range' => "($subQuery)" ),
-                               array( 'page_id', 'page_namespace', 'page_title', 'rd_from' ),
+                               array( 'page_id', 'page_namespace', 'page_title', 'rd_from', 'page_is_redirect' ),
                                array(),
                                __CLASS__ . '::showIndirectLinks',
                                array( 'ORDER BY' => 'page_id', 'LIMIT' => $queryLimit ),
@@ -321,7 +321,7 @@ class SpecialWhatLinksHere extends IncludableSpecialPage {
                $link = Linker::linkKnown(
                        $nt,
                        null,
-                       array(),
+                       $row->page_is_redirect ? array( 'class' => 'mw-redirect' ) : array(),
                        $query
                );
 
diff --git a/includes/templates/NoLocalSettings.mustache b/includes/templates/NoLocalSettings.mustache
new file mode 100644 (file)
index 0000000..1649e3b
--- /dev/null
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<html lang="en" dir="ltr">
+       <head>
+               <meta charset="UTF-8" />
+               <title>MediaWiki {{wgVersion}}</title>
+               <style media="screen">
+                       html, body {
+                               color: #000;
+                               background-color: #fff;
+                               font-family: sans-serif;
+                               text-align: center;
+                       }
+
+                       h1 {
+                               font-size: 150%;
+                       }
+               </style>
+       </head>
+       <body>
+               <img src="{{path}}resources/assets/mediawiki.png" alt="The MediaWiki logo" />
+
+               <h1>MediaWiki {{wgVersion}}</h1>
+               <div class="error">
+               {{#localSettingsExists}}
+                       <p>LocalSettings.php not readable.</p>
+                       <p>Please correct file permissions and try again.</p>
+               {{/localSettingsExists}}
+               {{^localSettingsExists}}
+                       <p>LocalSettings.php not found.</p>
+                       {{#installerStarted}}
+                               <p>Please <a href="{{path}}mw-config/index{{ext}}">complete the installation</a> and download LocalSettings.php.</p>
+                       {{/installerStarted}}
+                       {{^installerStarted}}
+                               <p>Please <a href="{{path}}mw-config/index{{ext}}">set up the wiki</a> first!</p>
+                       {{/installerStarted}}
+               {{/localSettingsExists}}
+               </div>
+       </body>
+</html>
\ No newline at end of file
diff --git a/includes/templates/NoLocalSettings.php b/includes/templates/NoLocalSettings.php
deleted file mode 100644 (file)
index 5b88dfd..0000000
+++ /dev/null
@@ -1,97 +0,0 @@
-<?php
-// @codingStandardsIgnoreFile
-/**
- * Template used when there is no LocalSettings.php file.
- *
- * 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 Templates
- */
-
-if ( !defined( 'MEDIAWIKI' ) ) {
-       die( "NoLocalSettings.php is not a valid MediaWiki entry point\n" );
-}
-
-if ( !isset( $wgVersion ) ) {
-       $wgVersion = 'VERSION';
-}
-
-# bug 30219 : can not use pathinfo() on URLs since slashes do not match
-$matches = array();
-$ext = 'php';
-$path = '/';
-foreach ( array_filter( explode( '/', $_SERVER['PHP_SELF'] ) ) as $part ) {
-       if ( !preg_match( '/\.(php5?)$/', $part, $matches ) ) {
-               $path .= "$part/";
-       } else {
-               $ext = $matches[1] == 'php5' ? 'php5' : 'php';
-       }
-}
-
-# Check to see if the installer is running
-if ( !function_exists( 'session_name' ) ) {
-       $installerStarted = false;
-} else {
-       session_name( 'mw_installer_session' );
-       $oldReporting = error_reporting( E_ALL & ~E_NOTICE );
-       $success = session_start();
-       error_reporting( $oldReporting );
-       $installerStarted = ( $success && isset( $_SESSION['installData'] ) );
-}
-?>
-<!DOCTYPE html>
-<html lang="en" dir="ltr">
-       <head>
-               <meta charset="UTF-8" />
-               <title>MediaWiki <?php echo htmlspecialchars( $wgVersion ) ?></title>
-               <style media='screen'>
-                       html, body {
-                               color: #000;
-                               background-color: #fff;
-                               font-family: sans-serif;
-                               text-align: center;
-                       }
-
-                       h1 {
-                               font-size: 150%;
-                       }
-               </style>
-       </head>
-       <body>
-               <img src="<?php echo htmlspecialchars( $path ) ?>resources/assets/mediawiki.png" alt='The MediaWiki logo' />
-
-               <h1>MediaWiki <?php echo htmlspecialchars( $wgVersion ) ?></h1>
-               <div class='error'>
-               <?php if ( !file_exists( MW_CONFIG_FILE ) ) { ?>
-                       <p>LocalSettings.php not found.</p>
-                       <p>
-                       <?php
-                       if ( $installerStarted ) {
-                               echo "Please <a href=\"" . htmlspecialchars( $path ) . "mw-config/index." . htmlspecialchars( $ext ) . "\">complete the installation</a> and download LocalSettings.php.";
-                       } else {
-                               echo "Please <a href=\"" . htmlspecialchars( $path ) . "mw-config/index." . htmlspecialchars( $ext ) . "\">set up the wiki</a> first.";
-                       }
-                       ?>
-                       </p>
-               <?php } else { ?>
-                       <p>LocalSettings.php not readable.</p>
-                       <p>Please correct file permissions and try again.</p>
-               <?php } ?>
-
-               </div>
-       </body>
-</html>
index 4eea01c..43bab0e 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
@@ -217,8 +217,10 @@ class UsercreateTemplate extends BaseTemplate {
                                                                        <?php if ( !empty( $inputItem['value'] ) ) {
                                                                                echo 'checked="checked"';
                                                                        } ?>
-                                                               ><label for="<?php echo htmlspecialchars( $inputItem['name'] ); ?>"></label>
-                                                       </div><?php $this->msgHtml( $inputItem['msg'] ); ?>
+                                                               ><label for="<?php echo htmlspecialchars( $inputItem['name'] ); ?>">
+                                                                       <?php $this->msgHtml( $inputItem['msg'] ); ?>
+                                                               </label>
+                                                       </div>
                                                <?php
                                                } else {
                                                        // Not a checkbox.
@@ -248,8 +250,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 +267,6 @@ class UsercreateTemplate extends BaseTemplate {
                                                'tabindex' => $tabIndex++
                                        ),
                                        array(
-                                               'mw-ui-big',
                                                'mw-ui-block',
                                                'mw-ui-constructive',
                                        )
index 8bbbfa6..345bb71 100644 (file)
@@ -143,7 +143,7 @@ class UserloginTemplate extends BaseTemplate {
                                        'tabindex' => '6',
                                );
                                $modifiers = array(
-                                       'mw-ui-big', 'mw-ui-constructive',
+                                       'mw-ui-constructive',
                                );
                                echo Html::submitButton( $this->getMsg( 'pt-login-button' )->text(), $attrs, $modifiers );
                                ?>
index a8a38c7..fccb5e1 100644 (file)
@@ -677,10 +677,10 @@ abstract class UploadBase {
                }
 
                // Check dupes against archives
-               $archivedImage = new ArchivedFile( null, 0, "{$hash}.{$this->mFinalExtension}" );
-               if ( $archivedImage->getID() > 0 ) {
-                       if ( $archivedImage->userCan( File::DELETED_FILE ) ) {
-                               $warnings['duplicate-archive'] = $archivedImage->getName();
+               $archivedFile = new ArchivedFile( null, 0, '', $hash );
+               if ( $archivedFile->getID() > 0 ) {
+                       if ( $archivedFile->userCan( File::DELETED_FILE ) ) {
+                               $warnings['duplicate-archive'] = $archivedFile->getName();
                        } else {
                                $warnings['duplicate-archive'] = '';
                        }
index 1499302..3c249ce 100644 (file)
@@ -77,7 +77,7 @@ class UploadFromChunks extends UploadFromFile {
 
                $this->verifyChunk();
                // Create a local stash target
-               $this->mLocalFile = parent::stashFile();
+               $this->mLocalFile = parent::stashFile( $user );
                // Update the initial file offset (based on file size)
                $this->mOffset = $this->mLocalFile->getSize();
                $this->mFileKey = $this->mLocalFile->getFileKey();
@@ -303,10 +303,10 @@ class UploadFromChunks extends UploadFromFile {
        }
 
        /**
-        * Gets the current offset in fromt the stashedupload table
+        * Get the offset at which the next uploaded chunk will be appended to
         * @return int Current byte offset of the chunk file set
         */
-       private function getOffset() {
+       public function getOffset() {
                if ( $this->mOffset !== null ) {
                        return $this->mOffset;
                }
diff --git a/includes/utils/StringUtils.php b/includes/utils/StringUtils.php
deleted file mode 100644 (file)
index c71e315..0000000
+++ /dev/null
@@ -1,608 +0,0 @@
-<?php
-/**
- * Methods to play with strings.
- *
- * 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 collection of static methods to play with strings.
- */
-class StringUtils {
-       /**
-        * Test whether a string is valid UTF-8.
-        *
-        * The function check for invalid byte sequences, overlong encoding but
-        * not for different normalisations.
-        *
-        * This relies internally on the mbstring function mb_check_encoding()
-        * hardcoded to check against UTF-8. Whenever the function is not available
-        * we fallback to a pure PHP implementation. Setting $disableMbstring to
-        * true will skip the use of mb_check_encoding, this is mostly intended for
-        * unit testing our internal implementation.
-        *
-        * @since 1.21
-        * @note In MediaWiki 1.21, this function did not provide proper UTF-8 validation.
-        * In particular, the pure PHP code path did not in fact check for overlong forms.
-        * Beware of this when backporting code to that version of MediaWiki.
-        *
-        * @param string $value String to check
-        * @param bool $disableMbstring Whether to use the pure PHP
-        * implementation instead of trying mb_check_encoding. Intended for unit
-        * testing. Default: false
-        *
-        * @return bool Whether the given $value is a valid UTF-8 encoded string
-        */
-       static function isUtf8( $value, $disableMbstring = false ) {
-               $value = (string)$value;
-
-               // If the mbstring extension is loaded, use it. However, before PHP 5.4, values above
-               // U+10FFFF are incorrectly allowed, so we have to check for them separately.
-               if ( !$disableMbstring && function_exists( 'mb_check_encoding' ) ) {
-                       static $newPHP;
-                       if ( $newPHP === null ) {
-                               $newPHP = !mb_check_encoding( "\xf4\x90\x80\x80", 'UTF-8' );
-                       }
-
-                       return mb_check_encoding( $value, 'UTF-8' ) &&
-                               ( $newPHP || preg_match( "/\xf4[\x90-\xbf]|[\xf5-\xff]/S", $value ) === 0 );
-               }
-
-               if ( preg_match( "/[\x80-\xff]/S", $value ) === 0 ) {
-                       // String contains only ASCII characters, has to be valid
-                       return true;
-               }
-
-               // PCRE implements repetition using recursion; to avoid a stack overflow (and segfault)
-               // for large input, we check for invalid sequences (<= 5 bytes) rather than valid
-               // sequences, which can be as long as the input string is. Multiple short regexes are
-               // used rather than a single long regex for performance.
-               static $regexes;
-               if ( $regexes === null ) {
-                       $cont = "[\x80-\xbf]";
-                       $after = "(?!$cont)"; // "(?:[^\x80-\xbf]|$)" would work here
-                       $regexes = array(
-                               // Continuation byte at the start
-                               "/^$cont/",
-
-                               // ASCII byte followed by a continuation byte
-                               "/[\\x00-\x7f]$cont/S",
-
-                               // Illegal byte
-                               "/[\xc0\xc1\xf5-\xff]/S",
-
-                               // Invalid 2-byte sequence, or valid one then an extra continuation byte
-                               "/[\xc2-\xdf](?!$cont$after)/S",
-
-                               // Invalid 3-byte sequence, or valid one then an extra continuation byte
-                               "/\xe0(?![\xa0-\xbf]$cont$after)/",
-                               "/[\xe1-\xec\xee\xef](?!$cont{2}$after)/S",
-                               "/\xed(?![\x80-\x9f]$cont$after)/",
-
-                               // Invalid 4-byte sequence, or valid one then an extra continuation byte
-                               "/\xf0(?![\x90-\xbf]$cont{2}$after)/",
-                               "/[\xf1-\xf3](?!$cont{3}$after)/S",
-                               "/\xf4(?![\x80-\x8f]$cont{2}$after)/",
-                       );
-               }
-
-               foreach ( $regexes as $regex ) {
-                       if ( preg_match( $regex, $value ) !== 0 ) {
-                               return false;
-                       }
-               }
-
-               return true;
-       }
-
-       /**
-        * Perform an operation equivalent to
-        *
-        *     preg_replace( "!$startDelim(.*?)$endDelim!", $replace, $subject );
-        *
-        * except that it's worst-case O(N) instead of O(N^2)
-        *
-        * Compared to delimiterReplace(), this implementation is fast but memory-
-        * hungry and inflexible. The memory requirements are such that I don't
-        * recommend using it on anything but guaranteed small chunks of text.
-        *
-        * @param string $startDelim
-        * @param string $endDelim
-        * @param string $replace
-        * @param string $subject
-        *
-        * @return string
-        */
-       static function hungryDelimiterReplace( $startDelim, $endDelim, $replace, $subject ) {
-               $segments = explode( $startDelim, $subject );
-               $output = array_shift( $segments );
-               foreach ( $segments as $s ) {
-                       $endDelimPos = strpos( $s, $endDelim );
-                       if ( $endDelimPos === false ) {
-                               $output .= $startDelim . $s;
-                       } else {
-                               $output .= $replace . substr( $s, $endDelimPos + strlen( $endDelim ) );
-                       }
-               }
-
-               return $output;
-       }
-
-       /**
-        * Perform an operation equivalent to
-        *
-        *   preg_replace_callback( "!$startDelim(.*)$endDelim!s$flags", $callback, $subject )
-        *
-        * This implementation is slower than hungryDelimiterReplace but uses far less
-        * memory. The delimiters are literal strings, not regular expressions.
-        *
-        * If the start delimiter ends with an initial substring of the end delimiter,
-        * e.g. in the case of C-style comments, the behavior differs from the model
-        * regex. In this implementation, the end must share no characters with the
-        * start, so e.g. /*\/ is not considered to be both the start and end of a
-        * comment. /*\/xy/*\/ is considered to be a single comment with contents /xy/.
-        *
-        * @param string $startDelim Start delimiter
-        * @param string $endDelim End delimiter
-        * @param callable $callback Function to call on each match
-        * @param string $subject
-        * @param string $flags Regular expression flags
-        * @throws MWException
-        * @return string
-        */
-       static function delimiterReplaceCallback( $startDelim, $endDelim, $callback,
-               $subject, $flags = ''
-       ) {
-               $inputPos = 0;
-               $outputPos = 0;
-               $output = '';
-               $foundStart = false;
-               $encStart = preg_quote( $startDelim, '!' );
-               $encEnd = preg_quote( $endDelim, '!' );
-               $strcmp = strpos( $flags, 'i' ) === false ? 'strcmp' : 'strcasecmp';
-               $endLength = strlen( $endDelim );
-               $m = array();
-
-               while ( $inputPos < strlen( $subject ) &&
-                       preg_match( "!($encStart)|($encEnd)!S$flags", $subject, $m, PREG_OFFSET_CAPTURE, $inputPos )
-               ) {
-                       $tokenOffset = $m[0][1];
-                       if ( $m[1][0] != '' ) {
-                               if ( $foundStart &&
-                                       $strcmp( $endDelim, substr( $subject, $tokenOffset, $endLength ) ) == 0
-                               ) {
-                                       # An end match is present at the same location
-                                       $tokenType = 'end';
-                                       $tokenLength = $endLength;
-                               } else {
-                                       $tokenType = 'start';
-                                       $tokenLength = strlen( $m[0][0] );
-                               }
-                       } elseif ( $m[2][0] != '' ) {
-                               $tokenType = 'end';
-                               $tokenLength = strlen( $m[0][0] );
-                       } else {
-                               throw new MWException( 'Invalid delimiter given to ' . __METHOD__ );
-                       }
-
-                       if ( $tokenType == 'start' ) {
-                               # Only move the start position if we haven't already found a start
-                               # This means that START START END matches outer pair
-                               if ( !$foundStart ) {
-                                       # Found start
-                                       $inputPos = $tokenOffset + $tokenLength;
-                                       # Write out the non-matching section
-                                       $output .= substr( $subject, $outputPos, $tokenOffset - $outputPos );
-                                       $outputPos = $tokenOffset;
-                                       $contentPos = $inputPos;
-                                       $foundStart = true;
-                               } else {
-                                       # Move the input position past the *first character* of START,
-                                       # to protect against missing END when it overlaps with START
-                                       $inputPos = $tokenOffset + 1;
-                               }
-                       } elseif ( $tokenType == 'end' ) {
-                               if ( $foundStart ) {
-                                       # Found match
-                                       $output .= call_user_func( $callback, array(
-                                               substr( $subject, $outputPos, $tokenOffset + $tokenLength - $outputPos ),
-                                               substr( $subject, $contentPos, $tokenOffset - $contentPos )
-                                       ) );
-                                       $foundStart = false;
-                               } else {
-                                       # Non-matching end, write it out
-                                       $output .= substr( $subject, $inputPos, $tokenOffset + $tokenLength - $outputPos );
-                               }
-                               $inputPos = $outputPos = $tokenOffset + $tokenLength;
-                       } else {
-                               throw new MWException( 'Invalid delimiter given to ' . __METHOD__ );
-                       }
-               }
-               if ( $outputPos < strlen( $subject ) ) {
-                       $output .= substr( $subject, $outputPos );
-               }
-
-               return $output;
-       }
-
-       /**
-        * Perform an operation equivalent to
-        *
-        *   preg_replace( "!$startDelim(.*)$endDelim!$flags", $replace, $subject )
-        *
-        * @param string $startDelim Start delimiter regular expression
-        * @param string $endDelim End delimiter regular expression
-        * @param string $replace Replacement string. May contain $1, which will be
-        *                 replaced by the text between the delimiters
-        * @param string $subject String to search
-        * @param string $flags Regular expression flags
-        * @return string The string with the matches replaced
-        */
-       static function delimiterReplace( $startDelim, $endDelim, $replace, $subject, $flags = '' ) {
-               $replacer = new RegexlikeReplacer( $replace );
-
-               return self::delimiterReplaceCallback( $startDelim, $endDelim,
-                       $replacer->cb(), $subject, $flags );
-       }
-
-       /**
-        * More or less "markup-safe" explode()
-        * Ignores any instances of the separator inside <...>
-        * @param string $separator
-        * @param string $text
-        * @return array
-        */
-       static function explodeMarkup( $separator, $text ) {
-               $placeholder = "\x00";
-
-               // Remove placeholder instances
-               $text = str_replace( $placeholder, '', $text );
-
-               // Replace instances of the separator inside HTML-like tags with the placeholder
-               $replacer = new DoubleReplacer( $separator, $placeholder );
-               $cleaned = StringUtils::delimiterReplaceCallback( '<', '>', $replacer->cb(), $text );
-
-               // Explode, then put the replaced separators back in
-               $items = explode( $separator, $cleaned );
-               foreach ( $items as $i => $str ) {
-                       $items[$i] = str_replace( $placeholder, $separator, $str );
-               }
-
-               return $items;
-       }
-
-       /**
-        * Escape a string to make it suitable for inclusion in a preg_replace()
-        * replacement parameter.
-        *
-        * @param string $string
-        * @return string
-        */
-       static function escapeRegexReplacement( $string ) {
-               $string = str_replace( '\\', '\\\\', $string );
-               $string = str_replace( '$', '\\$', $string );
-
-               return $string;
-       }
-
-       /**
-        * Workalike for explode() with limited memory usage.
-        * Returns an Iterator
-        * @param string $separator
-        * @param string $subject
-        * @return ArrayIterator|ExplodeIterator
-        */
-       static function explode( $separator, $subject ) {
-               if ( substr_count( $subject, $separator ) > 1000 ) {
-                       return new ExplodeIterator( $separator, $subject );
-               } else {
-                       return new ArrayIterator( explode( $separator, $subject ) );
-               }
-       }
-}
-
-/**
- * Base class for "replacers", objects used in preg_replace_callback() and
- * StringUtils::delimiterReplaceCallback()
- */
-class Replacer {
-       /**
-        * @return array
-        */
-       function cb() {
-               return array( &$this, 'replace' );
-       }
-}
-
-/**
- * Class to replace regex matches with a string similar to that used in preg_replace()
- */
-class RegexlikeReplacer extends Replacer {
-       private $r;
-
-       /**
-        * @param string $r
-        */
-       function __construct( $r ) {
-               $this->r = $r;
-       }
-
-       /**
-        * @param array $matches
-        * @return string
-        */
-       function replace( $matches ) {
-               $pairs = array();
-               foreach ( $matches as $i => $match ) {
-                       $pairs["\$$i"] = $match;
-               }
-
-               return strtr( $this->r, $pairs );
-       }
-}
-
-/**
- * Class to perform secondary replacement within each replacement string
- */
-class DoubleReplacer extends Replacer {
-       /**
-        * @param mixed $from
-        * @param mixed $to
-        * @param int $index
-        */
-       function __construct( $from, $to, $index = 0 ) {
-               $this->from = $from;
-               $this->to = $to;
-               $this->index = $index;
-       }
-
-       /**
-        * @param array $matches
-        * @return mixed
-        */
-       function replace( $matches ) {
-               return str_replace( $this->from, $this->to, $matches[$this->index] );
-       }
-}
-
-/**
- * Class to perform replacement based on a simple hashtable lookup
- */
-class HashtableReplacer extends Replacer {
-       private $table, $index;
-
-       /**
-        * @param array $table
-        * @param int $index
-        */
-       function __construct( $table, $index = 0 ) {
-               $this->table = $table;
-               $this->index = $index;
-       }
-
-       /**
-        * @param array $matches
-        * @return mixed
-        */
-       function replace( $matches ) {
-               return $this->table[$matches[$this->index]];
-       }
-}
-
-/**
- * Replacement array for FSS with fallback to strtr()
- * Supports lazy initialisation of FSS resource
- */
-class ReplacementArray {
-       private $data = false;
-       private $fss = false;
-
-       /**
-        * Create an object with the specified replacement array
-        * The array should have the same form as the replacement array for strtr()
-        * @param array $data
-        */
-       function __construct( $data = array() ) {
-               $this->data = $data;
-       }
-
-       /**
-        * @return array
-        */
-       function __sleep() {
-               return array( 'data' );
-       }
-
-       function __wakeup() {
-               $this->fss = false;
-       }
-
-       /**
-        * Set the whole replacement array at once
-        * @param array $data
-        */
-       function setArray( $data ) {
-               $this->data = $data;
-               $this->fss = false;
-       }
-
-       /**
-        * @return array|bool
-        */
-       function getArray() {
-               return $this->data;
-       }
-
-       /**
-        * Set an element of the replacement array
-        * @param string $from
-        * @param string $to
-        */
-       function setPair( $from, $to ) {
-               $this->data[$from] = $to;
-               $this->fss = false;
-       }
-
-       /**
-        * @param array $data
-        */
-       function mergeArray( $data ) {
-               $this->data = array_merge( $this->data, $data );
-               $this->fss = false;
-       }
-
-       /**
-        * @param ReplacementArray $other
-        */
-       function merge( $other ) {
-               $this->data = array_merge( $this->data, $other->data );
-               $this->fss = false;
-       }
-
-       /**
-        * @param string $from
-        */
-       function removePair( $from ) {
-               unset( $this->data[$from] );
-               $this->fss = false;
-       }
-
-       /**
-        * @param array $data
-        */
-       function removeArray( $data ) {
-               foreach ( $data as $from => $to ) {
-                       $this->removePair( $from );
-               }
-               $this->fss = false;
-       }
-
-       /**
-        * @param string $subject
-        * @return string
-        */
-       function replace( $subject ) {
-               if ( function_exists( 'fss_prep_replace' ) ) {
-                       if ( $this->fss === false ) {
-                               $this->fss = fss_prep_replace( $this->data );
-                       }
-                       $result = fss_exec_replace( $this->fss, $subject );
-               } else {
-                       $result = strtr( $subject, $this->data );
-               }
-
-               return $result;
-       }
-}
-
-/**
- * An iterator which works exactly like:
- *
- * foreach ( explode( $delim, $s ) as $element ) {
- *    ...
- * }
- *
- * Except it doesn't use 193 byte per element
- */
-class ExplodeIterator implements Iterator {
-       // The subject string
-       private $subject, $subjectLength;
-
-       // The delimiter
-       private $delim, $delimLength;
-
-       // The position of the start of the line
-       private $curPos;
-
-       // The position after the end of the next delimiter
-       private $endPos;
-
-       // The current token
-       private $current;
-
-       /**
-        * Construct a DelimIterator
-        * @param string $delim
-        * @param string $subject
-        */
-       function __construct( $delim, $subject ) {
-               $this->subject = $subject;
-               $this->delim = $delim;
-
-               // Micro-optimisation (theoretical)
-               $this->subjectLength = strlen( $subject );
-               $this->delimLength = strlen( $delim );
-
-               $this->rewind();
-       }
-
-       function rewind() {
-               $this->curPos = 0;
-               $this->endPos = strpos( $this->subject, $this->delim );
-               $this->refreshCurrent();
-       }
-
-       function refreshCurrent() {
-               if ( $this->curPos === false ) {
-                       $this->current = false;
-               } elseif ( $this->curPos >= $this->subjectLength ) {
-                       $this->current = '';
-               } elseif ( $this->endPos === false ) {
-                       $this->current = substr( $this->subject, $this->curPos );
-               } else {
-                       $this->current = substr( $this->subject, $this->curPos, $this->endPos - $this->curPos );
-               }
-       }
-
-       function current() {
-               return $this->current;
-       }
-
-       /**
-        * @return int|bool Current position or boolean false if invalid
-        */
-       function key() {
-               return $this->curPos;
-       }
-
-       /**
-        * @return string
-        */
-       function next() {
-               if ( $this->endPos === false ) {
-                       $this->curPos = false;
-               } else {
-                       $this->curPos = $this->endPos + $this->delimLength;
-                       if ( $this->curPos >= $this->subjectLength ) {
-                               $this->endPos = false;
-                       } else {
-                               $this->endPos = strpos( $this->subject, $this->delim, $this->curPos );
-                       }
-               }
-               $this->refreshCurrent();
-
-               return $this->current;
-       }
-
-       /**
-        * @return bool
-        */
-       function valid() {
-               return $this->curPos !== false;
-       }
-}
index fbd4f6d..d203c0f 100644 (file)
@@ -3172,9 +3172,7 @@ class Language {
                        return;
                }
                $this->mMagicHookDone = true;
-               wfProfileIn( 'LanguageGetMagic' );
                Hooks::run( 'LanguageGetMagic', array( &$this->mMagicExtensions, $this->getCode() ) );
-               wfProfileOut( 'LanguageGetMagic' );
        }
 
        /**
index bb26d19..d4df1ab 100644 (file)
        'ug-latn' => 'Uyghurche', # Uyghur (Latin script)
        'uk' => 'українська', # Ukrainian
        'ur' => 'اردو',     # Urdu
-       'uz' => 'oʻzbekcha',   # Uzbek
+       'uz' => "oʻzbekcha/ўзбекча",    # Uzbek (multiple scripts - defaults to Latin)
+       'uz-cyrl' => "ўзбекча",  # Uzbek Cyrillic
+       'uz-latn' => "oʻzbekcha",      # Uzbek Latin (default)
        've' => 'Tshivenda',            # Venda
        'vec' => 'vèneto',     # Venetian
        'vep' => 'vepsän kel’',      # Veps
index 2ec13d6..c8e4bf0 100644 (file)
@@ -11,7 +11,8 @@
                        "Spacebirdy",
                        "Tsepelcory",
                        "Wōdenhelm",
-                       "아라"
+                       "아라",
+                       "Dpk"
                ]
        },
        "tog-underline": "Mearc under hlencan:",
        "databaseerror": "Cȳþþuhordes wōh",
        "databaseerror-error": "Wōg: $1",
        "laggedslavemode": "'''Warnung:''' Wēnunga næbbe se tramet nīwlīca nīwunga.",
+       "readonly": "Ġifhord locen",
        "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",
        "acct_creation_throttle_hit": "Nēosiende tō þissum wici, þe þīnne IP-Stōwe brȳcþ, hæfþ gesett {{PLURAL:$1|1 hordcleofan|$1 hordcleofan}} in þǣm læsten dæge. Þu ne canst settan ǣnige māran. Þǣrfram ne cunnon Nēosiende, þe þisne IP-Stōwe brȳcþ, settan ǣnige hordcleofan māran on þisse handhwīle.",
        "accountcreated": "Scōp reccinge",
        "loginlanguagelabel": "Sprǣc: $1",
+       "pt-login": "Inmeldian",
+       "pt-login-button": "Inmeldian",
+       "pt-createaccount": "Ūtmeldian",
+       "pt-userlogout": "Ūtmeldian",
+       "changepassword": "Andwendan þafungword",
        "oldpassword": "Eald þafungword:",
        "newpassword": "Nīwe þafungword:",
        "retypenew": "Wrīt nīwe þafungword eft:",
        "resetpass-submit-loggedin": "Andwendan þafungword",
        "resetpass-submit-cancel": "Undōn",
+       "passwordreset-legend": "Settan þafungword eft",
        "passwordreset-username": "Brūcendnama:",
        "bold_sample": "Þicce traht",
        "bold_tip": "Þicce traht",
        "cur": "nū",
        "next": "nīehst",
        "last": "ǣr",
+       "page_first": "ærost",
+       "page_last": "sƿift",
        "history-fieldset-title": "Sēcan stǣr",
        "histfirst": "ieldeste",
        "histlast": "nīwoste",
        "nchanges": "$1 {{PLURAL:$1|andwendung|andwendunga}}",
        "recentchanges": "Nīwa andwendunga",
        "recentchanges-legend": "Nīwra andwendunga cyras",
+       "recentchanges-summary": "Sēon þā nīwostan andwendunga þisses wiki on þissum tramete",
        "recentchanges-feed-description": "Īwan þā nīwostan andwendunga þæs wiki mid þissum strēame",
        "recentchanges-label-newpage": "Þēos adihtung scōp nīwne tramet",
        "recentchanges-label-minor": "Þēos is lytel adihtung",
        "deletecomment": "Racu:",
        "deleteotherreason": "Ōðra/nīehst racu:",
        "deletereasonotherlist": "Ōðru racu",
-       "rollback_short": "Settan on bæc",
        "rollbacklink": "settan on bæc",
        "rollbackfailed": "Bæcsettung tōsǣlde",
        "editcomment": "Þǣre adihtunge se cwide wæs: \"''$1''\".",
index 23ae380..5b3dc29 100644 (file)
        "showhideselectedversions": "أظهر/أخف المراجعات المختارة",
        "editundo": "رجوع",
        "diff-empty": "(لا فرق)",
-       "diff-multi-sameuser": "({{PLURAL:$1|Ù\85راجعة Ù\85تÙ\88سطة Ù\88احدة|Ù\85راجعتاÙ\86 Ù\85تÙ\88سطتاÙ\86|$1 Ù\85راجعات Ù\85تÙ\88سطة|$1 Ù\85راجعة Ù\85تÙ\88سطة}} Ø¨Ù\88اسطة Ù\86Ù\81س Ø§Ù\84Ù\85ستخدÙ\85 ØºÙ\8aر Ù\85عرÙ\88ضة)",
-       "diff-multi-otherusers": "({{PLURAL:$1|Ù\85راجعة Ù\85تÙ\88سطة Ù\88احدة|Ù\85راجعتاÙ\86 Ù\85تÙ\88سطتاÙ\86|$1 Ù\85راجعات Ù\85تÙ\88سطة|$1 Ù\85راجعة Ù\85تÙ\88سطة}} Ø¨Ù\88اسطة {{PLURAL:$2|Ù\85ستخدÙ\85 Ù\88احد Ø¢Ø®Ø±|Ù\85ستخدÙ\85Ù\8aÙ\86 Ø§Ø«Ù\86Ù\8aÙ\86 Ø¢Ø®Ø±Ù\8aÙ\86|$2 Ù\85ستخدÙ\85Ù\8aÙ\86|$2 Ù\85ستخدÙ\85اÙ\8b|$2 Ù\85ستخدÙ\85}} ØºÙ\8aر Ù\85عرÙ\88ضة)",
+       "diff-multi-sameuser": "({{PLURAL:$1|Ù\84ا Ù\85راجعات Ù\85تÙ\88سطة|Ù\85راجعة Ù\85تÙ\88سطة Ù\88احدة|Ù\85راجعتاÙ\86 Ù\85تÙ\88سطتاÙ\86|$1 Ù\85راجعات Ù\85تÙ\88سطة|$1 Ù\85راجعة Ù\85تÙ\88سطة}} Ø¨Ù\88اسطة Ù\86Ù\81س Ø§Ù\84Ù\85ستخدÙ\85 ØºÙ\8aر {{PLURAL:$1|Ù\85عرÙ\88ضة|Ù\85عرÙ\88ضة|Ù\85عرÙ\88ضتÙ\8aÙ\86\85عرÙ\88ضة}})",
+       "diff-multi-otherusers": "({{PLURAL:$1|Ù\84ا Ù\85راجعات|Ù\85راجعة Ù\85تÙ\88سطة Ù\88احدة|Ù\85راجعتاÙ\86 Ù\85تÙ\88سطتاÙ\86|$1 Ù\85راجعات Ù\85تÙ\88سطة|$1 Ù\85راجعة Ù\85تÙ\88سطة}} Ø¨Ù\88اسطة {{PLURAL:$2|Ù\88Ù\84ا Ù\85ستخدÙ\85\85ستخدÙ\85 Ù\88احد Ø¢Ø®Ø±|Ù\85ستخدÙ\85Ù\8aÙ\86 Ø§Ø«Ù\86Ù\8aÙ\86 Ø¢Ø®Ø±Ù\8aÙ\86|$2 Ù\85ستخدÙ\85Ù\8aÙ\86|$2 Ù\85ستخدÙ\85اÙ\8b|$2 Ù\85ستخدÙ\85}} ØºÙ\8aر {{PLURAL:$1|Ù\85عرÙ\88ضة|Ù\85عرÙ\88ضة|Ù\85عرÙ\88ضتÙ\8aÙ\86\85عرÙ\88ضة}})",
        "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-personal": "ملف المستخدم",
        "prefs-rc": "أحدث التغييرات",
        "prefs-watchlist": "قائمة المراقبة",
+       "prefs-editwatchlist": "تعديل قائمة المراقبة",
+       "prefs-editwatchlist-label": "عدل قائمة مراقبتك:",
+       "prefs-editwatchlist-edit": "أعرض وأحذف عناوين من قائمة مراقبتك",
+       "prefs-editwatchlist-raw": "عدل قائمة المراقبة الخام",
+       "prefs-editwatchlist-clear": "امسح قائمة المراقبة",
        "prefs-watchlist-days": "عدد الأيام للعرض في قائمة المراقبة:",
        "prefs-watchlist-days-max": "الحد الأقصى {{PLURAL:$1|أقل من يوم|يوم واحد|يومان|$1 أيام|$1 يوما|$1 يوم}}",
        "prefs-watchlist-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|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|type|types}}: $1.",
+       "upload-preferred": "أنواع الملفات المفضلة {{PLURAL:$2|type|types}}: $1.",
+       "upload-prohibited": "أنواع الملفات الممنوعة {{PLURAL:$2|type|types}}: $1.",
        "uploadlogpage": "سجل الرفع",
        "uploadlogpagetext": "في الأسفل قائمة بأحدث عمليات رفع الملفات.\nانظر [[Special:NewFiles|معرض الملفات الجديدة]] لعرض بصري أكثر",
        "filename": "اسم الملف",
        "namespace": "النطاق:",
        "invert": "اعكس الاختيار",
        "tooltip-invert": "علم على هذا الصندوق لإخفاء التغييرات للصفحات في النطاق المختار (والنطاق المصاحب لو معلم عليها)",
+       "tooltip-whatlinkshere-invert": "قم بتعليم هذا الخيار لإخفاء الروابط من الصفحات التي تم تعليم نطاقاتها.",
        "namespace_association": "النطاق المقترن",
        "tooltip-namespace_association": "علم على هذا الصندوق لتضمين نطاق النقاش أو الموضوع المصاحب للنطاق المختار",
        "blanknamespace": "(رئيسي)",
        "javascripttest": "اختبار جافاسكربت",
        "javascripttest-pagetext-noframework": "هذه الصفحة محجوزة لإجراء أختبارات الجافا سكريبت.",
        "javascripttest-pagetext-unknownframework": "إطار اختبار غير معروف \"$1\".",
+       "javascripttest-pagetext-unknownaction": "فعل غير معروف \"$1\".",
        "javascripttest-pagetext-frameworks": "الرجاء اختيار أحد أطر الاختبارات التالية: $1",
        "javascripttest-pagetext-skins": "قم باختيار الواجهة لإجراء الإحتبارات بها:",
        "javascripttest-qunit-intro": "راجع [$1 وثيقة الاختبار] على mediawiki.org.",
index 01a0d29..d90c4ef 100644 (file)
@@ -14,7 +14,8 @@
                        "Reedy",
                        "Simbu123",
                        "Urhixidur",
-                       "아라"
+                       "아라",
+                       "Aftabuzzaman"
                ]
        },
        "tog-underline": "সংযোগসমূহ অধোৰেখিত কৰক:",
        "expandtemplates": "সাঁচবোৰ বহলাওক",
        "expand_templates_input": "পাঠ্য ভৰাওক",
        "expand_templates_output": "ফলাফল",
-       "expand_templates_ok": "à¦\93à¦\95ে",
+       "expand_templates_ok": "ঠিà¦\95 à¦\86à¦\9bে",
        "expand_templates_remove_comments": "মন্তব্য গু়চাওক",
        "expand_templates_preview": "খচৰা",
        "pagelanguage": "পৃষ্ঠাৰ ভাষা নিৰ্বাচক",
index d82ffbb..5cbed2e 100644 (file)
        "deleteprotected": "Nun pues desaniciar esta páxina porque ta protexida.",
        "deleting-backlinks-warning": "'''Avisu:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Otres páxines]] enllacen a, o trescluyen de, la páxina que ta a piques de desaniciar.",
        "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}}",
        "sp-contributions-newonly": "Amosar namái les ediciones que son creaciones de páxines",
        "sp-contributions-submit": "Buscar",
        "whatlinkshere": "Lo qu'enllaza equí",
-       "whatlinkshere-title": "Páxines qu'enllacien a \"$1\"",
+       "whatlinkshere-title": "Páxines qu’enllacien a «$1»",
        "whatlinkshere-page": "Páxina:",
        "linkshere": "Les páxines siguientes enllacien a '''[[:$1]]''':",
        "nolinkshere": "Nenguna páxina enllaza a '''[[:$1]]'''.",
        "import-logentry-interwiki": "treswikificada $1",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|revisión importada|revisiones importaes}} dende $2",
        "javascripttest": "Prueba de JavaScript",
-       "javascripttest-title": "Executando pruebes de $1",
        "javascripttest-pagetext-noframework": "Esta páxina ta acutada pa executar pruebes de javascript.",
        "javascripttest-pagetext-unknownframework": "L'entornu de pruebes «$1» ye desconocíu.",
        "javascripttest-pagetext-frameworks": "Escueyi un de los siguientes entornos de pruebes: $1",
        "javascripttest-pagetext-skins": "Escueyi una apariencia pa executar les pruebes:",
        "javascripttest-qunit-intro": "Ver la [$1 documentación de les pruebes] en mediawiki.org.",
-       "javascripttest-qunit-heading": "Conxuntu de pruebes JavaScript QUnit de MediaWiki",
        "tooltip-pt-userpage": "La to páxina d'usuariu",
        "tooltip-pt-anonuserpage": "La páxina d'usuariu de la IP cola que tas editando",
        "tooltip-pt-mytalk": "La to páxina d'alderique",
index 1b27400..3e03958 100644 (file)
@@ -5,11 +5,11 @@
                ]
        },
        "tog-underline": "कड़ि अधोरेखन:",
-       "tog-hideminor": "à¤\85बहिन à¤\95य बदलावमें छोट बदलाव लुकुआवा जाय",
-       "tog-hidepatrolled": "à¤\85बहिन à¤\95य बदलावमें परीक्षित बदलाव लुकुआवा जाय",
+       "tog-hideminor": "नà¤\81वा बदलावमें छोट बदलाव लुकुआवा जाय",
+       "tog-hidepatrolled": "नà¤\81वा बदलावमें परीक्षित बदलाव लुकुआवा जाय",
        "tog-newpageshidepatrolled": "नवा पन्नन कय सूची में परीक्षित पन्ना लुकुआवा जाय",
        "tog-extendwatchlist": "खाली हालिए कय नाहीं, बल्कि कुल बदलाव कय देखावे कय लिए ध्यानसूची कय विस्तारित करा जाय",
-       "tog-usenewrc": "à¤\85भिन à¤\95य à¤¬à¤¦à¤²à¤¾à¤µ à¤®à¥\87 à¤\85à¤\89र à¤§à¥\8dयानसà¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤¬à¤¦à¤²à¤¾à¤µ à¤\95य à¤ªà¤¨à¥\8dना à¤\95य अनुसार समूह में बाँटा जाय",
+       "tog-usenewrc": "नà¤\81वा à¤¬à¤¦à¤²à¤¾à¤µ à¤®à¥\87à¤\82 à¤\85à¤\89र à¤§à¥\8dयानसà¥\82à¤\9aà¥\80 à¤¬à¤¦à¤²à¤¾à¤µ à¤\95य à¤ªà¤¨à¥\8dना अनुसार समूह में बाँटा जाय",
        "tog-numberheadings": "शीर्षक स्व-क्रमांकित करा जाय",
        "tog-showtoolbar": "सम्पादन औज़ारपट्टी देखावो",
        "tog-editondblclick": "दुई क्लिक से पन्ना संपादित करा जाय",
        "tog-shownumberswatching": "ध्यान रख्खय वाले सदस्यन् कय संख्या देखावो",
        "tog-oldsig": "अभिन कय हस्ताक्षर:",
        "tog-fancysig": "हस्ताक्षर कय विकिपाठ जैसन मानों (बिना स्वचालित कड़ी कय)",
-       "tog-uselivepreview": "सà¤\9cिव à¤¦à¥\87à¤\96à¥\8b",
-       "tog-forceeditsummary": "यदि à¤¸à¤®à¥\8dपादन à¤¸à¤¾à¤°à¤¾à¤\82श à¤¨à¤¾à¤\88 à¤¦à¤¿à¤¹à¤¾ à¤¹à¥\88 à¤¤à¥\8b à¤¹à¤®à¥\8dमà¥\88 à¤¬à¤¤à¤¾à¤µà¥\8b",
+       "tog-uselivepreview": "सà¤\9cिव à¤\9dलà¤\95 à¤¦à¥\87à¤\96ा à¤\9cाय",
+       "tog-forceeditsummary": "यदि à¤¸à¤®à¥\8dपादन à¤¸à¤¾à¤°à¤¾à¤\82श à¤¨à¤¾à¤\88 à¤¦à¤¿à¤¹à¤¾ à¤¹à¥\88 à¤¤à¥\8b à¤¹à¤®à¥\8dमà¥\88 à¤¬à¤¤à¤¾à¤µà¤¾ à¤\9cाय",
        "tog-watchlisthideown": "हमरे ध्यानसूची से हमार करल बदलाव लुकुवाओ",
        "tog-watchlisthidebots": "हमरे ध्यानसूची से बॉट कय करल परिवर्तन लुकुवाओ",
        "tog-watchlisthideminor": "हमरे ध्यानसूची से छोट बदलाव लुकुवाओ",
-       "tog-watchlisthideliu": "हमरà¥\87 à¤§à¥\8dयानसà¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤²à¤¼à¤¾à¤\97 à¤\87न à¤\95रल à¤¸à¤¦à¤¸à¥\8dयनà¥\8d à¤\95य à¤¸à¤®à¥\8dपादन à¤¨à¤¾ à¤¦à¥\87à¤\96ावà¥\8b",
+       "tog-watchlisthideliu": "हमरà¥\87 à¤§à¥\8dयानसà¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤²à¤¼à¤¾à¤\97 à¤\87न à¤\95रल à¤¸à¤¦à¤¸à¥\8dयनà¥\8d à¤\95य à¤¸à¤®à¥\8dपादन à¤¨à¤¾ à¤¦à¥\87à¤\96ावा à¤\9cाय",
        "tog-watchlisthideanons": "आइ॰पी सदस्यन् कय करल सम्पादन हमरे ध्यानसूची में ना देखाओ",
        "tog-watchlisthidepatrolled": "परीक्षित सम्पादन हमरे ध्यानसूची में लुकुवाओ",
        "tog-ccmeonemails": "हमरे द्वारा अउर सदस्यन् कय पठावल् ई-मेल कय प्रति हमहु कय पठओ",
        "tog-diffonly": "अवतरणन् में अन्तर देखावत समय पुरान अवतरण ना देखाओ",
        "tog-showhiddencats": "लुकुवावल श्रेणि देखाओ",
        "tog-norollbackdiff": "सम्पादन वापिस लेवेक बाद अन्तर ना देखाओ",
-       "tog-useeditwarning": "जब हम कवनो सम्पादन पन्ना कय बिना सहेजे बदलाव कय साथ छोड दि तव हम्मै बतावो।",
+       "tog-useeditwarning": "जब हम कवनो सम्पादन पन्ना कय बिना सहेजे बदलाव कय साथ छोड दि तव हम्मै बतावो।",
        "tog-prefershttps": "लॉगिन करेक बाद हमेशा सुरक्षित कनेक्शन कय प्रयोग करो",
        "underline-always": "हमेशा",
        "underline-never": "कब्बो नाई",
        "about": "कय बारे में",
        "article": "लेख",
        "newwindow": "(नवा विंडो में खुलत अहै)",
-       "cancel": "रदà¥\8dद à¤\95रà¥\87",
+       "cancel": "रदà¥\8dद à¤\95रा à¤\9cाय",
        "moredotdotdot": "अउर...",
        "morenotlisted": "ई पूरा सूची नाई होय।",
        "mypage": "पन्ना",
        "qbedit": "सम्पादन",
        "qbpageoptions": "ई पन्ना",
        "qbmyoptions": "हमार पन्ना",
-       "faq": "बहà¥\81त  à¤ªà¥\82à¤\9bा à¤\9cाय à¤µà¤¾à¤²à¤¾ à¤ªà¥\8dरशà¥\8dन",
+       "faq": "साधारण à¤¸à¤µà¤¾à¤²",
        "faqpage": "Project:ढेर पूछा जाय वाला सवाल",
        "actions": "काम कुल",
        "namespaces": "नामस्थान",
        "updatedmarker": "हमरे अन्तिम दाँइ आवे कय बाद कय अपडेट",
        "printableversion": "छापए लायक संस्करण",
        "permalink": "स्थायी कड़ी",
-       "print": "पà¥\8dरिà¤\82à¤\9f à¤\95रà¥\8b",
-       "view": "दà¥\87à¤\96à¥\8b",
-       "view-foreign": "$1 à¤ªà¥\87 à¤¦à¥\87à¤\96à¥\8b",
+       "print": "पà¥\8dरिà¤\82à¤\9f à¤\95रा à¤\9cाय",
+       "view": "दà¥\87à¤\96ा à¤\9cाय",
+       "view-foreign": "$1 à¤ªà¥\87 à¤¦à¥\87à¤\96ा à¤\9cाय",
        "edit": "सम्पादन",
        "edit-local": "स्थानीय विवरण सम्पादन",
        "create": "बनावो",
        "articlepage": "सामग्री पन्ना देखा जाय",
        "talk": "चर्चा",
        "views": "दर्शाव",
-       "toolbox": "साधन à¤ªà¥\87à¤\9fà¥\80",
-       "userpage": "सदसà¥\8dय à¤ªà¤¨à¥\8dना à¤¦à¥\87à¤\96à¥\8b",
+       "toolbox": "à¤\94à¤\9cार à¤\95य à¤¬à¤\95à¥\8dसा",
+       "userpage": "सदसà¥\8dय à¤ªà¤¨à¥\8dना à¤¦à¥\87à¤\96ा à¤\9cाय",
        "projectpage": "परियोजना पन्ना देखा जाय",
        "imagepage": "फ़ाइल पन्ना देखा जाय",
        "mediawikipage": "सनेशा पन्ना देखा जाय",
        "viewhelppage": "मदद पन्ना देखा जाय",
        "categorypage": "श्रेणी पन्ना  देखा जाय",
        "viewtalkpage": "चर्चा देखा जाय",
-       "otherlanguages": "à¤\85à¤\89र à¤­à¤¾à¤·à¤¾ à¤¸à¤¬",
+       "otherlanguages": "दà¥\81सर à¤­à¤¾à¤·à¤¾ à¤®à¥\87à¤\82",
        "redirectedfrom": "($1 से पुनर्निर्देशित)",
        "redirectpagesub": "पुनर्निर्देश पन्ना",
-       "redirectto": "पà¥\81नरà¥\8dनिरà¥\8dदà¥\87श à¤\95रà¥\8b:",
+       "redirectto": "पà¥\81नरà¥\8dनिरà¥\8dदà¥\87श à¤\95रा à¤\9cाय:",
        "lastmodifiedat": "इ पन्ना कय पिछला बदलाव $1 कय $2 बजे भवा रहा।",
        "viewcount": "ई पन्ना {{PLURAL:$1|एक|$1}} दाइँ देख़ गा है।",
        "protectedpage": "सुरक्षित पन्ना",
        "toc": "विषय सूची",
        "showtoc": "देखाओ",
        "hidetoc": "लुकुवाओ",
-       "collapsible-collapse": "à¤\9bà¥\8bà¤\9f à¤\95रà¥\8b",
-       "collapsible-expand": "बडा à¤\95रà¥\8b",
+       "collapsible-collapse": "à¤\9bà¥\8bà¤\9f à¤\95रा à¤\9cाय",
+       "collapsible-expand": "बडा à¤\95रा à¤\9cाय",
        "confirmable-confirm": "का {{GENDER:$1|आप}} निश्चित हव?",
        "confirmable-yes": "हाँ",
        "confirmable-no": "नाहीँ",
        "site-atom-feed": "$1 कय एटम फ़ीड",
        "page-rss-feed": "\"$1\" आर॰एस॰एस फ़ीड",
        "page-atom-feed": "\"$1\" एटम फ़ीड",
+       "feed-atom": "एटम फिड",
        "red-link-title": "$1 (पन्ना मौजूद नाई है)",
        "sort-descending": "घटे कय क्रम में मिलाओ",
        "sort-ascending": "बढे कय क्रम में मिलाओ",
        "viewyourtext": "आप ई पन्ना में ''आपन सम्पादन'' कय स्रोत देखी सका जात है औ ओकर नकल उतार सका जात है:",
        "protectedinterface": "इ पन्ना  विकी कय सॉफ़्टवेयर कय इंटरफ़ेस पाठ देत है,अव एकर गलत प्रयोग से बचावेक लिये सुरक्षित करा है।\nकुल विकिन् कय लिए अनुवाद जोड़य या बदलय कय लिए कृपया मीडियाविकि कय क्षेत्रीयकरण प्रकल्प [//translatewiki.net/ translatewiki.net] कय प्रयोग करा जाय।",
        "editinginterface": "<strong>चेतावनी:</strong> आप एकठु अइसन पन्ना कय बदलय जावा जात हैं जवन सॉफ़्टवेयर कय इंटरफ़ेस पाठ देत है।\nइ पन्ना कय बदलय से अउर सदस्यन् कय देखावेवाला इंटरफ़ेस कय शकल सूरत में बदलाव आई जाइ।",
+       "translateinterface": "कुल विकिन् कय ट्रान्सलेशन करय अव बदलय खर्तिन [//translatewiki.net/ ट्रान्शलेटविकि.नेट] कय प्रयोग करा जाय ।",
        "cascadeprotected": "ई पन्ना सुरक्षित है, काहे से इ निचे दिहा {{PLURAL:$1|पन्ना|पन्नन्}} कय सुरक्षा-सीढ़ी में है:\n$2",
        "namespaceprotected": "आप कय '''$1''' नामस्थान में रहल पन्नन कय बदलै कय अनुमति नाइ है।",
        "customcssprotected": "आप कय इ CSS पन्ना कय संपादन करेक अनुमति नाई है, काहे से एहमा अउर सदस्य कय व्यक्तिगत सेटिंग्स शामिल है।",
        "nav-login-createaccount": "लाग इन / खाता खोला जाय",
        "userlogin": "लाग इन / खाता खोला जाय",
        "userloginnocreate": "लॉग इन",
-       "logout": "बहरà¥\87 à¤¨à¤¿à¤\95रà¥\8b",
-       "userlogout": "बहरà¥\87 à¤¨à¤¿à¤\95रà¥\8b",
+       "logout": "बहरà¥\87 à¤¨à¤¿à¤\95रा à¤\9cाय",
+       "userlogout": "बहरà¥\87 à¤¨à¤¿à¤\95रा à¤\9cाय",
        "notloggedin": "लॉग इन नाइ करा गा है",
        "userlogin-noaccount": "खाता नाइ है?",
        "userlogin-joinproject": "{{SITENAME}} से जुडव",
        "nocookieslogin": "{{SITENAME}} पे लॉग इन करेक लिये कुकीज़ कय प्रयोग होत है।\nआप कुकीज़ बन्द करा गा है।\nकृपया अपने ब्राउज़र में कुकीज़ सक्षम करा जाय, औ फिर से कोशिस करा जाय।",
        "nocookiesfornew": "स्रोत कय पुष्टि ना होइ पावे कय कारण इ खाता  नाई बनाई गा है। \nसुनिश्चित करा जाय कि आप कय कुकीज़ बन्द है कि नाईं, पन्ना कय फिरसे लोड करा जाय अव फिरसे प्रयास करा जाय।",
        "noname": "आप सही सदस्यनाम नाइ दिहा गा है।",
-       "loginsuccesstitle": "लॉग इन हो गवा",
+       "loginsuccesstitle": "लॉग इन हो गवा",
        "loginsuccess": "'''आप {{SITENAME}} में \"$1\" सदस्यनाम से लॉग इन होई {{GENDER:$1|चुके|चुकी|चुके}} हव।'''",
        "nosuchuser": "\"$1\" नावँ कय कवनो सदस्य नाइ है।\nसदस्यनावँ में लघु औ दीर्घ अक्षरन् से फ़रक परत है।\nआपन अक्षर जाँचा जाय, या [[Special:UserLogin/signup|नवाँ खाता खोला जाय]]।",
        "nosuchusershort": "\"$1\" नावँ कय कवनो सदस्य नाई है।\nकृपया आपन शब्द फिरसे जाँचा जाय।",
        "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यदि आप देवा जाई तव एकर प्रयोग सदस्यन् कय योगदान कय लिये श्रेय (attribution) देक लिये कई जाई।",
        "changeemail-submit": "ई-मेल बदला जाय",
        "changeemail-throttled": "आप अबहिनय में कयु दाँइ लॉग इन करेक प्रयास किहा गा है।\nफिरसे प्रयास करय से पहीले तनी $1 रुका जाय।",
        "resettokens": "टोकन रीसेट करा जाय",
+       "resettokens-text": "जो टोकन आपके खाते से सम्बद्ध कुछ विशिष्ट व्यक्तिगत जानकारी प्रदान करते हैं, आप उन्हें यहाँ रीसेट कर सकते हैं।\n\nयदि आपने उन्हें गलती से किसी को दिखा दिया है या फिर आपका खाता हैक हो गया है तो आपको इन्हें रीसेट कर देना चाहिए।",
        "resettokens-no-tokens": "रीसेट करेक लिए कवनो टोकन नाई है।",
        "resettokens-legend": "टोकन रीसेट करा जाय",
        "resettokens-tokens": "टोकन:",
        "anoneditwarning": "<strong>चेतावनी:</strong>आप लाग इन नाई करा गा है ।जब आप सम्पादन करा जाई तव आप कय IP address सब कय बिलगाइ। जब आप <strong>[$1 log in]</strong> या <strong>[$2 create an account]</strong> करा जाइ तब आप कय सम्पादन आप कय  सदस्यनाँव से जुडी जाई अव आप कय अउर सुविधओ मिली।",
        "anonpreviewwarning": "''आप लॉग्ड नाई होआ जात है। पन्ना सहेजे पे आप कय आइ॰पी ठाँव इ पन्ना कय इतिहास में दर्ज कइ जाई।''",
        "missingsummary": "'''ध्यान दिहा जाय:''' आप  संपादन सारांश नाइ दिहा गा है।\nअगर आप दुबारा \"{{int:savearticle}}\" पे क्लिक करा जाई तव आप कय संपादन बिना सारांश कय सहेज जाई।",
+       "selfredirect": "<strong>चेतावनी:</strong> आप इ पन्नवा कय इहि से निर्देश करय जावा जात है.\nआप या तव गलत लक्ष्य पे पुनर्निर्देश करा गा है, या तव गलत पन्ना संपादन करा जात है ।\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|सदस्य वरीयता]] में जाईकय आपन ई-मेल ठाँव दिहा जाय अव ओका प्रमाणित करा जाय।",
        "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आप कय बदलाव अभीन तक नाई सहेजा है!",
+       "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अइसन तब्बय होइ सकत है जब आप कवनव खराब वेब-आधारित अनामक प्रौक्सी प्रयोग करा जात होय।",
+       "edit_form_incomplete": "'''सम्पादन फ़ॉर्म कय कुछ हिस्सा सर्वर तक नाइ पहुँच पाए; जाँच लिहा जाय कि आप कय द्वारा करल बदलाव वइसय है कि नाइ, अउर सहेजय कय प्रयास करा जाय।'''",
        "editing": "$1 सम्पादन",
        "creating": "$1 बनावा जात है",
        "editingsection": "$1 सम्पादन करा जात है (अनुभाग)",
        "editingcomment": "$1 सम्पादन करा जात है (नँवा अनुभाग)",
        "editconflict": "संपादन अंतर्विरोध: $1",
+       "explainconflict": "आप कय द्वारा सम्पादन शुरू करय कय बाद से कवनो दुसर मनई इ पन्ना में बदलाव करे हैं।\nऊपरी पाठ सम्पादन क्षेत्र में अभिन कय पाठ देखाइ गा है।\nनिचला क्षेत्र में आप कय बदलाव देखाइ गा है।\nआप कय आपन बदलाव अबहिन कय पाठ में अपने से एकट्ठा करेक परि।\nआपके \"{{int:savearticle}}\" पर क्लिक करने पर '''केवल''' ऊपरी क्षेत्र में दिखने वाला पाठ संजोया जायेगा।",
        "yourtext": "आप कय पाठ",
        "storedversion": "सहेज़ल अवतरण",
+       "nonunicodebrowser": "'''सावधान: आप कय ब्राउज़र युनिकोड कय स्वीकार नाइ करत है।'''\nआप से बढिया संपादन होएक लिये: ग़ैर-ASCII कैरैक्टर षट्‍पदी कोड (hexadecimal) में देखाइ जाई।",
+       "editingold": "'''चेतावनी: आप इ पन्ना कय पुरान(Out of Date) अवतरण संपादित करा जात है।'''\nअगर आप एका सहेजा जाइ , तव इ अवतरण कय बाद करल कुल बदलाव नष्ट होइ जाइ।",
        "yourdiff": "अंतर",
+       "copyrightwarning": "कृपया ध्यान दिहा जाय कि {{SITENAME}} मे करल कुल योगदान $2 शर्त कय निचे होंइ (ढेर जानकारी कय लिये $1 देखा जाय)।\nयदि आप आपन योगदान कय लगातार बदलत अव फिर से बटत़ नाइ देखय चाहा जात है तव यँह योगदान ना करा जाय।<br />\nआप इहो भी प्रमाणित करा जात है कि इ आप अपने से लिखा गा है या सार्वजनिक क्षेत्र या कवनो समान मुक्त स्रोत से प्रतिलिपित करा गा है।\n'''कॉपीराइट सुरक्षित काम कय बिना अनुमति कय यहँ ना करा जाय!'''",
+       "copyrightwarning2": "{{SITENAME}} पे करल कवनो भी योगदान अउर सदस्य लोग बदलि या हटाइ सकत हैँ ।\nयदि आप आपन योगदान कय लगातार बदलत अव फिर से बटत़ नाइ देखय चाहा जात है तव यँह योगदान ना करा जाय।<br />\nआप इहो भी प्रमाणित करा जात है कि इ आप अपने से लिखा गा है या सार्वजनिक क्षेत्र या कवनो समान मुक्त स्रोत से प्रतिलिपित करा गा है।\n'''कॉपीराइट सुरक्षित काम कय बिना अनुमति कय यहँ ना करा जाय!'''",
+       "longpageerror": "'''त्रुटि: आप कय दिहा पाठ {{PLURAL:|$1 किलोबाइट|$1 किलोबाइट}} लंमा है, जवन {{PLURAL:|$2 किलोबाइट|$2 किलोबाइट}} कय सीमा से बहरे है।\nएका नाइ सहेज सका जात है।'''",
+       "readonlywarning": "'''सावधान: डाटाबेस कय रख-रखाव कय खत्तिर बंद कै दिहा गा है, इहि कय नाते आप कय बदलाव अभीन नाइ सहेजि सका जात है।\nअगर आप चाहा जाय तव इ चिज कय बाद कय खत्तिर कॉपी-पेस्ट कइकय कवनो टेक्स्ट फ़ाइल में रखि सका जात है।'''\n\nबंद करय वाले प्रबंधक बंद करे कय इ कारण दिहे हैं: $1",
        "protectedpagewarning": "'''चेतावनी: इ पन्ना कय सुरक्षित कई  गा है अव एका खालि प्रबंधक सम्पादित कई सकत हँय।'''\nनँवा लॉग प्रविष्टि संदर्भ कय लिये नीचे दीहा है:",
+       "semiprotectedpagewarning": "<strong>नोट:</strong> ई पन्ना बचावा है इही कय नाते खालि रजिष्टर करल सदस्य एका सम्पादन कई सकत हैं ।\nसंदर्भ कय खर्तिन अन्तिम दाइ कय लाग निचे दिहा है:",
+       "cascadeprotectedwarning": "'''सावधान:''' इ पन्ना निचे दिहा सुरक्षा-सीढ़ी {{PLURAL:$1|पन्ना से|पन्नन् से}} जोडाएक नाते सुरक्षित है, अव खाली प्रबंधक एहमा बदलाव कै सकत हैं:",
+       "titleprotectedwarning": "'''चेतावनी: इ पन्ना सुरक्षित है अव एका बनावेक खत्तिर [[Special:ListGroupRights|विशेष अधिकारन्]] कय आवश्यकता है।'''\nसंदर्भ कय खत्तिर नँवा लॉग प्रविष्टि नीचे दीहा है:",
+       "templatesused": "ई पन्ना में इस्तेमाल करल {{PLURAL:$1|साँचा}}:",
+       "templatesusedpreview": "ई झलक में इस्तेमाल करल {{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लागत है एका मेटाई दिहा है।",
        "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-javascript": "जावास्क्रिप्ट",
        "content-json-empty-object": "खाली चिज",
        "content-json-empty-array": "खाली एरे",
+       "expensive-parserfunction-warning": "'''चेतावनी:''' इ पन्ना पे बहुत ढेर संख्या में कीमती पार्सर फ़ंक्शनों कय प्रयोग कई गा है।\n\nएकर प्रयोग $2 से कम दाइ होएक चाहि, इ समय प्रयोग $1 दाइ कै गा {{PLURAL:$1|है}}।",
        "expensive-parserfunction-category": "अईसन पन्ना जवन महङा पार्सर फ़ंक्शनन् कय ढेर प्रयोग करत हैं",
        "post-expand-template-inclusion-warning": "'''चेतावनी:''' साँचा जोडे कय सीमा पार होई चुका है।\nकवनो-कवनो साँचा नाई जुड़ी।",
        "post-expand-template-inclusion-category": "अईसन पन्ना जवने मे साँचा जोड़े कय सीमा पार होई गवा है",
+       "post-expand-template-argument-warning": "'''चेतावनी:''' इ पन्ना पे कवनो साँचा में कम-से-कम एकठु अइसन प्राचल है जवन बढ़ावे पे बहुत बड़ा होइ जाइ।\nअइसन प्राचलन् कय छोड़ दिहा गा है।",
        "post-expand-template-argument-category": "अईसन पन्ना जवनेमें प्राचल छोड़ी दिहा है",
        "parser-template-loop-warning": "साँचा चक्र मिला: [[$1]]",
        "parser-template-recursion-depth-warning": "साँचा पुनरावर्ती गहराई सीमा पार ($1)",
        "last": "पिछला",
        "page_first": "पहीला",
        "page_last": "आखिरी",
+       "histlegend": "अन्तर चयन: अन्तर देखय खत्तिर पुरान अवतरणन् कय आगे दिहा रेडियो बॉक्स पे क्लिक किन जाय अव एण्टर कीन जाय या तव नीचे दिहा बटन पे क्लिक करा जाय<br />\nलिजण्ड: (चालू) = सद्य अवतरण कय बीचे में अन्तर,\n(आखिरी) = पिछले अवतरण के बीच में अन्तर, छो = छोटा बदलाव।",
        "history-fieldset-title": "इतिहास कय विचरण करा जाय",
        "history-show-deleted": "सूची में खाली लुकुआवल अवतरण देखा जाय",
        "histfirst": "सबसे पुरान",
        "revdelete-selected-text": "[[:$2]] {{PLURAL:$1|कय}} चयनित अवतरण:",
        "revdelete-selected-file": "[[:$2]] {{PLURAL:$1|कय}} चयनित फ़ाइल अवतरण:",
        "logdelete-selected": "{{PLURAL:$1|चुनल}} लॉग इवेंट:",
+       "revdelete-confirm": "यकिन करावा जाय कि आप इ काम करय चाहा जात है, आप एकर परिणाम समझा जात है, औ आप इ [[{{MediaWiki:Policy-url}}|नीति]] कय अनुसार करा जात है।",
+       "revdelete-suppress-text": "लुकुआवेक प्रयोग <strong>खाली</strong> इ परिस्थितन् में होएक चाहि:\n* संभावित अपमानजनक जानकारी\n* अनुपयुक्त निजी जानकारी\n*: <em>घर कय ठहर या दूरभाष, राष्ट्रीय पहिचान क्रमांक आदि।</em>",
        "revdelete-legend": "दृश्य प्रतिबंध निश्चित करा जाय",
        "revdelete-hide-text": "अवरतण पाठ",
        "revdelete-hide-image": "फ़ाइल कय पाठ लुकुआवा जाय",
+       "revdelete-hide-name": "टार्गेट अव पारामिटर लुकुआवा जाय",
        "revdelete-hide-comment": "संपादन सारांश",
        "revdelete-hide-user": "संपादक कय सदस्यनाँव/आइ॰पी॰ ठहर",
        "revdelete-hide-restricted": "प्रबंधक सहित कुल सदस्यन् से डाटा लुकुआवा जाय",
        "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-show-no-access": "$1, $2 वाला चिज देखावत समय त्रुटि होइ गवा: इ चिज कय \"प्रतिबंधित\" चिन्हित कई गा है।\nआप यँह तक नाइ पहुँच सका जात है।",
+       "revdelete-modify-no-access": "$1, $2 वाला चिज कय बदलत समय त्रुटि होइ गवा: इ चिज कय \"प्रतिबंधित\" चिन्हित कई गा है।\nआप यँह तक नाइ पहुँच सका जात है।",
+       "revdelete-modify-missing": "मद क्रमांक $1 कय बदलत समय त्रुटि आई गवा: इ डाटाबेस में नाइ है!",
+       "revdelete-no-change": "'''चेतावनी:''' $2, $1 वाले चिज में पहिलवे से ही इ आप कय कहल दृश्यता सेटिङ रहा।",
+       "revdelete-concurrent-change": "$2, $1 वाला चिज कय बदलत समय त्रुटि आई गय: लागत है कि आपकय बदलत समय केहु अउर एहमा बदलाव कई दिहे हैं।\nकृपया लॉग देखा जाय।",
+       "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-header": "इ पन्ना एकठु स्रोत पन्ना कय इतिहास कवनो अउर पन्नन में मिलावे खत्तिर होय।\nसुनिश्चित करा जाय कि इ बदलाव पन्ना इतिहास में कन्टिन्य़ुईटी बरकरार राखय।",
        "mergehistory-box": "दुई पन्नन कय इतिहास मिलावा जाय:",
        "mergehistory-from": "स्रोत पन्ना:",
        "mergehistory-into": "लक्ष्य पन्ना:",
        "mergehistory-list": "मिलावे लायक संपादन इतिहास",
+       "mergehistory-merge": "[[:$1]] कय निचे कय अवतरण [[:$2]] में एकट्ठा कै सका जात है।\nकवनो दिहल समय या ओसे पहिले कय अवतरणन् कय एकट्ठा करेक खत्तिर रेडियो बटन कय प्रयोग करा जाय।\nनैविगेशन कड़िन् कय प्रयोग कय बाद इ कॉलम अपने पुरानी स्थिति पे आइ जाइ।",
        "mergehistory-go": "मिलावे लायक संपादन देखावा जाय",
        "mergehistory-submit": "अवतरण मिलावा जाय",
        "mergehistory-empty": "कवनो भी अवतरण नाई मिलाई सका जात अहै।",
+       "mergehistory-success": "[[:$1]] {{PLURAL:$3|कय}} $3 अवतरण [[:$2]] में एकट्ठा कई {{PLURAL:$3|गय}}।",
+       "mergehistory-fail": "इतिहास एकट्ठा नाई कई सका जात है, कृपया पन्ना औ समय कय फिरसे जाँच करा जाय।",
        "mergehistory-no-source": "स्रोत पन्ना $1 मौजूद नाई है।",
        "mergehistory-no-destination": "लक्ष्य पन्ना $1 मौजूद नाई है।",
        "mergehistory-invalid-source": "स्रोत पन्ना कय शीर्षक वैध होब आवश्यक है।",
        "mergehistory-reason": "कारण:",
        "mergelog": "मिलावेक लॉग",
        "revertmerge": "अलग करा जाअ",
+       "mergelogpagetext": "नीचे उ पन्नन कय सूची है जवने कय इतिहास हालिए में दूसरे पन्ना में मिलाइ ग रहा।",
        "history-title": "\"$1\" कय अवतरण इतिहास",
        "difference-title": "\"$1\" कय अवतरण में अंतर",
        "difference-title-multipage": "\"$1\" अव \"$2\" पन्नन में अंतर",
        "search-relatedarticle": "सम्बंधित",
        "searchrelated": "सम्बंधित",
        "searchall": "कुल",
+       "showingresults": "नीचे क्रमांक '''$2''' से सुरु कै कय सबसे ढेर '''$1''' परिणाम {{PLURAL:$1|देखाइ गा है}}।",
        "search-nonefound": "आप कय खोज से मिलत जुलत कवनो परिणाम नाई मिला।",
        "powersearch-legend": "उन्नत खोज",
        "powersearch-ns": "नामस्थानन् में खोजा जाय:",
        "powersearch-togglelabel": "चुना जाय:",
        "powersearch-toggleall": "कुल",
        "powersearch-togglenone": "केहु नाई",
+       "powersearch-remember": "अबसे करय वाले खोजमे हमार पसंद याद रक्खा जाय",
        "search-external": "बाहरी खोज",
-       "preferences": "प्राथमिकता",
-       "mypreferences": "प्राथमिकता",
+       "searchdisabled": "{{SITENAME}} पे खोज अक्षम है।\nआप गूगल से खोज कै सका जात है।\nध्यान रक्खा जाय कि वनकय {{SITENAME}} समानन् कय सूची पुरान होइ सकत है।",
+       "search-error": "खोजत समय अईसन त्रुटि उत्पन्न होइ गय: $1",
+       "preferences": "हमार पसंद",
+       "mypreferences": "हमार पसंद",
        "prefs-edits": "सम्पादन गिन्ती",
+       "prefsnologintext2": "आपन पसंद बदलेक खत्तिर लाग इन करा जाय",
        "prefs-skin": "स्कीन",
        "skin-preview": "झलक",
        "datedefault": "खा़स प्राथमिकता नाँइ है",
        "prefs-labs": "लैब विशेषता",
        "prefs-user-pages": "सदस्य पन्ना",
        "prefs-personal": "सदस्य व्यक्तिरेखा",
-       "prefs-rc": "à¤\85बहिन à¤\95य बदलाव",
+       "prefs-rc": "नà¤\81वा बदलाव",
        "prefs-watchlist": "अवलोकन सुची",
+       "prefs-editwatchlist": "ध्यानसूची संपादन करा जाय",
+       "prefs-editwatchlist-label": "अपने धियान सुचीमा एन्ट्रि सम्पादन कीन जाय",
+       "prefs-editwatchlist-raw": "कच्चा निगरानी सूची सम्पादन करा जाय",
+       "prefs-editwatchlist-clear": "आपन ध्यानसूची साफ करा जाय",
        "prefs-watchlist-days": "ध्यानसूची में दिखावै कय दिन:",
        "prefs-watchlist-days-max": "अधिकतम $1 {{PLURAL:$1|दिन}}",
+       "prefs-watchlist-edits": "बढ़ावल ध्यानसूची में देखावे खत्तिर अधिकतम बदलाव:",
        "prefs-watchlist-edits-max": "अधिकतम संख्या: एक हज़ार",
        "prefs-watchlist-token": "ध्यानसूची टोकन",
        "prefs-misc": "अउर",
        "prefs-email": "ई-मेल वरीयता",
        "prefs-rendering": "शकलसूरत",
        "saveprefs": "सहेजा जाय",
-       "prefs-editing": "संपादन होत है",
+       "restoreprefs": "पहिलकय सेटिङ मिलावा जाय (कुल जगही में)",
+       "prefs-editing": "संपादन",
        "rows": "कताँर:",
        "columns": "कॉलम:",
        "searchresultshead": "खोजा जाय",
+       "stub-threshold": "<a href=\"#\" class=\"stub\">आधार कड़िन्</a> कय सबसे बडा आकार (बाइट):",
        "stub-threshold-disabled": "अक्षम करा है",
+       "recentchangesdays": "नँवा बदलाव में देखावे कय दिन:",
+       "recentchangesdays-max": "सबसे ढेर $1 {{PLURAL:$1|दिन}}",
+       "recentchangescount": "मूल रूप से केतना संपादन देखावा जाय:",
+       "prefs-help-recentchangescount": "एहमा नँवा बदलाव, पन्ना इतिहास अव लॉग शामिल है।",
+       "prefs-help-watchlist-token2": "ई आपकय ध्यानसूची कय वेब फ़ीड कय गोपनीय कुंजी होय।\nइ जेकरे लगे होइ उहय आपकय ध्यानसूची पढ़ि पाइ,इहिक नाते केहुक साथे ना बांटा जाइ।\n[[Special:ResetTokens|एका रीसेट करय खत्तिर हिँया क्लिक किन जाय]]।",
+       "savedprefs": "आप कय पसंद सहेजि गय ।",
        "timezonelegend": "समयमंडल:",
        "localtime": "स्थानीय समय:",
+       "timezoneuseserverdefault": "विकी डिफ़ॉल्ट कय उपयोग कीन जाय ($1)",
+       "timezoneuseoffset": "अउर कौनो(समयांतर निर्दिष्ट करा जाय)",
        "servertime": "सर्वर कय समय:",
+       "guesstimezone": "ब्राउज़र से भरा जाय",
        "timezoneregion-africa": "अफ्रिका",
        "timezoneregion-america": "अमेरिका",
        "timezoneregion-antarctica": "अंटार्कटिका",
        "timezoneregion-europe": "यूरोप",
        "timezoneregion-indian": "हिंद महासागर",
        "timezoneregion-pacific": "प्रशांत महासागर",
+       "allowemail": "अउर सदस्यन् से ई-मेल सक्षम करा जाय",
        "prefs-searchoptions": "खोजा जाय",
        "prefs-namespaces": "नामस्थान",
        "default": "डिफ़ॉल्ट",
        "prefs-custom-css": "खासमखास सी॰एस॰एस",
        "prefs-custom-js": "खासमखास जावास्क्रिप्ट",
        "prefs-common-css-js": "कुल स्किन कय लिए साझा सी॰एस॰एस/जावास्क्रिप्ट:",
+       "prefs-reset-intro": "आप इ पन्ना से अपने पसंद कय, साइट कय मूल पसंद कय जइसन बनाय सका जात है।\nएकरे बाद आप वापिस पुरान जगहि पे नाइ आय पावा जाइ।",
+       "prefs-emailconfirm-label": "ईमेल सुनीश्चित करा जाय:",
        "youremail": "ई-मेल:",
        "username": "{{GENDER:$1|सदस्यनाँव}}:",
+       "prefs-memberingroups": "निचे दिहा {{PLURAL:$1|समूह|समूहन्}} कय {{GENDER:$2|सदस्य}}:",
        "prefs-registration": "रजिष्ट्रेसन समय:",
        "yourrealname": "वास्तविक नाँव:",
        "yourlanguage": "भाषा",
        "yourvariant": "सामग्री भाषा संस्करण:",
+       "prefs-help-variant": "आप कय पसंदीदा प्रकार या इमला इ विकि कय अंदर सामग्री पन्नन कय देखावे खत्तिर होय।",
        "yournick": "नँवा हस्ताक्षर:",
        "prefs-help-signature": "बातचीत पन्नन पे करल टिप्पणिन् पे \"<nowiki>~~~~</nowiki>\" से हस्ताक्षर करेक परि, इ आप कय हस्ताक्षर अव समय में परिवर्तित होई जाइ।",
        "badsig": "गलत कच्चा हस्ताक्षर।\nHTML टैग कय जाँच करा जाय।",
        "gender-female": "एन सम्पादन करत अहिन।",
        "prefs-help-gender": "ई जानकारी देब वैकल्पिक होय।\nई सॉफ़्टवेयर में लिंग कय आधार पे आप कय लिए सही संबोधन कय नाते प्रयुक्त होत है।\nई जानकारी सार्वजनिक होइ।",
        "email": "ई-मेल",
+       "prefs-help-realname": "असली नाँव कय कवनो जरुरत नाइ है।यकर इस्तेमाल आप कय काम कय बडाइ करय में होइ सकत है ।",
        "prefs-help-email": "ई-मेल ठहर वैकल्पिक होय, लेकिन यदि आप आपन गुप्तकुंजी भूलाई गवा गय तव एकरे माध्यम से रीसेट कई सका जात है।",
+       "prefs-help-email-others": "आप आपन पहिचान बिना देखाए, अउर सदस्यन् कय अपने सदस्य या बातचीत पन्ना से ,अपने आप से सम्पर्क कराय सका जात है।",
        "prefs-help-email-required": "ई-मेल ठहर जरुरी है।",
        "prefs-info": "मूलभूत जानकारी",
        "prefs-i18n": "अंतर्राष्ट्रीयकरण",
        "prefs-tokenwatchlist": "टोकन",
        "prefs-diffs": "अंतर",
        "prefs-help-prefershttps": "ई प्राथमिकता आप कय अगला लॉगिन मे प्रभावी होई।",
+       "prefswarning-warning": "आप अपने पसंद मा परिवर्तन करा गा है जवन अभिन अतक नाइ सहेजि गा है ।अगर आप \"$1\" कय किल्क किहे बिना इ पन्ना छोडा जाइ तव आप कय पसंद नाइ सहेजी जाइ।",
+       "prefs-tabs-navigation-hint": "सुझाव: आप टैब्स सूची में टैब्स कय बीचे आवे-जाय खत्तीर बाँवा औ दहिना तीर कुंजिन् कय उपयोग कै सका जात है।",
+       "email-address-validity-valid": "ई-मेल ठहर वैध नाइ लागत है",
        "email-address-validity-invalid": "एकठु वैध ई-मेल ठहर दिहा जाय",
        "userrights": "सदस्य अधिकार व्यवस्थापन",
        "userrights-lookup-user": "सदस्य समूहन् कय व्यवस्थापन करा जाय",
        "saveusergroups": "सदस्य समूहन् कय व्यवस्थापन सहेजा जाय",
        "userrights-groupsmember": "निचे कय {{PLURAL:$1|समूह|समूहन्}} कय सदस्य:",
        "userrights-groupsmember-auto": "निचे कय {{PLURAL:$1|समूह|समूहन्}} कय अंतर्निहित सदस्य:",
+       "userrights-groups-help": "आप इ सदस्य कय समूह-सदस्यता बदलि सका जात है:\n* बक्सा पे सही कय निशान लागेक माने होय कि सदस्य उ समूह मा है।\n* बक्सा पे सही कय निशान ना लागेक माने होय कि सदस्य उ समूह में नाइ है।\n* एक * कय माने होय कि एक दाइ जोड़ेक बाद उ समूह कय नाइ हटाय सका जात है, औ हटावे कय बाद नाइ जोडि सका जात है।",
        "userrights-reason": "कारण:",
+       "userrights-no-interwiki": "आप कय अउर विकिन् पे सदस्य अधिकार बदले कय अनुमति नाइ है।",
+       "userrights-nodatabase": "डाटाबेस $1 या तो मौजूद नाइ है या फिर स्थानीय नाइ है।",
+       "userrights-nologin": "सदस्य अधिकार बदलेक खत्तिर  प्रबंधक खाता से [[Special:UserLogin|लॉग इन]] करेक परि।",
+       "userrights-notallowed": "आप कय लगे सदस्य अधिकार जोडेक या हटावेक अनुमति नाइ है।",
+       "userrights-changeable-col": "गोल (ग्रुप) जवन आप बदलि सका जात है ।",
+       "userrights-unchangeable-col": "गोल (ग्रुप) जवन आप नाइ बदलि सका जात है ।",
+       "userrights-conflict": "सदस्य अधिकार बदलाव में अंतर्विरोध! कृपया आपन बदलाव जाँचा जाय और फिरसे सुनिश्चित करा जाय।",
+       "userrights-removed-self": "आप सफलतापूर्वक आपन अधिकार हटाए दिहा गए। इहिक नाते अब आप इ पन्ना नाइ देख सका जात है।",
        "group": "गोल:",
        "group-user": "सदस्य:",
        "group-autoconfirmed": "अपने आप बनल सदस्य",
        "right-purge": "पन्ना कय कैश मेमोरी खाली करा जाय",
        "right-autoconfirmed": "आई॰पी ठहर आधारित रेट लिमिट्स से बेअसर होई जाय",
        "right-bot": "स्वचलित प्रणाली माना जाय",
+       "right-nominornewtalk": "बातचीत पन्नन पे छोट बदलाव करय पे सदस्यन् कय \"आप कय खत्तिर नँवा सनेशा है\" पट्टी ना देखावा जाय",
+       "right-apihighlimits": "API पुँचताँछ में ऊँच सीमा प्रयोग करा जाय",
+       "right-writeapi": "लेखन ए॰पी॰आई कय प्रयोग करा जाय",
        "right-delete": "पन्ना मेटावा जाय",
        "right-bigdelete": "ढेर इतिहास वाले पन्नन्  कय हटावा जाय",
        "right-deletelogentry": "विशिष्ट लॉग प्रविष्टिन् कय लुकुआवा जाय अव देखावा जाय",
+       "right-deleterevision": "पन्नन कय विशिष्ट अवतरण हटावा जाय या पुनर्स्थापित करा जाय",
+       "right-deletedhistory": "हटावल इतिहास सूची, ओकरे साथे मिलय वाला पाठ कय बिना देखा जाय",
+       "right-deletedtext": "हटावल पाठ औ हटावल अवतरणन् कय बीचे अंतर देखा जाय",
        "right-browsearchive": "हटावल पन्ना खोजा जाय",
        "right-undelete": "ई पन्ना कय पुनर्स्थापित करा जाय।",
+       "right-viewsuppressed": "कवनो भि सदस्य कय लुकुआवल अवतरण देखा जाय",
        "right-suppressionlog": "खासगी लॉग देखा जाय",
        "right-block": "अउर सदस्यन् कय सम्पादन करय से ब्लॉक करा जाय",
        "right-blockemail": "अउर सदस्यन् कय ईमेल करै से रोका जाय",
+       "right-hideuser": "सदस्यनाँव ब्लॉक करा जाय औ ओका मनईन से लुकुआवा जाय",
        "right-ipblock-exempt": "आइ॰पी ब्लॉक्स, ऑटो-ब्लॉक्स अव रेंज ब्लॉक्स कय अनदेखा करा जाय",
        "right-proxyunbannable": "स्वचालित प्रौक्सी ब्लॉक्स कय अनदेखा करा जाय",
        "right-unblockself": "अपने आप कय अनावरुद्ध करा जाय",
        "right-protect": "सुरक्षा स्तर बदला जाय अव सीढ़ी-सुरक्षित पन्ना सम्पादन करा जाय",
        "right-editprotected": "अइसन सुरक्षित पन्नन कय सम्पादन करा जाय जवने कय सम्पादन कय \"{{int:protect-level-sysop}}\"",
        "right-editsemiprotected": "अइसन पन्नन् कय सम्पादन करा जाय जवने कय सुरक्षा स्तर होय \"{{int:protect-level-autoconfirmed}}\"",
+       "right-editcontentmodel": "पन्ना कय सामग्री नमुना कय बदला जाय",
+       "right-editinterface": "सॉफ़्टवेयर इंटरफ़ेस सम्पादित करा जाय",
        "right-editusercssjs": "अउर सदस्यन् कय सी॰एस॰एस अव जावास्क्रिप्ट पन्ना कय सम्पादन करा जाय",
        "right-editusercss": "अउर सदस्यन् कय सी॰एस॰एस पन्ना सम्पादन करा जाय",
        "right-edituserjs": "अउर सदस्यन् कय जावास्क्रिप्ट पन्ना कय सम्पादन करा जाय",
        "right-viewmyprivateinfo": "आपन व्यक्तिगत डाटा देखा जाय (जैसय ई-मेल ठहर, असली नाँव)",
        "right-editmyprivateinfo": "आपन व्यक्तिगत डाटा सम्पादन करा जाय (जैसय ई-मेल ठहर, असली नाँव)",
        "right-editmyoptions": "आपन पसंद सम्पादन करा जाय",
+       "right-rollback": "कवनो पन्ना कय अंतिम दाइ सम्पादन करय वाले सदस्य कय सम्पादन वापिस लिहा जाय",
        "right-markbotedits": "वापिस लेवे में होए वाला संपादनन् कय बॉट सम्पादन चिन्हित करा जाय",
        "right-noratelimit": "रेट लिमिट्स से बेअसर होइ जाय",
        "right-import": "दुसर विकि से पन्ना लावा जाय",
        "right-importupload": "फ़ाइल अपलोड से पन्ना लावा जाय",
        "right-patrol": "अउर सदस्यन् कय सम्पादन परीक्षित चिन्हित करा जाय",
+       "right-autopatrol": "अपने सम्पादन कय स्वचालित रूप से परीक्षित चिन्हित करा जाय",
+       "right-patrolmarks": "नँवा बदलाव में परीक्षण चिन्ह देखा जाय",
+       "right-unwatchedpages": "अइसन पन्नन कय सूची देखा जाय जवन केहु कय ध्यानसूची में नाइ है",
        "right-mergehistory": "पन्ना इतिहास एकट्ठय करा जाय",
        "right-userrights": "कुल सदस्य अधिकार बदला जाय",
        "right-userrights-interwiki": "अउर विकिन् पे सदस्य अधिकार बदला जाय",
        "right-siteadmin": "डाटाबेस कय ताला लगावा जाय या खोला जाय",
+       "right-override-export-depth": "पन्ना निर्यात करा जाय, पाँच स्तर कय गहराई तक जुड़ल पन्ना लइकय",
        "right-sendemail": "अउर सदस्यन् कय ई-मेल पठवा जाय",
        "right-passwordreset": "गुप्तकुंजी रीसेट ई-मेल देखा जाय",
        "newuserlogpage": "सदस्य खाता बनावे कय लॉग",
        "action-unwatchedpages": "अईसन पन्ना जवन केहु कय ध्यानसूची में नाई है कय सूची देखे कय",
        "action-mergehistory": "पन्ना इतिहास एकट्ठय करे कय",
        "action-userrights": "कुल सदस्यन कय अधीकार बदले कय",
+       "action-userrights-interwiki": "अउर विकिन् पे सदस्य अधिकार बदले कय",
+       "action-siteadmin": "डाटाबेस कय ताला लगावा जाय या खोला जाय",
        "action-sendemail": "ईमेल पठवा जाय",
        "action-editmywatchlist": "ध्यानसूची सम्पादन करा जाय",
        "action-viewmywatchlist": "आपन ध्यानसूची देखा जाय",
        "action-viewmyprivateinfo": "आपन व्यक्तिगत जानकारी देखा जाय",
        "action-editmyprivateinfo": "आपन व्यक्तिगत जानकारी बदला जाय",
+       "action-editcontentmodel": "पन्ना कय सामग्री नमुना कय बदला जाय",
        "nchanges": "$1 {{PLURAL:$1|बदलाव}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|अंतिम दाइ देखय कय बाद से}}",
        "enhancedrc-history": "इतिहास",
-       "recentchanges": "हालिय कय बदलाव",
-       "recentchanges-legend": "हालिय कय बदलाव संबंधी विकल्प",
+       "recentchanges": "नँवा बदलाव",
+       "recentchanges-legend": "नँवा बदलाव से सम्बंधीत विकल्प",
+       "recentchanges-summary": "इ विकि पे करल नँवा बदलाव इ पन्ना पे देख सका जात अहै।",
+       "recentchanges-noresult": "इ अवधि कय दौरान इ मापदंडन् कय पूरा कईकय कवनो बदलाव नाइ कै गा है।",
+       "recentchanges-feed-description": "इ विकि पे करल नँवा बदलाव इ फिड मे देख सका जात अहै।",
        "recentchanges-label-newpage": "ई सम्पादन से नँवा पन्ना बना",
        "recentchanges-label-minor": "ई छोट सम्पादन होय ।",
        "recentchanges-label-bot": "ई सम्पादन एक्ठु ब़ा़ट करे है",
+       "recentchanges-label-unpatrolled": "ई संपादन अभीन नाइ जाँचि गा है",
+       "recentchanges-label-plusminus": "पन्ना कय आकार इ बाइट संख्या से बदला",
        "recentchanges-legend-heading": "'''कुंजी:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|नवा पन्नन् कय सूची]] कय भी देखा जाय)",
        "rclistfrom": "$3 $2 से नँवा बदलाव देखावा जाय",
        "newpageletter": "न",
        "boteditletter": "बॉ",
        "number_of_watching_users_pageview": "[$1 ध्यान राखय वाले {{PLURAL:$1|सदस्य}}]",
+       "rc_categories": "श्रेणीन् तक सीमीत रक्खा जाय (\"|\" से अलग करा जाय)",
        "rc_categories_any": "कवनो भी",
        "rc-change-size-new": "बदलाव कय बाद $1 {{PLURAL:$1|बाइट}}",
        "newsectionsummary": "/* $1 */ नँवा अनुभाग",
        "recentchangeslinked-feed": "पन्ना से सम्बन्धित बदलाव",
        "recentchangeslinked-toolbox": "पन्ना से सम्बन्धित बदलाव",
        "recentchangeslinked-title": "\"$1\" से जुड़ल बदलाव",
+       "recentchangeslinked-summary": "ई पन्ना कवनो विशिष्ट पन्ना से जोडान पन्नन् (या कवनो श्रेणी में श्रेणीबद्ध पन्नन्) में नँवा बदलाव कय सूची देखावत है।\n[[Special:Watchlist|आप कय ध्यानसूची]] में मौजूद पन्ना '''मोट''' अक्षर में बीलगाई।",
        "recentchangeslinked-page": "पन्ना कय नाँव:",
        "recentchangeslinked-to": "इसके बदले में दिये हुए पृष्ठसे जुडे पन्नोंके बदलाव दर्शायें",
        "upload": "फ़ाइल अपलोड करा जाय",
        "uploadnologin": "लाग इन नाई करा गा है",
        "uploadnologintext": "फाइल अपलोड करेक लिए $1 करब आवश्यक है",
        "upload_directory_missing": "अपलोड डाइरेक्टरी ($1) मौजूद नाई है, अउर वेबसर्वर एकर निर्माण नाई कई पाय।",
+       "upload_directory_read_only": "अपलोड डाइरेक्टरी ($1) में वेबसर्वर नाइ लिख पावत है।",
        "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 पिक्सेल चौड़ा अवतरण \"alt text\" विवरण कय साथे एकठु बक्सा में प्रयोग करेक लिये\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' बिना फ़ाइल कय प्रयोग करे खालि ओकर कड़ी जोडेक लिये",
+       "upload-permitted": "फाइल जवने कय इजाजत है कय {{PLURAL:$2|प्रकार}}: $1.",
+       "upload-preferred": "आप कय मन चाहा फाइल {{PLURAL:$2|प्रकार}}: $1.",
+       "upload-prohibited": "फाइल जवने कय मिनाही है {{PLURAL:$2|प्रकार}}: $1.",
        "uploadlogpage": "अपलोड लॉग",
+       "uploadlogpagetext": "नीचे हालिए अपलोड करल फ़ाइलन् कय सूची है।\nकृपया अउर द्रैश्यिक विवरण कय खत्तीर [[Special:NewFiles|नँवा फ़ाइलन् कय गैलरी]] देखा जाय।",
        "filename": "फ़ाइल कय नाँव",
        "filedesc": "सारांश:",
        "fileuploadsummary": "सारांश:",
        "ignorewarning": "चेतावनि अनदेखा करा जाय अव फ़ाइल अपलोड करा जाय",
        "ignorewarnings": "कुल चेतावनि कय अनदेखा करा जाय",
        "minlength1": "फ़ाइल कय नाँव कम-से-कम एक अक्षर कय होएक चाहि।",
+       "illegalfilename": "फ़ाइल कय नाँव \"$1\" में कुछ ऐसन कैरैक्टर हैं जवन पन्ना शीर्षक में प्रतिबंधित है।\nकृपया फ़ाइल कय नाँव बदलि कय अपलोड करेक कोशिश करा जाय।",
        "filename-toolong": "फ़ाइल नाँव 240 बाइट से ढेर लम्मा नाई होई सकत है।",
        "badfilename": "फ़ाइल कय नाँव बदल कय \"$1\" कई दिहा है।",
        "filetype-mime-mismatch": "फाइल एक्सटेंशन \".$1\" फ़ाइल कय खोजेक MIME प्रकार ($2) से मेल नाई खात है।",
        "filetype-badmime": "\"$1\" प्रकार कय फ़ाइल अपलोड करय कय अनुमति नाई है।",
+       "filetype-bad-ie-mime": "इ फ़ाइल कय अपलोड नाइ कै सका जात है काहे से इंटर्नेट एक्स्प्लोरर एका \"$1\" मानि जवन कि प्रतिबन्धित या संभवतः खतरनाक फ़ाइल प्रकार होय।",
+       "filetype-unwanted-type": "'''\".$1\"''' एकठु अनचाहा फ़ाइल प्रकार होय।\nचाहय वाला फ़ाइल प्रकार {{PLURAL:$3|होय}} $2।",
+       "filetype-banned-type": "'''\".$1\"''' फ़ाइल {{PLURAL:$4|प्रकार|प्रकारन्}} कय अनुमति नाइ है।\nफ़ाइल प्रकार {{PLURAL:$3|जवने कय}} अनुमति है: $2।",
+       "filetype-missing": "इ फ़ाइल कय एक्स्टेंशन नाइ है (उदाहरण \".jpg\")।",
+       "empty-file": "आप कय दीहल फ़ाइल खाली रहा।",
+       "file-too-large": "आप कय दीहल फ़ाइल बहुत बडा रहा।",
+       "filename-tooshort": "फ़ाइल कय नाँव बहुत छोट है।",
+       "filetype-banned": "अइसन फ़ाइल प्रतिबन्धित है।",
+       "verification-error": "इ फ़ाइल सत्यापन में अनुत्तीर्ण रहा।",
+       "hookaborted": "आपके द्वारा प्रयासरत संशोधन किसी एक्स्टेंशन द्वारा निरस्त किया गया।",
+       "illegal-filename": "अइसन फ़ाइल कय इजाजत नाइ है।",
+       "overwrite": "मौजुदा फाइल कय उप्पर नाइ लिखि सका जात अहै ।",
+       "unknown-error": "अज्ञात त्रुटि आइ गय।",
+       "tmp-create-error": "अस्थाई फ़ाइल नाई बनि पाय।",
+       "tmp-write-error": "अस्थायी फ़ाइल कय लिखय में त्रुटि होइ गवा।",
+       "large-file": "फ़ाइल $1 से कम आकार कय होएक चाहि;\nइ फ़ाइल $2 आकार कय है।",
+       "largefileserver": "इ फ़ाइल कय आकार निर्धारित आकार सीमा कय पार है।",
+       "emptyfile": "आप कय अपलोड करल फ़ाइल खाली है।इ फ़ाइल कय नाँव लिखय में गलती होएक कारण होइ सकत है। कृपया जाँचा जाय कि का आप इहय फ़ाइल अपलोड करय चाहा जात है।",
+       "windows-nonascii-filename": "इ विकि विशेष कैरैक्टरन् कय वाले फ़ाइलनाँव नाइ स्वीकार करि।",
+       "filepageexists": "इ फ़ाइल कय लिए विवरण पृष्ठ पहलवे <strong>[[:$1]]</strong> पे बनाइ गा है, लेकिन इ नाँव कय कवनो फ़ाइल अभीन उपस्थित नाइ है। \nआप जवन विवरण दिहा जाइ उ विवरण पन्ना पे नाइ देखाइ। \nआप कय आपन विवरण कय उहाँ डारए कय लिए ओकर हस्त्य सम्पादन करेक परि।\n[[$1|thumb]]",
+       "fileexists-extension": "इ नाँव से मिलत-जुलत नाँव कय एकठु फ़ाइल पहलवे से है: [[$2|thumb]]\n* अपलोड होए वाला फ़ाइल कय नाँव: <strong>[[:$1]]</strong>\n* मौजूदा फ़ाइल कय नावँ: <strong>[[:$2]]</strong>\nशायद आप कवनो विशिष्ट नाँव कय प्रयोग करय चाहा जाइ?",
+       "fileexists-thumbnail-yes": "इ फ़ाइल बड़ा चित्र कय छोटा आकार ''(अंगूठाकार)'' जैसन लागत है। [[$1|thumb]]\n<strong>[[:$1]]</strong> फ़ाइल कय देखा जाय।\nअगर जाँचल फ़ाइल इही आकार कय है तव छोट आकार कय फ़ाइल अपलोड करेक आवश्यकता नाइ है।",
+       "file-thumbnail-no": "इ फ़ाइल कय नाँव <strong>$1</strong> से शुरू होत है।\nइ आकार घटावाल ''(अंगूठाकार)'' होइ सकत है।\nअगर इ चित्र अपने मूल आकार में है तव एका अपलोड करा जाय, नाइ तव फ़ाइल बदला जाय।",
+       "fileexists-forbidden": "इ नाँव कय फ़ाइल पहिलवे से मौजूद है, अउर एकरे जगही अउर नाइ अपलोड कै सका जात है।\nतब्बव यदि आप इ फ़ाइल कय अपलोड करय चाहा जात है, तव कृपया वापस जाइ कय एकरे लिए कवनो अउर नाँव चुना जाय।\n[[File:$1|thumb|center|$1]]",
+       "fileexists-shared-forbidden": "इ नाँव कय फ़ाइल साझा फ़ाइल भंडार में पहिलवे से मौजूद है।\nतब्बो यदि आप इ फ़ाइल कय अपलोड करय चाहा जात है, तव कृपया वापिस जाइ कय एकरे खत्तीर कवनो दुसर नाँव चुना जाय।\n[[File:$1|thumb|center|$1]]",
+       "file-exists-duplicate": "यह फ़ाइल निम्नलिखित {{PLURAL:$1|फ़ाइल|फ़ाइलों}} की प्रति है:",
+       "file-deleted-duplicate": "इसी फ़ाइल ([[:$1]]) से हूबहू मेल खाती एक फ़ाइल पहले हटाई जा चुकी है।\nइसे फिर से अपलोड करने से पहले आपको पुरानी फ़ाइल का हटाने के इतिहास देख लेना चाहिए।",
+       "file-deleted-duplicate-notitle": "इससे पहले इस फ़ाइल के समान एक फ़ाइल को हटाया गया है, और शीर्षक छिपा दिया गया है।\nइसे फिर से अपलोड करने से पहले आप किसी ऐसे व्यक्ति से स्थिति की समीक्षा करने के लिए कहें जिसके पास छिपी फ़ाइल का डाटा देखने की क्षमता है।",
        "uploadwarning": "अपलोड चेतावनी",
        "uploadwarning-text": "फ़ाइल विवरण कय मिलाई कय फिर कोशिश करा जाय।",
        "savefile": "फ़ाइल सहेजा जाय",
        "upload-description": "फ़ाइल विवरण",
        "upload-options": "अपलोड विकल्प",
        "watchthisupload": "इ फ़ाइल पे ध्यान रक्खा जाय",
+       "filewasdeleted": "इस नाम की एक फ़ाइल पहले भी अपलोड होने के बाद हटाई जा चुकी है।\nफिरसे अपलोड करने से पहले आप $1 को अच्छी तरह से जाँचे।",
+       "filename-bad-prefix": "आप जो फ़ाइल अपलोड कर रहे हैं उसका नाम '''\"$1\"''' से शुरू होता है, जो डिजिटल कैमेरे द्वारा दिया गया नाम है।\nकृपया इस फ़ाइल के लिये कोई दूसरा अधिक जानकारीयुक्त नाम चुनें।",
        "upload-success-subj": "अपलोड होइ गय",
        "upload-success-msg": "आप कय [$2] से अपलोड असफल रहा। ई [[:{{ns:file}}:$1]] पे उपलब्ध है",
        "upload-failure-subj": "अपलोड समस्या",
        "upload-file-error": "आन्तरिक त्रुटि",
        "upload-file-error-text": "सर्वर पे अस्थायी फ़ाइल बनावत समय आंतरिक त्रुटि आई गय।\nकृपया कवनो [[Special:ListUsers/sysop|प्रबंधक]] से संपर्क करा जाय।",
        "upload-misc-error": "अज्ञात अपलोड त्रुटि",
+       "upload-misc-error-text": "अपलोड के दौरान कोई अज्ञात त्रुटि आई।\nकृपया यह पुष्टि कर लें कि यू॰आर॰एल वैध है और उस तक पहुँचा जा सकता है, उसके बाद फिर कोशिश करें।\nअगर फिर भी समस्या आती है तो किसी [[Special:ListUsers/sysop|प्रबंधक]] से संपर्क करें।",
        "upload-too-many-redirects": "इ यू॰आर॰एल में ढेर कुल पुनर्निर्देशन हैं",
        "upload-http-error": "एकठु एच॰टी॰टी॰पी त्रुटि आई गय: $1",
        "upload-copy-upload-invalid-domain": "कॉपी अपलोड इ डोमेन से उपलब्ध नाई हैं।",
        "backend-fail-synced": "फ़ाइल \"$1\" आतंरिक भंडारण बैकेंड में असंगत स्थिति में है।",
        "backend-fail-connect": "\"$1\" भंडारण बैकेंड से सम्पर्क स्थापित नाई कई मिला।",
        "backend-fail-internal": "भंडारण बैकेंड \"$1\" में कवनो अज्ञात त्रुटि पैदा होइ गय।",
+       "backend-fail-contenttype": "\"$1\" मा सहेजै खत्तिर फाइल कय प्रकार नाइ निश्चित कै मिला ।",
+       "backend-fail-batchsize": "भंडारण बैकेंड कय $1 फ़ाइल {{PLURAL:$1|काम}} दिहा गा रहा; सीमा {{PLURAL:$2|$2 काम}} कय है।",
+       "backend-fail-usable": "फ़ाइल \"$1\" कय पर्याप्त अनुमति या अनुपस्थित डायरेक्ट्रीज़/कंटेनरन् कय कारण पढ़ा या लिखा नाइ जाय सकत है।",
+       "filejournal-fail-dbconnect": "भंडारण बैकेंड \"$1\" कय जर्नल डाटाबेस से सम्पर्क नाइ होइ पाय।",
+       "filejournal-fail-dbquery": "भंडारण बैकेंड \"$1\" कय जर्नल डाटाबेस कय अद्यतन नाइ कै मिला ।",
+       "lockmanager-notlocked": "\"$1\" कय अनलॉक नाइ कै मिला,इ बन्द नाइ है।",
+       "lockmanager-fail-closelock": "\"$1\" कय लॉक फ़ाइल बंद नाइ कै सका गय।",
+       "lockmanager-fail-deletelock": "\"$1\" कय लॉक फ़ाइल नाइ मिटाइ सका गय।",
+       "lockmanager-fail-acquirelock": "\"$1\" के लिए लॉक नाइ मिला।",
+       "lockmanager-fail-openlock": "\"$1\" के लिये लॉक फ़ाइल खोली नहीं जा सकी।",
+       "lockmanager-fail-releaselock": "\"$1\" के लिए लॉक हटाया नहीं जा सका।",
+       "lockmanager-fail-db-bucket": "बकेट $1 में आवश्यक संख्या में लॉक डाटाबेसों से सम्पर्क नहीं हो पाया।",
+       "lockmanager-fail-db-release": "डाटाबेस $1 से ताला हटाया नहीं जा सका।",
+       "lockmanager-fail-svr-acquire": "सर्वर $1 पर तालों को प्राप्त नहीं किया जा सका।",
+       "lockmanager-fail-svr-release": "सर्वर $1 से टाला हटाया नहीं जा सका।",
+       "zip-file-open-error": "ज़िप जाँच के लिए फ़ाइल खोलते समय त्रुटि आई।",
+       "zip-wrong-format": "निर्दिष्ट फ़ाइल एक ज़िप फ़ाइल नहीं थी।",
+       "zip-bad": "ज़िप फ़ाइल या तो दूषित है या किसी अन्य कारण से अपठनीय है।\nइसकी ठीक से सुरक्षा जाँच नहीं की जा सकती।",
+       "zip-unsupported": "यह फ़ाइल एक ज़िप फ़ाइल है जो ऐसी ज़िप विशेषताओं का प्रयोग करती है जो मीडियाविकि द्वारा समर्थित नहीं हैं।\nइसकी ठीक से सुरक्षा जाँच नहीं की जा सकती।",
        "uploadstash": "स्टैश अपलोड करा जाय",
+       "uploadstash-summary": "यह पृष्ठ उन फ़ाइलों के लिए अभिगम उपलब्ध कराता है जो अपलोड की गई हैं ‍‌‍‌(या अपलोड प्रक्रिया में हैं) लेकिन विकी पर अभी भी प्रकाशित नहीं हुई हैं। ये फ़ाइलें अपलोड करने वाले सदस्य को छोड़कर किसी के लिए भी दर्शित नहीं हैं।",
+       "uploadstash-clear": "स्टैश करल फ़ाइल साफ़ करा जाय",
+       "uploadstash-nofiles": "आप कय लगे कवनो स्टैश करल फाइल नाइ है ।",
+       "uploadstash-badtoken": "इ काम असफल रहा ,लागत है आप कय सम्पादन प्रमाणपत्र कय अवधि खतम होइ गवा है ।",
+       "uploadstash-errclear": "फाइल कय साफ करब असफल रहा ।",
+       "uploadstash-refresh": "फाइल कय सुची रिफ्रेश करा जाय ।",
+       "invalid-chunk-offset": "अग्राह्य चंक ऑफ़सेट",
+       "img-auth-accessdenied": "पहुँच अस्वीकार",
+       "img-auth-nopathinfo": "PATH_INFO मौजूद नाइ है।\nआप कय सर्वर मा इ जानकारी भेजय खत्तीर जमाव नाइ है।\nइ सी॰जी॰आई-आधारित होइ सकत है औ img_auth कय स्वीकार नाइ करत है।\nhttps://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization देखें।",
+       "img-auth-notindir": "अनुरोधित पथ जमावल अपलोड डायरेक्टरी मा नाइ है।",
+       "img-auth-badtitle": "\"$1\" से एकठु वैध शीर्षक बनावे मा असमर्थ।",
+       "img-auth-nologinnWL": "आप लाग इन् नाइ करे हौ औ \"$1\" श्वेतसूची मा नाइ हौ।",
+       "img-auth-nofile": "\"$1\" फाइल नाइ है।",
+       "img-auth-isdir": "आप डायरेक्टरी \"$1\" खोलेक कोशिश करा जात है ।\nखालि फ़ाइल खोली जा सकत है।",
+       "img-auth-streaming": "\"$1\"  स्ट्रीम होत है।",
+       "img-auth-public": "img_auth.php निजी विकि से फ़ाइल देवै कय काम करत है।\nइ विकि सार्वजनिक विकि होय।\nउचित सुरक्षा खत्तीर img_auth.php अक्षम है।",
+       "img-auth-noread": "सदस्य कय \"$1\" पढै कय अनुमति नाइ है ।",
+       "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": "अपलोड टाइम‍आउट",
+       "upload-curl-error28-text": "साइट कय जवाब देय मा बहुतय समय लागत है ।कृपया जाचा जाय कि साइट चलत है कि नाही अव फिरसे प्रयास कीन जाय ।आप कम भिड वाले समय प्रयास करय चाहा जाइ।",
        "license": "लाइसेन्सिंग:",
        "license-header": "लाइसेन्सिंग",
+       "nolicense": "कवनो नाइ चुना गय",
        "licenses-edit": "लाइसेंस विकल्प सम्पादन",
+       "license-nopreview": "(झलक उपलब्ध नाइ है)",
+       "upload_source_file": "(आप कय कम्प्युटरसे लिहल फाइल)",
        "listfiles-delete": "मिटावा जाय",
+       "listfiles-summary": "इ विशेष पन्ना अपलोड करल कुल फ़ाइल देखावत है।",
        "listfiles_search_for": "मीडिया नाँव कय खर्तिन खोजा जाय:",
        "imgfile": "फ़ाइल",
        "listfiles": "फ़ाइल सूची",
        "filehist-comment": "टिप्पणी",
        "imagelinks": "फ़ाइल कय उपयोग",
        "linkstoimage": "निचे दिहा {{PLURAL:$1|पन्ना}} में इ फ़ाइल कय कड़ि हैं:",
+       "linkstoimage-more": "{{PLURAL:$1|$1}} से ढेर पन्ना एहमा जोडात है।\nनिम्नोक्त सूची फ़ाइल से जुड़य वाले {{PLURAL:$1|$1 पन्ना}} देखावत है।\n[[Special:WhatLinksHere/$2|पूरा सूची]] उपलब्ध है।",
+       "nolinkstoimage": "इ फाइल से कवनो पन्ना नाइ जोडान है ।",
+       "morelinkstoimage": "इ फ़ाइल कय [[Special:WhatLinksHere/$1|अउर कड़ि]] देखा जाय।",
+       "linkstoimage-redirect": "$1(फ़ाइल पुनर्निर्देश) $2",
+       "duplicatesoffile": "निचे दिहा {{PLURAL:$1|फ़ाइल इ फ़ाइल कय प्रतिलिपि होय|$1 फ़ाइल इ फ़ाइल कय प्रतिलिपि होय}} ([[Special:FileDuplicateSearch/$2|ढेर जानकारी]]):",
+       "sharedupload": "इ फाइल $1 कय होए अव बहुत परियोजना मे इस्तेमाल होत है",
+       "sharedupload-desc-there": "इ फाईल $1 से है अव दुसर परियोजना मा प्रयोग कै सका जात है। ढेर जानकारी खातिर कृपया [$2 फाईल विवरण पन्ना] देखा जाय।",
+       "sharedupload-desc-here": "इ फाईल $1 से है अव दुसर परियोजना मा प्रयोग कै सका जात है। वँह एकर  [$2 फाईल विवरण पन्ना] कय विवरण निचे दिहा है।",
+       "sharedupload-desc-edit": "इ फाईल $1 से है अव दुसर परियोजना मा प्रयोग कै सका जात है। शाएद आप [$2 वँह ओकर फाईल विवरण पन्ना] कय सम्पादित करै चाहा जात है।",
+       "sharedupload-desc-create": "इ फाईल $1 से है अव दुसर परियोजना मा प्रयोग कै सका जात है। शाएद आप [$2 वँह ओकर फाईल विवरण पन्ना] कय सम्पादित करै चाहा जात है।",
        "filepage-nofile": "ई नाँव कय कवनो फाइल नाइ है ।",
        "filepage-nofile-link": "ई नाँव कय कवनो फाइल नाइ है,लेकिन आप [$1 कय अपलोड कई सका जात है]।",
        "uploadnewversion-linktext": "ई फाइल कय नँवा अवतरण अप्लोड करा जाय",
        "filedelete-submit": "मिटावा जाय",
        "filedelete-success": "'''$1''' मेटावा है।",
        "filedelete-success-old": "'''[[Media:$1|$1]]''' कय $2 कय $3 बजे कय अवतरण हटाई गा है।",
+       "filedelete-nofile": "<strong>$1</strong> नाई है.",
+       "filedelete-nofile-old": "\n'''$1''' का आपकी बताई विशेषताओं वाला संग्रहित अवतरण मौजूद नहीं है।",
+       "filedelete-otherreason": "अउर/दुसर कारण:",
+       "filedelete-reason-otherlist": "दुसर कारण",
        "filedelete-reason-dropdown": "*हटावे कय साधारण कारण\n** कॉपीराइट उल्लंघन\n** डुप्लिकेट फ़ाइल",
        "filedelete-edit-reasonlist": "हटावेक कारण बदला जाय",
        "filedelete-maintenance": "रखरखाव चलत है अव रखरखाव कय दौरान फ़ाइलन् कय हटाइब औ पुनर्स्थापित करब मिनाही है।",
        "filedelete-maintenance-title": "फ़ाइल नाइ हटाय सका जात है",
        "mimesearch": "MIME खोज",
-       "watchlist": "अवलोकन सुची"
+       "mimesearch-summary": "MIME-प्रकारों के अनुसार फ़ाइलें खोजने के लिये इस पृष्ठ का इस्तेमाल किया जा सकता है।\nइनपुट: फ़ाइल का प्रकार/उपप्रकार या प्रकार/*, उदा॰ <code>image/jpeg</code>।",
+       "mimetype": "MIME प्रकार:",
+       "download": "डाउनलोड",
+       "unwatchedpages": "ध्यान ना दिहल पन्ना",
+       "listredirects": "पुनर्निर्देशन कय सूची",
+       "listduplicatedfiles": "डुप्लिकेट वाले फाइल",
+       "listduplicatedfiles-entry": "[[:फाइल:$1|$1]] कय लगे [[$3|{{PLURAL:$2|एक्ठु डुप्लिकेट|$2 डुप्लिकेट}}]].",
+       "unusedtemplates": "अप्रयुक्त साँचा",
+       "unusedtemplatestext": "इस पृष्ठ पर {{ns:template}} नामस्थान वाले वे सभी पृष्ठ इंगित है जो किसी अन्य पृष्ठ में शामिल नहीं हैं।\nइन्हें हटाने के पहले इन साँचों की और कड़ियाँ जाँच लें।",
+       "unusedtemplateswlh": "अउर कड़ि",
+       "randompage": "कवनो एक पन्ना",
+       "randompage-nopages": "ई {{PLURAL:$2|नामस्थान|नामस्थानन्}} मा कवनो फाइल नाइ है: $1।",
+       "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": "पन्ना",
+       "statistics-pages-desc": "विकि कय कुल पन्ना,बातचीत पन्ना अव रिडाइरेक्ट लैकय।",
+       "statistics-files": "अपलोड करल फाइल",
+       "statistics-edits": "{{SITENAME}} बनै कय बाद संपादन करल पन्ना",
+       "statistics-edits-average": "प्रति पन्ना औसत संपादन",
+       "statistics-users": "पंजीकृत [[Special:ListUsers|सदस्य]]",
+       "statistics-users-active": "सक्रिय सदस्य",
+       "statistics-users-active-desc": "पिछला {{PLURAL:$1|दिन}} से जवन सदस्य सक्रिय हँय",
+       "pageswithprop": "पन्ना जवनन में पन्ना गुण है",
+       "pageswithprop-legend": "पन्ना जवनन में पन्ना गुण है",
+       "pageswithprop-text": "इ पन्ना पन्नन कय गुण कय उपयोग करय वाले पन्नन कय सुचिबद्ध करत है ।",
+       "pageswithprop-prop": "गुण कय नाँव:",
+       "pageswithprop-submit": "खोजा जाय",
+       "pageswithprop-prophidden-long": "लम्मा पाठ गुण मान लुकुआवा है ($1)",
+       "pageswithprop-prophidden-binary": "बाइनरी पाठ गुण मान लुकुआवा है ($1)",
+       "doubleredirects": "दुईठु पुनर्निर्देश",
+       "doubleredirectstext": "यह पृष्ठ उन पृष्ठों की सूची देता है जो अन्य पुनर्निर्देशित पृष्ठों की ओर पुनर्निर्देशित हैं।\nहर कतार में पहले और दूसरे पुनर्निर्देशन की कड़ियाँ, तथा दूसरे पुनर्निर्देशन का लक्ष्य भी है, आमतौर पर यही \"वास्तविक\" लक्ष्यित पृष्ठ होगा, और पहला पुनर्देशन वास्तव में इसी को लक्ष्यित होना चाहिए।\n<del>काटी गई</del> प्रविष्टियाँ सुलझा दी गई हैं।",
+       "double-redirect-fixed-move": "[[$1]] कय घुस्काइ गय । इ अपने आप अपडेट होइ गवा है अव [[$2]] पे पुनर्निर्देशीत होइ ।",
+       "double-redirect-fixer": "पुनर्निर्देशन मिस्त्री",
+       "brokenredirects": "टूटल पुनर्निर्देशन पन्ना",
+       "brokenredirectstext": "ई कुल पुनर्निर्देश नामौजुद पन्नन मा लैजात हैं :",
+       "brokenredirects-edit": "सम्पादन करा जाय",
+       "brokenredirects-delete": "मेटावा जाय",
+       "withoutinterwiki": "बिना अंतरविकि कड़ि वाले पन्ना",
+       "withoutinterwiki-summary": "इ कुल पन्ना कवनो दुसर अवतरण कय पन्नन् से नाइ जोड़ात हैं ।",
+       "withoutinterwiki-legend": "उपसर्ग",
+       "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": "जवन फाइल चाहिँ",
+       "wantedfiletext-cat": "निम्न फ़ाइलें प्रयुक्त हैं पर मौजूद नहीं हैं। बाहरी भंडारों की फ़ाइलें मौजूद होने के बावजूद सूची में हो सकती हैं। ऐसी कोई भी गलत प्रविष्टियाँ <del>काटी हुई</del> होंगी। साथ ही, जो पृष्ठ ऐसी फ़ाइलों का प्रयोग करते हैं जो मौजूद नहीं हैं, उनकी सूची [[:$1]] में है।",
+       "wantedfiletext-nocat": "निम्न फ़ाइलें प्रयुक्त हैं पर मौजूद नहीं हैं। बाहरी भंडारों की फ़ाइलें मौजूद होने के बावजूद सूची में हो सकती हैं। ऐसी कोई भी गलत प्रविष्टियाँ <del>काटी हुई</del> होंगी।",
+       "wantedfiletext-nocat-noforeign": "इ कुल फाइल कय इस्तेमाल कै गा है लेकिन मौजुद नाइ है ।",
+       "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": "खोजा जाय",
+       "booksources-text": "निचँवा पुरान व नँवा किताब बेचय वाले वेबसाइट कय एड्रेस हैं,जवने मा आप कय खोजल किताबिन् कय बारे मे ढेर जानकारी मिलि सकत है :",
+       "booksources-invalid-isbn": "इ ISBN सही नाइ लागत है ,मुल स्रोत से नकल करत कय कवनो गल्ती होइ गा होइ ,जाँचा लीन जाय ।",
+       "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-viewing-cached-ttl": "आप इ पन्ना कय कैश करल अवतरण देखा जात है ,जवन $1 पुरान होइ सकत है ।",
+       "cachedspecial-viewing-cached-ts": "आप इ पन्ना कय कैश करल अवतरण देखा जात है ,जवन कि पुरै सही नाइ होइ सकत है ।",
+       "cachedspecial-refresh-now": "हालिए कय देखा जाय ।",
+       "categories": "श्रेणी",
+       "categoriespagetext": "निम्नोक्त {{PLURAL:$1|श्रेणी|श्रेणि}} मा पन्ना या मीडिया है।\nजवन श्रेणिन् कय [[Special:UnusedCategories|अप्रयुक्त श्रेणि]] यहँ नाइ देखाई गा हैं।\n[[Special:WantedCategories|वांछित श्रेणि]] भी देखा जाय।",
+       "categoriesfrom": "इ अक्षर से शुरु होय वाला श्रेणी देखावा जाय:",
+       "special-categories-sort-count": "संख्या कय अनुसार क्रमांकित करा जाय",
+       "special-categories-sort-abc": "वर्णानुक्रम कय अनुसार देखावा जाय",
+       "deletedcontributions": "हटावल सदस्य योगदान",
+       "deletedcontributions-title": "हटावल सदस्य योगदान",
+       "sp-deletedcontributions-contribs": "योगदान",
+       "linksearch": "बाहरी कड़ी खोजा जाय",
+       "linksearch-pat": "खोजय खर्तीन पाठ:",
+       "linksearch-ns": "नामस्थान:",
+       "linksearch-ok": "खोजा जाय",
+       "linksearch-text": "\"*.wikipedia.org\" जैसन वाईल्ड-कार्ड्स प्रयोग कै सका जात है।\nकम-से-कम \".org\" जैसन कवनो top-level डोमेन कय आवश्यकता है।<br />\nस्वीकार्य {{PLURAL:$2|प्रोटोकॉल}}: <code>$1</code> (यदि कवनो प्रोटोकॉल ना दै जाए तव http:// कय प्रयोग कै सका जात है)",
+       "linksearch-line": "$2 में से $1 जोडान है",
+       "linksearch-error": "वाईल्डकार्ड्स होस्टनाम कय खालि शुरू में आइ सकत है।",
+       "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": "सनेशा कय नाँव",
+       "trackingcategories-desc": "श्रेणी राखेक क्राइटेरिया",
+       "trackingcategories-nodesc": "कवनो ढेर जानकारी नाइ है ।",
+       "trackingcategories-disabled": "श्रेणी अक्षम करा है",
+       "mailnologin": "कवनो पठवे वाला ठहर नाइ है",
+       "mailnologintext": "अउर सदस्यन् कय इ-मेल पठवे खत्तिर [[Special:UserLogin|लॉग इन]] करब आवश्यक है औ आप कय [[Special:Preferences|पसंद]] में वैध ई-मेल ठहर होब जरुरी है।",
+       "emailuser": "इ सदस्य कय ई-मेल पठवा जाय",
+       "emailuser-title-target": "इ {{GENDER:$1|सदस्य|सदस्या}} कय ई-मेल करा जाय।",
+       "emailuser-title-notarget": "सदस्य कय ई-मेल करा जाय",
+       "emailpage": "सदस्य कय ई-मेल करा जाय",
+       "emailpagetext": "नीचे कय पर्चा से आप इ {{GENDER:$1|सदस्य}} कय ई-मेल भेजि सका जात है।\nआप जवन ठहर [[Special:Preferences|आप कय पसंद]] में दिहा गा है उ इ ई-मेल कय \"भेजय वाले\" कय तौर पे आइ, इही से प्राप्तकर्ता आप कय सीधय जवाब दई सकत हैं।",
+       "defemailsubject": "{{SITENAME}} ई-मेल \"$1\" सदस्य से",
+       "usermaildisabled": "सदस्य ई-मेल अक्षम कै गय",
+       "usermaildisabledtext": "आप इ विकि पे अउर सदस्यन् कय ई-मेल नाइ भेज सका जात है",
+       "noemailtitle": "कवनो ई-मेल एड्रेस नाइ है",
+       "noemailtext": "इ सदस्य वैध ई-मेल ठहर नाइ दिहे हैं।",
+       "nowikiemailtext": "इ सदस्य अउर सदस्यन से इमेल ना पावै कय फैसला करें हँय ।",
+       "emailnotarget": "प्राप्तकर्ता कय लिए अस्तित्वहीन या अमान्य सदस्यनाम।",
+       "emailtarget": "पावै वाले कय सदस्यनाँव भरा जाय",
+       "emailusername": "सदस्यनाँव",
+       "emailusernamesubmit": "भेजो",
+       "email-legend": "कवनो अउर {{SITENAME}} सदस्य कय ई-मेल भेजा जाय",
+       "emailfrom": "प्रेषक:",
+       "emailto": "प्राप्तकर्ता:",
+       "emailsubject": "विषय:",
+       "emailmessage": "सनेशा:",
+       "emailsend": "भेजा जाय",
+       "emailccme": "हमरे इमेल कय प्रतिलिपि(कापी) हमँहु कय भेजा जाय ।",
+       "emailccsubject": "आप कय इमेल कय प्रतिलिपि(कापि) जवन $1 कय भेजि गय:$2",
+       "emailsent": "इमेल पठै गय",
+       "emailsenttext": "आप कय इमेल सनेशा पठै गय ।",
+       "emailuserfooter": "इ ई-मेल {{SITENAME}} कय \"सदस्य ई-मेल\" सुविधा से $1 से $2 कय भेजि गा रहा।",
+       "usermessage-summary": "प्रणाली सन्देश छोडत है।",
+       "usermessage-editor": "सिस्टम दूत",
+       "watchlist": "अवलोकन सुची",
+       "mywatchlist": "अवलोकन सुची",
+       "watchlistfor2": "$1 $2 कय खत्तिर",
+       "nowatchlist": "आप कय धियान सुची मा कवनो पन्ना नाइ है ।",
+       "watchlistanontext": "आपन धियान सुची कय देखय अव सम्पादन करय खत्तीर लाग इन कीन जाय ।",
+       "watchnologin": "लॉग इन नाइ करा गा है",
+       "addwatch": "ध्यानसूची में जोड़ा जाय",
+       "addedwatchtext": "आप कय [[Special:Watchlist|ध्यानसूची]] मा \"[[:$1]]\" पन्ना जोड़ाइ गय।\nभविष्य मा इ पन्ना अव एकर बातचीत पन्ना मा होवै वाला बदलाव आप कय ध्यानसूची मा देखाइ।",
+       "addedwatchtext-short": "\"$1\" कय आप कय धियान सुची मा डारी गय ।",
+       "removewatch": "ध्यानसूची से हटावा जाय",
+       "removedwatchtext": "\"[[:$1]]\" नाँव कय पन्ना कय आपकय [[Special:Watchlist|ध्यानसूची]] से हटाय दिहा गा है।",
+       "removedwatchtext-short": "\"$1\" कय आप कय धियान सुची से निकारि गय ।",
+       "watch": "ध्यान रक्खा जाय",
+       "watchthispage": "इ पन्ना पे ध्यान रक्खा जाय",
+       "unwatch": "ध्यान हटावा जाय",
+       "unwatchthispage": "ध्यानसूची से हटावा जाय",
+       "notanarticle": "सामग्री पन्ना नाइ होय",
+       "notvisiblerev": "पूर्वावलोकन हटाइ गय",
+       "watchlist-details": "बातचीत पन्ना कय अलावा {{PLURAL:$1|$1 पन्ना}} आप कय ध्यानसूची में है।",
+       "wlheader-enotif": "ई-मेल नोटिफ़िकेशन सक्षम है।",
+       "wlheader-showupdated": "पन्ना जवन आपकय द्वारा देखय जाएक बाद बदलि गा है '''बोल्ड''' मे देखाइ।",
+       "wlshowlast": "पिछला $1 घंटा $2 दिन  देखा जाय",
+       "watchlist-options": "ध्यानसूची विकल्प",
+       "watching": "ध्यान देत हँय...",
+       "unwatching": "ध्यानसूची से हटत है...",
+       "watcherrortext": "\"$1\" कय खत्तीर आप कय ध्यानसूची सेटिंग बदलत समय त्रुटि होई गवा।",
+       "enotif_reset": "कुल पन्ना कय देखल पन्ना करा जाय",
+       "enotif_impersonal_salutation": "{{SITENAME}} सदस्य",
+       "enotif_subject_deleted": "{{SITENAME}} पन्ना $1 कय {{gender:$2|$2}} हटाए दिहे हैं",
+       "enotif_subject_created": "{{SITENAME}} पन्ना $1 कय {{gender:$2|$2}} बनाए दिहें हैं",
+       "enotif_subject_moved": "{{SITENAME}} पन्ना $1 कय {{gender:$2|$2}} घुस्काय दिहे हैं",
+       "enotif_subject_restored": "{{SITENAME}} पन्ना $1 कय {{gender:$2|$2}} पुनर्स्थापित कै दिहे हैं",
+       "enotif_subject_changed": "{{SITENAME}} पन्ना $1 कय {{gender:$2|$2}} बद़ल दिहे हैं",
+       "enotif_body_intro_deleted": "{{SITENAME}} पन्ना $1 कय {{gender:$2|$2}} $PAGEEDITDATE कय हटाइ दिहें है, देखा जाय $3।",
+       "enotif_body_intro_created": "{{SITENAME}} पन्ना $1 कय {{gender:$2|$2}} $PAGEEDITDATE कय बनाए हैं, वर्तमान अवतरण कय लिए $3 देखा जाय।",
+       "enotif_body_intro_moved": "{{SITENAME}} पन्ना $1 कय {{gender:$2|$2}} $PAGEEDITDATE कय घुस्काए हैं, वर्तमान अवतरण कय लिए $3 देखा जाय।",
+       "enotif_body_intro_restored": "{{SITENAME}} पन्ना $1 कय {{gender:$2|$2}} $PAGEEDITDATE कय पुनर्स्थापित करे हैं, वर्तमान अवतरण कय लिए $3 देखा जाय।",
+       "enotif_body_intro_changed": "{{SITENAME}} पन्ना $1 कय {{gender:$2|$2}} $PAGEEDITDATE कय बदलें हैं, वर्तमान अवतरण कय लिए $3 देखा जाय।",
+       "enotif_lastvisited": "आप कय आखिरी भेंट कय बाद करल बदलाव देखय खर्तीन $1 देखा जाय।",
+       "enotif_lastdiff": "इ बदलाव देखय खत्तिर $1 देखा जाय।",
+       "enotif_anon_editor": "अज्ञात  प्रयोगकर्ता  $1",
+       "enotif_body": "प्रिय $WATCHINGUSERNAME जी,\n\n$PAGEINTRO $NEWPAGE\n\nसम्पादन सारांश: $PAGESUMMARY $PAGEMINOREDIT\n\nसंपादक से संपर्क करें:\nई-मेल: $PAGEEDITOR_EMAIL\nविकि: $PAGEEDITOR_WIKI\n\nजब तक आप इस पृष्ठ पर लॉगिन कर के फिर से नहीं जाते, तब तक और बदलाव होने पर भी आपको फिर से सूचना नहीं भेजी जाएगी।\nआप चाहें तो अपनी ध्यानसूची में मौजूद सभी पन्नों के लिए सूचना चिन्ह को भी बदल सकते हैं।\n\nआपकी सहायिका, {{SITENAME}} की सूचक प्रणाली\n\n--\nअपनी ई-मेल सूचना के जमाव बदलने के लिये देखें\n{{canonicalurl:{{#special:Preferences}}}}\n\nअपनी ध्यानसूची के जमाव बदलने के लिए देखें\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nइस पृष्ठ को अपनी ध्यानसूची से हटाने के लिये देखें\n$UNWATCHURL\n\nराय देने या अधिक सहायता पाने के लिए:\n$HELPPAGE",
+       "deletepage": "पन्ना मेटावा जाय",
+       "confirm": "सुनिश्चित करा जाय",
+       "excontent": "लेख रहा: '$1'",
+       "excontentauthor": "लिखा रहा: '$1' (औ खाली '[[Special:Contributions/$2|$2]]' कय योगदान रहा।)",
+       "exbeforeblank": "खाली करय से पहिले पाठ रहा: '$1'",
+       "delete-confirm": "\"$1\" मिटावा जाय",
+       "delete-legend": "मेटावा जाय",
+       "confirmdeletetext": "आप एकठु पन्ना कय अव ओकरे कुल अवतरण सहित हटावे जावा जात है।\nजाँच लीन जाय कि आप इ करय चाहा जात है, आप एकरे परिणाम कय जाना जात है, औ आप इ [[{{MediaWiki:Policy-url}}|नीति]] कय अनुसार करा जात है।",
+       "actioncomplete": "काम पुरा होइ गवा",
+       "actionfailed": "काम असफल",
+       "deletedtext": "\"$1\" कय हटाई गा है।\nहालिए में हटावल पन्नन कय सूची खत्तीर $2 देखा जाय।",
+       "dellogpage": "हटावे कय लॉग",
+       "dellogpagetext": "नीचे हालिए में हटावल पन्नन कय सूची है।",
+       "deletionlog": "हटावे कय लॉग",
+       "reverted": "पुरान अवतरण कय पहिले जैसन कै गय",
+       "deletecomment": "कारण:",
+       "deleteotherreason": "अउर/दुसर कारण:",
+       "deletereasonotherlist": "दुसर कारण",
+       "deletereason-dropdown": "*हटावे कय सामान्य कारण\n** स्पैम\n** बर्बरता\n** कॉपीराइट उल्लंघन\n** लेखक कय अनुरोध\n** टूटल अनुप्रेषण",
+       "delete-edit-reasonlist": "हटावे कय कारण संपादित करा जाय",
+       "delete-toobig": "इ पन्ना कय संपादन इतिहास $1 से ढेर {{PLURAL:$1|अवतरण}} होएक  नाते से बहुत बड़ा है।\n{{SITENAME}} कय अनपेक्षित रूप से बंद होए से रोकेक लिये ऐसन पन्नन् कय हटावे कय अनुमति नाइ है।",
+       "delete-warning-toobig": "इ पन्ना कय संपादन इतिहास $1 से ढेर {{PLURAL:$1|अवतरण}} होएक  नाते से बहुत बड़ा है।\nएका हटावे से {{SITENAME}} कय डाटाबेस कय गतिविधिन् में व्यवधान आइ सकत है;\nकृपया सोच समझ कर आगे बढ़ें।",
+       "deleteprotected": "आप इ पन्ना कय नाइ मिटाइ सका जात है काहे से इ पन्ना सुरक्षित है ।",
+       "deleting-backlinks-warning": "'''चेतावनी:''' जवन पन्ना आप हटावे जावा जात है ओसे [[Special:WhatLinksHere/{{FULLPAGENAME}}|अउर पन्ना]] जुड़त है या ओसे ट्रांसक्लूड करत है।",
+       "rollback": "संपादन वापिस लिहा जाय",
+       "rollbacklink": "वापिस लिहा जाय",
+       "rollbacklinkcount": "$1 {{PLURAL:$1|सम्पादन}} वापिस लिहा जाय",
+       "rollbacklinkcount-morethan": "$1 से ढेर {{PLURAL:$1|सम्पादन}} वापिस लिहा जाय",
+       "rollbackfailed": "वापिस लेब असफल रहा",
+       "cantrollback": "पुरान अवतरण कय पहिले जैसन नाइ कै सका जात है ; इ पन्ना कय आखिरी योगदानकर्ता खालि इ लेख कय लिखे हैं ।",
+       "alreadyrolled": "[[User:$2|$2]] ([[User talk:$2|बातचीत]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) द्वारा किए गए  [[:$1]] के पिछले संपादन को वापिस पुरानी स्थिति पर नहीं लाया जा सकता है;\nकिसी और ने इस बीच या तो इस पृष्ठ को फिर से संपादित कर दिया है या पहले ही पृष्ठ पुरानी स्थिति पर लाया जा चुका है।\n\nइस पृष्ठ का अन्तिम संपादन [[User:$3|$3]] ([[User talk:$3|बातचीत]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]) ने किया है।",
+       "editcomment": "संपादन सारांश रहा: \"''$1''\"।",
+       "revertpage": "[[Special:Contributions/$2|$2]] ([[User talk:$2|बातचीत]])से [[User:$1|$1]] कय करल पिछला संशोधन उल्टाई कय पहिले जैसन कै गय",
+       "revertpage-nouser": "(सदस्य नाँव हटाइ गा है) कय संपादन कय हटाइकए {{GENDER:$1|[[User:$1|$1]]}} कय अन्तिम अवतरण कय पहिले जैसन कै गय।",
+       "rollback-success": "$1 कय संपादन हटाइ गय;\n$2 कय संपादित अन्तिम अवतरण कय पुनर्स्थापित कै गय।",
+       "sessionfailure-title": "सत्र विफलता",
+       "sessionfailure": "ऐसा प्रतीत होता है कि आपके लॉगिन सत्र के साथ कोई समस्या है।\nसत्र अपहरण से बचाने के लिए सावधानी के तौर पर आपका यह क्रियाकलाप रद्द कर दिया गया है।\nकृपया पीछे जाएँ और पृष्ठ को पुनः लोड करें, तब दुबारा कोशिश करें।",
+       "protectlogpage": "सुरक्षा लॉग",
+       "protectlogtext": "नीचे पन्ना सुरक्षा कय बदलाव कय सूची है।\nवर्तमान सुरक्षित पन्नन कय सूची कय लिए [[Special:ProtectedPages|सुरक्षित पन्ना कय सूची]] देखा जाय।",
+       "protectedarticle": "\"[[$1]]\" कय सुरक्षित कै गय",
+       "modifiedarticleprotection": "\"[[$1]]\" कय सुरक्षा-स्तर बदलि गय",
+       "unprotectedarticle": "\"[[$1]]\" से सुरक्षा हटाइ गय",
+       "movedarticleprotection": "सुरक्षा स्तर \"[[$2]]\" से बदलि कय  \"[[$1]]\" कै गय",
+       "protect-title": "\"$1\" कय सुरक्षा स्तर बदला जाय",
+       "protect-title-notallowed": "\"$1\" कय सुरक्षा स्तर देखा जाय",
+       "prot_1movedto2": "[[$1]] कय नाँव बदलि कय [[$2]] कै गय",
+       "protect-badnamespace-title": "सुरक्षाहीन नामस्थान",
+       "protect-badnamespace-text": "इ नामस्थान मा पन्ना सुरक्षित नाइ कै सका जात है।",
+       "protect-norestrictiontypes-text": "इ पन्ना कय सुरक्षित नाइ कै सका जात है काहे से कवनो सुरक्षा प्रकार नाइ है ।",
+       "protect-norestrictiontypes-title": "सुरक्षाहीन पन्ना",
+       "protect-legend": "सुरक्षा निर्धारित करा जाय",
+       "protectcomment": "कारण :",
+       "protectexpiry": "समाप्ति:",
+       "protect_expiry_invalid": "समाप्ती समय गलत अहै।",
+       "protect_expiry_old": "समाप्ती समय बीत चुका है।",
+       "protect-unchain-permissions": "अउर सुरक्षा विकल्प खोला जाय",
+       "protect-text": "'''$1''' पन्ना कय सुरक्षा-स्तर आप हिँया देख सका जात है औ ओका बदल सका जात है।",
+       "protect-locked-blocked": "आप बाधित होने की स्थिति में सुरक्षा स्थर में परिवर्तन नहीं कर सकते।\nपृष्ठ '''$1''' की वर्तमान स्थिति यह है:",
+       "protect-locked-dblock": "डेटाबेस में सक्रिय लॉक होने की वजह से सुरक्षा स्तर में कोई परिवर्तन नहीं किया जा सकता।\nपृष्ठ '''$1''' की वर्तमान स्थिति यह है:",
+       "protect-locked-access": "आपको इस पृष्ठ का सुरक्षा-स्तर बदलने की अनुमति नहीं है।\n'''$1''' का वर्तमान सुरक्षा-स्तर यह है:",
+       "protect-cascadeon": "यह पृष्ठ अभी सुरक्षित है क्योंकि यह {{PLURAL:$1|इस पृष्ठ की|इन पृष्ठों की}} सुरक्षा-सीढ़ी में है। इस पृष्ठ के सुरक्षा-स्तर में बदलाव से सुरक्षा-सीढ़ी में बदलाव नहीं होगा।",
+       "protect-default": "कुल सदस्यन कय अनुमति दिहा जाय",
+       "protect-fallback": "खालि \"$1\" अधिकार वाले सदस्यन् कय अनुमति दिहा जाय",
+       "protect-level-autoconfirmed": "खालि स्वतः स्थापित सदस्यन् कय अनुमति दिहा जाय",
+       "protect-level-sysop": "खाली प्रबन्धकन् कय अनुमति दिहा जाय",
+       "protect-summary-cascade": "सीढ़ी",
+       "protect-expiring": "समाप्ती $1 (UTC)",
+       "protect-expiring-local": "समाप्ती $1",
+       "protect-expiry-indefinite": "अनिश्चितकालीन",
+       "protect-cascade": "इ पन्ना से जोडान पन्नन् कय सुरक्षित करा जाय (सुरक्षा सीढी)",
+       "protect-cantedit": "आप इ पन्ना कय सुरक्षा स्तर नाई बदलि सका जात अहै काहे से आप कय एकर अनुमति नाइ है ।",
+       "protect-othertime": "कवनो अउर समय:",
+       "protect-othertime-op": "कवनो अउर समय",
+       "protect-existing-expiry": "वर्तमान समय सीमा :$3, $2",
+       "protect-otherreason": "अउर/दुसर कारण:",
+       "protect-otherreason-op": "दुसर कारण",
+       "protect-dropdown": "*सुरक्षा कय आम कारण\n**ढेर बर्बरता \n**ढेर स्पैम\n**अफलदायी सम्पादन युद्ध\n**ढेर खोल जाय वाला पृष्ठ",
+       "protect-edit-reasonlist": "सुरक्षा कय कारण बदला जाय",
+       "protect-expiry-options": "एक घंटा:1 hour,एक दिन:1 day,एक हप्ता:1 week,दुइ हप्ता:2 weeks,एक महीन्ना:1 month,तीन महीन्ना:3 months,छः महीन्ना:6 months,एक साल:1 year,हमेशा खत्तिर:infinite",
+       "restriction-type": "अधिकार:",
+       "restriction-level": "प्रतिबन्ध स्तरः",
+       "minimum-size": "न्यूनतम आकार",
+       "maximum-size": "अधिकतम आकार:",
+       "pagesize": "(बाइट)",
+       "restriction-edit": "सम्पादन करा जाय",
+       "restriction-move": "घुस्कावा जाय",
+       "restriction-create": "बनावा जाय",
+       "restriction-upload": "अपलोड करा जाय",
+       "restriction-level-sysop": "पूर्ण सुरक्षित",
+       "restriction-level-autoconfirmed": "अर्ध-सुरक्षित",
+       "restriction-level-all": "कवनो स्तर",
+       "undelete": "मेटावल पन्ना देखावा जाय",
+       "undeletepage": "हटावल पन्ना देखा जाय औ पुनर्स्थापित करा जाय",
+       "undeletepagetitle": "'''नीचे [[:$1|$1]] कय हटावल अवतरण देखाई गा है।'''",
+       "viewdeletedpage": "मेटावल पन्ना देखावा जाय",
+       "undeletepagetext": "निम्न {{PLURAL:$1|$1 पृष्ठ|$1 पृष्ठों}} को हटा दिया गया है, लेकिन अभी ये लेखागार में हैं और पुनर्स्थापित किये जा सकते हैं।\nलेखागार समय-समय पर साफ किये जाते हैं।",
+       "undelete-fieldset-title": "अवतरण पहिले जैसन करा जाय",
+       "undeleteextrahelp": "पृष्ठ का संपूर्ण इतिहास वापस लाने के लिए सभी बक्सों से सही का निशान हटा दें और '''''{{int:undeletebtn}}''''' पर क्लिक करें।\nचुनिंदा इतिहास को वापस लाने के लिए उन अवतरणों के बगल के बक्सों पर सही का निशान लगाएँ और '''''{{int:undeletebtn}}''''' पर क्लिक करें।",
+       "undeleterevisions": "$1 अवतरण लेखागार में {{PLURAL:$1|है}}",
+       "undeletehistory": "यदि आप पृष्ठ को पुनर्स्थापित करते हैं तो सभी अवतरण इतिहास में पुनर्स्थापित हो जायेंगे।\nहटाने के बाद यदि एक नया पृष्ठ उसी नाम से बनाया गया है तो पुनर्स्थापित अवतरण पिछले इतिहास में दर्शित होंगे।",
+       "undeleterevdel": "यदि पुनर्स्थापन के फलस्वरूप शीर्ष पृष्ठ या फ़ाइल अवतरण आंशिक रूप से मिट सकता है, तो इसे नहीं किया जायेगा।\nऐसी स्थिति में, आपको नवीनतम मिटाए गए अवतरण को बिना सही के निशान लगाये हुए या बिना छुपाये रखना होगा।",
+       "undeletehistorynoadmin": "ई पन्ना हटाई दिहा गा है।\nहटावै  कय कारन नीचे सारांश में दिहा है, अउर साथय उ सदस्यन् कय बारे में विस्तार भी दिहा है, जे हटावै से पहिले इ पन्ना कय संपादित करे रहें।\nइ हटावल अवतरण कय पाठ केवल प्रबंधकन् कय लगे है।",
+       "undelete-revision": "$1 ($4 कय $5 बजे $3 बनाइन रहा) कय मेटावल संस्करण:",
+       "undeleterevision-missing": "अमान्य अथवा अनुपस्थित अवतरण।\nया तो आप ग़लत कड़ी प्रयोग कर रहे हैं, या यह अवतरण पुनर्स्थापित किया जा चुका है, अथवा इसे लेखागार से हटा दिया गया है।",
+       "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-missing-filearchive": "फ़ाइल पुरालेख आई॰डी $1 को पुनर्स्थापित करने में असक्षम हैं, क्योंकि यह डाटाबेस में उपलब्ध नहीं है।\nया ऐसा भी हो सकता है कि इसे पहले से ही पुनर्स्थापित किया जा चुका हो।",
+       "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": "चुनाव उल्टा करा जाय",
+       "tooltip-invert": "चयनित नामस्थान (और संबद्ध नामस्थान यदि जाँच) के भीतर पृष्ठों में किए गए परिवर्तन छुपाने के लिए इस बक्से को चिह्नित करें",
+       "namespace_association": "सम्बद्ध नामस्थान",
+       "tooltip-namespace_association": "भी बात या विषय नाम स्थान चयनित नाम स्थान के साथ जुड़े को शामिल करने के लिए इस बक्से को चिह्नित करें।",
+       "blanknamespace": "(मुख्य)",
+       "contributions": "{{GENDER:$1|सदस्य}} योगदान",
+       "contributions-title": "$1 कय योगदान",
+       "mycontris": "योगदान",
+       "contribsub2": "{{GENDER:$3|$1}} ($2) कय खर्तीन",
+       "contributions-userdoesnotexist": "सदस्य \"$1\" पंजीकृत नाइ है।",
+       "nocontribs": "इन कसौटियों से मिलनेवाले बदलाव मिले नहीं।",
+       "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-toponly": "केवल उन सम्पादनों को दिखाएँ जो नवीनतम संशोधन हैं",
+       "sp-contributions-newonly": "केवल वे सम्पादन दिखाएँ जिनसे पृष्ठ निर्मित हुए हों",
+       "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": "सदस्य कय अवरोधित करा जाय।",
+       "blockiptext": "विशिष्ठ IP पते अथवा सदस्य नाम को लिखने के अधिकार से बाध्य करने के लिए निम्न पत्र का प्रयोग करें।\nयह सिर्फ बर्बरता को रोकने के लिए ही किया जाना चाहिए, और [[{{MediaWiki:Policy-url}}|नीति]] के अनुसार ही करना चाहिए।\nनीचे विशिष्ठ कारण भी लिखें (उदाहरण के लिए, सटीक पृष्ठों को दर्शाते हुए, जिनमें बर्बरता की गई हो)।",
+       "ipaddressorusername": "आईपी एड्रेस या सदस्यनाँव:",
+       "ipbexpiry": "समाप्ति:",
+       "ipbreason": "कारण:",
+       "ipbreason-dropdown": "*अवरोधित करने के साधारण कारण\n** अवैध सदस्यनाम\n** एक से अधिक खातें खोलकर उनका दुरुपयोग करना\n** गलत जानकारी भरना\n** पृष्ठों में कचरा भरना\n** पृष्ठों से सामग्री हटाना‍‍‍‍‍\n** बाहरी जालस्थलों की फ़ालतू कड़ियां देना \n** सदस्यों को तंग करना",
+       "ipb-hardblock": "सत्राराम्भित प्रयोक्ताओं को इस आईपी पते का सम्पादन करने से रोकें",
+       "ipbcreateaccount": "खाते बनावेकै रोका जाय",
+       "ipbemailban": "सदस्य कय ईमेल करै से रोका जाय",
+       "ipbenableautoblock": "इस सदस्यद्वारा इस्तेमाल किया गया आखिरी आईपी एड्रेस और यहां से आगे इस सदस्य द्वारा इस्तेमालमें लाये जाने वाले सभी एड्रेस ब्लॉक करें।",
+       "ipbsubmit": "इ सदस्य कय अउर बदलाव करय से रोका जाय",
+       "ipbother": "अउर समय:",
+       "ipboptions": "दुइ घंटा:2 hours,एक दिन:1 day,तीन दिन:3 days,एक हप्ता:1 week,दुइ हप्ता:2 weeks,एक महीना:1 month,तीन महीना:3 months,छः महीना:6 months,एक साल:1 year,हमेशा कय लिये:infinite",
+       "ipbhidename": "संपादन अव सूचिन् से सदस्य नाँव लुकुआवा जाय",
+       "ipbwatchuser": "इ सदस्य कय सदस्य पन्ना अव बातचीत पन्ना पे नजर रक्खा जाय",
+       "ipb-disableusertalk": "इ सदस्य कय अवरुद्ध होए पे आपन बातचीत पन्ना सम्पादन करै से रोका जाय",
+       "ipb-change-block": "इ सेटिङ कय इस्तेमाल कै कय सदस्य कय अवरोधित करा जाय",
+       "ipb-confirm": "अवरोधण कय पुष्टि करा जाय",
+       "badipaddress": "अमान्य आईपी ठहर।",
+       "blockipsuccesssub": "अवरोधन सफल ।(संपादन करय से रोक दिहा गा है)",
+       "blockipsuccesstext": "[[Special:Contributions/$1|$1]] को ब्लॉक किया जा चुका है।<br />\nब्लॉकों की समीक्षा के लिए [[Special:BlockList|ब्लॉक लॉग]] देखें।",
+       "ipb-blockingself": "आप खुद को अवरोधित कर रहे हैं! क्या आप वाकई ऐसा करना चाहते हैं?",
+       "ipb-edit-dropdown": "ब्लॉक कारण संपादित करा जाय",
+       "ipb-unblock-addr": "$1 कय अनब्लॉक करा जाय",
+       "ipb-unblock": "सदस्य या आईपी एड्रेस कय अनब्लॉक करा जाय",
+       "ipb-blocklist": "सद्य ब्लॉक देखा जाय",
+       "ipb-blocklist-contribs": "{{GENDER:$1|$1}} कय योगदान",
+       "unblockip": "सदस्य कय अवरोध हटावा जाय।",
+       "unblockiptext": "पहले ब्लॉक किये हुए आईपी एड्रेस या सदस्यनाम को अनब्लॉक करने के लिये नीचे दिया गया फार्म भरें।",
+       "ipusubmit": "इ अवरोध हटावा जाय",
+       "unblocked": "[[User:$1|$1]] होइ गा हैं।",
+       "unblocked-range": "$1 अनब्लॉक होइ गा हैं।",
+       "unblocked-id": "अवरोध $1 निकारि दिहा गा है",
+       "unblocked-ip": "[[Special:Contributions/$1|$1]] कय ब्लाक कै गय",
+       "blocklist": "अवरोधित उपयोक्ता",
+       "ipblocklist": "अवरोधित आईपी ठहर या सदस्यनाँव",
+       "ipblocklist-legend": "अवरोधित सदस्य कय खोजा जाय",
+       "blocklist-userblocks": "खाता कय अवरोध लुकुआवा जाए",
+       "blocklist-tempblocks": "अस्थाई अवरोध लुकुआवा जाए",
+       "blocklist-addressblocks": "एक्ठु आईपी अवरोध लुकुआवा जाए",
+       "blocklist-rangeblocks": "श्रेणी अवरोध लुकुआवा जाए",
+       "blocklist-timestamp": "समय मोहर",
+       "blocklist-target": "लक्ष्य",
+       "blocklist-expiry": "खतम",
+       "blocklist-by": "प्रशासक अवरुद्ध",
+       "blocklist-params": "अवरोध मापदण्ड",
+       "blocklist-reason": "कारण",
+       "ipblocklist-submit": "खोजा जाय",
+       "ipblocklist-localblock": "स्थानीय अवरोध",
+       "ipblocklist-otherblocks": "अन्य {{PLURAL:$1|ब्लॉक}}",
+       "infiniteblock": "इनफाईनाईट",
+       "expiringblock": "$1 कय $2 बजे समय खतम होत है",
+       "anononlyblock": "केवल बेनाम सदस्य",
+       "noautoblockblock": "स्वत:ब्लाक निस्क्रिय कै गय",
+       "createaccountblock": "खाता बनावै कय रोक लगाए दिहा गा हैं",
+       "emailblock": "ईमेल अवरोधित",
+       "blocklist-nousertalk": "आपन बातचीत पन्ना भी संपादन नाइ कै सकत हैँ ।",
+       "ipblocklist-empty": "ब्लॉक सूची खाली है।",
+       "ipblocklist-no-results": "पूछल आईपी एड्रेस / सदस्यनाँव पे ब्लॉक नाइ है।",
+       "blocklink": "अवरोधित करा जाय",
+       "unblocklink": "अवरोध हटावा जाय",
+       "change-blocklink": "विभाग बदला जाय",
+       "contribslink": "योगदान",
+       "emaillink": "ईमेल पठवा जाय",
+       "autoblocker": "आपका आइ॰पी पता स्वतः अवरुद्ध है, चूँकि इसे हाल ही में \"[[User:$1|$1]]\" द्वारा प्रयोग किया गया है।\n$1 को अवरोधित करने का कारण है: \"$2\"",
+       "blocklogpage": "ब्लॉक सूची",
+       "blocklog-showlog": "इ सदस्य पहिलँहु ब्लाक कै गा हैं । संदर्भ खत्तीर अभिलेख निचे दिहा है ।",
+       "blocklog-showsuppresslog": "इ सदस्य कय पहिलँहु ब्लाक कै गा है ।दबावल लाग संदर्भ खत्तीर दै गा है ।",
+       "blocklogentry": "\"[[$1]]\" कय $2 $3 तक बदलाव करय से रोक दिहा गा है।",
+       "reblock-logentry": "[[$1]] कय अवरोध जमाव बदलि गय, मियाद अब $2 $3 पे खतम होइ",
+       "blocklogtext": "इ सदस्यन् कय ब्लॉक अव अनब्लॉक करेक काम कय लॉग होय।\nअपने से बाधित होवे वाले IP ठहर इ सूची मा उपलब्ध नाइ है।\nवर्तमान में क्रियाशील प्रतिबंध औ ब्लॉक कय सूची कय लिए [[Special:BlockList|ब्लॉक लॉग]] देखा जाय।",
+       "unblocklogentry": "$1 अनवरोधित",
+       "block-log-flags-anononly": "खाली बेनाम सदस्य",
+       "block-log-flags-nocreate": "खाता बनावै से रोक",
+       "block-log-flags-noautoblock": "ऑटोब्लॉक बंद हैं",
+       "block-log-flags-noemail": "ई-मेल अवरुद्ध",
+       "block-log-flags-nousertalk": "आपन बातचीत पन्ना भी संपादन नाइ कै सकत हैँ ।",
+       "block-log-flags-angry-autoblock": "उन्नत स्व-अवरोध लागू",
+       "block-log-flags-hiddenname": "सदस्य नाँव लुकुआवा है",
+       "range_block_disabled": "प्रबंधकन कय अब रेंज ब्लॉक करेक अनुमति नाइ है।",
+       "ipb_expiry_invalid": "अवैध समाप्ति कालावधी।",
+       "ipb_expiry_temp": "छुपायें हुए सदस्यनाम ब्लॉक्स हमेशा के लिये होने चाहिये।",
+       "ipb_hide_invalid": "इस खाते को छिपा नहीं पाए; इस से {{PLURAL:$1|एक सम्पादन किया गया है|$1 सम्पादन किये गये हैं}}।",
+       "ipb_already_blocked": "\"$1\" पहिलवे से ब्लॉक हैं",
+       "ipb-needreblock": "$1 पहले ही अवरोधित है।\nक्या आप अवरोध के जमाव बदलना चाहेंगे?",
+       "ipb-otherblocks-header": "अउर {{PLURAL:$1|ब्लॉक}}",
+       "unblock-hideuser": "आप इस प्रयोक्ता को अनवरोधित नहीं कर सकते, क्योंकि इनका प्रयोक्तानाम छिपा हुआ है।",
+       "ipb_cant_unblock": "समस्या: ब्लॉक ID $1 मिला नहीं। इसे पहले अनब्लॉक कर दिया गया हो सकता हैं।",
+       "ipb_blocked_as_range": "गलती: $1 यह आइपी सीधे बाधित नहीं है और अबाध्य नहीं किया जा सकता।\nफिर भी, $2 प्रकार को बाध्य किया जा सकता है, जिनको अबाध्य किया जा सकता है।",
+       "ip_range_invalid": "गलत आईपी रेंज",
+       "ip_range_toolarge": "/$1 से अधिक बड़े रेञ्ज ब्लॉकों की अनुमति नहीं है।",
+       "proxyblocker": "प्रॉक्सी ब्लॉकर",
+       "proxyblockreason": "आपका IP पता बाधित किया जा चुका है क्योंकि यह एक मुक्त प्रतिनिधि है।\nकृपया आप अपने इंटरनेट सेवा प्रदान करने वाले से या तकनीकी सहायक से सम्पर्क करें अथवा उन्हें इस भयावह सुरक्षा समस्या के बारे में सूचित करें।",
+       "sorbsreason": "{{SITENAME}} द्वारा इस्तेमालमें लाये जाने वाले DNSBL में आपके आईपी एड्रेसको ओपन प्रॉक्सीमें दर्शाया गया हैं।",
+       "sorbs_create_account_reason": "{{SITENAME}} के DNSBL ने आपका आईपी एड्रेस ओपन प्रोक्सी करके सूचित किया हैं। आप खाता खोल नहीं सकतें।",
+       "cant-see-hidden-user": "जिस सदस्य को आप अवरोधित करने की कोशिश कर रहे हैं उसे पहले ही अवरोधित कर के छुपाया जा चुका है।\nचूँकि आपके पास hideuser अधिकार नहीं है, आप इस सदस्य का अवरोधन ना देख सकते हैं और ना ही सम्पादित कर सकते हैं।",
+       "ipbblocked": "आप अन्य प्रयोक्ताओं को अवरोधित या अनवरोधित नहीं कर सकते, क्योंकि आप स्वयं अवरोधित हैं",
+       "ipbnounblockself": "आपको स्वयं को अनवरोधित करने की अनुमति नहीं है",
+       "lockdb": "डाटाबेस लॉक करा जाय",
+       "unlockdb": "डाटाबेस अनलॉक करा जाय",
+       "lockdbtext": "डेटाबेस में ताला लगाने से सभी सदस्य पृष्ठ संपादन, अपनी वरीयताओं में परिवर्तन, अपनी ध्यानसूची में संपादन, और अन्य चीजें जिनके लिए डेटाबेस में परिवर्तन करना होता है, उनसे वंचित हो जायेंगे।\nकृपया यह सुनिश्चित करे की आप यह करना चाहते हैं, और आप अनुरक्षण के पश्चात ताला खोल देंगे।",
+       "unlockdbtext": "डेटाबेस का ताला खोलने से सभी सदस्य पृष्ठ संपादन, अपनी वरीयताओं में परिवर्तन, अपनी ध्यानसूची में संपादन, और अन्य चीजें जिनके लिए डेटाबेस में परिवर्तन करना होता है, की सक्षमता को पुनर्स्थापित कर लेंगे।\nकृपया यह सुनिश्चित करे की आप यह करना चाहते हैं।",
+       "lockconfirm": "जी हां, मुझे सचमुच डाटाबेस को ताला लगाना हैं।",
+       "unlockconfirm": "जी हां, मुझे सचमुच डाटाबेस का ताला खोलना हैं।",
+       "lockbtn": "डाटाबेस लॉक करा जाय",
+       "unlockbtn": "डाटाबेस अनलॉक करा जाय",
+       "locknoconfirm": "आपने कन्फर्मेशन सन्दूकमें क्लिक नहीं किया हैं।",
+       "lockdbsuccesssub": "डाटाबेस लाक सफल",
+       "unlockdbsuccesssub": "डाटाबेस लाक हटाइ गय",
+       "lockdbsuccesstext": "डाटाबेस को ताला लगाया गया हैं।<br />\nआपके द्वारा मेंटेनन्स पूरा होने के बाद [[Special:UnlockDB|ताला खोलना]] याद रखें।",
+       "unlockdbsuccesstext": "डाटाबेसका ताला खोल दिया गया हैं।",
+       "lockfilenotwritable": "डाटाबेस के लॉक फ़ाईलमें लिख नहीं पा रहें हैं।\nडाटाबेस का ताला लगाने या खोलनेके लिये, इस फ़ाईलपर लिखा जाना जरूरी हैं।",
+       "databasenotlocked": "डाटाबेस को ताला नहीं लगाया गया हैं।",
+       "lockedbyandtime": "(से {{GENDER:$1|$1}} पे $2 यँह $3)",
+       "move-page": "$1 कय घुस्कावा जाय",
+       "move-page-legend": "पन्ना घुसकावा जाय",
+       "movepagetext": "निचे दिहा फारम पन्ना कय नाँव बदल दी अव ओकर इतिहास नँवा नाँव से देखाए लागि ।\nपुरान शिर्षक कय नँवा नाँव मे पुनर्निर्देशन कै जाइ।\nमूल शीर्षक की ओर ले जाने वाले पुनार्निर्देशों को आप स्वचालित रूप से बदल सकते हैं।\nयदि आप ऐसा नहीं करते हैं तो कृपया [[Special:DoubleRedirects|दोहरे पुनर्निर्देशन]] या [[Special:BrokenRedirects|टूटे पुनर्निर्देशन]] के लिए ज़रूर जाँच करें।\nकड़ियाँ सही जगह इंगित करती रहें, यह सुनिश्चित करना आपकी ज़िम्मेदारी है।\n\nअगर नये शीर्षक का लेख पहले से है तो स्थानांतरण '''नहीं''' होगा। पर अगर नये शीर्षक वाला लेख कहीं और अनुप्रेषित करता है और साथ ही उसके पुराने संस्करण नहीं हैं तो स्थानांतरण हो जायेगा।\nइसका मतलब कि यदि आपसे गलती हो जाए तो आप वापस पुराने नाम पर इस पृष्ठ का स्थानांतरण कर सकेंगे, और साथ ही आप किसी मौजूदा पृष्ठ के बदले यह स्थानांतरण नहीं कर सकते हैं।\n\n'''चेतावनी!'''\nयदि पृष्ठ काफ़ी लोकप्रिय है तो उसके लिए यह एक बहुत बड़ा व अकस्मात् परिवर्तन हो सकता है;\nआगे बढ़ने से पहले इसका अंजाम अच्छी तरह समझ लें।",
+       "movepagetext-noredirectfixer": "नीचे दिया हुआ पर्चा पृष्ठ का नाम बदल देगा, उसका सारा इतिहास भी नए नाम से दिखना शुरू हो जाएगा।\nपुराना शीर्षक नये नाम को अनुप्रेषित करेगा ।\nमूल शीर्षक की ओर ले जाने वाले अग्रेषणों को आप स्वचालित रूप से बदल सकते हैं।\nयदि आप ऐसा नहीं करते हैं तो कृपया [[Special:DoubleRedirects|दोहरे]] पुनर्निर्देशण या [[Special:BrokenRedirects|टूटे पुनर्निर्देशन]] के लिए ज़रूर जाँच करें।\nकड़ियाँ सही जगह इंगित करती रहें, यह सुनिश्चित करना आपकी जिम्मेदारी है।\n\nअगर नये शीर्षक का लेख पहले से है तो स्थानांतरण '''नहीं''' होगा। पर अगर नये शीर्षक वाला लेख खाली है अथवा कहीं और अनुप्रेषित करता है और साथ ही उसके पुराने संस्करण नहीं हैं तो स्थानांतरण हो जायेगा ।\nइसका मतलब कि यदि आपसे गलती हो जाए तो आप वापस पुराने नाम पर इस पृष्ठ का स्थानांतरण कर सकेंगे, और साथ ही आप किसी मौजूदा पृष्ठ के बदले यह स्थानांतरण नहीं कर सकते हैं।\n\n'''चेतावनी!'''\nयदि पृष्ठ काफ़ी लोकप्रिय है तो उसके लिए यह एक बहुत बड़ा व अकस्मात् परिवर्तन हो सकता है;\nआगे बढ़ने से पहले इसका अंजाम अच्छी तरह समझ लें।\n\n'''सूचना!'''\nस्थानांतरण करनेसे कोई भी महत्वपूर्ण लेख में अनपेक्षित बदलाव हो सकते है ।\nआपसे अनुरोध है कि आप इसके परिणाम जान लें ।",
+       "movepagetalktext": "संबंधित वार्ता पृष्ठ इसके साथ स्थानांतरीत नहीं होगा '''अगर:'''\n* आप पृष्ठ दुसरे नामस्थान में स्थानांतरीत कर रहें है\n* इस नाम का वार्ता पृष्ठ पहलेसे बना हुवा है, या\n* नीचे दिया हुआ चेक बॉक्स आपने निकाल दिया है ।\n\nइन मामलोंमे आपको स्वयं यह पृष्ठ जोडने पड़ सकते है ।",
+       "movearticle": "पन्ना घुसकावा जाय:",
+       "moveuserpage-warning": "<strong>चेतावनी:</strong> आप एकठु सदस्य पन्ना कय नाँव बदलय जावा जात है।तनि ध्यान दिहा जाय कि खालि पन्ना कय नाँव बदल जाइ औ सदस्यनाँव <em>नाई</em> बदलि।",
+       "movenologintext": "लेख स्थानान्तरित करने के लिये आपका [[Special:UserLogin|लॉग इन]] किया होना आवश्यक हैं।",
+       "movenotallowed": "आप कय इ पन्ना घुस्कावे कय अनुमति नाई है ।",
+       "movenotallowedfile": "आप कय फाइल घुस्कावे कय अनुमति नाई है ।",
+       "cant-move-user-page": "आप कय सदस्य पन्ना घुस्कावे कय अनुमति नाई है (उप-पन्ना बादे) ।",
+       "cant-move-to-user-page": "आप कय कवनो पन्नन कय सदस्य पन्ना पय लैजाएक अनुमति नाइ है (सिवाय सदस्य उप पन्नन कय)",
+       "cant-move-category-page": "आप कय श्रेणी पन्ना घुस्कावे कय अनुमति नाई है ।",
+       "cant-move-to-category-page": "आप कय कवनो पन्ना कय श्रेणी पन्ना पे घुस्कावे कय अनुमति नाई है ।",
+       "newtitle": "नवा शिर्षक पे :",
+       "move-watch": "स्रोत पन्ना अव टार्गेट पन्ना पे ध्यान रक्खा जाय",
+       "movepagebtn": "पन्ना घुसकावा जाय",
+       "pagemovedsub": "पन्ना घुस्काइ गय",
+       "movepage-moved": "<strong>\"$1\" कय \"$2\" पे घुस्काइ गय</strong>",
+       "movepage-moved-redirect": "एक्ठु पुनर्निर्देशन बनाइ गय।",
+       "movepage-moved-noredirect": "पुनर्निर्देशन निर्माण दबाइ गय",
+       "articleexists": "इ नाँव कय पन्ना पहिल्वे से मौजुद है या तव आप कवनो गलत नावँ चुना गा है। कवनो दुसर नाँव चुना जाय",
+       "cantmove-titleprotected": "नँवा पन्ना बनावै से रोक होएक नाते आप कय इ जगही कवनो दुसर पन्ना घुस्कावै कय अनुमति नाइ है ।",
+       "movetalk": "सम्बंधित बातचित पन्ना घुस्कावा जाय",
+       "move-subpages": "उप पन्ना घुस्कावा जाय ($1 तक)",
+       "move-talk-subpages": "बातचीत पन्ना कय उप पन्ना भी लई जावा जाय ($1 तक)",
+       "movepage-page-exists": "$1 पन्ना पहिलवे से है अव आप ओहपर फिरसे नाइ लिखि सका जात है ।",
+       "movepage-page-moved": "पन्ना $1 कय $2 पे घुस्काइ गय ।",
+       "movepage-page-unmoved": "पन्ना $1 कय $2 पे नाइ घुस्काइ सका जात है ।",
+       "movepage-max-pages": "$1 की अधिकतम सीमा तक पृष्ठ स्थानांतरित कर {{PLURAL:$1|दिया गया है|दिये गये हैं}}, अब और पृष्ठ अपने-आप स्थानांतरित नहीं होंगे।",
+       "movelogpage": "घुस्कावे कय ल़ाग",
+       "movelogpagetext": "निचे घुस्कावल पन्नन् कय सुची हय",
+       "movesubpage": "{{PLURAL:$1|उप-पन्ना}}",
+       "movesubpagetext": "नीचे $1 {{PLURAL:$1|पृष्ठ दिखाया गया है, जो इस पृष्ठ का उप पृष्ठ है|पृष्ठ दिखाया गया है, जो इस पृष्ठ के उप पृष्ठ हैं}}।",
+       "movenosubpage": "इ पन्ना कय कवनो उप-पन्ना नाइ है ।",
+       "movereason": "कारण:",
+       "revertmove": "पहिले जैसन करा जाय",
+       "delete_and_move": "मिटावा जाय अव घुस्कावा जाय",
+       "delete_and_move_text": "==हटावै कय ज़रूरत==\nलक्ष्य पन्ना \"[[:$1]]\" पहिलवे से मौजूद है।\nनाव बदलय खत्तीर का आप एका हटावै चाहा जात है?",
+       "delete_and_move_confirm": "हाँ,पन्ना कय मिटावा जाय",
+       "delete_and_move_reason": "\"[[$1]]\" से घुस्कावै खत्तीर जगह बनाई गा है",
+       "selfmove": "स्रोत अव गन्तव्य पन्ना कय एक्कय शिर्षक है ;पन्ना कय उहिक उप्पर नाइ घुस्काय सका जात है ।",
+       "immobile-source-namespace": "नामस्थान \"$1\" पे पन्ना नाइ घुस्काय सका जात है",
+       "immobile-target-namespace": "नामस्थान \"$1\" कय भित्तर पन्ना नाइ घुस्काय सका जात है",
+       "immobile-target-namespace-iw": "अंतर विकि कड़ी पन्ना लई जाय खत्तीर उचित लक्ष्य नाइ है।",
+       "immobile-source-page": "ई पन्ना नाइ घुस्की ।",
+       "immobile-target-page": "इ गन्तव्य शिर्षक पय नाइ लैजाय सका जात अहै ।",
+       "imagenocrossnamespace": "फाइल कय बिना-फाइल नेमस्पेस मा नाइ घुस्काय सका जात है",
+       "nonfile-cannot-move-to-file": "बिना-फाइल कय फाइल नेमस्पेस मा नाइ घुस्काय सका जात है ।",
+       "imagetypemismatch": "नँवा फाइल एक्सटेन्सन फाइल कय प्रकार से मेल नाइ खात है",
+       "imageinvalidfilename": "लक्ष्यित फाइल नाँव अवैध है",
+       "fix-double-redirects": "मूल शीर्षक तक जाने वाले सभी पुनर्निर्देशनों को भी बदलें",
+       "move-leave-redirect": "पिछे एक्ठु पुनर्निर्देशन छोडा जाय",
+       "protectedpagemovewarning": "'''चेतावनी: इ पन्ना कय सुरक्षित कई  गा है अव एका खालि प्रबंधक घुस्काय सकत हँय।'''\nनँवा लॉग प्रविष्टि संदर्भ कय लिये नीचे दीहा है:",
+       "semiprotectedpagemovewarning": "'''सूचना:''' इ पन्ना सुरक्षित करा है औ खाली पंजीकृत सदस्य एका घुस्काय सकत हैं।\nनँवा लॉग प्रविष्टि संदर्भ खत्तीर नीचे दीहा है:",
+       "move-over-sharedrepo": "== फ़ाइल मौजूद है ==\n[[:$1]] एकठु साझा भंडार पय मौजूद है। इ नाँव पय घुस्कावै से नँवा फ़ाइल साझा फ़ाइल कय ओवरराइड करी।",
+       "file-exists-sharedrepo": "चुनल फाइल नाँव पहिलेवे एकठु साझा भण्डार में प्रयुक्त है।\nकृपया दुसर नाव चुना जाय।",
+       "export": "पन्ना निर्यात करा जाय",
+       "exporttext": "आप विशिष्ठ पृष्ठ के विषय वस्तु और संपादन इतिहास को निर्यात कर सकते हैं अथवा पृष्ठों के समूह को कुछ XML में लपेट सकते हैं।\nयह [[Special:Import|आयात पृष्ठ]] की सहायता से मीडियाविकी का प्रयोग करके दूसरी विकी से आयात किया जा सकता है।\n\nपृष्ठों को निर्यात करने के लिए, नीचे विषय वस्तु संदूक में शीर्षक प्रवेश करें, एक शीर्षक प्रति पंक्ति, और चुने कि आप वर्त्तमान अवतरण के साथ पुराने अवतरण भी चाहते हैं कि नहीं, या पिछले संपादन के बारे में जानकारी के साथ केवल वर्त्तमान अवतरण चाहते हैं।\n\nबाद वाली स्थिति के लिए आप एक सम्पर्क भी प्रयोग कर सकते हैं, उदाहरण के लिए, \"[[{{MediaWiki:Mainpage}}]]\" पृष्ठ के लिए [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]]।",
+       "exportall": "कुल पन्ना निर्यात करा जाय",
+       "exportcuronly": "पुरा इतिहास नाइ चाहि,खाली नँवा अवतरण करा जाय",
+       "exportnohistory": "----\n'''सूचना:''' इस फॉर्म का इस्तेमाल कर पृष्ठका पूरा इतिहास निर्यात करना परफॉर्मेन्स के चलते रोक दिया गया हैं।",
+       "exportlistauthors": "प्रत्येक पृष्ठ के लिए योगदानकर्ताओं की एक पूरी सूची शामिल करें ।",
+       "export-submit": "निर्यात",
+       "export-addcattext": "श्रेणी से पन्ना डारा जाय :",
+       "export-addcat": "जोडव",
+       "export-addnstext": "नामस्थान से पन्ना डारा जाय :",
+       "export-addns": "जोडा जाय",
+       "export-download": "फ़ाइल रुप में सहेजा जाय",
+       "export-templates": "टेम्प्लेटस भी जोडा जाय",
+       "export-pagelinks": "जिन पन्नों के हवाले यहाँ हैं, उन्हें भी इस गहराई तक शामिल करें:",
+       "allmessages": "व्यवस्था संदेश",
+       "allmessagesname": "नाँव",
+       "allmessagesdefault": "सनेशा कय डिफ़ॉल्ट पाठ",
+       "allmessagescurrent": "वर्तमान पाठ",
+       "allmessagestext": "ये मीडियाविकि नामस्थान में उपलब्ध प्रणाली संदेशों की एक सूची है। यदि आप सामान्य मीडियाविकि क्षेत्रीयकरण में योगदान देना चाहें तो कृपया [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation मीडियाविकि क्षेत्रीयकरण] व [//translatewiki.net translatewiki.net] को देखें।",
+       "allmessagesnotsupportedDB": "इस पृष्ठ का इस्तेमाल नहीं कर सकते क्योंकी '''$wgUseDatabaseMessages''' बंद हैं।",
+       "allmessages-filter-legend": "फिल्टर",
+       "allmessages-filter": "अनुकूलन स्थिति कय आधार पे छाना जाय:",
+       "allmessages-filter-unmodified": "अपरिवर्तित",
+       "allmessages-filter-all": "कुल",
+       "allmessages-filter-modified": "परिवर्तित",
+       "allmessages-prefix": "उपसर्ग कय आधार पे छाना जाय:",
+       "allmessages-language": "भाषा:",
+       "allmessages-filter-submit": "जावा जाय",
+       "allmessages-filter-translate": "अनुवाद करा जाय",
+       "thumbnail-more": "बड़ा करा जाय",
+       "filemissing": "फाईल गायब",
+       "thumbnail_error": "थम्बनेल(thumbnail) बनावै में त्रुटि: $1",
+       "thumbnail_error_remote": "$1 से त्रुटि सन्देश: $2",
+       "djvu_page_error": "DjVu पन्ना रेंज कय बहरे है",
+       "djvu_no_xml": "DjVu फ़ाईल कय खत्तीर XML नाइ मिला",
+       "thumbnail-temp-create": "अस्थायी थम्बनेल फ़ाइल बनावै में असफल",
+       "thumbnail_invalid_params": "अमान्य थम्बनेल पैरामीटर",
+       "thumbnail_toobigimagearea": "$1 से बडा फाइल",
+       "thumbnail_dest_directory": "गन्तव्य निर्देशिका बनावै में असमर्थ",
+       "thumbnail_image-type": "चित्र कय प्रकार समर्थित नाइ है",
+       "thumbnail_gd-library": "अवैध जीडी लाइब्रेरी जमाव: कार्यसमूह $1 मौजूद नहीं है",
+       "thumbnail_image-missing": "लागत है फाइल नामौजूद है: $1",
+       "import": "पन्ना आयात करा जाय",
+       "importinterwiki": "ट्रान्सविकि आयात",
+       "import-interwiki-text": "आयात करने के लिये एक विकि और एक पृष्ठ चुनें।\nअवतरण दिनांक और संपादक नाम ज्यों-के-त्यों रखे जाएँगे।\nसभी ट्रान्सविकि आयात क्रियाएँ [[Special:Log/import|आयात लॉग]] में डाली जाती हैं।",
+       "import-interwiki-sourcewiki": "स्रोत विकि:",
+       "import-interwiki-sourcepage": "स्रोत पन्ना:",
+       "import-interwiki-history": "इस पृष्ठ के सभी इतिहास अवतरण कॉपी करें",
+       "import-interwiki-templates": "कुल साँचा शामिल करा जाय",
+       "import-interwiki-submit": "आयात",
+       "import-interwiki-namespace": "गंतव्य नामस्थान:",
+       "import-interwiki-rootpage": "गंतव्य पृष्ठ उपसर्ग (वैकल्पिक):",
+       "import-upload-filename": "फ़ाइल कय नाँव",
+       "import-comment": "टिप्पणी:",
+       "importtext": "कृपया स्रोत विकि से संचिका निर्यातित करने के लिए [[Special:Export|निर्यात सुविधा]] का इस्तेमाल करें।\nइसे अपने संगणक पर सँजो के यहाँ चढ़ा दें।",
+       "importstart": "पन्ना आयात होत है...",
+       "import-revision-count": "$1 {{PLURAL:$1|अवतरण}}",
+       "importnopages": "आयात करेक कवनो पन्ना नाइ है ।",
+       "imported-log-entries": "आयातित $1 {{PLURAL:$1|लॉग प्रविष्टि|लॉग प्रविष्टियाँ}}.\nजब कभी कोई फाइल आपको import करनी हो",
+       "importfailed": "आयात विफल होइ गवा: <nowiki>$1</nowiki>",
+       "importunknownsource": "अज्ञात आयात स्रोत प्रकार",
+       "importcantopen": "आयात फ़ाइल खोल नाई खुला।",
+       "importbadinterwiki": "अवैध अन्तरविकि कड़ी",
+       "importsuccess": "आयात सफल होइ गवा!",
+       "importnosources": "कोई भी ट्रान्सविकी आयात स्रोत मिले नहीं और प्रत्यक्ष इतिहास अपलोड बन्द कर दिए गए हैं।",
+       "importnofile": "कवनो आयात फाइल नाइ अपलोड करा रहा ।",
+       "importuploaderrorsize": "आयात फ़ाईल अपलोड हुई नहीं। इसका आकार अनुमतिसे ज्यादा हैं।",
+       "importuploaderrorpartial": "आयात फ़ाईल अपलोड हुई नहीं। फ़ाईल आधी अधूरी अपलोड हुई।",
+       "importuploaderrortemp": "आयात फ़ाईल अपलोड हुई नहीं। एक अस्थायी डाइरेक्टरी नहीं मिल रहीं।",
+       "import-parse-failure": "XML आयात पार्स असफल",
+       "import-noarticle": "आयात करेक कवनो पन्ना नाइ है !",
+       "import-nonewrevisions": "कोई अवतरण आयात नहीं किये गये (या तो सभी अवतरण पहले से मौजूद हैं, या त्रुटियों के कारण छोड़े गये)।",
+       "xml-error-string": "$1 पंक्ति $2 मा, कॉलम $3 (बाईट $4): $5",
+       "import-upload": "XML डाटा अपलोड कीन जाय",
+       "import-token-mismatch": "सत्र सामग्री खो गई है। \nकृपया पुनः प्रयास करें।",
+       "import-invalid-interwiki": "इ विकि से आयात नाइ होइ सकत है।",
+       "import-options-wrong": "गलत {{PLURAL:$2|विकल्प}}: <nowiki>$1</nowiki>",
+       "import-rootpage-invalid": "दिहल उपसर्ग पन्ना शीर्षक अमान्य है।",
+       "import-rootpage-nosubpage": "दिए गए उपसर्ग पृष्ठ \"$1\" के नामस्थान में उप-पृष्ठ नहीं बनाए जा सकते।",
+       "importlogpage": "आयात सूची",
+       "importlogpagetext": "अन्य विकियों से प्रबन्धकों द्वारा किए गए सम्पादन इतिहास के साथ होने वाले पृष्ठों का आयात।",
+       "import-logentry-upload": "सञ्चिका अपलोड करके [[$1]] का आयात किया",
+       "import-logentry-interwiki": " $1 कय अन्तरविकिकरण कई गय",
+       "javascripttest": "जावास्क्रिप्ट परीक्षण",
+       "javascripttest-pagetext-unknownframework": "अज्ञात परीक्षण ढाँचा \"$1\"",
+       "javascripttest-pagetext-unknownaction": "अज्ञात काम \"$1\".",
+       "javascripttest-pagetext-frameworks": "कृपया निम्न परीक्षण ढाँचों में से एक चुनें: $1",
+       "javascripttest-pagetext-skins": "परीक्षण करने के लिए त्वचा चुनें:",
+       "javascripttest-qunit-intro": "mediawiki.org पे [$1 परीक्षण कय प्रलेखन] देखा जाय।",
+       "tooltip-pt-userpage": "आप कय सदस्य पन्ना",
+       "tooltip-pt-anonuserpage": "आप जिस आईपी से बदलाव कर रहें हैं उसका सदस्य पन्ना निचे है",
+       "tooltip-pt-mytalk": "आप कय बातचित पन्ना",
+       "tooltip-pt-anontalk": "इस आईपी एड्रेससे हुए बदलावों के बारे में वार्ता",
+       "tooltip-pt-preferences": "आप कय पसंद",
+       "tooltip-pt-watchlist": "आप कय ध्यान दिहल पन्नन कय सूची",
+       "tooltip-pt-mycontris": "आप कय योगदान कय सुची",
+       "tooltip-pt-login": "आप कय खाता प्रवेश खत्तिर प्रोत्साहित कै जात है, लेकिन ई अनिवार्य नाई है",
+       "tooltip-pt-logout": "बहरे निकरा जाय",
+       "tooltip-ca-talk": "सामग्री पन्ना कय बारे में बात-चीत",
+       "tooltip-ca-edit": "आप ई पन्ना कय सम्पादन कै सका जात है। कृपया पन्ना सुरक्षित करय से पहिले पूर्वावलोकन बटन कय इस्तेमाल करा जाय।",
+       "tooltip-ca-addsection": "एक्ठु नँवा खण्ड शुरु करा जाय",
+       "tooltip-ca-viewsource": "इ पन्ना सुरक्षित है । आप एकर स्रोत देख सका जात है ।",
+       "tooltip-ca-history": "ई पन्ना कय पिछला संशोधन",
+       "tooltip-ca-protect": "इ पन्ना कय सुरक्षित करा जाय",
+       "tooltip-ca-unprotect": "ई पन्ना कय सुरक्षा स्तर बदला जाय",
+       "tooltip-ca-delete": "ई पन्ना मेटावा जाय",
+       "tooltip-ca-move": "ई पन्ना कय नाँव बदला जाय",
+       "tooltip-ca-watch": "इ पन्ना कय अपने ध्यानसूची में डारा जाय",
+       "tooltip-ca-unwatch": "इ पन्ना कय अपने ध्यानसूची से हटावा जाय",
+       "tooltip-search": "{{SITENAME}} में खोजा जाय",
+       "tooltip-search-go": "यदि पन्ना मौजूद होई तव उ पन्ना पे चला जाय",
+       "tooltip-search-fulltext": "ई पाठ्य खत्तिर पन्ना खोजा जाय",
+       "tooltip-p-logo": "प्रधान पन्ना",
+       "tooltip-n-mainpage": "प्रधान पन्ना पे जावा जाय",
+       "tooltip-n-mainpage-description": "प्रधान पन्ना पे जावा जाय",
+       "tooltip-n-portal": "परियोजना कय बारे मेँ, आप का कई सका जात अहै, मदद कँहा से लेब",
+       "tooltip-n-currentevents": "हालिए कय घटना कय जमिनी जानकारी लिहा जाय",
+       "tooltip-n-recentchanges": "विकि पे तुरंतय करल बदलाव कय सूची",
+       "tooltip-n-randompage": "कवनो एक पन्ना खोला जाय",
+       "tooltip-n-help": "पता लगावेक जगह",
+       "tooltip-t-whatlinkshere": "हिँया लिंक होवे वाले कुल विकि पन्नन् कय सूची",
+       "tooltip-t-recentchangeslinked": "ई पन्ना से जोडान पन्नवन पे तुरंत करल बदलाव",
+       "tooltip-feed-rss": "इ पन्ना कय आरएसएस फ़ीड",
+       "tooltip-feed-atom": "ई पन्ना कय Atom फ़ीड",
+       "tooltip-t-contributions": "इ सदस्य कय योगदान कय सुची देखा जाय",
+       "tooltip-t-emailuser": "इ सदस्य कय इमेल पठवा जाय",
+       "tooltip-t-info": "इ पन्ना कय बारे मे ढेर जानकारी",
+       "tooltip-t-upload": "फ़ाइल अपलोड करा जाय",
+       "tooltip-t-specialpages": "कुल विशेष पन्नन कय सूची",
+       "tooltip-t-print": "ई पन्ना कय छापय लायक संस्करण",
+       "tooltip-t-permalink": "ई पन्ना कय संसोधन खत्तिर स्थायी लिंक",
+       "tooltip-ca-nstab-main": "सामग्री वाला पन्ना देखा जाय",
+       "tooltip-ca-nstab-user": "सदस्य पन्ना देखा जाय",
+       "tooltip-ca-nstab-media": "मीडिया पन्ना देखा जाय",
+       "tooltip-ca-nstab-special": "इ एक्ठु खास पन्ना होय ,एका आप नाइ बदलि सका जात है",
+       "tooltip-ca-nstab-project": "प्रोजेक्ट पन्ना देखा जाय",
+       "tooltip-ca-nstab-image": "फ़ाइल कय पन्ना देखा जाय",
+       "tooltip-ca-nstab-mediawiki": "प्रणाली सन्देश देखा जाय",
+       "tooltip-ca-nstab-template": "टेम्प्लेट देखा जाय",
+       "tooltip-ca-nstab-help": "सहायता पन्ना पे जावा जाय",
+       "tooltip-ca-nstab-category": "श्रेणी पन्ना  देखा जाय",
+       "tooltip-minoredit": "एहपे छोट संपादन कय चिन्हा लगावा जाय",
+       "tooltip-save": "आपन बदलाव सहेजा जाय",
+       "tooltip-preview": "आप कय करल बदलाव कय झलक देखा जाय, सहेजय से पहिले एकर इस्तेमाल करा जाय!",
+       "tooltip-diff": "इ पाठ मे आप कय करल बदलाव देखा जाय",
+       "tooltip-compareselectedversions": "इ पन्ना कय चुनल अवतरणन् में अन्तर देखा जाय।",
+       "tooltip-watch": "इ पन्ना कय अपने ध्यानसूची में डारा जाय",
+       "tooltip-watchlistedit-normal-submit": "पन्ना हटावा जाय",
+       "tooltip-watchlistedit-raw-submit": "ध्यानसूची अपडेट करा जाय",
+       "tooltip-recreate": "यह पृष्ठ पहले हटाया होने के बावजूद फिरसे बनायें",
+       "tooltip-upload": "अपलोड शुरू करा जाय",
+       "tooltip-rollback": "\"वापिस लीं\" ई पन्ना के पिछ्ला योगदाता के बदलाव एकही चटके मे गायब कर देवेला",
+       "tooltip-undo": "\"पुरानी स्थिति पर लाएँ\" इस बदलाव को वापस ले जा के संपादन पर्चे को झलक रीति में दिखलाता है।\nइसके जरिए सारांश में पुरानी स्थिति में लाने का कारण लिखा जा सकता है।",
+       "tooltip-preferences-save": "पसंद सहेजा जाय",
+       "tooltip-summary": "छोट सारांश लिखा जाय",
+       "anonymous": "{{SITENAME}} कय {{PLURAL:$1||}} बेनामी सदस्य",
+       "siteuser": "विकिपीडिया सदस्य  $1",
+       "anonuser": "{{SITENAME}} अज्ञात उपयोगकर्ता $1",
+       "lastmodifiedatby": "इ पन्ना कय अन्तिम बदलाव $2, $1 पे $3 करें रहें।",
+       "othercontribs": "$1 कय काम कय अनुसार।",
+       "others": "अउर",
+       "siteusers": "{{SITENAME}} {{PLURAL:$2|सदस्य|सदस्य}} $1",
+       "anonusers": "{{SITENAME}} अनाम {{PLURAL:$2|सदस्य|सदस्य}} $1",
+       "creditspage": "पन्ना श्रेय नामावली",
+       "nocredits": "इस पृष्ठ के लिये क्रेडिट जानकारी नहीं है।",
+       "spamprotectiontitle": "स्पॅम सुरक्षा फिल्टर",
+       "spamprotectiontext": "आप जिस पृष्ठ को सँजोना चाहते थे उसे रद्दी सामग्री की छननी ने अवरोधित किया हुआ है।\nयह संभवतः किसी कर्पसूचित बाहरी स्थल की कड़ी की वजह से हुआ है।",
+       "spamprotectionmatch": "नीचे दिये हुए पाठ को स्पॅम सुरक्षा फिल्टर द्वारा रोका गया था: $1",
+       "spambot_username": "मीडियाविकि स्पॅम स्वच्छता",
+       "spam_reverting": "$1 को कड़ी ना होने वाले पुराने अवतरण को पुनर्स्थापित कर रहें हैं",
+       "spam_blanking": "सभी अवतरणोंमें $1 को कड़ियां हैं, पूरा पाठ निकाल रहें हैं",
+       "spam_deleting": "सभी अवतरणों में $1 की कड़ी थी, हटाया जा रहा है",
+       "simpleantispam-label": "ऐन्टी-स्पैम जाँच।\nइसे <strong>नहीं</strong> भरें!",
+       "pageinfo-title": "\"$1\" कय जानकारी",
+       "pageinfo-not-current": "क्षमा करें, पुराने अवतरणों के लिए यह जानकारी प्रदान करना संभव नहीं है।",
+       "pageinfo-header-basic": "मूल जानकारी",
+       "pageinfo-header-edits": "सम्पादन इतिहास",
+       "pageinfo-header-restrictions": "पन्ना सुरक्षा",
+       "pageinfo-header-properties": "पन्ना जानकारी",
+       "pageinfo-display-title": "प्रदर्शन शिर्षक",
+       "pageinfo-default-sort": "डिफ़ॉल्ट सॉर्ट की",
+       "pageinfo-length": "पन्ना आकार (बाइट्स में)",
+       "pageinfo-article-id": "पन्ना आइ॰डी",
+       "pageinfo-language": "पन्ना सामग्री भाषा",
+       "pageinfo-content-model": "पन्ना सामग्री नमुना",
+       "pageinfo-robot-policy": "सर्च इंजन बॉट से अनुक्रमण",
+       "pageinfo-robot-index": "अनुमतित",
+       "pageinfo-robot-noindex": "अनुमतित नाइ है",
+       "pageinfo-watchers": "पन्ना पे नजर राखय वालें कय गिन्ती",
+       "pageinfo-few-watchers": "$1 से कम ध्यान देवै {{PLURAL:$1|वाला|वाले}}",
+       "pageinfo-redirects-name": "इ पन्ना पे कुल पुनर्निर्देश कय गिन्ती",
+       "pageinfo-subpages-name": "इ पन्ना कय उपपन्ना",
+       "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|पुनर्निर्देश}}; $3 {{PLURAL:$3|ग़ैर-पुनर्निर्देश}})",
+       "pageinfo-firstuser": "पन्ना बनावै वालें",
+       "pageinfo-firsttime": "पन्ना बनावै कय तिथि",
+       "pageinfo-lastuser": "सबसे नँवा संपादक",
+       "pageinfo-lasttime": "सबसे नँवा संपादन कय तिथि",
+       "pageinfo-edits": "कुल सम्पादन गिन्ती",
+       "pageinfo-authors": "लेखकन् कय गिन्ती",
+       "pageinfo-recent-edits": "हालिए कय सम्पादन कय गिन्ती (पिछ्ला $1 में)",
+       "pageinfo-recent-authors": "हालिए कय लेखकन् कय गिन्ती",
+       "pageinfo-magic-words": "जादुई {{PLURAL:$1|शब्द}} ($1)",
+       "pageinfo-hidden-categories": "लुकुआवल {{PLURAL:$1|श्रेणी}} ($1)",
+       "pageinfo-templates": "प्रयुक्त {{PLURAL:$1|साँचा}} ($1)",
+       "pageinfo-transclusions": "$1 {{PLURAL:$1|पन्ना|पन्नन्}} पे ट्रांस्कलूडिड",
+       "pageinfo-toolboxlink": "पन्ना कय जानकारी",
+       "pageinfo-redirectsto": "पुनर्निर्देशन लक्ष्य",
+       "pageinfo-redirectsto-info": "जानकारी",
+       "pageinfo-contentpage": "सामग्री पन्नन मा गिन जात अहै",
+       "pageinfo-contentpage-yes": "हाँ",
+       "pageinfo-protect-cascading-yes": "हाँ",
+       "pageinfo-category-info": "श्रेणी जानकारी",
+       "pageinfo-category-pages": "पन्नन कय सङ्ख्या",
+       "pageinfo-category-subcats": "उपश्रेणिन कय गिन्ती",
+       "pageinfo-category-files": "फाइल कय गिन्ती",
+       "markaspatrolleddiff": "जाँचल चिन्हीत करा जाय",
+       "markaspatrolledtext": "इ पन्ना कय जाँचल चिन्हीत करा जाय",
+       "markedaspatrolled": "जाँचल चिन्हीत करा जाय",
+       "markedaspatrolledtext": "[[:$1]] कय चयनित अवतरण जाँचल चिन्हित कै गय।",
+       "rcpatroldisabled": "नँवा बदलाव कय परीक्षण अक्षम है",
+       "rcpatroldisabledtext": "हाल में हुए बदलावों के परीक्षण की सुविधा अभी अक्षम है।",
+       "markedaspatrollederror": "जाँचल चिन्हित नाइ कै मिला",
+       "markedaspatrollederrortext": "जाँचा हुआ चिन्हित करने के लिये आपको एक अवतरण चुनना होगा।",
+       "markedaspatrollederror-noautopatrol": "आपको अपने बदलाव परीक्षित करने की अनुमति नहीं है।",
+       "markedaspatrollednotify": "$1 पृष्ठ में किया गया ये बदलाव जाँचा हुआ चिन्हित कर दिया गया है।",
+       "markedaspatrollederrornotify": "जाँचा हुआ चिन्हित करना असफल रहा।",
+       "patrol-log-page": "परीक्षण लॉग",
+       "patrol-log-header": "यह परीक्षित अवतरणों की लॉग है।",
+       "log-show-hide-patrol": "परीक्षण लॉग $1",
+       "deletedrevision": "पुरान अवतरण $1 हटाय दिहा गा है",
+       "filedeleteerror-short": "फ़ाईल हटावै मा समस्या: $1",
+       "filedeleteerror-long": "फ़ाइल हटावै में आवा गल्ती:\n\n$1",
+       "filedelete-missing": "फ़ाईल \"$1\" कय नाइ हटाई सका जात है, काहे से इ अस्तित्व मा नाइ है।",
+       "filedelete-old-unregistered": "बतावल \"$1\" अवतरण डाटाबेस मा नाइ मिला ।",
+       "filedelete-current-unregistered": "बतावल \"$1\" फाइल डाटाबेस मा नाइ मिला ।",
+       "filedelete-archive-read-only": "अभिलेख डाइरेक्टरी \"$1\" पे वेबसर्वर लिख नाइ पावत है।",
+       "previousdiff": "← पुरान सम्पादन",
+       "nextdiff": "ताज़ा संपादन →",
+       "mediawarning": "<strong>चेतावनी:</strong> इ फ़ाइल प्रकार मा हानिकारक कोड होइ सकत है।\nसंभव है कि एका चलावै से आप कय सिस्टम हैक होइ जाइ।",
+       "imagemaxsize": "तस्विर आकार सिमा:<br />''(फाइल जानकारी पन्ना खत्तीर )''",
+       "thumbsize": "थम्बनेल आकार:",
+       "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|पन्ना|पन्ना}}",
+       "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": " उच्च गुणवत्ता रिजोलुशन उपलब्ध नाइ है।",
+       "svg-long-desc": "SVG फ़ाईल, साधारणत: $1 × $2 पीक्सेल्स, फ़ाईल कय आकार: $3",
+       "svg-long-desc-animated": "ऐनिमेटिड एस॰वी॰जी फ़ाइल, $1 × $2 पिक्सेल, फ़ाइल साइज़: $3",
+       "svg-long-error": "अमान्य एस॰वी॰जी फ़ाइल: $1",
+       "show-big-image": "मूल फ़ाइल",
+       "show-big-image-preview": "इ पूर्वावलोकन कय आकार:  $1 ।",
+       "show-big-image-other": "अउर  {{PLURAL:$2| resolution|resolutions}}:  $1 ।",
+       "show-big-image-size": "$1 × $2  पिक्सेल",
+       "file-info-gif-looped": "चक्रित",
+       "file-info-gif-frames": "$1 {{PLURAL:$1|फ्रेम}}",
+       "file-info-png-looped": "चक्रित",
+       "file-info-png-repeat": "$1 {{PLURAL:$1|दाइ}} प्ले होइ चुका है",
+       "file-info-png-frames": "$1 {{PLURAL:$1|फ्रेम}}",
+       "newimages": "नँवा फ़ाईल्स कय गैलरी",
+       "newimages-legend": "छनना",
+       "newimages-label": "फाइल नाँव (या ओकर अंश):",
+       "newimages-showbots": "बाट कय अपलोड देखावा जाय",
+       "noimages": "देखेक खत्तीर कुछ नाइ है",
+       "ilsubmit": "खोजा जाय",
+       "bydate": "मिती कय अनुसार",
+       "sp-newimages-showfrom": "$2, $1 कय बाद कय फ़ाईलें देखावा जाय",
+       "seconds": "{{PLURAL:$1|$1 सेकेन्ड}}",
+       "minutes": "{{PLURAL:$1|$1 मिनेट}}",
+       "hours": "{{PLURAL:$1|$1 घण्टा|$1 घण्टा}}",
+       "days": "{{PLURAL:$1|$1 दिन|$1 दिन}}",
+       "weeks": "{{PLURAL:$1|$1 सप्ताह}}",
+       "months": "{{PLURAL:$1|महीन्ना}}",
+       "years": "{{PLURAL:$1|$1 साल}}",
+       "ago": "$1 पहिले",
+       "just-now": "अबहिनै",
+       "hours-ago": "$1 {{PLURAL:$1|घंटा}} पहिले",
+       "minutes-ago": "$1 {{PLURAL:$1|मिनट}} पहीले",
+       "seconds-ago": "$1 {{PLURAL:$1|सॅकेंड}} पहीले",
+       "monday-at": "सोम कय $1",
+       "tuesday-at": "मङ्ङर कय $1",
+       "wednesday-at": "बुध कय $1",
+       "thursday-at": "बीफए कय $1",
+       "friday-at": "शुक्क कय $1",
+       "saturday-at": "शनीच्चर कय $1",
+       "sunday-at": "अत्तवार कय $1",
+       "yesterday-at": "कल्हीँया",
+       "metadata": "मेटाडाटा",
+       "metadata-expand": "अउर विवरण देखावा जाय",
+       "metadata-collapse": "अउर विवरण लुकुआवा जाय",
+       "metadata-fields": "Image metadata fields listed in this message will be included on image page display when the metadata table is collapsed.\nOthers will be hidden by default.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
+       "exif-imagewidth": "चौडाई",
+       "exif-imagelength": "उचाई",
+       "exif-bitspersample": "प्रति घटक बीट्स",
+       "exif-compression": "कम्प्रेशन योजना",
+       "exif-photometricinterpretation": "पिक्सल रचना",
+       "exif-orientation": "अभिविन्यास",
+       "exif-samplesperpixel": "घटक कय संख्या",
+       "exif-planarconfiguration": "डाटा रचना",
+       "exif-ycbcrsubsampling": "Y कय C कय साथे सबसॅम्पलींग अनुमान",
+       "exif-ycbcrpositioning": "Y अव C व्यवस्थापन",
+       "exif-xresolution": "होरिज़ॉंटल रिज़ोल्यूशन",
+       "exif-yresolution": "व्हर्टिकल रिज़ोल्यूशन",
+       "exif-stripoffsets": "चित्र डाटा स्थान",
+       "exif-rowsperstrip": "हर स्ट्रीप मा कतार कय गिन्ती",
+       "exif-stripbytecounts": "कॉम्प्रेस्स्ड स्ट्रीपमें बाईट्स",
+       "exif-jpeginterchangeformat": "अफसेट से JPEG SOI",
+       "exif-jpeginterchangeformatlength": "JPEG डेटा कय बाइट",
+       "exif-whitepoint": "उज्जर बिंदू क्रोमॅटिसिटी",
+       "exif-primarychromaticities": "क्रोमॅटिसिटीज ऑफ प्राईमारिटीज",
+       "exif-ycbcrcoefficients": "कलर स्पेस ट्रान्स्फॉर्मेशन मॅट्रीक्स कोएफिशीयंट्स",
+       "exif-referenceblackwhite": "करीया औ उज्जर संदर्भ मूल्यन कय जोड़ी",
+       "exif-datetime": "फ़ाईल बदलाव दिनांक औ समय",
+       "exif-imagedescription": "चित्र शिर्षक",
+       "exif-make": "क्यामेरा निर्माता",
+       "exif-model": "क्यामरा मोडल",
+       "exif-software": "इस्तेमाल करल सॉफ्टवेयर",
+       "exif-artist": "लेखक",
+       "exif-copyright": "कपीराइट धारक",
+       "exif-exifversion": "Exif संस्करण",
+       "exif-flashpixversion": "सपोर्टेड फ्लॅशपीक्स अवतरण",
+       "exif-colorspace": "रंग स्थान",
+       "exif-componentsconfiguration": "हर घटक कय मतलब",
+       "exif-compressedbitsperpixel": "चित्र कॉम्प्रेशन मोड",
+       "exif-pixelydimension": "छवि चौड़ाई",
+       "exif-pixelxdimension": "छवि ऊँचाई",
+       "exif-usercomment": "सदस्य टिप्पणी",
+       "exif-relatedsoundfile": "संबंधित ध्वनी फ़ाईल",
+       "exif-datetimeoriginal": "डेटा सञ्चालन कय मिति अव समय",
+       "exif-datetimedigitized": "डिजिटाईज़िंग कय दिनांक औ समय",
+       "exif-subsectime": "दिनांकसमय उपसेकंद",
+       "exif-subsectimeoriginal": "मूलदिनांकसमय उपसेकंड",
+       "exif-subsectimedigitized": "दिनांकसमयडिजिटाईज्ड उपसेकेंड",
+       "exif-exposuretime": "एक्स्पोज़र समय",
+       "exif-exposuretime-format": "$1 सेकंड ($2)",
+       "exif-fnumber": "F संख्या",
+       "exif-exposureprogram": "एक्स्पोजर कार्यक्रम",
+       "exif-spectralsensitivity": "वर्णक्रमीय संवेदनशीलता",
+       "exif-isospeedratings": "आईएसओ गति रेटिंग",
+       "exif-shutterspeedvalue": "APEX शटर गती",
+       "exif-aperturevalue": "APEX ऍपर्चर",
+       "exif-brightnessvalue": "APEX चमक",
+       "exif-exposurebiasvalue": "एक्सपोजर पूर्वाग्रह",
+       "exif-maxaperturevalue": "अधिकतम एपर्चर भूमि",
+       "exif-subjectdistance": "सब्जेक्टसे अंतर",
+       "exif-meteringmode": "मीटरींग मोड",
+       "exif-lightsource": "प्रकाश स्रोत",
+       "exif-flash": "फ्लैस",
+       "exif-focallength": "लेंस फोकल लम्बाई",
+       "exif-subjectarea": "विषय क्षेत्र",
+       "exif-flashenergy": "फ्ल्यास ऊर्जा",
+       "exif-focalplanexresolution": "फोकल प्लेन x रिज़ोल्यूशन",
+       "exif-focalplaneyresolution": "फोकल प्लेन Y रिज़ोल्यूशन",
+       "exif-focalplaneresolutionunit": "फोकल प्लेन रिज़ोल्यूशन एकक",
+       "exif-subjectlocation": "सब्जेक्ट कय स्थान",
+       "exif-exposureindex": "एक्स्पोज़र इन्डेक्स",
+       "exif-sensingmethod": "सेन्सींग पद्धती",
+       "exif-filesource": "फ़ाईल स्रोत",
+       "exif-scenetype": "दृश्य प्रकार",
+       "exif-customrendered": "कस्टम इमेज प्रोसेसिंग",
+       "exif-exposuremode": "एक्स्पोज़र मोड",
+       "exif-whitebalance": "श्वेत सन्तुलन",
+       "exif-digitalzoomratio": "डिजिटल झूम अनुमान",
+       "exif-focallengthin35mmfilm": "३५ मी.मी. फ़ील्ममें फोकल लंबाई",
+       "exif-scenecapturetype": "दृश्य पकड़ प्रकार",
+       "exif-gaincontrol": "दृश्य नियन्त्रण",
+       "exif-contrast": "कॉन्ट्रास्ट",
+       "exif-saturation": "सॅचूरेशन",
+       "exif-sharpness": "शार्पनेस",
+       "exif-devicesettingdescription": "उपकरण रचना वर्णन",
+       "exif-subjectdistancerange": "विषय दूरी सीमा",
+       "exif-imageuniqueid": "यूनिक चित्र ID",
+       "exif-gpsversionid": "GPS टॅग अवतरण",
+       "exif-gpslatituderef": "उत्तर या दक्खिन अक्षांश",
+       "exif-gpslatitude": "अक्षांश",
+       "exif-gpslongituderef": "पुरुब या पच्छु रेखांश",
+       "exif-gpslongitude": "रेखांश",
+       "exif-gpsaltituderef": "ऊंचाई संदर्भ",
+       "exif-gpsaltitude": "उँचाई",
+       "exif-gpstimestamp": "GPS समय (एटोमिक क्लॉक)",
+       "exif-gpssatellites": "मापन खत्तिर इस्तेमाल करल सैटेलाईट",
+       "exif-gpsstatus": "रिसिभर अवस्था",
+       "exif-gpsmeasuremode": "माप मोड",
+       "exif-gpsdop": "मेज़रमेंट प्रिसिजन",
+       "exif-gpsspeedref": "गति इकाई",
+       "exif-gpsspeed": "GPS रिसिवर कय गती",
+       "exif-gpstrackref": "मूवमेंट दिशा खत्तीर संदर्भ",
+       "exif-gpstrack": "मूवमेंट डाइरेक्शन",
+       "exif-gpsimgdirectionref": "चित्र कय दिशा कय संदर्भ",
+       "exif-gpsimgdirection": "चित्र कय दिशा",
+       "exif-gpsmapdatum": "जियोडेटिक सर्वे डाटा इस्तेमाल कै गय",
+       "exif-gpsdestlatituderef": "लक्ष्य कय अक्षांश कय संदर्भ",
+       "exif-gpsdestlatitude": "अक्षांश लक्ष्य",
+       "exif-gpsdestlongituderef": "लक्ष्य कय रेखांश कय संदर्भ",
+       "exif-gpsdestlongitude": "लक्ष्य कय रेखांश",
+       "exif-gpsdestbearingref": "लक्ष्य कय बियरींग कय संदर्भ",
+       "exif-gpsdestbearing": "लक्ष्य कय बेअरिंग",
+       "exif-gpsdestdistanceref": "लक्ष्य कय अंतर कय संदर्भ",
+       "exif-gpsdestdistance": "लक्ष्य कय अंतर",
+       "exif-gpsprocessingmethod": "GPS प्रक्रीया पद्धती कय नाँव",
+       "exif-gpsareainformation": "GPS विभाग कय नाम",
+       "exif-gpsdatestamp": "GPS दिनांक",
+       "exif-gpsdifferential": "GPS डिफरन्शियर करेक्शन",
+       "exif-jpegfilecomment": "JPEG फ़ाइल टिप्पणी",
+       "exif-keywords": "कीवर्ड",
+       "exif-worldregioncreated": "दुनिया क्षेत्र जहां इ चित्र लै ग रहा",
+       "exif-countrycreated": "देश जहां इ चित्र लै ग रहा",
+       "exif-countrycodecreated": "तस्विर खिचल देश कय कोड",
+       "exif-provinceorstatecreated": "प्रांत या राज्य जहां इ चित्र लै ग रहा",
+       "exif-citycreated": "शहर जहां इ चित्र लै ग रहा",
+       "exif-worldregiondest": "दुनिया कय क्षेत्र देखाइ गा है",
+       "exif-countrydest": "देश देखाइ गा है",
+       "exif-countrycodedest": "देखावल देश कय कोड",
+       "exif-provinceorstatedest": "देखावल प्रान्त या क्षेत्र",
+       "exif-citydest": "देखावल शहर",
+       "exif-sublocationdest": "देखावल सहर भित्तर कय क्षेत्र",
+       "exif-objectname": "छोट शीर्षक",
+       "exif-specialinstructions": "विशेष निर्देश",
+       "exif-headline": "शीर्षक",
+       "exif-credit": "श्रेय/प्रदायक",
+       "exif-source": "स्रोत",
+       "exif-editstatus": "तस्विर कय सम्पादकीय स्थिती",
+       "exif-urgency": "तात्कालिकता",
+       "exif-fixtureidentifier": "फिक्चर कय नाम",
+       "exif-locationdest": "देखावल जगह",
+       "exif-locationdestcode": "देखावल जगहि कय कोड",
+       "exif-contact": "संपर्क जानकारी",
+       "exif-writer": "लेखक",
+       "exif-languagecode": "भाषा",
+       "exif-iimversion": "आईआईएम संस्करण",
+       "exif-iimcategory": "श्रेणी",
+       "exif-iimsupplementalcategory": "पुरक श्रेणी",
+       "exif-datetimeexpires": "एकरे बाद मा इस्तेमाल ना करा जाइ",
+       "exif-datetimereleased": "पे जारी",
+       "exif-originaltransmissionref": "मूल प्रसारण स्थान कोड",
+       "exif-identifier": "पहचानकर्ता",
+       "exif-lens": "इस्तेमाल करल लेंस",
+       "exif-serialnumber": "कैमरा कय क्रमांक नंबर",
+       "exif-cameraownername": "कैमरा कय मालिक",
+       "exif-label": "लेबल",
+       "exif-datetimemetadata": "मेटा जानकारी अन्तिम सम्पादन करल दिन",
+       "exif-nickname": "छवि कय अनौपचारिक नाँव",
+       "exif-rating": "दर्ज़ा (5 से)",
+       "exif-rightscertificate": "अधिकार प्रबंधन प्रमाण पत्र",
+       "exif-copyrighted": "कॉपीराइट स्थिति",
+       "exif-copyrightowner": "कोपीराईट कय धारक",
+       "exif-usageterms": "उपयोग कय शर्त",
+       "exif-webstatement": "ऑनलाइन कॉपीराइट वक्तव्य",
+       "exif-originaldocumentid": "मूल दस्तावेज़ कय अनन्य पहचान",
+       "exif-licenseurl": "कॉपीराइट लाइसेंस कय लिए यूआरएल",
+       "exif-morepermissionsurl": "वैकल्पिक सूचना लाइसेंस",
+       "exif-attributionurl": "जब इ काम दुबारा इश्तेमाल करा जाइ,तव कृपया लिंक करा जाइ",
+       "exif-preferredattributionname": "जब इ काम दुबारा इश्तेमाल करा जाइ,तव कृपया क्रेडिट दिहा जाइ",
+       "exif-pngfilecomment": "PNG फ़ाइल टिप्पणी",
+       "exif-disclaimer": "शर्त्त",
+       "exif-contentwarning": "सामग्री चेतावनी",
+       "exif-giffilecomment": "GIF फ़ाइल टिप्पणी",
+       "exif-intellectualgenre": "आइटम कय प्रकार",
+       "exif-subjectnewscode": "विषय कोड",
+       "exif-scenecode": "IPTC दृश्य कोड",
+       "exif-event": "चित्रित घटना",
+       "exif-organisationinimage": "चित्रित संगठन",
+       "exif-personinimage": "व्यक्ति चित्रण",
+       "exif-originalimageheight": "छोट करे कय पहिले चित्र कय उचाई",
+       "exif-originalimagewidth": "छोट करे कय पहिले चित्र कय चौडाई",
+       "exif-compression-1": "अनकॉम्प्रेस्स्ड",
+       "exif-compression-2": "CCITT समूह 3 1-Dimensional Modified Huffman संचालन इन्कोडिङ्ग",
+       "exif-compression-3": "CCITT ग्रुप 3 फ़ैक्स एनकोडिंग",
+       "exif-compression-4": "CCITT ग्रुप 4 फ़ैक्स एनकोडिंग",
+       "exif-copyrighted-true": "कॉपीराईट",
+       "exif-copyrighted-false": "कॉपीराइट स्थिति अनिर्दिष्ट",
+       "exif-unknowndate": "अज्ञात तारीख",
+       "exif-orientation-1": "सामान्य",
+       "exif-orientation-2": "हॉरिज़ॉन्टली घुमाइ गय",
+       "exif-orientation-3": "180° घूमाइ गय",
+       "exif-orientation-4": "वर्टिकली घुमाइ गय",
+       "exif-orientation-5": "90° CCW घुमाइ गय औ वर्टिकली बदलि गय",
+       "exif-orientation-6": "90° CCW घुमाइ गय",
+       "exif-orientation-7": "90° CW घुमाइ गय औ वर्टिकली बदलि गय",
+       "exif-orientation-8": "90° CW घुमाइ गय",
+       "exif-planarconfiguration-1": "चंकी फ़रमैट",
+       "exif-planarconfiguration-2": "प्लेनर फ़रमैट",
+       "exif-colorspace-65535": "बिना स्तरिकरण कय",
+       "exif-componentsconfiguration-0": "नाइ है",
+       "exif-exposureprogram-0": "अव्यक्त",
+       "exif-exposureprogram-1": "मैन्युअल",
+       "exif-exposureprogram-2": "सामान्य प्रोग्रॅम",
+       "exif-exposureprogram-3": "ऍपर्चर प्राथमिकता",
+       "exif-exposureprogram-4": "शटर प्राथमिकता",
+       "exif-exposureprogram-5": "क्रियेटीव्ह कार्यक्रम (फ़ील्ड कय डेप्थ कय तरफ बायस्‌ड)",
+       "exif-exposureprogram-6": "ऐक्शन कार्यक्रम (शटर कय गती कय तरफ बायस्‌ड)",
+       "exif-exposureprogram-7": "पोर्ट्रेट मोड (क्लोज़‍अप फ़ोटो कय लिये)",
+       "exif-exposureprogram-8": "लैंडस्केप मोड (बैकग्राउंड कय साथे लैंडस्केप फोटो)",
+       "exif-subjectdistance-value": "$1 मीटर",
+       "exif-meteringmode-0": "अज्ञात",
+       "exif-meteringmode-1": "औसत",
+       "exif-meteringmode-2": "सेंटरवेटेडएवरेज",
+       "exif-meteringmode-3": "स्पॉट",
+       "exif-meteringmode-4": "मल्टीस्पॉट",
+       "exif-meteringmode-5": "ढाँचा",
+       "exif-meteringmode-6": "आंशिक",
+       "exif-meteringmode-255": "अउर",
+       "exif-lightsource-0": "अज्ञात",
+       "exif-lightsource-1": "सूर्यप्रकाश",
+       "exif-lightsource-2": "फ्लूरोसेंट",
+       "exif-lightsource-3": "टंगस्ट्न (इनकॅन्‍डेसेंट प्रकाश)",
+       "exif-lightsource-4": "फ्लॅश",
+       "exif-lightsource-9": "साफ मौसम",
+       "exif-lightsource-10": "बदरी",
+       "exif-lightsource-11": "छाँह",
+       "exif-lightsource-12": "डेलाईट फ्लूरोसेंट (D 5700 – 7100K)",
+       "exif-lightsource-13": "डे व्हाईट फ्लूरोसेंट (N 4600 – 5400K)",
+       "exif-lightsource-14": "कूल व्हाईट फ्लूरोसेंट (W 3900 – 4500K)",
+       "exif-lightsource-15": "व्हाईट फ्लूरोसेंट (WW 3200 – 3700K)",
+       "exif-lightsource-17": "प्रमाण प्रकाश A",
+       "exif-lightsource-18": "प्रमाण प्रकाश B",
+       "exif-lightsource-19": "प्रमाण प्रकाश C",
+       "exif-lightsource-24": "ISO स्टूडीयो टंगस्टन",
+       "exif-lightsource-255": "अउर प्रकाश स्रोत",
+       "exif-flash-fired-0": "फ़्लैश नाइ चला",
+       "exif-flash-fired-1": "फ़्लैश चला",
+       "exif-flash-return-0": "कवनो फ़्लैश वापसी पहिचान सुविधा नाइ",
+       "exif-flash-return-2": "फ़्लैश वापसी कय रोशनी नाइ मिला",
+       "exif-flash-return-3": "फ़्लैश वापसी कय रोशनी मिला",
+       "exif-flash-mode-1": "अत्यावश्यक प्रकाश फाएर",
+       "exif-flash-mode-2": "आवश्यक फ्ल्यास संकुचन",
+       "exif-flash-mode-3": "स्वचालित शैली",
+       "exif-flash-function-1": "कवनो फ़्लैश सुविधा नाइ है",
+       "exif-flash-redeye-1": "लाल-आँख घटाव शैली",
+       "exif-focalplaneresolutionunit-2": "इंच",
+       "exif-sensingmethod-1": "अव्यक्त",
+       "exif-sensingmethod-2": "वन चीप कलर एरीया सेन्सर",
+       "exif-sensingmethod-3": "टू चीप कलर एरीया सेन्सर",
+       "exif-sensingmethod-4": "थ्री चीप कलर एरीया सेन्सर",
+       "exif-sensingmethod-5": "कलर सिक्वेण्शीयल एरीया सेंसर",
+       "exif-sensingmethod-7": "ट्रायलिनीयर सेंसर",
+       "exif-sensingmethod-8": "कलर सिक्वेंशीयल लिनीयर सेन्सर",
+       "exif-filesource-3": "डिजिटल स्टिल कैमरा",
+       "exif-scenetype-1": "सिधै खिचल चित्र",
+       "exif-customrendered-0": "सामान्य प्रक्रिया",
+       "exif-customrendered-1": "व्यक्तिगत प्रक्रिया",
+       "exif-exposuremode-0": "ऑटो एक्स्पोज़र",
+       "exif-exposuremode-1": "मैन्युअल एक्पोज़र",
+       "exif-exposuremode-2": "ऑटो ब्रॅकेट",
+       "exif-whitebalance-0": "ऑटो व्हाईट बैलेन्स",
+       "exif-whitebalance-1": "मॅन्यूअल व्हाईट बॅलेन्स",
+       "exif-scenecapturetype-0": "स्टॅन्डर्ड",
+       "exif-scenecapturetype-1": "लैंडस्केप",
+       "exif-scenecapturetype-2": "पोर्ट्रेट",
+       "exif-scenecapturetype-3": "नाईट सीन",
+       "exif-gaincontrol-0": "बिल्कुल नाइ",
+       "exif-gaincontrol-1": "लो गेन अप",
+       "exif-gaincontrol-2": "हाय गेन अप",
+       "exif-gaincontrol-3": "लो गेन डाउन",
+       "exif-gaincontrol-4": "हाय गेन डाउन",
+       "exif-contrast-0": "सामान्य",
+       "exif-contrast-1": "हल्का",
+       "exif-contrast-2": "गाढा",
+       "exif-saturation-0": "सामान्य",
+       "exif-saturation-1": "निम्न सैचुरेशन",
+       "exif-saturation-2": "उच्च सैचुरेशन",
+       "exif-sharpness-0": "साधारण",
+       "exif-sharpness-1": "नरम",
+       "exif-sharpness-2": "कडा",
+       "exif-subjectdistancerange-0": "अज्ञात",
+       "exif-subjectdistancerange-1": "मैक्रो",
+       "exif-subjectdistancerange-2": "नजदीक से देखा जाय",
+       "exif-subjectdistancerange-3": "लम्मे से देखा जाय",
+       "exif-gpslatitude-n": "उत्तरी अक्षांश",
+       "exif-gpslatitude-s": "दक्खिनी अक्षांश",
+       "exif-gpslongitude-e": "पुरुबी रेखांश",
+       "exif-gpslongitude-w": "पच्छु रेखांश",
+       "exif-gpsaltitude-above-sealevel": "$1 {{PLURAL:$1|meter|meters}} समुद्र स्तर से ऊप्पर",
+       "exif-gpsaltitude-below-sealevel": "$1 {{PLURAL:$1|meter|meters}} समुद्र स्तर कय नीचे",
+       "exif-gpsstatus-a": "मेज़रमेंट चलत है",
+       "exif-gpsstatus-v": "मेज़रमेंट इन्टरोपरेबिलीटी",
+       "exif-gpsmeasuremode-2": "२-आयामीय मापन",
+       "exif-gpsmeasuremode-3": "३-आयामीय मापन",
+       "exif-gpsspeed-k": "किलोमिटर प्रति घण्टा",
+       "exif-gpsspeed-m": "मील प्रति घंटा",
+       "exif-gpsspeed-n": "नाट्स",
+       "exif-gpsdestdistance-k": "किलोमीटर",
+       "exif-gpsdestdistance-m": "मील",
+       "exif-gpsdestdistance-n": "समुद्री मील",
+       "exif-gpsdop-excellent": "उत्कृष्ट ( $1 )",
+       "exif-gpsdop-good": "निक ($1)",
+       "exif-gpsdop-moderate": "मध्यम ($1)",
+       "exif-gpsdop-fair": "ठिकय ($1)",
+       "exif-gpsdop-poor": "खराब ($1)",
+       "exif-objectcycle-a": "खाली भिन्नही",
+       "exif-objectcycle-p": "खाली सन्झा",
+       "exif-objectcycle-b": "दुनो भिन्नही अव सन्झा",
+       "exif-gpsdirection-t": "असली दिशा",
+       "exif-gpsdirection-m": "चुम्बकिय दिशा",
+       "exif-ycbcrpositioning-1": "केंद्रित",
+       "exif-ycbcrpositioning-2": "को-साइटेड",
+       "exif-dc-contributor": "योगदानकर्ता",
+       "exif-dc-coverage": "मीडिया कय स्थानिक या लौकिक स्कोप",
+       "exif-dc-date": "दिनांक",
+       "exif-dc-publisher": "प्रकाशक",
+       "exif-dc-relation": "सम्बधित मीडिया",
+       "exif-dc-rights": "अधिकार",
+       "exif-dc-source": "मीडिया स्रोत",
+       "exif-dc-type": "मीडिया कय प्रकार",
+       "exif-rating-rejected": "खारिज कै दिहा गय",
+       "exif-isospeedratings-overflow": "६५५३५ से ढेर",
+       "exif-iimcategory-ace": "कला, संस्कृति औ मनोरंजन",
+       "exif-iimcategory-clj": "अपराध औ कानून",
+       "exif-iimcategory-dis": "प्रकोप अव दुर्घटना",
+       "exif-iimcategory-fin": "अर्थव्यवस्था औ व्यापार",
+       "exif-iimcategory-edu": "शिक्षा",
+       "exif-iimcategory-evn": "पर्यावरण",
+       "exif-iimcategory-hth": "स्वास्थ्य",
+       "exif-iimcategory-hum": "मानवी रुचि",
+       "exif-iimcategory-lab": "श्रम",
+       "exif-iimcategory-lif": "जीवन शैली औ अवकाश",
+       "exif-iimcategory-pol": "राजनीति",
+       "exif-iimcategory-rel": "धर्म औ विश्वास",
+       "exif-iimcategory-sci": "विज्ञान औ प्रौद्योगिकी",
+       "exif-iimcategory-soi": "सामाजिक मुद्दा",
+       "exif-iimcategory-spo": "खेल",
+       "exif-iimcategory-war": "युद्ध, संघर्ष औ अशांति",
+       "exif-iimcategory-wea": "मौसम",
+       "exif-urgency-normal": "सामान्य ( $1 )",
+       "exif-urgency-low": "न्यूनतम ($1)",
+       "exif-urgency-high": "उच्चतम ($1)",
+       "exif-urgency-other": "यूज़र-डिफ़ाइंड प्राथमिकता ( $1 )",
+       "namespacesall": "कुल",
+       "monthsall": "कुल",
+       "confirmemail": "आपन ई-मेल ठहर निश्चित करा जाय",
+       "confirmemail_noemail": "आप कय [[Special:Preferences|पसंद]] मा वैध इ-मेल एड्रेस नाइ दिहा है।",
+       "confirmemail_text": "{{SITENAME}} मा इमेल सुविधन कय लाभ उठावे खर्तीन आप कय आपन इमेल ठहर प्रमाणित करेक परि ।कन्फर्मेशन कोड भेजय खत्तीर निचे कय बटन पे क्लिक किन जाय। मेल मा कोड वाला लिन्क है ।उ लिन्क कय आप अपने ब्राउजर मा खोलि कय आपन इमेल ठहर प्रमाणित कै सका जात है ।",
+       "confirmemail_send": "कन्फर्मेशन कोड मेल करा जाय",
+       "confirmemail_sent": "कन्फर्मेशन इ-मेल भेज दिहा गा है।",
+       "confirmemail_oncreate": "आप कय इ-मेल  ठहर पे एकठु कन्फर्मेशन कोड भेजा गा है।\nलॉग इन करय खत्तीर एकर आवश्यकता नाइ है, लेकिन इ विकि पे उपलब्ध इ-मेल आधारित सुविधन् कय इस्तेमाल करय खत्तीर इ देब जरूरी है।",
+       "confirmemail_sendfailed": "{{SITENAME}} आप कय कन्फर्मेशन मेल नाइ पठै पाए । आप कय इमेल ठहर मा कवनो गलत अक्षर तव नाइ है ,जाँचा जाय ।\nमेलर कहिस :$1",
+       "confirmemail_invalid": "गलत कन्फर्मेशन कोड।\nकोड रद्द होएक संभावना है।",
+       "confirmemail_needlogin": "आप कय आपन इमेल ठहर प्रमाणित करय खत्तीर $1 करेक परि ।",
+       "confirmemail_success": "आप कय इमेल ठहर प्रमाणित होइ गवा है । अब आप [[Special:UserLogin|लाग इन]] कैकय विकि कय मजा लै सका जात है ।",
+       "confirmemail_loggedin": "आप कय इमेल ठहर प्रमाणित होइ गवा है ।",
+       "confirmemail_subject": "{{SITENAME}} इ-मेल एड्रेस प्रमाणिकरण",
+       "confirmemail_invalidated": "इ-मेल एड्रेस प्रमाणिकरण रद्द कै गय",
+       "invalidateemail": "इ-मेल प्रमाणिकरण रद्द करा जाय",
+       "scarytranscludedisabled": "[आंतरविकि ट्रान्स्क्लुडिंग बंद है]",
+       "scarytranscludefailed": "[$1 कय लिये साँचा नाइ मङाइ मिला]",
+       "scarytranscludefailed-httpstatus": "[$1 कय लिये साँचा नाइ मँगाइ मिला, त्रुटि: HTTP $2]",
+       "scarytranscludetoolong": "[यूआरएल बहुतय लम्मा है]",
+       "deletedwhileediting": "'''Warning''':आप जबसे सम्पादन शुर करा गा है तब से इ पन्ना मिटाइ दिहा है ।",
+       "recreate": "फिरसे बनावा जाय",
+       "confirm_purge_button": "ठीक है",
+       "confirm-purge-top": "पन्ना कय कैश साफ करा जाय ?",
+       "confirm-watch-button": "ठीक है",
+       "confirm-watch-top": "इ पन्ना कय अपने ध्यान सुचि मा डारा जाय",
+       "confirm-unwatch-button": "ठीक है",
+       "confirm-unwatch-top": "इ पन्ना कय अपने ध्यानसूची से हटावा जाय ?",
+       "quotation-marks": "\"$1\"",
+       "imgmultipageprev": "← पिछला पन्ना",
+       "imgmultipagenext": "अगला पन्ना →",
+       "imgmultigo": "जावा जाय",
+       "imgmultigoto": "पन्ना $1 पे जावा जाय",
+       "img-lang-default": "(डिफ़ॉल्ट भाषा)",
+       "img-lang-go": "जावा जाय",
+       "ascending_abbrev": "asc",
+       "descending_abbrev": "desc",
+       "table_pager_next": "अगला पन्ना",
+       "table_pager_prev": "पिछला पन्ना",
+       "table_pager_first": "पहिला पन्ना",
+       "table_pager_last": "आखिरी पन्ना",
+       "table_pager_limit": "एक पन्ना पे $1 आइटम देखावा जाय",
+       "table_pager_limit_label": "आइटम प्रति पन्ना:",
+       "table_pager_limit_submit": "जावा जाय",
+       "table_pager_empty": "रिज़ल्ट नाइ है",
+       "autosumm-blank": "पन्ना कय खाली कै गय",
+       "autosumm-replace": "पन्ना कय '$1' से बदलि जात है।",
+       "autoredircomment": "[[$1]] पे अनुप्रेषित",
+       "autosumm-new": "'$1' कय साथे नँवा पन्ना बनावा गय",
+       "autosumm-newblank": "खाली पन्ना बनावा गय",
+       "watchlistedit-normal-title": "ध्यानसूची बदला जाय",
+       "watchlistedit-normal-legend": "ध्यानसूची से शीर्षक हटावा जाय",
+       "watchlistedit-normal-submit": "शिर्षक हटावा जाय",
+       "watchlistedit-normal-done": "आप कय ध्यानसूचीसे {{PLURAL:$1|1शीर्षक|$1 शीर्षक}} हटाइ गय:",
+       "watchlistedit-raw-title": "कच्चा निगरानी सूची सम्पादन करा जाय",
+       "watchlistedit-raw-legend": "कच्चा निगरानी सूची सम्पादन करा जाय",
+       "watchlistedit-raw-titles": "शीर्षक:",
+       "watchlistedit-raw-submit": "ध्यानसूची अपडेट करा जाय",
+       "watchlistedit-raw-done": "आप कय ध्यान सुची अपडेट होइ गवा है ।",
+       "watchlistedit-raw-added": "{{PLURAL:$1|1शीर्षक|$1 शीर्षक}} बढाइ गय:",
+       "watchlistedit-raw-removed": "{{PLURAL:$1|1शीर्षक|$1 शीर्षक}} हटाइ गय:",
+       "watchlistedit-clear-title": "अवलोकन सूची खाली कै गय",
+       "watchlistedit-clear-legend": "अवलोकन सूची खाली कीन जाय",
+       "watchlistedit-clear-titles": "शिर्षक",
+       "watchlisttools-clear": "अवलोकन सूची खाली कीन जाय",
+       "watchlisttools-view": "आधारित बदलाव देखा जाय",
+       "watchlisttools-edit": "ध्यानसूची देखा जाय अव संपादित कीन जाय",
+       "watchlisttools-raw": "रॉ ध्यानसूची देखा जाय अव संपादित कीन जाय",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|वार्ता]])",
+       "version": "संस्करण",
+       "version-extensions": "इन्स्टॉल करल एक्स्टेंशन",
+       "version-skins": "इन्स्टॉल करल त्वचा",
+       "version-specialpages": "खाश पन्ना",
+       "version-parserhooks": "पार्सर हूक",
+       "version-variables": "चल राशी(variables)",
+       "version-antispam": "स्प्याम रोकथाम",
+       "version-other": "अउर",
+       "version-mediahandlers": "मीडिया संचालक",
+       "version-hooks": "हूक",
+       "version-parser-extensiontags": "पार्सर एक्स्टेंशन टैग",
+       "version-parser-function-hooks": "पार्सर कार्य हूक",
+       "version-hook-name": "हूक नाँव",
+       "version-hook-subscribedby": "ग्राह्यता करय वाले",
+       "version-no-ext-name": "[अज्ञात नाँव]",
+       "version-license": "मीडियाविकि अनुज्ञापत्र",
+       "version-ext-license": "लाइसेंस",
+       "version-ext-colheader-name": "एक्सटेंशन",
+       "version-skin-colheader-name": "स्किन",
+       "version-ext-colheader-version": "संस्करण",
+       "version-ext-colheader-license": "लाइसेंस",
+       "version-ext-colheader-description": "विवरण",
+       "version-ext-colheader-credits": "लेखक",
+       "version-license-title": "$1 के लिए लाइसेंस",
+       "version-credits-title": "$1 कय लिए श्रेय",
+       "version-poweredby-credits": "इ विकि  '''[https://www.mediawiki.org/ MediaWiki]''' से संचालित है, कॉपीराइट © 2001 - $1  $2 ।",
+       "version-poweredby-others": "अउर",
+       "version-poweredby-translators": "translatewiki.net अनुवादक",
+       "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-submit": "जावा जाय",
+       "redirect-lookup": "ढूँढा जाय:",
+       "redirect-value": "मूल्य:",
+       "redirect-user": "सदस्य आई॰डी",
+       "redirect-page": "पन्ना आइ॰डी",
+       "redirect-revision": "पन्ना अवतरण संख्या",
+       "redirect-file": "फ़ाइल कय नाँव",
+       "redirect-not-exists": "मुल्य नाइ मिला",
+       "fileduplicatesearch": "डुप्लिकेट फाइल खोजा जाय",
+       "fileduplicatesearch-summary": "हैश वैल्यू कय अनुसार डुप्लिकेट फाइल खोजा जाय ।",
+       "fileduplicatesearch-legend": "डुप्लिकेट खोजा जाय",
+       "fileduplicatesearch-filename": "फ़ाइल कय नाँव",
+       "fileduplicatesearch-submit": "खोजा जाय",
+       "fileduplicatesearch-info": "$1 × $2 पिक्सेल<br />फाइल आकार: $3<br />MIME प्रकार: $4",
+       "fileduplicatesearch-result-1": "फ़ाईल  \"$1\" मा डुप्लिकेट नाइ है।",
+       "fileduplicatesearch-result-n": "फाइल\"$1\" कय {{PLURAL:$2|1 दुरुस्त डुप्लिकेट|$2 दुरुस्त डुप्लिकेट}} हैं ।",
+       "fileduplicatesearch-noresults": "कवनो \"$1\" फाइल नाइ मिला।",
+       "specialpages": "खाश पन्ना",
+       "specialpages-note-top": "कुंजी",
+       "specialpages-note": "* साधारण विशेष पन्ना।\n* <span class=\"mw-specialpagerestricted\">प्रतिबंधित विशेष पन्ना।</span>",
+       "specialpages-group-maintenance": "अनुरक्षण रिपोर्ट",
+       "specialpages-group-other": "अउर खाश पन्ना",
+       "specialpages-group-login": "लाग इन / खाता खोला जाय",
+       "specialpages-group-changes": "नँवा बदलाव अव लाग",
+       "specialpages-group-media": "मीडिया रिपोर्ट अव अपलोड",
+       "specialpages-group-users": "सदस्य अव अधिकार",
+       "specialpages-group-highuse": "अत्यधिक उपयोगी पन्ना",
+       "specialpages-group-pages": "पन्नन् कय सूची",
+       "specialpages-group-pagetools": "पन्ना औज़ार",
+       "specialpages-group-wiki": "डाटा औ औज़ार",
+       "specialpages-group-redirects": "खाश पन्ना पे लैजात है",
+       "specialpages-group-spam": "स्पैम औज़ार",
+       "specialpages-group-developer": "डेवलपर औजार",
+       "blankpage": "खाली पन्ना",
+       "intentionallyblankpage": "इ पन्ना जानबुझी कय खाली छोडा है ।",
+       "tags": "वैध बदलाव चिप्पि",
+       "tag-filter": "[[Special:Tags|चिप्पी]] छननी:",
+       "tag-filter-submit": "फिल्टर",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|टैग}}]]: $2)",
+       "tags-title": "चिप्पि",
+       "tags-tag": "चिप्पी कय नाँव",
+       "tags-display-header": "बदलाव सूचिन् मा प्रदर्शन",
+       "tags-description-header": "अर्थ कय पूरा वर्णन",
+       "tags-active-header": "सक्रिय?",
+       "tags-hitcount-header": "चिप्पी वाला बदलाव",
+       "tags-active-yes": "हाँ",
+       "tags-active-no": "नाहीँ",
+       "tags-edit": "सम्पादन",
+       "tags-hitcount": "$1 {{PLURAL:$1|बदलाव|बदलाव}}",
+       "comparepages": "पन्ना दाँजा जाय",
+       "compare-page1": "पन्ना १",
+       "compare-page2": "पन्ना २",
+       "compare-rev1": "संशोधन १",
+       "compare-rev2": "संशोधन २",
+       "compare-submit": "दाँजा जाय",
+       "compare-invalid-title": "आप कय दिहा शिर्षक अमान्य है ।",
+       "compare-title-not-exists": "आप कय दिहा शिर्षक नाइ है ।",
+       "compare-revision-not-exists": "आप कय दिहा संशोधन नाइ है ।",
+       "dberr-again": "कुछ मिन रुकि कय फिरसे लोड किन जाय",
+       "dberr-usegoogle": "इही बिंचे आप गूगल से खोज कै सका जात है ।",
+       "htmlform-submit": "जमा कीन जाय",
+       "htmlform-reset": "बदलाव फिरसे उही जगही लावा जाय",
+       "htmlform-selectorother-other": "अउर",
+       "htmlform-no": "नाहीँ",
+       "htmlform-yes": "हाँ",
+       "htmlform-chosen-placeholder": "एक्ठु विकल्प चुना जाय",
+       "htmlform-cloner-create": "अउर जोडा जाय",
+       "htmlform-cloner-delete": "हटावा जाय",
+       "sqlite-has-fts": "$1 पूर्ण पाठ खोज समर्थन कय साथ",
+       "sqlite-no-fts": "$1पूर्ण-पाठ खोज समर्थन कय बिना",
+       "logentry-delete-delete": "$1 ने पृष्ठ $3 {{GENDER:$2|हटा}} दिहा गय",
+       "logentry-delete-restore": "$1 ने पृष्ठ $3 कय {{GENDER:$2|पुनर्स्थापित}} कै गय",
+       "revdelete-content-hid": "सामग्री लुकुआवा है",
+       "revdelete-summary-hid": "सम्पादन सारांश लुकुआवा है",
+       "revdelete-uname-hid": "सदस्य नाँव लुकुआवा है",
+       "revdelete-content-unhid": "सामग्री देखावा है",
+       "revdelete-summary-unhid": "सम्पादन सारांश देखावा है",
+       "revdelete-uname-unhid": "सदस्य नाँव देखावा है",
+       "revdelete-restricted": "प्रबंधक पे प्रतिबंध लागू",
+       "revdelete-unrestricted": "प्रबंधक कय प्रबंधन हटावा जाय",
+       "logentry-move-move": "$1 ने $3 पृष्ठ $4 पर {{GENDER:$2|स्थानांतरित}} कै गय",
+       "rightsnone": "(कउनो नाहीं)",
+       "revdelete-summary": "संपादन सारांश",
+       "feedback-subject": "विषय:",
+       "feedback-message": "सनेशा:",
+       "feedback-cancel": "रद्द करा जाय",
+       "feedback-submit": "प्रतिक्रिया भेजा जाय",
+       "feedback-adding": "पृष्ठ पे प्रतिक्रिया जोडत है ...",
+       "feedback-error2": "त्रुटि: संपादन विफल रहा है",
+       "feedback-close": "होइ गवा",
+       "searchsuggest-search": "खोज",
+       "searchsuggest-containing": "...से युक्त",
+       "api-error-badaccess-groups": "इ विकि मा आप कय फाइल अपलोड करेक अनुमति नाइ है",
+       "api-error-badtoken": "आंतरिक त्रुटि: खराब टोकन।",
+       "api-error-duplicate-popup-title": "डुप्लिकेट {{PLURAL:$1| फ़ाइल | फ़ाइल}}",
+       "api-error-empty-file": "आप कय दीहल फ़ाइल खाली रहा।",
+       "api-error-emptypage": "नँवा अव खाली पन्ना बनावै कय अनुमति नाइ है",
+       "api-error-fileexists-forbidden": "\"$1\" नाँव कय फाइल मौजुद है,एकरे उप्पर नाइ लिखि सका जात है",
+       "api-error-fileexists-shared-forbidden": "\"$1\" नाँव कय फाइल साझा फाइल भण्डार मा पहिलवे से मौजुद है अव एकरे उप्पर नाइ लिखि सका जात है ।",
+       "api-error-file-too-large": "आप कय दीहल फ़ाइल बहुत बडा रहा।",
+       "api-error-filename-tooshort": "फ़ाइल कय नाँव बहुत छोट है।",
+       "api-error-filetype-banned": "अइसन फ़ाइल प्रतिबन्धित है।",
+       "api-error-filetype-missing": "फाईल कय एक्सटेंशन लापता है ।",
+       "api-error-hookaborted": "आपके द्वारा प्रयासरत संशोधन किसी एक्स्टेंशन द्वारा निरस्त किया गया।",
+       "api-error-http": "आंतरिक त्रुटि: सर्वर से कनेक्ट करय में असमर्थ।",
+       "api-error-illegal-filename": "अइसन फ़ाइल कय इजाजत नाइ है।",
+       "api-error-missingparam": "आंतरिक त्रुटि: अनुरोध पे  पैरामीटर लापता",
+       "api-error-missingresult": "आन्तरिक त्रुटि: इ प्रतिलिपि सफल निर्धारित नाइ होइ सका",
+       "api-error-mustbeloggedin": "फाइल अपलोड करेक आप कय लाग इन करेक परि",
+       "api-error-mustbeposted": "आंतरिक त्रुटि: HTTP POST अनुरोध कय आवश्यकता है.",
+       "api-error-nomodule": "आंतरिक त्रुटि: कवनो अपलोड मॉड्यूल सेट नाइ है",
+       "api-error-ok-but-empty": "आंतरिक त्रुटि: सर्वर से कवनो जवाब नाइ है।",
+       "api-error-overwrite": "मौजुदा फाइल कय उप्पर नाइ लिखि सका जात अहै ।",
+       "api-error-stashfailed": "आन्तरिक त्रुटि: अस्थाई फाइल राखय मा सर्वर असफल रहा।",
+       "api-error-unclassified": "अज्ञात त्रुटि आइ गवा।",
+       "api-error-unknown-code": "अज्ञात त्रुटि: \"$1\"",
+       "api-error-unknown-error": "आंतरिक त्रुटि: आप कय फ़ाइल अपलोड प्रयास करत समय कुछ गलत होइ गवा रहा।",
+       "api-error-unknown-warning": "अज्ञात चेतावनी: $1",
+       "api-error-unknownerror": "अज्ञात त्रुटि: \"$1\"",
+       "api-error-uploaddisabled": "इ विकि मा अपलोड अक्षम है.",
+       "api-error-verification-error": "इ फाइल दुषित होइ सकत है या गलत एक्टेन्शन अहै ।",
+       "duration-seconds": "$1 {{PLURAL:$1|सॅकेंड}}",
+       "duration-minutes": "$1 {{PLURAL:$1|मिनट}}",
+       "duration-hours": "$1 {{PLURAL:$1|घंटा|घंटा}}",
+       "duration-days": "$1 {{PLURAL:$1|दिन}}",
+       "duration-weeks": "$1 {{PLURAL:$1|सप्ताह}}",
+       "duration-years": "$1 {{PLURAL:$1|साल}}",
+       "duration-decades": "$1 {{PLURAL:$1|दशक}}",
+       "duration-centuries": "$1 {{PLURAL:$1|शताब्दी}}",
+       "duration-millennia": "$1 {{PLURAL:$1|सहस्राब्दी}}",
+       "limitreport-title": "पार्सर प्रोफाइलिङ डाटा",
+       "limitreport-cputime": "सि.पि.यु समय खपत",
+       "limitreport-cputime-value": "$1 {{PLURAL:$1|सॅकेंड}}",
+       "limitreport-walltime": "असली समय खपत",
+       "limitreport-walltime-value": "$1 {{PLURAL:$1|सॅकेंड}}",
+       "limitreport-postexpandincludesize": "विस्तार उपरांत विकिपाठ आकार",
+       "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|बाइट}}",
+       "limitreport-templateargumentsize": "साँचा प्राचल आकार",
+       "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|बाइट}}",
+       "limitreport-expansiondepth": "उच्चतम विस्तार गहराई",
+       "limitreport-expensivefunctioncount": "महंगा पार्सर फंक्शन कय संख्या",
+       "expandtemplates": "साँचा विस्तार",
+       "expand_templates_title": "कन्टेक्स्ट शीर्षक, जैसय {{FULLPAGENAME}} आदि कय लिए:",
+       "expand_templates_input": "इनपुट पाठ:",
+       "expand_templates_output": "परिणाम",
+       "expand_templates_xml_output": "XML आउटपुट",
+       "expand_templates_html_output": "रा HTML आउटपुट",
+       "expand_templates_ok": "ठीक है",
+       "expand_templates_remove_comments": "टिप्पणी हटावा जाय",
+       "expand_templates_remove_nowiki": "परिणाम मा <nowiki> टैग हटावा जाय",
+       "expand_templates_generate_xml": "XML कय पार्स (parse) वृक्ष देखावा जाय",
+       "expand_templates_generate_rawhtml": "सुद्ध HTML देखावा जाय",
+       "expand_templates_preview": "झलक",
+       "pagelang-name": "पन्ना",
+       "pagelang-language": "भाषा",
+       "pagelang-use-default": "डिफ़ॉल्ट भाषा इस्तेमाल कीन जाय",
+       "pagelang-select-lang": "भाषा चुना जाय",
+       "right-pagelang": "पन्ना कय भाषा चुना जाय",
+       "action-pagelang": "पन्ना कय भाषा बदला जाय",
+       "log-name-pagelang": "भाषा लाग बदला जाय",
+       "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (सक्षम)",
+       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''अक्षम''')",
+       "mediastatistics": "मीडिया कय आँकड़ा",
+       "mediastatistics-nbytes": "{{PLURAL:$1|$1 बाईट}} ($2; $3%)",
+       "mediastatistics-table-mimetype": "MIME प्रकार",
+       "mediastatistics-table-extensions": "संभावित एक्श्टेंशन",
+       "mediastatistics-table-count": "फाइल कय गिन्ती",
+       "mediastatistics-table-totalbytes": "कुल साइज",
+       "mediastatistics-header-unknown": "अज्ञात",
+       "mediastatistics-header-bitmap": "बिटमैप चित्र",
+       "mediastatistics-header-audio": "आडियो",
+       "mediastatistics-header-video": "वीडियो",
+       "mediastatistics-header-office": "आफिस",
+       "mediastatistics-header-text": "शाब्दिक",
+       "json-error-unknown": "JSON से समस्या रहा । गल्ती: $1"
 }
index 4dc79d3..c1b8944 100644 (file)
        "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 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ı",
-       "createacct-emailoptional": "E-poçt ünvanı (istəyə bağlı)",
+       "createacct-emailoptional": "E-poçt ünvanı (məcburi deyil)",
        "createacct-email-ph": "E-poçt ünvanınızı daxil edin",
        "createacct-another-email-ph": "E-poçt ünvanını daxil edin",
        "createaccountmail": "Müvəqqəti təsadüfi bir paroldan istifadə edə bilər və bu parolu göstərilən e-poçt ünvanına göndərə bilərsiniz",
-       "createacct-realname": "Gərçək adı (istəyə bağlı)",
+       "createacct-realname": "Əsl adınız (məcburi deyil)",
        "createaccountreason": "Səbəb:",
        "createacct-reason": "Səbəb",
        "createacct-reason-ph": "Niyə başqa bir hesab yaradırsınız",
        "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",
        "pageinfo-header-edits": "Redaktə tarixçəsi",
        "pageinfo-header-restrictions": "Səhifə mühafizəsi",
        "pageinfo-header-properties": "Səhifə xüsusiyyətləri",
+       "pageinfo-display-title": "Göstərilən başlıq",
+       "pageinfo-length": "Səhifənin ölçüsü (baytla)",
+       "pageinfo-article-id": "Səhifə ID-si",
+       "pageinfo-language": "Səhifənin dili",
+       "pageinfo-content-model": "Səhifə məzmunu modeli",
+       "pageinfo-robot-noindex": "İcazə verilmədi",
        "pageinfo-watchers": "Səhifəyə baxışların sayı",
+       "pageinfo-few-watchers": "$1 {{PLURAL:$1|izləyicidən|izləyicilərdən}} az",
        "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 ümumi sayı",
        "pageinfo-authors": "Fərqli müəlliflərin ümumi sayı",
+       "pageinfo-recent-edits": "Sonuncu redaktə sayı ($1 ərzində)",
+       "pageinfo-recent-authors": "Sonuncu əhəmiyyətli dəyişiklik etmiş müəlliflər",
+       "pageinfo-magic-words": "Sehrli {{PLURAL:$1|1=söz|sözlər}} ($1)",
+       "pageinfo-templates": "{{PLURAL:$1|Şablon|Şablonlar}} ($1)",
        "pageinfo-toolboxlink": "Əsas məlumatlar",
        "pageinfo-redirectsto": "İstiqamətləndirmə",
        "pageinfo-redirectsto-info": "məlumat",
+       "pageinfo-contentpage": "Məzmunlu səhifə kimi sayılır",
        "pageinfo-contentpage-yes": "Bəli",
+       "pageinfo-protect-cascading": "Kaskad mühafizə burada qoşulub",
+       "pageinfo-category-pages": "Səhifələrin sayı",
+       "pageinfo-category-subcats": "Altkateqoriyaların sayı",
+       "pageinfo-category-files": "Faylların sayı",
        "markaspatrolleddiff": "Yoxlanıldı",
        "markaspatrolledtext": "Səhifəni patrullanmış kimi işarələ",
        "markedaspatrolled": "Yoxlanıldı",
index 401d4e7..85ed84b 100644 (file)
@@ -12,7 +12,8 @@
                        "Shirayuki",
                        "Microchip08",
                        "아라",
-                       "Koroğlu"
+                       "Koroğlu",
+                       "Baloch Afghanistan"
                ]
        },
        "tog-underline": "باغلانتیلارین آلتینی خطله:",
        "prefs-personal": "ایستیفاده‌چی پروفایلی",
        "prefs-rc": "سون دَییشیکلیکلر",
        "prefs-watchlist": "ایزله‌دیکلر",
+       "prefs-editwatchlist": "ایزله‌دیگیم صحیفه‌‌لری دَییشدیر",
        "prefs-watchlist-days": "ایزله‌دیکلرده گؤستریلن گونلر",
        "prefs-watchlist-days-max": "چوخو {{PLURAL:$1|بیر|$1}} گون",
        "prefs-watchlist-edits": "گنیشلنمیش ایزله‌مه‌لرده گؤستریلن دَییشیکلیکلرین چوخو:",
        "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|دییشمک |دییشمک}} دییشدیرمه",
        "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": "سیز او آی‌پی آدرسیله دَییشیکلیک ائتدیگینیز ایستیفاده‌چی صحیفه‌سی",
        "tooltip-pt-mytalk": "دانیشیق صحیفه‌نیز",
index f72e846..4041ee2 100644 (file)
@@ -35,7 +35,7 @@
        "tog-shownumberswatching": "Ihayag an numero kan nagbabantay na mga parágamit",
        "tog-oldsig": "Tugmadong pirma",
        "tog-fancysig": "Trataron an pirma na wiki-teksto (mayo nin awtomatikong kilyaw)",
-       "tog-uselivepreview": "Gamíta an buhay na patànaw (eksperimental)",
+       "tog-uselivepreview": "Gamíton an buhay na patànaw",
        "tog-forceeditsummary": "Ibunyaw sako kun maglalaog sa blangkong kalanyang nin paghirá",
        "tog-watchlisthideown": "Tagóa an sakong mga pagliwat gikan sa bantay-listahan",
        "tog-watchlisthidebots": "Tagóa an bot na mga pagliwat gikan sa bantay-listahan",
        "searchbutton": "Maghanap",
        "go": "Dumani",
        "searcharticle": "Lakaw",
-       "history": "Uusipon kan pahina",
-       "history_short": "Uusipon",
+       "history": "Historiya nin pahina",
+       "history_short": "Historiya",
        "updatedmarker": "dinagdagan poon kan sakong huring pagbisita",
        "printableversion": "Nalilimbag na bersyon",
        "permalink": "Permanenteng kilyawan",
        "delete": "Puraon",
        "deletethispage": "Puraon ining pahina",
        "undeletethispage": "Balikon sa pagkapura ining pahina",
-       "undelete_short": "Bawion an {{PLURAL:$1|sarong pagliwat|$1 mga pagliwat}}",
-       "viewdeleted_short": "Hilingon {{PLURAL:$1|sarong pinara na pagliwat|$1 mga pinara na pagliwat}}",
+       "undelete_short": "Dae puraon an {{PLURAL:$1|sarong pagliwat|$1 mga pagliwat}}",
+       "viewdeleted_short": "Hilingon {{PLURAL:$1|sarong pinura na pagliwat|$1 mga pinura na pagliwat}}",
        "protect": "Protektari",
        "protect_change": "Ribayan",
        "protectthispage": "Protektaran ining pahina",
        "delete-warning-toobig": "Ining pahina igwa nin dakulaong historiya sa pagliwat, minasobrang $1 {{PLURAL:$1|rebisyon|mga rebisyon}}.\nAn pagpupura kaini mapuwedeng makapag-antala sa mga operasyon kan datos-sarayan kan {{SITENAME}}; magpadagos tabi na igwang pag-iingat.",
        "deleting-backlinks-warning": "'''Patanid:''' An ibang mga pahina nakatakod sa pahina na muya mong pagpupuraon.",
        "rollback": "Mga paghihira na pabalík",
-       "rollback_short": "pabalík",
        "rollbacklink": "pabalikwaton",
        "rollbacklinkcount": "ibalik $1 {{PLURAL:$1|pagliwat|mga pagliwat}}",
        "rollbacklinkcount-morethan": "ibalik an sobrang $1  {{PLURAL:$1|pagliwat|mga pagliwat}}",
        "import-logentry-interwiki": "na-transwiki an $1",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|rebisyon|mga rebisyon}} gikan sa $2",
        "javascripttest": "Testing sa JavaScript",
-       "javascripttest-title": "Pinapadalagan na $1 na mga pagtesting",
        "javascripttest-pagetext-noframework": "An pahinang ini reserbado para sa pagpapadalagan kan mga pagtesting sa JavaScript.",
        "javascripttest-pagetext-unknownframework": "Bakong bistadong modelo para sa pagtesting kan \"$1\".",
        "javascripttest-pagetext-frameworks": "Pakipili tabi nin saro sa minasunod na mga modelo sa pagtesting: $1",
        "javascripttest-pagetext-skins": "Magpili nin sarong kublit tanganing padalaganon an mga pagtesting sa:",
        "javascripttest-qunit-intro": "Hilngon [$1 dokumentasyon sa pagtesting] sa mediawiki.org.",
-       "javascripttest-qunit-heading": "MediaWiki JavaScript QUnit kuwarto nin pagtesting",
        "tooltip-pt-userpage": "An saimong paragamit na pahina",
        "tooltip-pt-anonuserpage": "An páhina nin páragamit para sa ip na pighihira mo bilang",
        "tooltip-pt-mytalk": "An saimong pahina sa olayan",
        "watchlisttools-edit": "Tanawon asin liwaton an bantay-listahan",
        "watchlisttools-raw": "Liwaton an hilaw na bantay-listahan",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|olay]])",
-       "unknown_extension_tag": "Bakong bistadong ekstensyon nin pagmarka \"$1\"",
        "duplicate-defaultsort": "'''Patanid tabi:''' An susing panugmad kan salansan na \"$2\" minasalimbaw sa dating susing panugmad kan salansan na \"$1\".",
        "version": "Bersyon",
        "version-extensions": "Instaladong mga ekstensyon",
        "specialpages-group-wiki": "Datos asin mga palindô",
        "specialpages-group-redirects": "Panukdo sa espesyal na mga pahina",
        "specialpages-group-spam": "Pan-spam na mga kagamitan",
+       "specialpages-group-developer": "Mga kagamitan nin Paragibo",
        "blankpage": "Blangkong pahina",
        "intentionallyblankpage": "Pigtuyong blangko an pahinang ini",
        "external_image_whitelist": "#Bayai ining linya eksaktong siring man sana kaini<pre>\n#Magkaag nin regular na mga panambitong parasa (idto sanang parte na minauyon sa tahaw kan //) na yaon sa ibaba\n#An mga ini paglalangkapon kaiba an mga kilyawan kan panluwas (hotlinked) na mga imahe\n#Idtong nagkaralangkap ipagpapahiling bilang mga imahe, o baya an sarong sugpon sana pasiring sa imahe an ipagpapahiling\n#Mga linya na nagpopoon sa # pagtatrataron bilang mga komento\n#Ini baya bakong sensitibo sa tipahan\n\n#Ikaag an gabos na parasang regex sa ibabaw kaining linya. Bayai ining linya eksaktong siring man sana kaini.</pre>",
index 4561aeb..a041f8c 100644 (file)
        "virus-unknownscanner": "невядомы антывірус:",
        "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": "Увядзіце вашае імя ўдзельніка",
        "externaldberror": "Адбылася памылка аўтэнтыфікацыі з дапамогай вонкавай базы зьвестак, ці Вам не дазволена абнаўляць свой рахунак.",
        "login": "Увайсьці",
        "nav-login-createaccount": "Уваход / стварэньне рахунку",
-       "userlogin": "Увайсьці ў сыстэму",
+       "userlogin": "Увайсьці ў сыстэму / стварыць рахунак",
        "userloginnocreate": "Увайсьці",
        "logout": "Выйсьці",
        "userlogout": "Выйсьці",
        "prefs-personal": "Асабістыя зьвесткі",
        "prefs-rc": "Апошнія зьмены",
        "prefs-watchlist": "Сьпіс назіраньня",
+       "prefs-editwatchlist": "Рэдагаваць сьпіс назіраньня",
+       "prefs-editwatchlist-label": "Рэдагаваць запісы ў вашым сьпісе назіраньня:",
+       "prefs-editwatchlist-edit": "Прагляд і выдаленьне старонак зь сьпісу назіраньня",
+       "prefs-editwatchlist-raw": "Рэдагаваць нефарматаваны сьпіс назіраньня",
+       "prefs-editwatchlist-clear": "Ачысьціць ваш сьпіс назіраньня",
        "prefs-watchlist-days": "Колькасьць дзён для паказу ў сьпісе назіраньня:",
        "prefs-watchlist-days-max": "(максымальна $1 {{PLURAL:$1|дзень|дні|дзён}})",
        "prefs-watchlist-edits": "Колькасьць рэдагаваньняў для паказу ў пашыраным сьпісе назіраньня:",
        "right-override-export-depth": "экспартаваньне старонак, уключаючы зьвязаныя старонкі з глыбінёй да 5",
        "right-sendemail": "адпраўка электронных лістоў іншым удзельнікам",
        "right-passwordreset": "прагляд электронных лістоў з ачысткай паролю",
+       "right-managechangetags": "ствараць і выдаляць [[Special:Tags|меткі]] з базы зьвестак",
        "newuserlogpage": "Журнал стварэньня рахункаў",
        "newuserlogpagetext": "Гэта журнал стварэньня рахункаў удзельнікаў і ўдзельніц.",
        "rightslog": "Журнал правоў удзельнікаў",
        "action-viewmyprivateinfo": "прагляд вашых прыватных зьвестак",
        "action-editmyprivateinfo": "рэдагаваньне вашых прыватных зьвестак",
        "action-editcontentmodel": "рэдагаваньне мадэлі зьместу старонкі",
+       "action-managechangetags": "стварэньне і выдаленьне метак з базы зьвестак",
        "nchanges": "$1 {{PLURAL:$1|зьмена|зьмены|зьменаў}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|з апошняга візыту}}",
        "enhancedrc-history": "гісторыя",
        "tags-tag": "Назва тэга",
        "tags-display-header": "Новыя запісы ў сьпісе зьменаў",
        "tags-description-header": "Поўнае апісаньне значэньня",
+       "tags-source-header": "Крыніца",
        "tags-active-header": "Актыўны?",
        "tags-hitcount-header": "Пазначаныя зьмены",
+       "tags-actions-header": "Дзеяньні",
        "tags-active-yes": "Так",
        "tags-active-no": "Не",
+       "tags-source-extension": "Вызначаецца пашырэньнем",
+       "tags-source-manual": "Ставіцца ўручную ўдзельнікамі і робатамі",
+       "tags-source-none": "Больш не выкарыстоўваецца",
        "tags-edit": "рэдагаваць",
+       "tags-delete": "выдаліць",
+       "tags-activate": "актываваць",
+       "tags-deactivate": "адключыць",
        "tags-hitcount": "$1 {{PLURAL:$1|зьмена|зьмены|зьменаў}}",
+       "tags-manage-no-permission": "Вы ня маеце правоў на зьмену метак.",
+       "tags-create-heading": "Стварэньне новай меткі",
        "comparepages": "Параўнаньне старонак",
        "compare-page1": "Старонка 1",
        "compare-page2": "Старонка 2",
index 39e7748..5d9c4dc 100644 (file)
        "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": "$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": "Набор QUnit-тэстаў для MediaWiki JavaScript",
        "tooltip-pt-userpage": "Ваша ўласная старонка",
        "tooltip-pt-anonuserpage": "Старонка ўдзельніка для таго IP, з якога вы зараз працуеце",
        "tooltip-pt-mytalk": "Ваша старонка размоў",
        "just-now": "толькі што",
        "hours-ago": "$1 {{PLURAL:$1|гадзіну|гадзіны|гадзін}} таму",
        "minutes-ago": "$1 {{PLURAL:$1|мінуту|мінуты|мінут}} таму",
-       "seconds-ago": "$1 {{PLURAL:$1|секунду|секунды|секундаў}} таму",
+       "seconds-ago": "$1 {{PLURAL:$1|секунду|секунды|секунд}} назад",
        "monday-at": "У панядзелак а $1",
        "tuesday-at": "У аўторак а $1",
        "wednesday-at": "У сераду а $1",
        "api-error-unknownerror": "Невядомая памылка: «$1».",
        "api-error-uploaddisabled": "Загрузка ў гэтую вікі адключаная.",
        "api-error-verification-error": "Гэты файл можа быць пашкоджаны, ці мае няслушны канчатак назвы.",
-       "duration-seconds": "$1 {{PLURAL:$1|секунда|секунды|секундаў}}",
+       "duration-seconds": "$1 {{PLURAL:$1|секунда|секунды|секунд}}",
        "duration-minutes": "$1 {{PLURAL:$1|мінута|мінуты|мінут}}",
        "duration-hours": "$1 {{PLURAL:$1|гадзіна|гадзіны|гадзін}}",
        "duration-days": "$1 {{PLURAL:$1|дзень|дні|дзён}}",
        "rotate-comment": "Выява павернута на $1 {{PLURAL:$1|градус|градусы|градусаў}} па гадзіннікавай стрэлцы",
        "limitreport-title": "Звесткі прафілявання парсера:",
        "limitreport-cputime": "Выкарыстанне часу ЦП",
-       "limitreport-cputime-value": "$1 {{PLURAL:$1|секунда|секунды|секундаў}}",
+       "limitreport-cputime-value": "$1 {{PLURAL:$1|секунда|секунды|секунд}}",
        "limitreport-walltime": "Выкарыстанне рэальнага часу",
-       "limitreport-walltime-value": "$1 {{PLURAL:$1|секунда|секунды|секундаў}}",
+       "limitreport-walltime-value": "$1 {{PLURAL:$1|секунда|секунды|секунд}}",
        "limitreport-ppvisitednodes": "Колькасць вузлоў, наведаных прэпрацэсарам",
        "limitreport-ppgeneratednodes": "Колькасць вузлоў, створаных прэпрацэсарам",
        "limitreport-postexpandincludesize": "Памер уключэнняў па разгортванні",
index e969701..0b57887 100644 (file)
@@ -25,7 +25,8 @@
                        "StanProg",
                        "Bjankuloski06",
                        "Vodnokon4e",
-                       "ShadeOfGrey"
+                       "ShadeOfGrey",
+                       "PetaRZ"
                ]
        },
        "tog-underline": "Подчертаване на препратките:",
        "redirectedfrom": "(пренасочване от $1)",
        "redirectpagesub": "Пренасочваща страница",
        "redirectto": "Пренасочване към:",
-       "lastmodifiedat": "Последна промяна на страницата: $2, $1.",
+       "lastmodifiedat": "Последна промяна на страницата: в $2, на $1.",
        "viewcount": "Страницата е била преглеждана {{PLURAL:$1|един път|$1 пъти}}.",
        "protectedpage": "Защитена страница",
        "jumpto": "Направо към:",
        "mainpage-description": "Начална страница",
        "policy-url": "Project:Политика",
        "portal": "Портал за общността",
-       "portal-url": "Project:Портал",
+       "portal-url": "Проект:Портал на общността",
        "privacy": "Защита на личните данни",
-       "privacypage": "Project:Защита на личните данни",
+       "privacypage": "Проект:Защита на личните данни",
        "badaccess": "Грешка при достъп",
-       "badaccess-group0": "Нямате права да извършите исканото действие",
-       "badaccess-groups": "Исканото действие могат да изпълнят само потребители от {{PLURAL:$2|група|някоя от следните групи:}} $1.",
+       "badaccess-group0": "Нямате права да извършите исканото действие.",
+       "badaccess-groups": "Исканото действие могат да изпълнят само потребители от {{PLURAL:$2|групата|някоя от следните групи:}} $1.",
        "versionrequired": "Изисква се версия $1 на МедияУики",
-       "versionrequiredtext": "Ð\98зползванеÑ\82о Ð½Ð° Ñ\82ази Ñ\81Ñ\82Ñ\80аниÑ\86а Ð¸Ð·Ð¸Ñ\81ква Ð²ÐµÑ\80Ñ\81иÑ\8f $1 Ð½Ð° Ñ\81оÑ\84Ñ\82Ñ\83еÑ\80а Ð\9cедиÑ\8fУики. Ð\92ижÑ\82е [[Special:Version|Ñ\82екÑ\83Ñ\89аÑ\82а Ð¸Ð·Ð¿Ð¾Ð»Ð·Ð²Ð°Ð½Ð° Ð²ÐµÑ\80Ñ\81иÑ\8f]].",
+       "versionrequiredtext": "Използването на тази страница изисква версия $1 на софтуера МедияУики. Вижте [[Special:Version|текущата версия]].",
        "ok": "Добре",
        "pagetitle": "$1 — {{SITENAME}}",
        "retrievedfrom": "Взето от „$1“.",
        "filerenameerror": "Файлът „$1“ не можа да бъде преименуван на „$2“.",
        "filedeleteerror": "Файлът „$1“ не можа да бъде изтрит.",
        "directorycreateerror": "Невъзможно е да бъде създадена директория „$1“.",
+       "directoryreadonlyerror": "Директория \"$1\" е само за четене.",
+       "directorynotreadableerror": "Директория \"$1\" не може да бъде четена.",
        "filenotfound": "Файлът „$1“ не беше намерен.",
        "unexpected": "Неочаквана стойност: „$1“=„$2“.",
        "formerror": "Възникна грешка при изпращане на формуляра",
-       "badarticleerror": "Действието не може да се изпълни върху страницата.",
+       "badarticleerror": "Действието не може да бъде изпълнено на тази страница.",
        "cannotdelete": "Указаната страница или файл \"$1\" не можа да бъде изтрит(а). Възможно е вече да е бил(а) изтрит(а) от някой друг.",
        "cannotdelete-title": "Страницата „$1“ не може да бъде изтрита",
        "delete-hook-aborted": "Изтриването беше прекъснато от кука.\nНе беше посочена причина за това.",
        "cascadeprotected": "Тази страница е защитена против редактиране, защото е включена в {{PLURAL:$1|следната страница, която от своя страна има|следните страници, които от своя страна имат}} каскадна защита:\n$2",
        "namespaceprotected": "Нямате права за редактиране на страници в именно пространство '''$1'''.",
        "customcssprotected": "Нямате права за редактиране на тази CSS страница, защото тя съдържа чужди потребителски настройки.",
-       "customjsprotected": "Нямате права за редактиране на тази Джаваскрипт страница, защото тя съдържа чужди потребителски настройки.",
+       "customjsprotected": "Нямате права за редактиране на тази JavaScript страница, защото тя съдържа чужди потребителски настройки.",
        "mycustomcssprotected": "Нямате права за редактиране на тази CSS страница.",
        "mycustomjsprotected": "Нямате права за редактиране на тази JavaScript страница.",
        "myprivateinfoprotected": "Нямате права да редактирате личната си информация.",
        "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 знака}}.",
        "noemail": "Няма записана електронна поща за потребителя „$1“.",
        "noemailcreate": "Необходимо е да въведете валиден адрес за е-поща",
        "passwordsent": "Нова парола беше изпратена на електронната поща на „$1“.\nСлед като я получите, влезте отново.",
-       "blocked-mailpassword": "РедакÑ\82иÑ\80анеÑ\82о Ð¾Ñ\82 Ð²Ð°Ñ\88иÑ\8f IP-адÑ\80еÑ\81 Ðµ Ð·Ð°Ð±Ñ\80анено, Ð·Ð°Ñ\82ова Ð½Ðµ Ð²Ð¸ Ðµ Ð¿Ð¾Ð·Ð²Ð¾Ð»ÐµÐ½Ð¾ Ð´Ð° Ð¸Ð·Ð¿Ð¾Ð»Ð·Ð²Ð°Ñ\82е Ð²Ñ\8aзможноÑ\81Ñ\82Ñ\82а Ð·Ð° Ð²Ñ\8aзÑ\81Ñ\82ановÑ\8fване Ð½Ð° Ð·Ð°Ð³Ñ\83бена Ð¿Ð°Ñ\80ола.",
+       "blocked-mailpassword": "Редактирането от вашия IP-адрес е забранено, затова не ви е позволено да използвате възможността за възстановяване на парола.",
        "eauthentsent": "Писмото за потвърждение е изпратено на посочения адрес. В него са описани действията, които трябва да се извършат, за да потвърдите, че този адрес за електронна поща действително е ваш.",
        "throttled-mailpassword": "Функцията за напомняне на паролата е използвана през {{PLURAL:$1|последния един час|последните $1 часа}}.\nЗа предотвратяване на злоупотреби е разрешено да се изпраща не повече от едно напомняне в рамките на {{PLURAL:$1|един час|$1 часа}}.",
        "mailerror": "Грешка при изпращане на писмо: $1",
        "resetpass_header": "Промяна на парола",
        "oldpassword": "Стара парола:",
        "newpassword": "Нова парола:",
-       "retypenew": "Ð\9dова Ð¿Ð°Ñ\80ола Ð¿Ð¾Ð²Ñ\82оÑ\80но:",
+       "retypenew": "Ð\9fовÑ\82оÑ\80и Ð½Ð¾Ð²Ð°Ñ\82а Ð¿Ð°Ñ\80ола:",
        "resetpass_submit": "Избиране на парола и влизане",
        "changepassword-success": "Паролата ви беше променена успешно!",
        "changepassword-throttled": "Направили сте твърде много опити да въведете паролата за тази сметка.\nНеобходимо е да изчакате $1 преди да опитате отново.",
        "passwordreset-text-many": "{{PLURAL:$1|За получаване на временна парола по електронна поща е необходимо да попълните едно от полетата.}}",
        "passwordreset-legend": "Възстановяване на парола",
        "passwordreset-disabled": "Възстановяването на паролата е изключено в това уики.",
-       "passwordreset-emaildisabled": "Функционалността за електронна поща е изключена в това уики.",
+       "passwordreset-emaildisabled": "Функцията за електронна поща е изключена в това уики.",
        "passwordreset-username": "Потребителско име:",
        "passwordreset-domain": "Домейн:",
        "passwordreset-capture": "Преглеждане на електронното писмо?",
        "passwordreset-emailtext-ip": "Някой (вероятно вие, от IP адрес $1) поиска възстановяване на паролата за сметката в {{SITENAME}} ($4). За {{PLURAL:$3|следната сметка|следните сметки}}\nе посочен този адрес за електронна поща:\n\n$2\n\n{{PLURAL:$3|Тази временна парола ще бъде активна|Тези временни пароли ще бъдат активни}} {{PLURAL:$5|един ден|$5 дни}}.\nСега би трябвало да влезете в системата и да си изберете нова парола. Ако заявката е направена от друг или пък сте си спомнили паролата и не искате да я променяте, можете да пренебрегнете това съобщение и да продължите да използвате старата си парола.",
        "passwordreset-emailtext-user": "Потребител $1 от {{SITENAME}} поиска възстановяване на паролата за сметката в {{SITENAME}}\n($4). За {{PLURAL:$3|следната сметка|следните сметки}} е посочен този адрес за електронна поща:\n\n$2\n\n{{PLURAL:$3|Тази временна парола ще бъде активна|Тези временни пароли ще бъдат активни}} {{PLURAL:$5|един ден|$5 дни}}.\nСега би трябвало да влезете в системата и да изберете нова парола. Ако заявката е направена \nот друг или пък сте си спомнили паролата и не искате да я променяте, можете да пренебрегнете \nтова съобщение и да продължите да използвате старата си парола.",
        "passwordreset-emailelement": "Потребителско име: $1\nВременна парола: $2",
-       "passwordreset-emailsent": "На електронната поща беше испратено писмо за възстановяване на паролата.",
+       "passwordreset-emailsent": "На електронната поща беше изпратено писмо за възстановяване на паролата.",
        "passwordreset-emailsent-capture": "По-долу е показано електронното писмо за възстановяване на паролата, което беше изпратено.",
        "passwordreset-emailerror-capture": "По-долу е показано създадено електронно писмо за възстановяване на паролата, което не беше изпратено на {{GENDER:$2|потребителя}}: $1",
        "changeemail": "Промяна на адреса за е-поща",
        "protectedpagewarning": "'''Внимание: Страницата е защитена и само потребители със статут на администратори могат да я редактират.'''\nЗа справка по-долу е показан последният запис от дневниците.",
        "semiprotectedpagewarning": "'''Забележка:''' Тази страница е защитена и само регистрирани потребители могат да я редактират.\nЗа справка по-долу е показан последният запис от дневниците.",
        "cascadeprotectedwarning": "'''Внимание:''' Страницата е защитена, като само потребители с администраторски права могат да я редактират. Тя е включена в {{PLURAL:$1|следната страница|следните страници}} с каскадна защита:",
-       "titleprotectedwarning": "'''Ð\92нимание: Ð¢Ð°Ð·Ð¸ Ñ\81Ñ\82Ñ\80аниÑ\86а Ðµ Ð·Ð°Ñ\89иÑ\82ена Ð¸ Ñ\81а Ð½ÐµÐ¾Ð±Ñ\85одими [[Special:ListGroupRights|Ñ\81пеÑ\86иално права]], за да бъде създадена.'''\nЗа справка по-долу е показан последният запис от дневниците.",
+       "titleprotectedwarning": "'''Ð\92нимание: Ð¢Ð°Ð·Ð¸ Ñ\81Ñ\82Ñ\80аниÑ\86а Ðµ Ð·Ð°Ñ\89иÑ\82ена Ð¸ Ñ\81а Ð½ÐµÐ¾Ð±Ñ\85одими [[Special:ListGroupRights|Ñ\81пеÑ\86иални права]], за да бъде създадена.'''\nЗа справка по-долу е показан последният запис от дневниците.",
        "templatesused": "{{PLURAL:$1|Шаблон, използван|Шаблони, използвани}} на страницата:",
        "templatesusedpreview": "{{PLURAL:$1|Шаблон, използван|Шаблони, използвани}} в предварителния преглед:",
        "templatesusedsection": "{{PLURAL:$1|Шаблон, използван|Шаблони, използвани}} в този раздел:",
        "log-fulllog": "Преглеждане на пълния дневник",
        "edit-hook-aborted": "Редакцията беше прекъсната от кука.\nНе беше посочена причина за това.",
        "edit-gone-missing": "Страницата не можа да се обнови.\nВероятно междувременно е била изтрита.",
-       "edit-conflict": "РедакÑ\86ионен ÐºÐ¾Ð½Ñ\84ликÑ\82.",
+       "edit-conflict": "РазлиÑ\87на Ñ\80едакÑ\86иÑ\8f",
        "edit-no-change": "Редакцията ви беше пренебрегната, защото не съдържа промени по текста.",
        "postedit-confirmation-created": "Страницата е създадена.",
        "postedit-confirmation-restored": "Страницата е възстановена.",
        "content-model-text": "обикновен текст",
        "content-model-javascript": "Джаваскрипт",
        "content-model-css": "CSS",
-       "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>.",
+       "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В момента има {{PLURAL:$1|$1 обръщение|$1 обръщения}} към такива функции, а трябва да {{PLURAL:$1|е|са}} по-малко от $2.",
        "expensive-parserfunction-category": "Страници, които прекалено много пъти използват ресурсоемки парсерни функции",
        "post-expand-template-inclusion-warning": "Внимание: Размерът за включване на този шаблон е твърде голям.\nНякои шаблони няма да бъдат включени.",
        "post-expand-template-inclusion-category": "Страници, съдържащи шаблони с превишени размери на включеното съдържание",
-       "post-expand-template-argument-warning": "Ð\92нимание: Ð¢Ð°Ð·Ð¸ Ñ\81Ñ\82Ñ\80аниÑ\86а Ñ\81Ñ\8aдÑ\8aÑ\80жа Ð¿Ð¾Ð½Ðµ ÐµÐ´Ð¸Ð½ Ð¿Ð°Ñ\80амеÑ\82Ñ\8aÑ\80 Ð½Ð° Ñ\88аблон, ÐºÐ¾Ð¹Ñ\82о Ð¸Ð¼Ð° Ñ\82вÑ\8aÑ\80де Ð³Ð¾Ð»Ñ\8fм Ñ\80азмеÑ\80 Ð¿Ñ\80и Ñ\80азгÑ\80Ñ\8aÑ\89ане. Ð¢ÐµÐ·Ð¸ Ð¿Ð°Ñ\80амеÑ\82Ñ\80и бяха пропуснати.",
-       "post-expand-template-argument-category": "СÑ\82Ñ\80аниÑ\86и, Ñ\81Ñ\8aдÑ\8aÑ\80жаÑ\89и Ñ\88аблони Ñ\81 Ð¿Ñ\80опÑ\83Ñ\81наÑ\82и Ð¿Ð°Ñ\80амеÑ\82Ñ\80и",
+       "post-expand-template-argument-warning": "Ð\92нимание: Ð¢Ð°Ð·Ð¸ Ñ\81Ñ\82Ñ\80аниÑ\86а Ñ\81Ñ\8aдÑ\8aÑ\80жа Ð¿Ð¾Ð½Ðµ ÐµÐ´Ð¸Ð½ Ð°Ñ\80гÑ\83менÑ\82 Ð½Ð° Ñ\88аблон, ÐºÐ¾Ð¹Ñ\82о Ð¸Ð¼Ð° Ñ\82вÑ\8aÑ\80де Ð³Ð¾Ð»Ñ\8fм Ñ\80азмеÑ\80 Ð¿Ñ\80и Ñ\80азгÑ\80Ñ\8aÑ\89ане. Ð¢ÐµÐ·Ð¸ Ð°Ñ\80гÑ\83менÑ\82и бяха пропуснати.",
+       "post-expand-template-argument-category": "СÑ\82Ñ\80аниÑ\86и, Ñ\81Ñ\8aдÑ\8aÑ\80жаÑ\89и Ñ\88аблони Ñ\81 Ð¿Ñ\80опÑ\83Ñ\81наÑ\82и Ð°Ñ\80гÑ\83менÑ\82и",
        "parser-template-loop-warning": "Открито зацикляне на шаблон: [[$1]]",
        "parser-template-recursion-depth-warning": "Надвишен лимит на дълбочината при шаблонна рекурсия ($1)",
        "language-converter-depth-warning": "Надвишени са възможностите за автоматичен превод ($1)",
        "parser-unstrip-recursion-limit": "''Unstrip'' лимита на рекурсия превишава ($1)",
        "undo-success": "Редакцията може да бъде върната. Прегледайте долното сравнение и се уверете, че наистина искате да го направите. След това съхранете страницата, за да извършите връщането.",
        "undo-failure": "Редакцията не може да бъде върната поради конфликтни междинни редакции.",
-       "undo-norev": "Редакцията не може да бъде върната тъй като не съществува или е била изтрита.",
+       "undo-norev": "Редакцията не може да бъде върната, тъй като не съществува или е била изтрита.",
        "undo-summary": "Премахната редакция $1 на [[Special:Contributions/$2|$2]] ([[User talk:$2|беседа]])",
        "cantcreateaccounttitle": "Невъзможно е да бъде създадена потребителска сметка.",
        "cantcreateaccount-text": "[[User:$3|Потребител:$3]] е блокирал(а) създаването на сметки от този IP-адрес ('''$1''').\n\nПричината, изложена от $3, е ''$2''",
        "currentrev-asof": "Текуща версия към $1",
        "revisionasof": "Версия от $1",
        "revision-info": "Версия от $1 на {{GENDER:$6|$2}}$7",
-       "previousrevision": "←По-стара версия",
-       "nextrevision": "По-нова версия→",
-       "currentrevisionlink": "преглед на текущата версия",
+       "previousrevision": "← По-стара версия",
+       "nextrevision": "По-нова версия →",
+       "currentrevisionlink": "Ð\9fреглед на текущата версия",
        "cur": "тек",
        "next": "след",
        "last": "пред",
        "revdelete-failure": "'''Видимостта на редакцията не може да бъде обновена:'''\n$1",
        "logdelete-success": "Видимостта на събитието беше променена.",
        "logdelete-failure": "'''Видимостта на дневника не може да бъде променяна:'''\n$1",
-       "revdel-restore": "Ð\9fромяна на видимостта",
+       "revdel-restore": "промяна на видимостта",
        "pagehist": "История на страницата",
        "deletedhist": "Изтрита история",
        "revdelete-hide-current": "Грешка при скриване на елемента от $2, $1: представлява текущата версия.\nТя не може да бъде скрита.",
        "preferences": "Настройки",
        "mypreferences": "Настройки",
        "prefs-edits": "Брой редакции:",
-       "prefsnologintext2": "За да промените настройките си е необходимо да влезете в систеата.",
+       "prefsnologintext2": "Ð\97а Ð´Ð° Ð¿Ñ\80омениÑ\82е Ð½Ð°Ñ\81Ñ\82Ñ\80ойкиÑ\82е Ñ\81и Ðµ Ð½ÐµÐ¾Ð±Ñ\85одимо Ð´Ð° Ð²Ð»ÐµÐ·ÐµÑ\82е Ð² Ñ\81иÑ\81Ñ\82емаÑ\82а.",
        "prefs-skin": "Облик",
-       "skin-preview": "предварителен преглед",
+       "skin-preview": "Ð\9fредварителен преглед",
        "datedefault": "Без предпочитание",
        "prefs-labs": "Функционалности на Labs",
        "prefs-user-pages": "Потребителски страници",
        "grouppage-suppress": "{{ns:project}}:Ревизори",
        "right-read": "четене на страници",
        "right-edit": "редактиране на страници",
-       "right-createpage": "създаване на страници (които не са беседи)",
-       "right-createtalk": "създаване на дискусионни страници",
-       "right-createaccount": "създаване на нови потребителски сметки",
-       "right-minoredit": "отбелязване като малка промяна",
-       "right-move": "преместване на страници",
-       "right-move-subpages": "преместване на страници и техните подстраници",
+       "right-createpage": "Създаване на страници (които не са беседи)",
+       "right-createtalk": "Създаване на дискусионни страници",
+       "right-createaccount": "Създаване на нови потребителски сметки",
+       "right-minoredit": "Ð\9eтбелязване като малка промяна",
+       "right-move": "Ð\9fреместване на страници",
+       "right-move-subpages": "Ð\9fреместване на страници и техните подстраници",
        "right-move-rootuserpages": "Преместване на основни потребителски страници",
        "right-move-categorypages": "Преместване на категорийни страници",
        "right-movefile": "Преместване на файлове",
        "right-suppressredirect": "без създаване на пренасочване от старото име при преместване на страница",
-       "right-upload": "качване на файлове",
-       "right-reupload": "презаписване на съществуващ файл",
+       "right-upload": "Ð\9aачване на файлове",
+       "right-reupload": "Ð\9fрезаписване на съществуващ файл",
        "right-reupload-own": "Презаписване на съществуващ файл, качен от същия потребител",
        "right-reupload-shared": "Предефиниране на едноименните файлове от общото мултимедийно хранилище с локални",
        "right-upload_by_url": "качване на файл от URL адрес",
        "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": "'''Легенда:'''",
        "blocklog-showlog": "Потребителят е бил блокиран в миналото.\nЗа справка по-долу е дадено извлечение от дневника на блокиранията:",
        "blocklog-showsuppresslog": "Потребителят е бил блокиран и прикриван в миналото.\nЗа справка по-долу е дадено извлечение от дневника на прикриванията:",
        "blocklogentry": "блокира [[$1]] със срок на изтичане $2 $3",
-       "reblock-logentry": "промени параметрите на блокирането на [[$1]] със срок на изтричане $2 $3",
+       "reblock-logentry": "промени параметрите на блокирането на [[$1]] със срок на изтичане $2 $3",
        "blocklogtext": "Тази страница съдържа дневник на блокиранията и отблокиранията.\nАвтоматично блокираните IP-адреси не са показани.\nВижте [[Special:BlockList|списъка на блокираните IP-адреси]] за текущото състояние на блокиранията.",
        "unblocklogentry": "отблокира $1",
        "block-log-flags-anononly": "само анонимни потребители",
index 394db69..25bf272 100644 (file)
@@ -7,6 +7,10 @@
        "tog-underline": "لینکانی جهلگا خط کشیتین",
        "tog-hideminor": "کمین تغیرات شه آخیرین تغیراتانی لڑلیستا چیهر داته بئینت",
        "tog-hidepatrolled": "گشت وارته گین ایڈ\tیٹان شه آخیرین ایڈ\tیٹانی لڑلیستا چیهر داته بئینت",
+       "tog-newpageshidepatrolled": "گشت وارته ئین تاکدیمان شه نی نوکین تاکدیمانی لڑ لیستا زیان بیئنت",
+       "tog-extendwatchlist": "پراخ کورتین واچلیستی لڑلیست په موچین تغیراتان،نه فقط آخرینان",
+       "tog-usenewrc": "گروپ بندی تغیراتانئ بی اساسئ تاکدیمانئ اخیر ئین تغیران و واچلیستئ لڑ لیستا",
+       "tog-numberheadings": "ئنوانانئ اتوماتیکین شماره گذاری",
        "tog-showtoolbar": "نشان داتین ایڈیٹی نوارئ",
        "tog-editondblclick": "تاکدیمانی ایڈیٹ کورتین گو دو کلیک ئا",
        "tog-editsectiononrightclick": "پئال کورتین بخشانی ایڈیٹی گو راست کلیکا بی ئنوانی سرا",
        "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": "در بوتینی وختا شه ایڈ\tیٹی دیما اگر نی ایڈ\tیٹ تا هنگه ذخیره نه بوتتن ، په من هشدار دیم داته بیئت",
+       "tog-prefershttps": "بی داخل بوتینی وختا باید موچین وختا شه امنین اتصال ئا استفاده بیئت",
        "underline-always": "موچین وختا",
        "underline-never": "هیچ وخت",
+       "underline-default": "پیش فرضین پوسته یا بروزیر",
+       "editfont-style": "ایڈ\tیٹی جئبه ئی قلمی سبک:",
+       "editfont-default": "پیش فرضین بروزیر",
        "editfont-monospace": "گو ثابیتین اندزه ئی قلم ئا",
        "editfont-sansserif": "قلم بی شه گوشه ئا",
        "editfont-serif": "گوشه دارین قلم",
        "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تهر ئه انت .",
+       "category-article-count": "{{PLURAL:$2|ای تهر فقط جهلگی همی یکین تاکدیمانا داریت.|{{PLURAL:$1|ای تاکدیم|ای $1 تاکدیم}} بی ای تهرئ تا قرار {{PLURAL:$1|داریت|دارنت}}؛ ای تهر موچاموچ $2 تاکدیم داریت.}}",
+       "category-article-count-limited": "{{PLURAL:$1|جهلگی تاکدیم|$1 جهلگی تاکدیمان}} بی انونین تهرئ تا قرار دارنت.",
+       "category-file-count": "{{PLURAL:$2|ای تهر تانا ای جهلگین فایلا داریت .|{{PLURAL:$1|ای فایل|ای $1 فایل}} بی ای تهرئ تا جاه {{PLURAL:$1|داریت|دارنت}}؛ ای تهر تا موچاموچ $2 فایل انت.}}",
+       "category-file-count-limited": "{{PLURAL:$1|جهلگین فایل|$1 جهلگین فایلان}} بی انونین تهرئ تا قرار دارنت.",
        "listingcontinuesabbrev": "(ادامه)",
        "index-category": "آ تاکدیمان که دیسته بوته گنت",
        "noindex-category": "آ تاکدیمان که دیسته نه بوته گنت",
        "jumpto": "جوپ کورتین بی:",
        "jumptonavigation": "ناوبری",
        "jumptosearch": "گشتین",
+       "view-pool-error": "متاسفانه موچین سرویس بی انونین وختا باز مشغول انت.\nبازین شه کار گیروکان لوٹنت که ای تاکدیما بگیندنت. \nمهربانی بکنیت دیم شه ایشی که پدا په ای تاکدیمی دیستینا کوشش بکنیت یک کمی صبر بکنیت.\n\n$1",
+       "generic-pool-error": "متاسفانه موچین سرویس بی انونین وختا باز مشغول انت.\nبازین شه کار گیروکان لوتنت که ای تاکدیما بگیندنت. \nمهربانی بکنیت دیم شه ایشی که پدا په ای تاکدیمی دیستینا کوشش بکنیت یک کمی صبر بکنیت.",
        "pool-timeout": "تمام بوتین انتظارمهلتئ په قُلپ کورتینئ خاتیرا",
        "pool-queuefull": "مخزن ئی صف پر اینت",
        "pool-errorunknown": "ناشناخته ئین خطا",
        "poolcounter-usage-error": "خطا استفاده شه: $1",
        "aboutsite": "بی بارها {{SITENAME}}",
        "aboutpage": "Project:بی بارها",
+       "copyright": "محتوایات بی  $1 اجازه نامه ئا هستنت مگه ای که آی خلاف ئا ذکر بوته بیئنت .",
+       "copyrightpage": "{{ns:project}}:کاپی رایت یا باز کورتینی حق",
+       "currentevents": "انونین واقئات",
+       "currentevents-url": "Project:انونین واقئاتان",
+       "disclaimers": "تکذیب‌ نامه‌هان",
+       "disclaimerpage": "Project:ئمومی ئین تکذیب‌ نامه",
        "edithelp": "کومک په ایدیت ئی خاتیرا",
        "mainpage": "بُنیادی تاکدیم",
        "mainpage-description": "بُنیادی تاکدیم",
        "privacy": "سیاست محرمانگی",
        "privacypage": "Project:سیاست محرمانگی",
        "badaccess": "دسترسی ئی خطا",
+       "badaccess-group0": "شما اجازه په ای ئملی اجرائا که درخواست کورته ئیت نداریت.",
+       "badaccess-groups": "ای ئملی که شما درخواست کورته ئیت مخصوص بی  {{PLURAL:$2|ای گروپ|ای گروپ ئان}} شه کار زوروکان اینت: $1.",
+       "versionrequired": "نخسه $1 شه میڈ\tیا ویکی ئی نرم افزار ئا لازم اینت",
+       "versionrequiredtext": "په ای تاکدیمی دیستینی خاتیرا بی نخسه ئی  $1 تا شه میڈ\tیا ویکی ئی نرم افزار ئا ضرورت اینت .\nبی [[Special:Version|ای تاکدیما]] برویت.",
        "ok": "قبول داشتین",
        "retrievedfrom": "گیپته بوته شه  «$1»",
        "youhavenewmessages": "$1 داریت ($2).",
        "viewdeleted": "نشان داتین $1؟",
        "restorelink": "{{PLURAL:$1|یک|$1}} ڈ\tیلیٹ بوتگینئ ایڈ\tیٹ",
        "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": "میڈ\tیای تاکدیم",
        "nstab-category": "تهر",
        "nosuchaction": "ایرنگین ئملی وجود نداریت",
        "nosuchactiontext": "ای ئملی که شما مشخص کورته ئیت بی انترنیتئین ادرسی تا جواز نداریت .\nممکن اینت که انترنتین ادرسا جوان وارد نه کورته ئیت یا مشکل والا ئین لینک ئیا وارد کوره ئیت .\nیا امکان داریت که شه نرم افزاری که شما بی{{SITENAME}} تا استفاده کورته ئیت مشکل داشته بیئت.",
+       "nosuchspecialpage": "ای رقمین ویژه ئین تاکدیمی موجود نه اینت",
+       "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": "'''هشدار:''' امکان داریت که تاکدیم آخرین اپدیت ئا شامل مه بیئت .",
+       "readonly": "مئلوماتئ بانک قُلپ بوت",
+       "enterlockreason": "یک دلیلی په قُلپ کورتینا بیاریت، که آیی تا نشان داته بوته بیئت که چی وختی قُلپ پاچه ئه بیئت",
+       "readonlytext": "انون مئلوماتئ بانک په تغیراتان و جوڑ\t کورتینئ تاکدیمانیا قُلپ بوته؛ای حالت احتمالآ په خاتیری تئمیراتان است و پدا شه آیی وضیئت بی حالت اول ئا بیئر ئه گردید.\n\nمدیری که آیرا قُلپ کورته وتی توضیئاتانا پیش کورته است : $1",
+       "missing-article": "مئلوماتین بانک تاکدیمی متنا گو «$1» $2 ئی ناما که باید ودي کورتین ، ودي کورته نه توانت.\n\nاین مشکل معمولاً وختی ئه کیت که شما یک کهنگین لینک ئی و یا پاک بوتگین تاکدیمیا پدا بگردیت.\n\nیا دیگه شاید بی سافٹ ایر تا مشکل بیئت.\nمهربانی بکنیت ای مشکلا گو انترنتی ئین ادرسئ گوشتینا بی یکی شه [[Special:ListUsers/sysop|مدیرئان]] راپور دهیت.",
        "missingarticle-rev": "(شمارهٔ نسخه: $1)",
        "missingarticle-diff": "(تفاوت: $1، $2)",
+       "readonly_lag": "مئلوماتین بانک بی انونین وختا اتوماتیکین رکما قُلپ بوته تا که پشتوانی ئی و بُنیادی ئین نخسه گو وت هماهنگ بیئنت",
        "internalerror": "داخلین خطا",
        "internalerror_info": "داخلین خطا: $1",
        "filecopyerror": "نه شه فایل «$1» بی «$2» کاپی بیئت.",
        "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": "ای تاکدیمی اپڈیٹ کورتین انون غیر فئال بوته.\nای تاکدیمی مئلومات ممکن اینت که نوک نه بوته انت.",
        "viewsource": "نشان داتین مبدائی",
        "viewsource-title": "مبدا ئی نشان داتین په $1",
        "actionthrottled": "شمی ئملی دیم گیپته بوت",
+       "actionthrottledtext": "په دیمگیری شه اسپم شینک بوتینی خاتیرا، په شما اجازه نه اینت که ایرنگین ئملی ئا چینکه وار بی یک کمین وختی تا انجام دهیت.\nمهربانی بکنیت پد شه چینکه دقیقه ئا کوشش بکنیت.",
+       "protectedpagetext": "ای تاکدیم په دیمگیری شه ایڈیٹ و یا دیگرین فئالیئتان قُلپ بوته.",
        "viewsourcetext": "شما ئه توانیت ای تاکدیمی مبدائا بگیندیت و یا کاپی بکنیت:",
+       "viewyourtext": "شما ئه تونیت که  '''وتئ ایڈیٹانی'''  منشاء ئا بی ای تاکدیمی تا بگیندیت و کاپی بکنیت:",
+       "protectedinterface": "ای تاکدیم یک متنی ئا ارایه ئه کنت که ای ویکی ئی تا یک سافٹ ایرئ  په واسط بی کار زوروکانی مانجینا اینت و په دیمگیری ئا شه خرابکاری ئی  خاتیرا قُلپ بوته.\nپه اضافه کورتین یا تغیر داتین ترجمه په موچین ویکی ئان ، مهربانی بکنیت شه [//translatewiki.net/ translatewiki.net]، میڈیا ویکی ئی محلی کورتینی پروژه ئا ، استفاده بکنیت.",
+       "editinginterface": "<strong>هشدار:</strong> تاکدیمی که ایڈیٹ ئه کنیت متنی ئا شامل ئه بیئت که بی ای کار زوروکئ واسط ئی سافت ایر تا به کار گیپته بوته.\nای تاکدیمی تغییر  منجر بئ کار زوروکئ واسط ئی  ظاهر ئین تغیر ای سافت ایر په دیگه کار زوروکان ئه بیئت.",
+       "translateinterface": "په اضافه کورتین یا تغیر داتین ترجمه ئی په موچین ویکی ئان،مهربانی بکنیت شه [//translatewiki.net/ translatewiki.net]، مییڈیا ویکی  محلی کورتینی پروژه ئا، استفاده بکنیت.",
+       "cascadeprotected": "ای تاکدیم بئ ایڈیٹتانی مقابلا قُلپ بوته چونکه بی جهلگین قُلپ بوته ئین  {{PLURAL:$1|تاکدیم|تاکدیمانئ}} تا بئ {{PLURAL:$1|آوان|آوانئ}} تا «آپشاری» ئی گزینه انتخاب بوته:\n$2",
+       "namespaceprotected": "شما '''$1''' ئی تاکدیمانئ فضای نامئ ایڈیٹ کورتین ئی اجازه ئا  نداریت.",
+       "customcssprotected": "شما ای سی اس اس ئی تاکدیمئ ایڈیٹ ئی اجازه ئا نداریت، په خاتیریکه ایشی تا یک کار زوروکئ شخصی ئین تنظیمات هستنت.",
+       "customjsprotected": "شما ای جاوااسکریپت ئی تاکدیمئ ایڈیٹ ئی اجازه ئا نداریت، په خاتیریکه ایشی تا یک کار زوروکئ شخصی ئین تنظیمات هستنت.",
+       "mycustomcssprotected": "شما ای سی اس اس ئی تاکدیمی ایڈیٹ ئی اجازه ئه نداریت.",
+       "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": "کار زوروکین نام:",
        "yourpasswordagain": "پاسوردی تکرار کورتین",
        "createacct-yourpasswordagain": "پاسوردا تایید کورتین",
        "createacct-yourpasswordagain-ph": "پاسوردا پدا داخل کورتین دومین وارا",
+       "remembermypassword": "پاسورد یا چیهرگال ئا (تا حداکثر $1 {{PLURAL:$1|روچ|روچ}}) بئ ای بروزیري تا بسات",
        "userlogin-remembermypassword": "نا داخل بوتگ بسات",
        "userlogin-signwithsecure": "شه امنیت ئا استفاده بکنیت",
        "yourdomainname": "شمی دامنهٔ:",
        "password-change-forbidden": "شما ئا نه توانیت که بی ای ویکی تا پاسوردا تغیر بدهیت",
+       "externaldberror": "بئ مئلوماتین بانکی تا یک اوتوماتیکین خطا ئی رخ داته و یا ایکه شما وتئ خارجی ئین حسابئ شما اپڈیٹ کورتینی ئی اجازه ئا نداریت.",
        "login": "داخل بوتین",
        "nav-login-createaccount": "داخل بوتین  / کار زوروکین حسابي جوڑ کورتین",
        "userlogin": "داخل بوتین  / کار زوروکین حسابي جوڑ کورتین",
        "loginerror": "خطا بی داخل بوتینی تا",
        "createacct-error": "کار زوروکین حسابئ جوڑ کورتینی خطا",
        "createaccounterror": "ای حسابئ جوڑ کورتین امکان نداریت: $1",
+       "noname": "شما یک موتبرین کار زوروکی ئین نامی ئا مشخص نه کورته ئیت.",
+       "loginsuccesstitle": "کامیابین لوگین",
+       "loginsuccess": "'''شما انون گو «$1» ئی نا بی {{SITENAME}} ئی تا داخل بوته ایت.'''",
+       "nosuchusershort": "هیچ کار زوروکئ بی نامئ  ''$1'' ئا وجود نداریت.\nوتئ املا ئا چیک بکنیت.",
+       "nouserspecified": "باید یک کار زوروکئ نام مشخص بکنیت.",
+       "login-userblocked": "ای کار زوروک بلاک بوته، په داخل بوتینا اجازه نه اینت.",
+       "wrongpassword": "ای پاسورد یا چیهر گالا که داخل کورته ایت صحیح نه اینت.\nمهربانی بکنیت، پدا امتحان بکینت.",
+       "wrongpasswordempty": "ای پاسورد یا چیهر گالا که داخل کورته ایت ، خالی اینت.\nمهربانی پدا کوشش بکنیت.",
        "passwordtooshort": "پاسورد باید کم شه کم {{PLURAL:$1|۱ حرف|$1 حرف}} داشته بیئت.",
+       "password-name-match": "شمی چیهرگال یا پاسورد باید شه شمی کار زورکی ئین ناما فرق داشته بیئت.",
+       "password-login-forbidden": "استفاده شه ای کار زوروکی ناما و شه ای چیهرگالا اجازه نه اینت.",
        "mailmypassword": "پاک کورتین پاسوردئ",
+       "passwordremindertitle": "نوکین موقتی ئین چیهرگال یا پاسورد په  {{SITENAME}}",
+       "noemail": "هیچ ایمیل ادرسئ په  «$1» کار زوروکا ثبت نه بوته.",
+       "noemailcreate": "باید یک موتبرین ایمیل ادرسئ داخل بکنیت",
+       "mailerror": "خطا بی ایمیلی داتینی تا: $1",
+       "emailauthenticated": "شمی ایمیلی ادرس بی $2 سائت $3  تا تصدیق ئه بیئت.",
+       "emailnotauthenticated": "شمی ایمیلئ ادرس تا انون قبول نه بوته.\nایمیل په هیچ یک شه ویژه گی ئان دیم داته ئه نه بیئت.",
+       "noemailprefs": "په ای قابلیت ئانی دیمبورتینا یک ایمیل ادرسئ مشخص بکنیت.",
+       "emailconfirmlink": "وتئ ایمیل ادرسی تائید کورتین",
+       "cannotchangeemail": "شمی حسابئ ایمیلئ تغیر داتین بی ای ویکی ئی تا تغیری وڈ نه اینت.",
+       "emaildisabled": "ای ویبسایت ایمیل ئا دیم داته ئه نه کنت.",
        "accountcreated": "کار زوروکین حساب جوڑ بوت",
+       "accountcreatedtext": "کار زوروکئ حساب په [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|هبر و گپ]]) جوڑ بوته.",
+       "createaccount-title": "کار زوروکئ حساب جوڑ کورتین بی {{SITENAME}}",
+       "createaccount-text": "یک نفری په شمی ایمیلا یک کار زوروکین حسابئ  بی {{SITENAME}} تا گو «$2» ناما جوڑ کورته ($4)، که آیی پاسورد ایش اینت : $3\nشما باید همی انون وتئ حسابئ تا داخل بئیت و وتئ پاسوردا تغیر بدهیت .\n\nاگه ای حساب اشتباهی جوڑ بوته ، ای پیام ئا نادیستگ بگیریت.",
+       "login-abort-generic": "شمی لوگین ناکام ات - ساکت بوت",
+       "login-migrated-generic": "شمی کار زوروکین نام انتقال بوته، و شمی کار زوروکین نام دیگه بی ای ویکی ئی تا وجود نداریت.",
        "loginlanguagelabel": "زبان: $1",
+       "suspicious-userlogout": "شمی ریکویست په دربوتینی خاتیرا رد بوت، بی خاتیریکه بی نظر ئه رسیئت که ای درخواست شه  خراب و یا پروکسی ئین بروزیرئ نیمگا دیم داته بوته.",
+       "createacct-another-realname-tip": "واقئین نام اختیاری اینت.\nاگه آیی را بنویسیت شه شما بی قدردانی ئی وختا شه شمی واقئین ناما استفاده بیئت",
        "pt-login": "داخل بوتین",
        "pt-login-button": "داخل بوتین",
        "pt-createaccount": "کار زوروکین حسابئ جوڑ کورتین",
        "pt-userlogout": "در بوتین",
+       "php-mail-error-unknown": "نا زانتین خطابی تابع  mail()‎ پی‌اچ‌پی",
+       "user-mail-no-addy": "کوشش په دیم داتین یک خط بی شه گوجام ایمیل ادرسئ  ئا.",
+       "user-mail-no-body": "کوشش په دیم داتین ئا یک گونڈین یا خالی ئین ایمیل ئی ئا.",
+       "changepassword": "پاسوردی تغیر داتین",
        "resetpass_header": "پاسوردئ تغیر داتین",
        "oldpassword": "دیمئ پاسورد:",
        "newpassword": "نوکین پاسورد:",
        "retypenew": "نوکین پاسوردا پدا داخل کورتین",
        "resetpass_submit": "پاسوردی تنظیم و داخل بوتین",
        "changepassword-success": "شمی پاسوردئ تغیر کامیاب بوت و پاسورد تغیر کورت",
+       "resetpass_forbidden": "نه توانیت که پاسوردا تغیر بدهیت",
+       "resetpass-no-info": "په ای تاکدیمی دسترسی ئی خاتیرا داخل بئیت.",
        "resetpass-submit-loggedin": "پاسوردی تغیر داتین",
        "resetpass-submit-cancel": "کنسیل",
        "resetpass-temp-password": "موقیئتین پاسورد:",
        "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-emailelement": "کار زوروکئ نام: $1\nموقت ئین چیهرگال: $2",
+       "passwordreset-emailsent": "یک ایمیل په چیهر گالئ  پاک بوتین  خاتیرا دیم داته بوت.",
+       "passwordreset-emailsent-capture": "یک ایمیلئ په بیئرگردینتین ئا پاسوردئ خاتیرا، دیم داته بوت.",
        "changeemail": "ایمیل ادرسی تغیر داتین",
+       "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-done": "بیئر گردینتین نشانگ ئان.",
        "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": "دیم دیست",
        "showdiff": "تغیراتانئ نشان داتین",
        "blankarticle": "<strong>هشدار:</strong> شما انون یک خالین تاکدیمی جوڑ کورتینی حالا وَیت .\nاگر «{{int:savearticle}}» ئا پدا  کلیک کنیت، یک تاکدیمی بدون شه محتوائا جوڑ ئه بیئت.",
        "anoneditwarning": "<strong>هشدار:</strong> شما داخل نه بوته ئیت. شمی آی‌پی نشانگ ئا موچی ئه تواننت بگیندنت اگر شما هر تغیری بیاریت . اگر <strong>[$1 داخل بئیت]</strong> یا <strong>[$2 یک کار زوروکین حساب جوڑ بکنیت]</strong>، شمی ایڈیٹ\t بی شمی کار زوروکین ناما شینک ئه بیئنت و گون گو دیگرین مزایان .",
+       "anonpreviewwarning": "<em>شما لوگین نه بوته ئیت. ذخیره کورتین باعث ئه بیئت که شمی آی پی ادرس بی ای تاکدیمی تاریخچه ئی تا ثبت بیئت.</em>",
+       "missingcommenttext": "مهربانی بکنیت جهلگا توضیح دهیت.",
+       "summary-preview": "دیم دیست ئی خلاصه:",
        "blockedtitle": "کار زوروک بسته بوته",
+       "blockednoreason": "دلیلی مشخص نه بوته",
+       "whitelistedittext": "په مقاله ئانی ایڈیٹ ئا باید $1.",
+       "nosuchsectiontitle": "ایرنگی بخشئ ودئ نه بوت",
        "loginreqtitle": "لوگین بوتین ضروری اینت",
        "loginreqlink": "داخل بوتین",
+       "loginreqpagetext": "په دیگه تاکدیمانئ دیستینا باید  $1.",
        "accmailtitle": "پاسورد دیم داته بوت.",
        "newarticle": "(نوکین)",
+       "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": "#$1 ئی ایڈیٹ شه  «{{FULLPAGENAME}}» ئی تاکدیما موجود نه اینت.\n\nمعمولاً بئ اثر لینک بئ تاریخچهٔ ئا اپڈیٹ نه بوته و تاکدیم پاک بوته.\nتوانیت ایدت مئلومات بئ  [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} پاک بوته ئین سیاه چال ئی] تا بگیندیت.",
+       "userpage-userdoesnotexist": "«<nowiki>$1</nowiki>» ئی کار زوروکین حساب راجستر نه بوته.\nمهربانی بکنیت مطمائین بئیت که لوٹیت ای تاکدیما جوڑ یا ایڈیٹ بکنیت.",
+       "userpage-userdoesnotexist-view": "«$1» ئی کار زوروکین حساب راجستر نه بوته.",
+       "blocked-notice-logextract": "ای کار زوروکئ دسترسی بی انونین وختا بسته بوته.\nآخرین مورد شه دسترسی ئی سیستین به جهلگا آته:",
+       "clearyourcache": "<strong>نکته:</strong> پد شه تغیراتان شاید په دیستینا ضرورت بیئت که بروزیزی نهانی ئین حافظه ئا پاک بکنیت.\n*<strong>په فایرفاکس / سافاری:</strong> خاتیرا <em>Shift</em> کیلی ئانه بساتیت و  <em>Reload</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>Tools &rarr; Preferences</em> ئی مینوی طریقه پاک بکینت",
+       "usercssyoucanpreview": "'''نکته:''' پد شه وتئ سی‌اس‌اس ئی فایلی ذخیره کورتینا، گو '''{{int:showpreview}}''' ئی دکمه ئا آیرا امتحان بکنیت .",
+       "userjsyoucanpreview": "'''نکته:''' پد شه وتئ جاوااسکریپت ئی ذخیره کورتینا،گو '''{{int:showpreview}}''' ئی دکمه ئا آیرا امتحان بکنیت.",
+       "usercsspreview": "'''شه هوشا بورته ایت که شما فقط وتئ کار زوروکئ سی اس اس ئی دیم دیست ئا گیندیت.'''\n'''ای سی‌اس‌اس تا انون ذخیره نه بوته!'''",
+       "sitecsspreview": "'''شه هوشا مه بَریت که شما فقط وتئ کار زوروکئ سی اس اس ئی دیم دیست ئا گیندیت.'''\n'''ای سی‌اس‌اس تا انون ذخیره نه بوته!'''",
+       "sitejspreview": "'''شه هوشا مه بَریت که شما فقط جاوااسکریپت ئی دیم دیست ئا گیندیت.'''\n'''ای جاوااسکریپت تا انون ذخیره نه بوته!'''",
+       "updated": "(نوک بوته ئین)",
+       "note": "'''نکته:'''",
        "continue-editing": "شوتین بی ایڈ\tیٹ\tی نیمگا",
        "editing": "بی ایڈ\tیٹ\t کورتینی حالا $1",
        "creating": "بی جوڑ کورتینی حالا $1",
+       "editingsection": "بئ $1 ئی ایڈیٹ کورتینئ حالا (بخش)",
+       "editingcomment": "بئ $1 ئی ایڈیٹ کورتینئ حالا (نوکین بخش)",
+       "editconflict": "هجومین ایڈیٹ: $1",
        "yourtext": "شمی متن",
+       "storedversion": "ذخیره بوته ئین نخسه",
+       "yourdiff": "تفاوت‌هان",
+       "templatesused": "{{PLURAL:$1|تراشوان|تراشوانان}} استفاده بوته انت بی ای تاکدیمئ تا:",
+       "template-protected": "(قُلپ بوته)",
+       "template-semiprotected": "(نیمه‌ گ قُلپ بوته)",
+       "hiddencategories": "ای تاکدیم بی {{PLURAL:$1|یک چیهرین تهر|$1 چیهرین تهر}} تا قرار داریت:",
+       "sectioneditnotsupported-text": "ای تاکدیم شه بخشانی ایڈیٹ ئا پُشتوانی ئه نه کنت.",
+       "permissionserrors": "دسترسی ئی خطا",
+       "permissionserrorstext": "شما ای کارئ اجازه ئا په ای {{PLURAL:$1|دلیلا|دلیلان}} نداریت:",
+       "permissionserrorstext-withaction": "شما اجازهٔ $2 ئا بی ای {{PLURAL:$1|دلیلا|دلیلان}} نداریت:",
+       "recreate-moveddeleted-warn": "<strong>هشدار: شما یک تاکدیمی ئا جوڑ\t ئه کنیت که دیمتیرا پاک کورته بوته.</strong>\n\nبی نظر داشته بئیت که آیا ایڈ\tیٹ ای تاکدیمی جوانین کاری است یانه.\nای تاکدیمی پاک بوتینئ و انتقالئ کورم ئا جهلگا توانیت بگیندیت:",
+       "moveddeleted-notice": "ای تاکدیم پاک بوته.\nای تاکدیمی پاک بوتینئ و انتقالئ کورم ئا جهلگا توانیت بگیندیت.",
+       "log-fulllog": "دیستین کامیلین کورمئ",
+       "edit-hook-aborted": "ایڈیٹ شه قلاب ئی نیمگاه لغو بوت.\nبی ای باره ئا هیچ توضیحی داته نه بوته.",
+       "edit-gone-missing": "اپڈیٹ ئی امکان وجود نداریت.\nبی نظر ئه رسیت که تاکدیم پاک بوته.",
+       "edit-conflict": "هجومئ ایڈیٹ\t.",
+       "edit-no-change": "شمی ایڈیٹ مهم گیپته نه بوته، بی خاتیریکه متنئ تا هیچ تغیرئ داته نه بوتتت.",
+       "postedit-confirmation-created": "ای تاکدیم جوڑ بوته.",
+       "postedit-confirmation-restored": "ای تاکدیم بیئرگردینته بوته.",
+       "postedit-confirmation-saved": "شمی ایڈ\tیٹ ذخیره بوت.",
+       "edit-already-exists": "نوکین تاکدیمئ جوڑ کورتین امکان نه داریت.\nای تاکدیم شه دیما وجود داشتت.",
+       "defaultmessagetext": "پیامی پیش فرضین متن",
+       "content-not-allowed-here": "«$1» ئی محتوا بئ [[$2]] ئی دیمی تا جایز نه اینت",
        "content-model-wikitext": "ویکی‌متن",
        "content-model-text": "ساده گین متن",
        "content-model-javascript": "جاوااسکریپت",
        "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 لوٹیتین}} اینت.",
+       "expensive-parserfunction-category": "تاکدیمان که باز سکین تجزیه گرین فراخوانئ دستور دارنت",
+       "post-expand-template-inclusion-warning": "هشدار: تراشوان بی شه اندزه ئا ٹوو اینت.\nبرخی شه تراشوانان شاید شامل مه بیئنت.",
+       "post-expand-template-inclusion-category": "آ تاکدیمان که آوانئ تا تراشوانانئ اندزه گ شه حد ئا گیشتیر اینت.",
+       "post-expand-template-argument-warning": "'''هشدار:''' ای تاکدیم یک تراشوانئ پارامیتر اینت که شه اندازه ئا ٹوو.\nای پارامیتران نادیسته گیپته بوتنت.",
+       "post-expand-template-argument-category": "تاکدیمان که حاوی تراشوانان گو پارامیتران نادیده گیپته بوته انت",
+       "parser-template-loop-warning": "حلقه بی تراشوان ئا تا ودی نه بوت: [[$1]]",
+       "parser-template-recursion-depth-warning": "تراشوانئ بیئرگشتی عمق رد بوت ($1)",
+       "language-converter-depth-warning": "مبدل زبانی ئی محدودیت عمق  رد بوت ($1)",
+       "node-count-exceeded-category": "تاکدیمان که شه حداکثر گروپ ئا تجاوز کورته انت",
+       "node-count-exceeded-category-desc": "ای تاکدیم شه حداکثر پرابلمان گیشتیر بوته",
+       "node-count-exceeded-warning": "تاکدیم شه حداکثر گرینان گیشتیر بوته",
+       "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": " $1 ئی ایڈیٹ شه [[Special:Contributions/$2|$2]] ([[User talk:$2|حبر و گپ]]) نیمگا شه بَیْن بورته بوت",
+       "undo-summary-username-hidden": " $1 نخسه ئی شه بین بورتین بی یک کار زوروکئ دستا چیهر بوته",
+       "cantcreateaccounttitle": "نه توانیت حسابئ پاچ کنیت",
+       "viewpagelogs": "ای تاکدیمئ سیاه چال ئی دیستین",
+       "nohistory": "ای تاکدیم ایڈیٹ ئی تاریخچه نداریت.",
+       "currentrev": "انونین نخسه یی نشان داتین",
+       "currentrev-asof": "انونین نسخه تا $1",
+       "revisionasof": "نسخهٔ $1",
+       "revision-info": "تاریخ  $1 نسخه بی واسطه {{GENDER:$6|$2}}$7",
        "previousrevision": "→ قدیمین نخسه",
        "nextrevision": "نوکین نخسه ←",
        "currentrevisionlink": "انونین نخسه یی نشان داتین",
        "last": "دیمتیرین",
        "page_first": "اولین",
        "page_last": "آخیرین",
+       "history-fieldset-title": "تاریخچه ئی مرور کورتین",
+       "history-show-deleted": "فقط پاک بوته ئین",
        "histfirst": "کهنگتیرین",
        "histlast": "نوکتیرین",
+       "historysize": "({{PLURAL:$1|۱ بایٹ|$1 بایٹ}})",
        "historyempty": "(خالی)",
+       "history-feed-title": "ایڈ\tیٹانئ دپتر یا تاریخچه گ",
+       "history-feed-description": "ای تاکدیمی ایڈیٹ ئی تاریخچه بئ ویکی ئی تا",
        "history-feed-item-nocomment": "$1 بی $2",
+       "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-view": "ای ایڈیٹ شه ای تاکدیما '''پاک بوته'''.\nشما توانیت آیرا بگیندیت؛ ممکن اینت آیی مربوتین مئلوماتانا بئ [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} پاک بوته ئین سیاه چال ] تا ودئ بکنیت.",
        "rev-delundel": "نمایش/نهفتن",
        "rev-showdeleted": "نشان داتین",
+       "revisiondelete": "پاک کورتین/نخسه ئی پدا جۆڑ کورتین",
+       "revdelete-nooldid-title": "هدف ئی نامجازین نخسه",
+       "revdelete-no-file": "مشخص بوته ئین فایل موجود نه اینت.",
+       "revdelete-show-file-confirm": "آیا شما مطمئن وێت که لوٹیت یک پاک بوته ئین نخسه شه فایل \"<nowiki>$1</nowiki>\" مورخ $2 سائت $3 ئا بگیندیت؟",
        "revdelete-show-file-submit": "هان",
+       "revdelete-selected-text": "{{PLURAL:$1|انتخاب بوته ئین نخسه هان|انتخابین نخسه هان}} [[:$2]]:",
+       "revdelete-selected-file": "{{PLURAL:$1|انتخاب بوته ئین نخسه|انتخابین نخسه}} [[:$2]]:",
+       "logdelete-selected": "شه سیاه چال ئا {{PLURAL:$1|مورد|مورد هان}} انتخاب بوته:",
+       "revdelete-text-others": "دیگه مدیرهان تا انون هم ئه تواننت که چیهرین محتواهانه بگیندینت و شه همی راه ئا تواننت پاک بوته ئین مواردانا بیئرگردیننت، مگر ای که دیگه محدودیت ئی آته بیئت.",
+       "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": "<strong>لوگین ئی قابلیت دیست گو کامیابیا انجام بوت.</strong>",
+       "logdelete-failure": "'''لوگین ئی قابلیت دیست تنظیم ئه نه بیئنت:'''\n$1",
        "revdel-restore": "نمایش/نهفتن",
        "pagehist": "تاکدیمی تاریخچه",
        "deletedhist": "پاک بوتگینانی تاریخچه",
+       "revdelete-no-change": "'''هشدار:''' $2 تاریخ ئی و سائت $1 مورد شه دیما پیدائین ریکویست ئی  تنظیمات ئا داشت.",
+       "revdelete-otherreason": "دیگرین دلیل/اضافی:",
        "revdelete-reasonotherlist": "دیگرین دلیل",
+       "revdelete-edit-reasonlist": "پاک بوتینئ دلیلانئ ایڈیٹ",
+       "revdelete-offender": "نخسه ئی نویسوک:",
+       "suppressionlog": "سیاه چالئ نادینتین",
+       "mergehistory": "تاکدیمانئ تاریخچه ئی ادغام",
+       "mergehistory-box": "دو تاکدیمئ نخسه ئانی ادغام:",
+       "mergehistory-from": "تاکدیمئ منشا:",
+       "mergehistory-into": "تاکدیمئ مخصد:",
+       "mergehistory-list": "قابل ادغامئ تاریخچه",
+       "mergehistory-go": "قابل ادغامئ تاریخچه ئی نشان داتین",
+       "mergehistory-submit": "نخسه ئانی ادغام",
+       "mergehistory-empty": "هیچ یک شه نخسه ئان ادغامی ئی وڈ نه ونت.",
+       "mergehistory-success": "$3 ئی نخسه  شه [[:$1]]  ئا گو کامیابیا بی  [[:$2]] تا ادغام {{PLURAL:$3|بوت}}.",
+       "mergehistory-fail": "تاریخچه ئی ادغام ممکن نه اینت، مهربانی بکنیت تاکدیمئ گزینه ئانه و وختا بگیندیت.",
+       "mergehistory-no-source": " $1 منشائی تاکدیم موجود نه اینت.",
+       "mergehistory-no-destination": "$1 مخصدی تاکدیم موجود نه اینت .",
+       "mergehistory-invalid-source": "منشائی تاکدیم باید یک موتبرین ئنوان ئی داشته بیئت.",
+       "mergehistory-invalid-destination": "مخصدئ تاکدیم باید یک موتبرین ئنوان داشته بیئت",
+       "mergehistory-autocomment": "[[:$1]] ئا بی [[:$2]] ادغام کورت",
+       "mergehistory-comment": "[[:$1]] ئا بی  [[:$2]] ادغام کورت: $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 میانی نخسه}}ِ نمایش داته بوته)",
+       "searchresults": "گشتین ئی  نتیجه",
+       "searchresults-title": "گشتینئ نتایج په «$1»",
+       "titlematches": "مقاله ئی ئنوانئ یکی کورتین",
+       "textmatches": "مقاله ئی متنئ یکی کورتین",
+       "notextmatches": "هیچ یک شه مقاله ئانی متن مطابقت ندارنت",
+       "prevn": "{{PLURAL:$1|$1}}دیمتیری",
+       "nextn": "{{PLURAL:$1|$1}}پدتیری",
+       "prevn-title": "$1 {{PLURAL:$1|نتیجهٔ|نتیجهٔ}} دیمی",
+       "nextn-title": "$1 {{PLURAL:$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-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": "موچ",
+       "showingresults": "نشان داتین حداکثر {{PLURAL:$1|'''۱''' نتیجه|'''$1''' نتیجه}} بی جهلگا، شرو شه شماره ئی  '''$2'''.",
+       "showingresultsinrange": "نمایش بی جهلگا {{PLURAL:$1|<strong>1</strong> نتیجه|<strong>$1</strong> نتیجه}} بی محدودهٔ ئی #<strong>$2</strong> تا #<strong>$3</strong>.",
+       "search-showingresults": "{{PLURAL:$4|نتیجه ئان <strong>$1</strong> شه <strong>$3</strong>|نتیجه ئان <strong>$1 - $2</strong> شه <strong>$3</strong>}}",
+       "search-nonefound": "نتیجه په چیزی که شما لوٹیته تیت بی دست نه یات.",
+       "powersearch-legend": "پیشرفته ئین گشتین",
+       "powersearch-ns": "گشتین بی نامئ فضائان:",
        "powersearch-togglelabel": "چیک کورتین:",
        "powersearch-toggleall": "موچ",
        "powersearch-togglenone": "هیچ‌گوجام",
+       "powersearch-remember": "اتنخاب په دیگرین گشتین ئان بی خاتیر داشته بئیت",
+       "search-external": "خارجی ئین گشتین",
+       "searchdisabled": "گشتین بی {{SITENAME}} ئی تا فعال نه اینت.\nموقتاً توانیت شه Google ئی گردگ ئا استفاده کنیت.\nتوجه کنیت که بدست آته ئین نتایج شه گردگا بی آ ممکینین طریقه ئا مه بیئنت.",
+       "search-error": "یک خطایی بی گردگئ وختا رخ داته : $1",
+       "preferences": "تنظیمات",
+       "mypreferences": "تنظیمات",
+       "prefs-edits": "ایڈ\tیٹانی اندازه گ:",
+       "prefsnologintext2": "مهربانی بکنیت په وتئ تنظیماتانی ٹگل داتینا خاتیرا لوگین بئیت.",
+       "prefs-skin": "پوست",
+       "skin-preview": "دیم دیست",
+       "datedefault": "بی شه تنظیماتا",
+       "prefs-labs": "آزمایشی ئین ویژگی ئان",
+       "prefs-user-pages": "کار زوروکی تاکدیمان",
+       "prefs-personal": "کار زوروکی پروفایل",
+       "prefs-rc": "آخیرین تغیراتان",
+       "prefs-watchlist": "واچلیست",
+       "prefs-editwatchlist": "واچلیستی ایڈیٹ کورتین",
+       "prefs-editwatchlist-label": "وتئ واچلیست ئی موچین لڑلیستانئ ایڈیٹ:",
+       "prefs-editwatchlist-edit": "پاک کورتین و دیستین ئنوانانئ شه وتئ واچلیستا",
+       "prefs-editwatchlist-raw": "واچلیستئ آمگین لیستانی ایڈیٹ",
+       "prefs-editwatchlist-clear": "وتئ واچلیستئ پاک کورتین",
+       "prefs-watchlist-days": "روچانئ اندازه گ که باید بئ دیدارلیست ئی تا نشان داته بیئنت:",
+       "prefs-watchlist-days-max": "حداکثر $1 {{PLURAL:$1|روچ}}",
+       "prefs-watchlist-edits": "شمی ایڈیٹانئ اندازه گ بئ واچلیست ئي تا پراخ بوته:",
+       "prefs-watchlist-edits-max": "حداکثر اندازه گ: ۱۰۰۰",
+       "prefs-watchlist-token": "واچلیستئ کوڈ:",
        "prefs-misc": "متفرقه",
        "prefs-resetpass": "پاسوردی تغیر داتین",
        "prefs-changeemail": "ایمیل ادرسی تغیر داتین",
        "rows": "تعداد سطرها:",
        "columns": "تعداد ستون‌ها:",
        "searchresultshead": "گشتین",
+       "stub-threshold": "ایڈیٹانئ لینک <a href=\"#\" class=\"stub\">ناقص</a> (بایٹ):",
+       "stub-threshold-disabled": "غیرفعال",
+       "recentchangesdays": "روچانی اندازه گ بئ آخیر ئین تغیراتانئ تا نشان داته بوته انت:",
+       "recentchangesdays-max": "حداکثر $1 {{PLURAL:$1|روچ}}",
+       "savedprefs": "شمی تنظیمات ذخیره بوتنت.",
        "timezonelegend": "منطقهٔ زمانی:",
        "localtime": "محلی ئن وخت:",
+       "timezoneuseserverdefault": "استفاده شه  پیش‌فرض ئین ویکی ($1)",
+       "timezoneuseoffset": "دیگر (اختلاف ئا مشخص کنیت)",
+       "servertime": "سرور ئی وخت:",
+       "guesstimezone": "شه بروزیر ئه گیپته بیئت",
        "timezoneregion-africa": "آفریقا",
        "timezoneregion-america": "آمریکا",
+       "timezoneregion-antarctica": "جنوبی ئین قطب",
        "timezoneregion-arctic": "قطب شمالی",
        "timezoneregion-asia": "آسیا",
        "timezoneregion-atlantic": "بحر اتلانتیک",
        "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": "{{GENDER:$2|عضو}} {{PLURAL:$1|گروپ|گروپ}}:",
        "prefs-registration": "راجیسترئ وخت",
        "yourrealname": "واقیئین نام:",
        "yourlanguage": "زبان:",
+       "yourvariant": "گوشتین محتوائی زبانی:",
+       "yournick": "نوکین دستنام:",
+       "prefs-help-signature": "نیوشته بوته ئین نظرئان باید بی گپ و حبر ئی تاکدیمئ تا گو «<nowiki>~~~~</nowiki>» ئا دستنام یا امضا بیئنت ؛ ای علامت بی اوتوماتیکین رقما بی شمی دستنام یا امضا آ و تاریخ آ بدل ئه بیت.",
+       "badsig": "حامگین یا خرابین دستنام یا امضا.\nمهربانی بکنیت اچ‌تی‌ام‌ال ئا بگیندیت.",
+       "badsiglength": "شمی دستنام شه اندازه ئا مزن و تچک اینت.\nدستنام باید کمتر شه $1 {{PLURAL:$1|نویسه}} ئا طول داشته بیئت.",
+       "yourgender": "لوٹیت که شما را چون بزاننت؟",
+       "gender-unknown": "لوٹین که هیچ ئی مه گوشین",
+       "gender-male": "مردینزاگ",
+       "gender-female": "جنینزاگ",
+       "email": "ایمیل",
+       "prefs-help-realname": "واقئین نام اختیاری اینت.\nاگه وتئ واقئین ناما بنوسیت ممکن اینت شه شمی کار و خدمتان ئی نام گیپتینی وختا شه شمی واقئین ناما استفاده بیئت.",
+       "prefs-help-email-required": "ایمیل ادرس ضروری اینت.",
+       "prefs-info": "بُنادین مئلومات",
+       "prefs-i18n": "بین المللی کورتین",
+       "prefs-signature": "دست خط",
+       "prefs-dateformat": "تاریخ فورمت",
+       "prefs-timeoffset": "وختی فاصله",
+       "prefs-advancedediting": "ئمومین تنظیمات",
        "prefs-editor": "ایڈیٹور",
        "prefs-preview": "دیم دیست",
        "prefs-advancedrc": "پیشرفته ئین کیلی ئان",
        "prefs-displaywatchlist": "نمایش ئین کیلی ئان",
        "prefs-tokenwatchlist": "نشانه گ",
        "prefs-diffs": "تفاوت‌ئان",
+       "prefs-help-prefershttps": "ای تنظیمی تاثیر پد شه لوگین بوتینا بی شما اعمال ئه بیئت.",
+       "prefswarning-warning": "شمی تغیرات بی تنظیماتانی تا تا انون ذخیره نه بوته انت.\nاگه ای تاکدیما بي شه کلیک کورتین به  «$1» ئا بیلیئت شمی تنظیمات ذخیره ئه نه بیئنت.",
+       "email-address-validity-valid": "شمی ایمیلئ ادرس موتبر بی نظر ئه رسیت",
+       "email-address-validity-invalid": "موتبرین ایمیل ادرسی داخل بکنیت",
+       "userrights": "کار گیروکی اختیارانی مدیریت",
+       "userrights-lookup-user": "کار گیروکی گروپانی مدیریت",
+       "userrights-user-editname": "کار زوروکین ناما داخل بکنیت:",
+       "editusergroup": "کار زوروکی گروپانی ایڈیٹ",
+       "editinguser": "کار زوروکئ اختیارانی تغییر  '''[[User:$1|$1]]''' $2",
+       "userrights-editusergroup": "کار زوروکی گروپانی ایڈیٹ",
+       "saveusergroups": "کار زوروکی گروپانی ثبت کورتین",
+       "userrights-groupsmember": "عضو:",
+       "userrights-groupsmember-auto": "ضمنی ئین عضو:",
        "userrights-reason": "دلیل:",
+       "userrights-no-interwiki": "شما دیگه ویکی هانی کار زوروکانئ اختیارانی تغیر داتینی اجازه ئا نداریت.",
+       "userrights-nodatabase": " $1 مئلوماتئ بانک وجود نداریت یا محلی نه اینت.",
+       "userrights-nologin": "شما باید گو یک مدیرئی  [[Special:UserLogin|کار زوروکین حسابا لوگین بیئیت]] تا که بتوانیت دیگه کار زوروکانئ اختیارانا تعین بکنیت.",
+       "userrights-notallowed": "شما په کار زوروکئ حقوق ئی پاک کورتین یا افاضه کورتینی اجازه ئه نداریت.",
+       "userrights-changeable-col": "ئا گروپان که شما توانیت آوانا ٹگل بدهیت",
+       "userrights-unchangeable-col": "ئا گروپان که شما نتوانیت آوانا ٹگل بدهیت",
+       "userrights-conflict": "حمله بئ کار زوروکئ حقان! مهربانی بکنیت بگیندیت و تغیرانا تائید بکنیت.",
+       "userrights-removed-self": "شما وتئ دسترسی ئانه سیستیت. انون شما دیگه بئ ای تاکدیما دسترسی نداریت.",
        "group": "گروپ:",
        "group-user": "کار زوروکان",
        "group-autoconfirmed": "تائید بُوته ئین کار زوروکان",
        "right-createpage": "تاکدیمی جوڑ\t کورتین (بی غیر گپ ئین موردی تاکدیمان )",
        "right-createtalk": "گپ ئی تاکدیمی جوڑ\t کورتین",
        "right-createaccount": "کار زوروکئ حسابئ جوڑ\t کورتین",
+       "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-nominornewtalk": "گپ و حبر ئی تاکدیمانی گونڈ ایڈیٹ ، بئ رکمی که نوکین پیام ئا جار مه جنت",
+       "right-apihighlimits": "بُرز تیرین سقف استفاده شه API",
+       "right-writeapi": "استفاده شه نیویشتینی API",
+       "right-delete": "تاکدیمی پاک کورتین",
+       "right-bigdelete": "ٹوهین تاریخچه والا ئین تاکدیمانئ پاک کورتین",
+       "right-deletelogentry": "پاک کورتین و پداجۆڑ کورتین خاصین دروچه شه سیاهه ئان",
+       "right-deleterevision": "پاک کورتین و پدا جۆڑ کورتین خاصین نخسه ئان شه تاکدیما",
+       "right-deletedhistory": "شه تاریخچه ئا پاک بوته ئین مواریدانی دیستین، بیدون شه آوانی متنی دستینا",
+       "right-deletedtext": "دیستین پاک بوته ئین متن ئان و تغیر ئان پاک بوته ئین نخسه ئانی مانجینا",
+       "right-browsearchive": "گشتین په پاک بوته ئین تاکدیمان",
+       "right-undelete": "بی جاه آورتین  تاکدیمانئ",
+       "right-suppressrevision": "دیستین و پداجۆڑ کورتین آ ایڈیٹانی که شه کار زوروکان چیهر داته بوته انت",
+       "right-viewsuppressed": "آ نخسه هانی دیستین که شه کار زوروکان چیهر داته بوته انت",
+       "right-suppressionlog": "دیستین شخصین سیاه چال ئانی",
+       "right-block": "دیگه کار زوروکانئ بلاک کورتین شه ایڈیٹ ئان",
+       "right-blockemail": "دیگه کار زوروکانئ بلاک کورتین شه ایمیل ئی دیم داتین ئا",
+       "right-hideuser": "کار زوروکئ بلاک کورتین و چیهر داتین شه عمومی ئی دیدا",
+       "right-unblockself": "وتي دسترسی ئی پاچ کورتین",
+       "right-protect": "قُلپ بوته تاکدیمانئ قلپی میزانی تغیر داتین و آوانی ایڈیٹ کورتین",
+       "right-editprotected": "ایڈیٹ کورتین قُلپ بوته ئین تاکدیمانی بئ ئنوانئ «{{int:protect-level-sysop}}»",
+       "right-editsemiprotected": "ایڈیٹ کورتین قُلپ بوته ئین تاکدیمانی بئ ئنوانی \"{{int:protect-level-autoconfirmed}}\"",
+       "right-editcontentmodel": "یک تاکدیمی محتوایی مدل یی ایڈیٹ کورتین",
+       "right-editinterface": "ای\tڈیٹ کورتین کار زوروکانئ رابطه",
+       "right-editusercssjs": "ایڈیٹ کورتین دیگه کار زوروکانئ  CSS و JS ئی تاکدیمانئ",
+       "right-editusercss": "ایڈیٹ کورتین دیگه کار زوروکانئ  CSS ئی تاکدیمانئ",
+       "right-edituserjs": "ایڈیٹ کورتین دیگه کار زوروکانئ  JS ئی تاکدیمانئ",
+       "right-editmyusercss": "وتئ  سی‌اس‌اس کار زوروکئ فایلانا ایڈیٹ بکینت",
+       "right-editmyuserjs": "وتئ جاوااسکریپت کار زوروکي فایلانا ایڈیٹ بکنیت",
+       "right-viewmywatchlist": "وتئ واچلیست ئا بگیندیت",
+       "right-viewmyprivateinfo": "وتي خصوصین دیتا ئه بگیندیت (چو ایمیل و واقئین ناما)",
+       "right-editmyprivateinfo": "وتي حصوثین دیتا ئه ایڈیٹ بکنیت (چو ایمیل و واقئین ناما)",
+       "right-editmyoptions": "وتئ تنظیماتانا ایڈیٹ بکنیت",
+       "right-rollback": "عاجل ئین بیئرگردینتین آخیر ئین کار زوروکئ ایڈیٹانئ که ای تاکدیما ایڈیٹ کورته",
+       "right-markbotedits": "ای بیئرگردینته بوته ئین ایڈیٹانی علامت جتین بئ ئنوانئ رباتئ ایڈیٹا",
+       "right-noratelimit": "تاثیر نه گیپتین شه سرعتئ محدودیت ئا",
+       "right-import": "تاکدیمئ داخل کورتین شه دیگه ویکی ئا",
+       "right-importupload": "تاکدیمئ داخل کورتین شه فایلئ اپلوڈ کورتین ئا",
+       "right-patrol": "دیگرانئ ایڈیٹانی مارک جتین",
+       "right-autopatrol": "اوتوماتیکین مارک وارتین ایڈیٹ ئانی",
+       "right-mergehistory": "تاکدیمانی تاریخچه ئی ادغام کورتین",
+       "right-userrights": "ایڈیٹ کورتین کار زوروکئ موچین اختیارانئ",
+       "right-userrights-interwiki": "دیگه ویکی ئی کار زوروکانئ اختیارانی ایڈیٹ کورتین",
+       "right-siteadmin": "مئلومات ئین بانکئ قُلپ و یا پاچ کورتین",
+       "right-sendemail": "دیم داتین ایمل په دیگه کار زوروکان",
+       "right-passwordreset": "پاسوردی نوک تنظیم کورتینی ایمیل",
+       "newuserlogpage": "کار زوروکئ جوڑ کورتینی سیاه چال",
+       "newuserlogpagetext": "ای سیاه چال شه نوکین کار زوروکئ ناما جوڑ بوته.",
+       "rightslog": "کار زوروکی اختیارانئ سیاه چال",
+       "rightslogtext": "ای سیاه چال کار زوروکئ تغیراتانی اینت.",
        "action-read": "وانتین ای تاکدیمئ",
        "action-edit": "ایڈ\tیٹ کورتین ای تاکدیمئ",
        "action-createpage": "تاکدیم جوڑ کورتین",
+       "action-createtalk": "گپ ئی تاکدیمانی جوڑ\t کورتین",
+       "action-createaccount": "ای کار زوروکئ حسابئ جوڑ\t کورتین",
+       "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": "استفاده شه نیویشتینی API",
        "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-userrights-interwiki": "یک دیگه ویکی ئی کار زوروکانئ اختیارانی ایڈیٹ کورتین",
+       "action-siteadmin": "مئلومات ئین بانکئ قُلپ و یا پاچ کورتین",
+       "action-sendemail": "ایمیلی دیم داتین",
+       "action-editmywatchlist": "وتئ واچلیستا ایڈیٹ بکنت",
+       "action-viewmywatchlist": "وتئ واچلیست ئا بگیندیت",
+       "action-viewmyprivateinfo": "وتئ خصوصین مئلوماتانا بگیندیت",
+       "action-editmyprivateinfo": "وتئ خصوصین مئلوماتانا ایڈیٹ بکنیت",
+       "action-editcontentmodel": "یک تاکدیمی محتوائین مدل ئی ایڈیٹ کورتین",
+       "nchanges": "$1 {{PLURAL:$1|ٹگل|ٹگل}}",
+       "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|شه اخر ئین دیستینا}}",
+       "enhancedrc-history": "تاریخچه",
+       "recentchanges": "آخیرین تغیراتان",
+       "recentchanges-legend": "آخیر ئین تغیراتانئ آپشن",
+       "recentchanges-summary": "ویکی ئی آخیر ئین تغیرانا بئ تاکدیمی تا بچاریت.",
+       "recentchanges-noresult": "هیچ تغیری بئ تعین بوته ئین دوره ئی تا گۆ ای معیاران هموانی نداشت.",
+       "recentchanges-feed-description": "ای ویکی ئی آخیر ئین تغیرانا بئ ای وارگ ئی تا بچاریت.",
+       "recentchanges-label-newpage": "ای ایڈیٹ نوکین تاکدیمی ئا جوڑ کورت",
+       "recentchanges-label-minor": "ای یک گونڈین ایڈیٹئ است",
+       "recentchanges-label-bot": "ای ایڈیٹا یک ربات ئی کورته",
+       "recentchanges-label-unpatrolled": "ای ایڈیٹ تا انون گشت وارته نه بوته",
+       "recentchanges-label-plusminus": "تاکدیمئ حجم بئ ای اندازگ بایٹ ئا تغیر کورته",
+       "recentchanges-legend-heading": "'''اختصارئان:'''",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (همیرنگ بی [[Special:NewPages|نوکین تاکدیمانئ لڑ لیست]] ئا سیل بکنیت)",
+       "rcnotefrom": "بئ جهلگا تغیرات شه <strong>$3, $4</strong> (تا <strong>$1</strong> {{PLURAL:$5|نشان داته بوته|نشان داته انت}}).",
+       "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": "نشان داتین $1 آخیر ئین تغییر بئ $2 اخیرین روچا<br />$3",
        "diff": "تفاوت",
        "hist": "تاریخچه",
        "hide": "چیهر داتین",
        "minoreditletter": "جز",
        "newpageletter": "نوک",
        "boteditletter": "ر",
+       "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|کار زوروک}} دیستینوک]",
+       "rc_categories": "ای تهرهانی حد ئا (گۆ «|» ئا جیتا کنیت)",
        "rc_categories_any": "هر گوجام",
+       "rc-change-size-new": "$1 {{PLURAL:$1|بایٹ}} پد شه تغیرا",
+       "newsectionsummary": "/* $1 */ نوکین بخش",
+       "rc-enhanced-expand": "جزئیات ئی نشان داتین",
+       "rc-enhanced-hide": "جزئیات ئی چیهر داتین",
+       "rc-old-title": "جوڑ بوته گو بُنیادی ئنوانا «$1»",
+       "recentchangeslinked": "مربوتین تغیراتان",
+       "recentchangeslinked-feed": "مربوتین تغیراتان",
+       "recentchangeslinked-toolbox": "مربوتین تغیراتان",
+       "recentchangeslinked-title": "مربوتین تغیراتان گو $1",
        "recentchangeslinked-page": "تاکدیم نام:",
+       "recentchangeslinked-to": "نشان داتین تاکدیماني تغیرات که گۆ ای تاکدیما لینک دارنت",
        "upload": "فایلی بُرز کورتین",
        "uploadbtn": "فایلی بُرز کورتین",
+       "reuploaddesc": "بُرز کورتیني کنسیل و بیئرگشت په بُرز کورتیني فرما",
+       "upload-tryagain": "فایلئ تغیر ئی شرح ئی دیم داتین",
+       "uploadnologin": "لوگین نه بوته بی",
+       "uploadnologintext": "په فایلي بُرز کورتینا باید $1.",
+       "upload_directory_missing": "($1) ئی بُرز کنۆکین شاخه موجود نه اینت و جۆڑ بوتینئ وڑ نه اینت .",
+       "upload_directory_read_only": "($1) بُرز کنۆکین شاخه شه ویت سرور نیمگا نیویشتین ئی وڑ نه اینت.",
        "uploaderror": "خطا بی اپلودی تا",
+       "upload-recreate-warning": "'''هشدار:فایلی گۆ\t ای ناما یا پاک بوته یا دیگه جای جابجا بوته.'''\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": "مجاز ئین فایل ئی {{PLURAL:$2|نوع|انواع}}: $1.",
+       "upload-preferred": "ترجیح داته بوته ئین فایل ئی {{PLURAL:$2|نوع|انواع}} : $1.",
+       "upload-prohibited": "نا مجاز ئین فایل ئی {{PLURAL:$2|نوع|انواع}}: $1.",
+       "uploadlogpage": "بُرز کورتینئ سیاه چاله",
+       "uploadlogpagetext": "جهلگی لڑلیست آخیرین لڑلیست شه بُرز بوته ئین فایلان اینت.\nپه دیدارین مرواریدا [[Special:NewFiles|نوکین فایلانی نگارخانه]] ئا بگیندیت.",
        "filename": "فایلئ نام",
        "filedesc": "خلاصه",
        "fileuploadsummary": "خلاصه:",
+       "filereuploadsummary": "فایلی تغیرات:",
+       "filestatus": "کاپی رایٹ ئی وضیعت",
        "filesource": "منبع:",
+       "ignorewarning": "چشم چیهرداتین شه هشدارا و ذخیره کورتین فایلئ.",
+       "ignorewarnings": "چم پوشی شه موچین هشداران",
+       "minlength1": "فایلئ نام باید کم شه کم یک حرف بیئت.",
+       "filetype-missing": "ای فایل پدوندی (مثلاً «‎.jpg») نداریت.",
+       "empty-file": "فایلی که دیم داته بوت خالی ات.",
+       "file-too-large": "فایلی که دیم داتیت بئ حد ٹوو ات.",
+       "filename-tooshort": "فایلی نام بئ شه اندازگ ئا گۆنڈ ات.",
+       "filetype-banned": "ایرنگین فایل ئی اجازه نه اینت.",
+       "verification-error": "فایل شه تائید ئی امتحانا در نه بوت.",
+       "hookaborted": "تغیر که شما لۆٹیت جۆڑ کنیت شه یک جنگک یی نیمگا بند بوت.",
+       "illegal-filename": "فایل ئی نام غیرمجاز اینت.",
+       "overwrite": "یک موجودین فایلی سرا نیویشتین ئی اجازه نه اینت.",
+       "unknown-error": "یک نا زانتین خطائی رخ دات.",
+       "tmp-create-error": "موقتین فایلی جۆڑ کورتین ممکن نه اینت.",
+       "tmp-write-error": "خطا بئ موقتین فایلی نیویشتینا.",
+       "uploadwarning": "بُرز کورتینئ هشدار",
+       "savefile": "فایلی ذخیره کورتین",
+       "uploaddisabled": "بُرز کورتین غیر پئال اینت.",
+       "copyuploaddisabled": "بُرز کورتین شه اینترنیتی ادرسا غیرفعال اینت.",
+       "uploaddisabledtext": "فایل ئی بُرز کورتین غیر فعال اینت.",
+       "upload-source": "فایلی منشا",
+       "sourcefilename": "منشائی فایلی نام:",
+       "sourceurl": "منشائی ادرس:",
+       "destfilename": "فایلئ مخصدی نام:",
+       "upload-maxfilesize": "فایلی حداکثر اندازه گ: $1",
+       "upload-description": "فایلی توضیحات",
+       "upload-options": "بُرز کورتین یا آپلوڈئ اپشن",
+       "watchthisupload": "دیستین ای فایلی",
+       "upload-success-subj": "بُرز کورتین یا آپلوڈ گو کامیابی ئا انجام بوت",
+       "upload-failure-subj": "بُرز کنوکی پرابلم",
+       "upload-warning-subj": "بُرز کورتینئ هشدار",
+       "upload-proto-error": "نادروستین پروتوکول",
+       "upload-proto-error-text": "بُرز کورتین شه دوردستا به ادرس ئان که گو <code dir=ltr>http://</code> یا <code dir=ltr>ftp://</code>  ئی شرو بیئنت ضرورت داریت .",
+       "upload-file-error": "داخلین خطا",
+       "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-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-connect": "ارتباط گۆ «$1» ئی ذخیره ئی پُشتیوانا برقرار نه بوت.",
+       "backend-fail-internal": "نامئلومین خطایی بئ «$1» ئی ذخیره پُشتیوانی تا رخ دات.",
+       "lockmanager-notlocked": "نه توان که «$1» ئی قُلپا پاچ کورت؛ چون که قُلپ نه بوته.",
+       "lockmanager-fail-closelock": "\"$1\" ئی قُلپ بوته ئین فایلی بستین امکان نه داریت.",
+       "lockmanager-fail-deletelock": "\"$1\" ئی قُلپ بوته ئین فایلی پاک کورتین،امکان نداریت.",
+       "lockmanager-fail-acquirelock": "نه توانیت «$1» ئی قُلپ ئا کسب کنیت.",
+       "lockmanager-fail-openlock": "\"$1\" ئی قُلپ بوته ئین فایلی پاچ کورتین امکان نه داریت.",
+       "lockmanager-fail-releaselock": "نه توانیت «$1» ئی قُلپ ئا پاچ کنیت.",
+       "lockmanager-fail-db-release": "$1 ئی مئلوماتی بانکی قُلپئ پاچ کورتین امکان نه داریت.",
+       "lockmanager-fail-svr-acquire": "$1 ئی سرور ئی قُلپانی گیپتین امکان نه داریت.",
+       "lockmanager-fail-svr-release": "$1 ئی سرور ئی قُلپانی پاچ کورتین ئی امکان نه اینت.",
+       "zip-file-open-error": "بئ زیپ ئی فایلی پاچ کورتینی وختا، په آیی محتوایی دیستینی خاتیرا، یک خطا ئی رخ دات.",
+       "zip-wrong-format": "مشخص بوته ئین فایل، زیپ ئی یک فایلی نه اینت.",
+       "uploadstash": "بُرز کورتین انبار ئی",
+       "uploadstash-clear": "پاک کورتین انبارشده ئین فایلانئ",
+       "uploadstash-nofiles": "شما هیچ انبارشده ئین فایلئ نداریت.",
+       "uploadstash-errclear": "فایلانئ پاک کورتین ناکام ات.",
+       "uploadstash-refresh": "فایلانئ لڑلیستئ نوک کورتین",
+       "invalid-chunk-offset": "قطعه ئی ناموتبرین جابجايی",
+       "img-auth-accessdenied": "دسترسی ئی منشا",
+       "img-auth-nofile": "«$1» ئی فایل موجود نه اینت.",
+       "img-auth-isdir": "شما کوشش کورته ئیت که بئ «$1» ئی شاخه ئا دسترسی ودی بکنیت.\nتانا په فایل ئا دسترسی جایز اینت.",
+       "img-auth-streaming": "بئ حال جاری کورتینی «$1» ئا.",
+       "img-auth-noread": "کار زوروک «$1» ئی وانتین ئی دسترسی ئا نداریت.",
+       "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_url": "(شما شه یک موتبرین و جۆانین URL ئا فایل ئی انتخاب کورته ایت، که موچانی دسترس ئا توانت بیئت)",
+       "upload_source_file": "(شمی انتخابی ئین فایل شه شمی کامپیوتیرا)",
        "listfiles-delete": "پاک کورتین",
+       "listfiles-summary": "ای خاصین تاکدیم موچین بُرز بوته ئین فایلانه نشان ئه دنت.",
+       "listfiles_search_for": "گشتین په میڈیا نام ئا:",
        "imgfile": "فایل",
        "listfiles": "فایل لیست",
        "listfiles_thumb": "ناحُننک",
        "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|تاکدیم|تاکدیمان}} جهلگین بی اکسا لینک {{PLURAL:$1|داریت|دارنت}}:",
+       "linkstoimage-more": "گیشتیر شه $1 تاکدیم گۆ ای فایلا لینک {{PLURAL:$1|داریت|دارنت}}.\nجهلگی لڑ تانا {{PLURAL:$1|اولین لینک|اولین $1 لینک}} گۆ ای دیما نشان ئا دنت.\n[[Special:WhatLinksHere/$2|کامیلین لیست]] هم موجود اینت.",
+       "nolinkstoimage": "ای فایل بئ هیچ تاکدیمی تا بئ کار گیپته نه بوته.",
+       "morelinkstoimage": "ای فایلئ [[Special:WhatLinksHere/$1|دیگرین لینکانا]] بگیندیت.",
+       "linkstoimage-redirect": "$1 (فایلی تغیرمسیر) $2",
+       "duplicatesoffile": "جهلگی{{PLURAL:$1|فایل|فایلان}} تکرارین نخسه شه ای فایلا  {{PLURAL:$1|است|هستنت}} ([[Special:FileDuplicateSearch/$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": "<strong>[[Media:$1|$1]]</strong> بی [$4 نخسه ئی بی تاریخی $2 سائت $3] ئا بیئرگشتینته بوت.",
+       "filerevert-badversion": "قدیمیتیرین نخسه شه ای فایلا موجود نه اینت.",
        "filedelete": "پاک کورتین $1",
        "filedelete-legend": "فایلی پاک کورتین",
+       "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": "'''$1''' موجود نه اینت.",
+       "filedelete-nofile-old": "ارشیف  بوته ئین نخسه شه  '''$1''' گۆ داته بوته ئین مشخصاتان، موجود نه اینت.",
+       "filedelete-otherreason": "دیگرین دلیل/اضافی:",
+       "filedelete-reason-otherlist": "دیگرین دلیل",
+       "filedelete-edit-reasonlist": "پاک بوتینئ دلیلانئ ایڈیٹ",
+       "filedelete-maintenance-title": "نه توانیت فایلا پاک بکنیت",
        "mimesearch": "گشتین بی اساس MIME",
+       "mimetype": "MIME ئی رکم:",
        "download": "ائیر کورتین",
+       "unwatchedpages": "دیسته نه یوته ئین تاکدیمان",
+       "listredirects": "تغیرمسیر ئی تاکدیمانی لڑ",
+       "listduplicatedfiles": "موچین فایل ئانی لڑ ، لۆڑ گۆ تکراری ئان",
+       "listduplicatedfiles-entry": "[[:File:$1|$1]][[$3|{{PLURAL:$2|یک تکرار|$2 تکرار}}]] داریت.",
+       "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": "تاکدیمان",
+       "statistics-pages-desc": "ای ویکی ئی موچین تاکدیمان ٬ هبر و گپ ئی تاکدیمان ٬ و تغیر مسیر و دیگرین",
+       "statistics-files": "بُرز بوته ئین فایلان",
+       "statistics-edits": "تاکدیمانی ایڈیٹ شه وخت که {{SITENAME}} جۆڑ بوته انت",
+       "statistics-edits-average": "متوسطین ایڈیٹ شه هر یکین تاکدیما",
+       "statistics-users": "راجستر بوته ئین [[Special:ListUsers|کار زوروکان]]",
+       "statistics-users-active": "پئال ئین کار زوروکان",
+       "statistics-users-active-desc": "آ کار زوروکان که بئ {{PLURAL:$1|رۆچ|$1 رۆچ}} دیما پئالیت شه وت نشان داته انت",
+       "pageswithprop": "تاکدیم گۆ تاکدیمانئ خاصیتا",
+       "pageswithprop-legend": "تاکدیم گۆ تاکدیمانئ خاصیتا",
+       "pageswithprop-prop": "خاصیت ئی نام:",
        "pageswithprop-submit": "برا",
+       "pageswithprop-prophidden-long": "($1) ئی تچکین متنی چیهرین جزییات",
+       "pageswithprop-prophidden-binary": "($1) ئی باینری چیهرین اندازگ ئی جزییات",
+       "doubleredirects": "دوتائین تغیرمسیرئان",
+       "double-redirect-fixer": "تغیرمسیرئانی تئمیرکار",
+       "brokenredirects": "خرابین تغیرمسیر",
+       "brokenredirectstext": "جهلگین تغییرمسیرئان بئ یک ناموجودین دیمی لینک دارنت:",
        "brokenredirects-edit": "ایڈیٹ",
        "brokenredirects-delete": "پاک کورتین",
+       "withoutinterwiki": "تاکدیمان بی شه زبانئ لینک ئان",
        "withoutinterwiki-legend": "دیموند",
        "withoutinterwiki-submit": "نشان داتین",
+       "fewestrevisions": "مقاله ئان گۆ کم ئین ایڈیٹ ئی اندازگ ئا",
+       "nbytes": "$1 {{PLURAL:$1|بایٹ|بایٹ}}",
+       "ncategories": "$1 {{PLURAL:$1|تهر|تهرئان}}",
+       "ninterwikis": "$1 {{PLURAL:$1|میان‌ویکی|میان‌ویکی}}",
+       "nlinks": "$1 {{PLURAL:$1|لینک|لینک}}",
+       "nmembers": "$1 {{PLURAL:$1|عضو|عضو}}",
+       "nmemberschanged": "$1 → $2   {{PLURAL:$2| عضو|عضو}}",
+       "nrevisions": "$1 {{PLURAL:$1|نخسه|نخسه}}",
+       "nviews": "$1 {{PLURAL:$1|دیست|دیست}}",
+       "nimagelinks": "استفاده بوته بی  $1 {{PLURAL:$1|تاکدیم|تاکدیم}} ئی تا",
+       "ntransclusions": "استفاده بوته بی  $1 {{PLURAL:$1|تاکدیم|تاکدیم}} ئی تا",
+       "specialpage-empty": "نتیجه په راپور ئا موجود نه اینت.",
+       "lonelypages": "آتیمین تاکدیمان",
+       "uncategorizedpages": "تاکدیمان که کتیگوری بندی نه بوته انت",
+       "uncategorizedcategories": "تهرهان که کتیگوری بندی نه بوته انت",
+       "uncategorizedimages": "کتیگوری بندی نه بوته ئین فایلان",
+       "uncategorizedtemplates": "کتیگوری بندی نه بوته ئین تراشوانان",
+       "unusedcategories": "استفاده نه بوته ئین تهرهان",
+       "unusedimages": "استفاده نه بوته ئین فایلان",
+       "wantedcategories": "ضرورتین تهرهان",
+       "wantedpages": "ضرورتین تاکدیمان",
+       "wantedpages-badtitle": "نامجازین ئنوانی بی مجموعه نتایج: $1",
+       "wantedfiles": "ضرورتین فایلان",
+       "wantedtemplates": "ضرورتین تراشوانان",
+       "mostlinked": "تاکدیمان که گیشتیر شه دیگران بئ آوان لینک داته بوته",
+       "mostlinkedcategories": "تهرهان که گیشتیر شه دیگران بئ آوان لینک داته بوته",
+       "mostlinkedtemplates": "تاکدیمان که گیشتیر ترانسکلوڈ بوته انت",
+       "mostcategories": "تاکدیمان گۆ بازین تهرهان",
+       "mostimages": "فایلان که گیشتیر شه دیگران بئ آوان لینک داته بوته",
+       "mostinterwikis": "تاکدیمان گۆ بازین میان ویکی هان",
+       "mostrevisions": "تاگدیمان گۆ بازێن نخسه ئان",
+       "prefixindex": "موچین تاکدیمان گۆ پدوندی",
+       "prefixindex-strip": "دیموندین نوار بئ لیست ئی تا",
+       "shortpages": "گونڈ\tین تاکدیمان",
+       "longpages": "تچکین تاکدیمان",
+       "deadendpages": "بن بستین تاکدیمان",
+       "deadendpagestext": "جهلگین تاکدیمان گۆ هیچگوجام تاکدیما بئ  {{SITENAME}} ئی تا لینک نه دارنت.",
+       "protectedpages": "قُلپ بوتگین تاکدیمان",
+       "protectedpages-indef": "فقط بی پایانین قُلپ ئان",
+       "protectedpages-timestamp": "وختی برچسپ",
        "protectedpages-page": "تاکدیم",
+       "protectedpages-expiry": "الاسی وخت",
+       "protectedpages-performer": "قُلپ کنۆوکین کار زوروک",
+       "protectedpages-params": "قُلپ بوته ئین پارامیتران",
+       "protectedpages-reason": "دلیل",
+       "protectedpages-unknown-timestamp": "نامئلوم",
+       "protectedpages-unknown-performer": "نادروستئ ئین کار زوروک",
+       "protectedtitles": "قُلپ بوته ئین ئنوانان",
+       "listusers": "کار زوروکانئ لڑلیست",
+       "listusers-editsonly": "فقط آ کار زوروکان که ایڈیٹ کورته انت نشان ب دئ",
+       "listusers-creationsort": "مرتب کورتین بئ اساس جۆڑ کورتینی تاریخا",
+       "listusers-desc": "نزولی ترتیب",
+       "usereditcount": "$1 {{PLURAL:$1|ایڈیٹ|ایڈیٹ}}",
+       "usercreated": "{{GENDER:$3|جوڑ بوته}} بئ تاریخ $1 بئ سائت $2",
+       "newpages": "نوکین تاکدیم",
        "newpages-username": "کار زوروکین نام:",
+       "ancientpages": "کهنگین تاکدیمان",
+       "move": "انتقال",
+       "movethispage": "ای تاکدیمی انتقال",
+       "notargettitle": "بی شه هدفا",
+       "nopagetitle": "ایرنگی تاکدیمئ وجود نداریت",
+       "pager-newer-n": "{{PLURAL:$1|یک نوکتیرین مورد|$1 نوکتیرین مورد}}",
+       "pager-older-n": "{{PLURAL:$1|یک دیمتیرین مورد|$1 دیمتیرین مورد}}",
+       "suppress": "گیندوک ئان",
+       "apihelp": "API کومک",
+       "apihelp-no-such-module": "موڈیل \" $1 \" ودی نه بوت.",
+       "booksources": "کتابئ منبه ئان",
+       "booksources-search-legend": "په کتایئ منابی ئان خاتیرا گشتین",
        "booksources-search": "گشتین",
        "specialloguserlabel": "مجری:",
+       "speciallogtitlelabel": "هدف (ئنوان یا کار زوروک):",
        "log": "سیاهه‌ها",
+       "all-logs-page": "عمومین موچین سیاه چال هان",
+       "logempty": "شمی منطبقین آیتم بی سیاه چالئ تا ودی نه بوت.",
+       "log-title-wildcard": "آ تاکدیمیانی پدا بگرد که آوانی ئنوان که گۆ ای ئبارت ئا شرو ئه بیئت",
+       "allpages": "موچین تاکدیمان",
+       "nextpage": "بعدین تاکدیم ($1)",
+       "prevpage": "دیمی تاکدیم ($1)",
+       "allpagesfrom": "تاکدیمانئ نشان داتین شرو شه:",
+       "allpagesto": "تاکدیمانئ نشان داتین الاسئ گو:",
        "allarticles": "موچین تاکدیمان",
+       "allinnamespace": "موچین تاکدیمان ($1 نامی فضا)",
        "allpagessubmit": "برا",
+       "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": "$1 شه $2 ئا لینک داریت",
+       "linksearch-error": "نشانگ فقط بئ انترنیتی میزبانی اولی نامی تا تواننت استفاده بیئنت.",
+       "listusersfrom": "نمایش داتین کار زوروکان شرو شه:",
        "listusers-submit": "نشان داتین",
+       "listusers-noresult": "هیچ کار زوروکئ ودی نه بوت.",
+       "listusers-blocked": "(بلاک بوته)",
+       "activeusers": "پئالین کار زوروکانئ لڑ لیست",
+       "activeusers-intro": "جهلگا یک لڑئ شه کار زوروکان ئه گیندیت که بئ $1 {{PLURAL:$1|روچ|روچ}} دیمتیرا پئالیت داشته انت.",
+       "activeusers-count": "$1 {{PLURAL:$1|پئالیت|پئالیت}} بئ {{PLURAL:$3|رۆچ|$3 رۆچ}} اخیرا",
+       "activeusers-from": "نمایش داتین کار زوروکان شرو شه:",
+       "activeusers-hidebots": "رباتانی چیهر داتین",
+       "activeusers-hidesysops": "مدیرانئ چیهرداتین",
+       "activeusers-noresult": "هیچ کار زوروکئ ودی نه بوت.",
+       "listgrouprights": "کار زوروکین گروپانئ اختیاران",
        "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": "نامی فضا",
+       "trackingcategories": "ردیابی کنۆکین تهرهان",
+       "trackingcategories-msg": "ردیابئ تهر",
+       "trackingcategories-name": "پیامی نام",
+       "trackingcategories-desc": "تهرئ کنجایش ئی معیاران",
+       "trackingcategories-nodesc": "هیچ توضیحی موجود نه اینت.",
+       "trackingcategories-disabled": "تهر غیر پئال بوته",
+       "mailnologin": "ادرسئ شه دیم دهۆک ئا موجود نه اینت",
+       "emailuser": "ای کار زوروکئ ایمیل",
+       "emailuser-title-target": "ایمیل په {{GENDER:$1|کار زوروکا}}",
        "emailuser-title-notarget": "کار زوروکی ایمیل",
        "emailpage": "کار زوروکی ایمیل",
+       "defemailsubject": "{{SITENAME}} ایمیل شه کار زوروکئ نیمگا «$1»",
+       "usermaildisabled": "کار زوروکئ ایمیل غیر پئال اینت",
+       "noemailtitle": "ایمیل ئی ادرس موجود نه اینت",
+       "noemailtext": "ای کار زوروک موتبرین ایمیل ئی مشخص نه کورته.",
+       "nowikiemailtext": "ای کار زوروک انتخاب کورته که شه دیگه کار زوروکان په آیی ایمیل مه آینت.",
+       "emailnotarget": "کار زورکین نام موجود نه اینت یا ناموتبر په گیرنده ئا.",
+       "emailtarget": "گیرنده ئی کار زوروکین ناما وارد بکنیت",
        "emailusername": "کار زوروکین نام:",
        "emailusernamesubmit": "ثبت کورتین",
+       "email-legend": "یک ایمیلی داتین په دیگرین {{SITENAME}} کار زوروکا",
        "emailfrom": "شه:",
        "emailto": "بی:",
        "emailsubject": "ئنوان:",
        "emailmessage": "پیام:",
        "emailsend": "دیم دئ",
+       "emailccme": "پیامی رونیویشت ئا په من دیم دی.",
+       "emailccsubject": "شمی پیامی رونیویشت په $1: $2",
        "emailsent": "ایمیل دیم دئ",
+       "emailsenttext": "شمی ایمیل پیام دیم داته بوت",
+       "usermessage-summary": "سیستم یی پیامی ایشتین.",
+       "usermessage-editor": "سیستم یی پیام رسان",
        "watchlist": "واچلیست",
        "mywatchlist": "واچلیست",
        "watchlistfor2": "په $1 $2",
+       "nowatchlist": "شمی واچلیست ئی تا هیچ موردی نه اینت.",
+       "watchlistanontext": "په وتي واچلیستئ دستین و ایڈیٹ ئی خاتیرا شه $1 ئا استفاده بکنیت.",
+       "watchnologin": "داخل نه بوته ئیت",
+       "addwatch": "افاضه کورتین بئ واچلیستا",
+       "addedwatchtext-short": "\" $1 \" ئی دیم بئ شمی واچلیست ئا ایزاپه بوته.",
+       "removewatch": "پاک کورتین شه واچلیستا",
+       "removedwatchtext": "«[[:$1]]» دیم شه  [[Special:Watchlist|شمی واچلیستا]] زورته بوت.",
+       "removedwatchtext-short": "\"$1\" ئی دیم شه شمی واچلیستا پاک بوته.",
        "watch": "دیستین",
+       "watchthispage": "دیستین ای تاکدیمی",
        "unwatch": "اوشتارین تین دیستینی",
+       "unwatchthispage": "اوشتارینتین چارگ ئی",
+       "notanarticle": "تاکدیم محتوایی نه اینت",
+       "notvisiblerev": "آخرین نخسه شه دیگه کار زوروکئ نیمگا پاک بوته.",
+       "wlheader-enotif": "ایمیل ئی ناتیپشن پئال اینت.",
+       "wlheader-showupdated": "تاکدیمان که شه شمی آخیرین دیستینا پد تغیر بوته انت '''پررنگ''' نشان داته بیئنت.",
+       "wlnote": "بئ جهلگا {{PLURAL:$1|تغییری|<strong>$1</strong> تغییری}} که بئ {{PLURAL:$2|سائت|<strong>$2</strong> سائت}} دیمتیرا انجام بوته موجود اینت، آخیرین بازیابی تاریخ: $3، $4",
+       "wlshowlast": "نشان داتین آخیرئین $1 سائت $2 روچئ",
+       "watchlist-options": "واچلیستئ آپشن",
+       "watching": "بئ دیستینئ حالا...",
+       "unwatching": "دیستینئ اوشتارینتین...",
+       "watcherrortext": "مشکل بئ شمی واچلیستئ تنظماتانی بدل کورتینی وختا په «$1» ئا رخ دات.",
+       "enotif_reset": "نشان گذاری کورتین موچین تاکدیمانی گۆ دیسته بوته ئین ئنوانا",
+       "enotif_impersonal_salutation": "کار زوروک {{SITENAME}}",
+       "enotif_subject_deleted": "{{SITENAME}} تاکدیم $1 شه {{gender:$2|$2}} نیمگا پاک بوت.",
+       "enotif_subject_created": "{{SITENAME}} تاکدیم $1 شه {{gender:$2|$2}} نیمگا جوڑ بوته.",
+       "enotif_subject_moved": "{{SITENAME}} تاکدیم $1 شه {{gender:$2|$2}} نیمگاانتقال بوت.",
+       "enotif_subject_restored": "{{SITENAME}} تاکدیم $1 شه {{gender:$2|$2}} نیمگا نوک بوت.",
+       "enotif_subject_changed": "{{SITENAME}} تاکدیم $1 شه {{gender:$2|$2}} نیمگا تغیر بوت.",
+       "enotif_body_intro_deleted": "$1 تاکدیم {{SITENAME}} $PAGEEDITDATE بی تاریخی شه{{gender:$2|$2}} نیمگا پاک بُوت ، $3 ئا بگیندیت .",
+       "enotif_body_intro_created": "{{SITENAME}} $1 ئی تاکدیم بئ تاریخ $PAGEEDITDATE شه {{gender:$2|$2}} ئی نیمگا جۆڑ بوت، $3 ئا په انونین نخسه ئا بگیندیت.",
+       "enotif_body_intro_moved": "{{SITENAME}} $1 ئی تاکدیم بئ تاریخ $PAGEEDITDATE شه {{gender:$2|$2}} ئی نیمگا انتقال بوت، $3 ئا په انونین نخسه ئا بگیندیت.",
+       "enotif_body_intro_restored": "{{SITENAME}} $1 تاکدیم بئ تاریخ $PAGEEDITDATE شه {{gender:$2|$2}} ئی نیمگا پدا جۆڑ بوت، $3 ئا په انونین نخسه ئا بگیندیت.",
+       "enotif_body_intro_changed": "{{SITENAME}} $1 ئی تاکدیم بئ تاریخ $PAGEEDITDATE شه {{gender:$2|$2}} ئی نیمگا تغیر داته بوت، $3 ئا په انونین نخسه ئا بگیندیت.",
+       "enotif_lastvisited": "په موچین تغیران شه آخیرئین واری که سر جته ئیت  ایدا $1 بگنیت.",
+       "enotif_lastdiff": "په ای تغیری دیستینا $1 ئا بگیندیت.",
+       "enotif_anon_editor": "$1 نا دروستی ئین کار زوروک",
+       "enotif_body": "$WATCHINGUSERNAME گرامی،\n\n$PAGEINTRO $NEWPAGE\n\n\nایڈیٹ کنۆکێ توضیحات: $PAGESUMMARY $PAGEMINOREDIT\n\nتماس گۆ ایڈیٹ کنۆکا:\nایمیل: $PAGEEDITOR_EMAIL\nویکی: $PAGEEDITOR_WIKI\n\nتا وختی که بئ ای دیما سر نه جته ئیت ، بئ شمی احتمالی ئین فعالیتی گیشتیرین بوتین ئی سورتا، تا وختی که گۆ وتئ کار زوروکین حسابا بی سایت تا وێت ، شما جار دیم داته ئه نه بیێت.\nشما همچنین توانتیت وتئ چاریێتین لیست ئی تا موچین بیراکانه سیپر کنیت و هم توانیت آوانا پدا بیئرگردی نیت.\n\nشمی دوستدارۆک، {{SITENAME}} ئی نوتیپیشن ئی سیستم\n\n--\nپه ای ایمیل ئی مئلومات رسانی ئی تنظیماتانی تغیری خاتیرا بئ {{canonicalurl:{{#special:EditWatchlist}}}} ئی تا برۆیت.\n\nپه وتئ واچلیستی تنظماتانی تغیر بئ  {{canonicalurl:{{#special:EditWatchlist}}}} ئی تا برۆیت\n\nپه دیمی پاک کورتین ئی خاتیرا شه وتئ واچلیستا بئ $UNWATCHURL ئی تا برۆیت.\n\nپه گیشتیرین کومک ئی خاتیرا:\n$HELPPAGE",
        "deletepage": "تاکدیمی پاک کورتین",
        "confirm": "تأیید کورتین",
+       "excontent": "تاکدیمی محتوا ایش ات: «$1»",
+       "excontentauthor": "تاکدیمی محتوا ایش ات: «$1» (و تانا مشارکت کنۆک «[[Special:Contributions/$2|$2]]» ات)",
+       "exbeforeblank": "تاکدیمی محتوا دیم شه خالی کورتینا ایش ات: «$1»",
        "delete-confirm": "پاک کورتین «$1»",
        "delete-legend": "پاک کورتین",
+       "historywarning": "<strong>هشدار:</strong> تاکدیمی ئا که پاک ئه کنیت تاریخچه داریت گۆ  $1 {{PLURAL:$1|پدا دیسته بوتین|پدا دیسته بوتین ئان}} اینت:",
+       "actioncomplete": "کار بوت",
+       "actionfailed": "کار نه بوت",
+       "deletedtext": "«$1» پاک بوت.\nپه آخیرین پاک بوتینین سابقه ئا بئ $2 ئی تا مراجعه بکنیت.",
+       "dellogpage": "سیاه چال ئی پاک کورتین",
+       "dellogpagetext": "جهلگین لڑلیست شه آخیرین پاک بوته ئین ئانی لڑا اینت.\nموچین ئانی نشان داته بته ئین وخت خادم وخت (گرینویچ ئی وخت) انت.",
+       "deletionlog": "سیاه چال ئی پاک کورتین",
+       "reverted": "بی دیمتیرین نخسه ئا بیئرگردینته بوت",
        "deletecomment": "دلیل:",
+       "deleteotherreason": "دیگرین دلیل/اضافی:",
+       "deletereasonotherlist": "دیگرین دلیل",
+       "deletereason-dropdown": "*پاک بوتینئ متدوالین دلیل\n** سپم\n** خرابکاری\n** کاپی رایت ئی نقض\n** کار زوروکئ خواهش\n** پروشته ئین تغیر میسر",
+       "delete-edit-reasonlist": "پاک بوتینئ دلیلانئ ایڈیٹ",
+       "deleteprotected": "شما نه توانیت که ای تاکدیما پاک کنیت چون که شه آیی محافظت بوته.",
+       "deleting-backlinks-warning": "''' هشدار:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|دیگرین تاکدیم]] هستنت که گۆ ای تاکدیما که شما ئه لوٹیت آیرا پاک بکنیت لینک بوته انت.",
+       "rollback": "ایڈیٹئ بیئرگردینتین",
        "rollbacklink": "بیجا آورتین",
+       "rollbacklinkcount": "بیئرگردینتین $1 {{PLURAL:$1|ایڈیٹ|ایڈیٹ هانئ}}",
+       "rollbacklinkcount-morethan": "بیئرگردینتین گیشتیر شه $1 ایڈیٹا",
+       "rollbackfailed": "بیئرگردینته نه بوت",
+       "cantrollback": "نه توانیت که ایڈیٹ ئا بیئرگردینیت؛\nآخرین مشارکت‌کنۆک ای مقاله ئی تانائین مولف اینت.",
+       "editcomment": "ایڈیٹ ئی خلاصه ایش ات: «''$1''».",
+       "rollback-success": "$1 ئی ایڈیٹ بیئرگردینته بوتنت؛\nتاکدیم بئ اخیرین ایڈیٹ شه $2 ئا بیئرگردینته بوت.",
+       "sessionfailure-title": "کار زوروکئ نشست ئی خطا",
+       "protectlogpage": "سیاهگئ قُلپ",
+       "protectedarticle": "«[[$1]]» ئا قُلپ کورت",
+       "modifiedarticleprotection": "«[[$1]]» قُلپ ئی وزيیتا گردینت",
+       "unprotectedarticle": "«[[$1]]» ئی تاکدیمئ قُلپ يا پاچ کورت",
+       "movedarticleprotection": "قُلپ ئی تنظیماتاشه «[[$2]]» ئا بئ  «[[$1]]» ئا جابجا کورت",
+       "protect-title": "«$1»  ئی قُلپ ئی وزئتئ گردینتین",
+       "protect-title-notallowed": "\" $1 \" ئی قُلپ ئی سطح دیستین",
+       "prot_1movedto2": "[[$1]] بئ [[$2]] ئا جابجا بوت",
+       "protect-badnamespace-title": "نام فضا بی شه قُلپا",
+       "protect-badnamespace-text": "ای فضای نامی تا موجودین تاکدیمان نه توانن قُلپ کنن.",
+       "protect-norestrictiontypes-title": "غیر قابل قُلپ ئین تاکدیم",
+       "protect-legend": "قُلپ کورتین ئی تائیدی",
        "protectcomment": "دلیل:",
+       "protectexpiry": "الاسی وخت:",
+       "protect_expiry_invalid": "الاسی وخت صحیح نه اینت.",
+       "protect_expiry_old": "الاسی وخت بئ دیما.",
+       "protect-unchain-permissions": "قُلپی دیگرین بخشانی پاچ کورتین",
+       "protect-default": "اجازه داتین بئ موچین کار زوروکان",
+       "protect-fallback": "فقط بئ آ کار زوروکان که بئ  «$1» ئا دسترسی دارنت، اجازه داته ئه بیئت",
+       "protect-level-autoconfirmed": "تانا اجازه په تائید بوته ئین کار زوروکان",
+       "protect-level-sysop": "فقط مدیر هان",
+       "protect-summary-cascade": "آپشاری",
+       "protect-expiring": "پوره بوتین ئی وخت $1 (UTC)",
+       "protect-expiring-local": "پوره بوته ئین $1",
+       "protect-expiry-indefinite": "بی‌پایان",
+       "protect-cantedit": "شما ئه نه توانیت ای تاکدیمی قُلپئ وضیعتا تغیر بدهیت، چون که شما آیی ایڈیٹ ئی اجازه ئا نداریت.",
+       "protect-othertime": "دیگه وخت:",
+       "protect-othertime-op": "دیگه وخت",
+       "protect-existing-expiry": "موجودین انقضای وخت: $2، $3",
+       "protect-existing-expiry-infinity": "موجودین انقضای وخت: بی‌نهایت",
+       "protect-otherreason": "دیگرین دلیل/اضافی:",
+       "protect-otherreason-op": "دیگرین دلیل",
+       "protect-edit-reasonlist": "قُلپی دلیلانی ایڈیٹ کورتین",
+       "protect-expiry-options": "۱ سائت:1 hour,۱ روچ:1 day,۱ هپتگ:1 week,۲ هپتگ:2 weeks,۱ ماه:1 month,۳ ماه:3 months,۶ ماه:6 months,۱ سال:1 year,بی‌پایان:infinite",
+       "restriction-type": "دسترسی:",
+       "restriction-level": "محدودیت ئی سطح:",
+       "minimum-size": "حداقل اندازه",
+       "maximum-size": "حداکثر اندازه:",
+       "pagesize": "(بایٹ)",
        "restriction-edit": "ایڈیٹ",
        "restriction-move": "انتقال",
        "restriction-create": "جوڑ\t کورتین",
        "restriction-upload": "بُرز کورتین",
+       "restriction-level-sysop": "کاملآ قُلپ بوته",
+       "restriction-level-autoconfirmed": "نیمه‌ گ قُلپ بوته",
+       "restriction-level-all": "هر سطحی",
+       "undelete": "پاک بوته ئین تاکدیمانی دیستین",
+       "undeletepage": "پاک بوته ئین تاکدیمانی دیستین و پدا جۆڑ کورتین",
+       "undeletepagetitle": "'''آن چه که دیمتیرا کاینت شامل شه [[:$1|$1]] ئی پاک بوته ئین نخسه ئان انت'''.",
+       "viewdeletedpage": "پاک بوته ئین تاکدیمانی دیستین",
+       "undelete-fieldset-title": "نخسه ئانی پدا جۆڑ کورتین",
+       "undeleterevisions": "$1 آرشیف {{PLURAL:$1|بوته|بوته انت}}",
+       "undelete-revision": "$1 ئی پاک بوته ئین نخسه (بئ تاریخ $4 سائت $5) شه $3 ئی نیمگا:",
+       "undelete-nodiff": "قدیمیتیرین نخسه ئی ودئ نه بوت.",
+       "undeletebtn": "احیا",
+       "undeletelink": "نمایش/احیا",
+       "undeleteviewlink": "دیستین",
+       "undeleteinvert": "انتخاب سرچپی بیئت",
+       "undeletecomment": "دلیل:",
+       "undeletedrevisions": "$1 ئی نخسه احیا {{PLURAL:$1|بوت}}",
+       "undeletedrevisions-files": "$1 نخسه و $2 فایل پداجۆڑ {{PLURAL:$1|بوت|بوتنت}}.",
+       "undeletedfiles": "$1 ئی فایل پدا جۆڑ {{PLURAL:$1|بوت|بوتنت}}.",
+       "cannotundelete": "پدا جۆڑ کورتین ناکام ات:\n$1",
+       "undeletedpage": "'''$1 پدا جۆڑ بوت'''\n\nپه پاک بوته ئین و پدا جۆڑ بوته ئین سیاهه ئی خاتیرا بئ [[Special:Log/delete|پاک بوته ئین ئانی سیاهه]] ئی تا برۆیت.",
+       "undelete-header": "په آ دیما که بئ ای آخیرا پاک بوته انت بئ   [[Special:Log/delete|پاک بوته ئین ئانی سیاهه]] ئا بگیندیت.",
+       "undelete-search-title": "گشتین په پاک بوته ئین تاکدیمان",
+       "undelete-search-box": "گشتین په پاک بوته ئین تاکدیمان",
+       "undelete-search-prefix": "نشان داتین تاکدیمانی شرو شه:",
        "undelete-search-submit": "گشتین",
+       "undelete-no-results": "هیچ مطابقت ئی تاکدیمی بئ پاک بوته ئین ئانی آرشیف ئی تا ودئ نه بوت.",
+       "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": "Associated namespace",
        "blanknamespace": "(بُنیادی)",
+       "contributions": "{{GENDER:$1|کار زوروک}} ئی شراکت ئان",
+       "contributions-title": "$1 ئی کار زوروکئ شراکت ئان",
+       "mycontris": "شراکت ئان",
+       "contribsub2": "په {{GENDER:$3|$1}} ($2)",
+       "contributions-userdoesnotexist": "«$1» ئی کار زوروکین حساب راجستر نه بوته.",
+       "nocontribs": "هیچ تغیری گۆ ای مشخصات ئان ودێ نه بوت",
+       "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-toponly": "فقط آخیرین نخسه ئانی  ایڈیٹ نشان داته بئنت",
+       "sp-contributions-newonly": "فقط نشان داتین آ ایڈیٹانی که دیمی جۆڑ کورتینی هستنت",
        "sp-contributions-submit": "گشتین",
+       "whatlinkshere": "لینک بئ ای تاکدیما",
+       "whatlinkshere-title": "تاکدیمان که گو  «$1» لینک دارنت",
        "whatlinkshere-page": "تاکدیم:",
+       "linkshere": "جهلگین دیم بئ  '''[[:$1]]''' ئا لینک داریت:",
+       "nolinkshere": "هیچ دیمی بئ  '''[[:$1]]''' ئا لینک نه داریت.",
+       "nolinkshere-ns": "هیچ دیمی شه انتخاب بوته ئین نامی فضائان بئ  '''[[:$1]]''' ئا لینک نداریت.",
+       "isredirect": "تاکدیمی تغییرمسیر داتین",
+       "istemplate": "تراگنجانش‌هان",
+       "isimage": "فایل لینک",
+       "whatlinkshere-prev": "{{PLURAL:$1|دیمئ|$1 دیمئ مورد}}",
+       "whatlinkshere-next": "{{PLURAL:$1|پدئ|$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": "دلیل:",
+       "ipb-hardblock": "دیمگیری شه ایڈیٹ کورتین ئا کار زوروکانئ که شه آی پی نیمگا راجستر بوته انت",
+       "ipbcreateaccount": "دیمگیری شه حسابئ جوڑ کورتینا",
+       "ipbemailban": "دیمگیری شه ایمیلی دیم داتینا",
+       "ipbsubmit": "ای کار زوروک بسته بیئت",
+       "ipbother": "دیگه وخت:",
+       "ipboptions": "۲ سائت:2 hours,۱ روچ:1 day,۳ روچ:3 days,۱ هپتگ:1 week,۲ هپتگ:2 weeks,۱ ماه:1 month,۳ ماه:3 months,۶ ماه:6 months,۱ سال:1 year,بی‌پایان:infinite",
+       "ipbhidename": "چیهرداتین کار زوروکئ ناما شه ایڈیٹان و لیستا",
+       "ipbwatchuser": "ای کار زوروکئ ، کارزوروکین و حبر وگپ ئی دیمانی دیستین",
+       "ipb-disableusertalk": "دیمگیری کورتین شه ایڈیٹ کورتین ئا گپ و حبر ئی تاکدیمئ شه کار زوروکئ جیندئ نیمگا وختی که آ بلاک اینت",
+       "ipb-change-block": "کار زوروکئ پدا بلاک کورتین گۆ ای تنظیماتان",
+       "ipb-confirm": "بستینئ تائید کورتین",
+       "badipaddress": "آی‌پی نامجازین ادرس",
+       "blockipsuccesssub": "بستین گو کامیابیا انجام بوت",
+       "blockipsuccesstext": "[[Special:Contributions/$1|$1]] بسته بوت.<br />\nپه بلاک یا بسته بوته ئین نانی خاتیرا [[Special:BlockList|ای جاه]] ئا بگیندیت.",
+       "ipb-blockingself": "شما وترا بئ بلاک کورتین ئی حالا هستیت! آیا شما موتمئین هستیت که لۆٹیت ایرنگین کاری بکنیت؟",
+       "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 الاس بوت",
+       "unblocked-ip": "[[Special:Contributions/$1|$1]] انبلاک بوت.",
+       "blocklist": "بلاک بوته ئین کار زوروکان",
+       "ipblocklist": "بلاک بوته ئین کار زوروکان",
+       "ipblocklist-legend": "گشتین په بلاک بوته ئین کار زوروکا",
+       "blocklist-userblocks": "چیهرداتین بسته بوتین ئانی حسابئ",
+       "blocklist-tempblocks": "موقتین بستینانی چیهرداتین",
+       "blocklist-addressblocks": "چیهرداتین یک آی پی بسته بوته ئین",
+       "blocklist-rangeblocks": "رینج ئی بلاک هانئ چیهرداتین",
+       "blocklist-timestamp": "وختی برچسپ",
        "blocklist-target": "هدف",
+       "blocklist-expiry": "الاسی وخت",
+       "blocklist-by": "بلاک کورتین ئی مدیر",
+       "blocklist-params": "بلاک ئی پارامیتران",
        "blocklist-reason": "دلیل",
        "ipblocklist-submit": "گشتین",
+       "ipblocklist-localblock": "محلین دسترسی ئی بستین",
+       "ipblocklist-otherblocks": "دیگرین {{PLURAL:$1|بستین‌هان|بستین‌هان}}",
+       "infiniteblock": "بی‌پایان",
+       "expiringblock": "بئ $1 سائت $2 ئا الاس ئه بێت",
+       "anononlyblock": "فقط زیان نامین کار زوروکان",
+       "noautoblockblock": "اوتوماتیکبلاک غیرفعال اینت",
+       "createaccountblock": "حسابئ جوڑ کورتینئ قابلیت غیر پئال بوت",
+       "emailblock": "ایمیل بسته بوته",
+       "blocklist-nousertalk": "وتئ گپ ئی تاکدیما نتوان ایڈیٹ کورت",
+       "ipblocklist-empty": "بسته بوته ئین ئانی لیست خالی اینت.",
+       "blocklink": "بلاک یا بستین",
+       "unblocklink": "پاچ یا انبلاک بێت",
+       "change-blocklink": "بلاک ئی تغیرداتین",
+       "contribslink": "مشارکت ئان",
+       "emaillink": "ایمیلی دیم داتین",
+       "blocklogpage": "کورمئ بستین",
+       "blocklogentry": "«[[$1]]» ئا تا $2 بست $3",
+       "unblocklogentry": "$1 ئا پاچ کورت",
+       "block-log-flags-anononly": "فقط زیان نامین کار زوروکان",
+       "block-log-flags-nocreate": "حسابئ جوڑ کورتینئ قابلیت غیر پئال بوت",
+       "block-log-flags-noautoblock": "اوتوماتیکبلاک غیرفعال اینت",
+       "block-log-flags-noemail": "ایمیل بسته بوته",
+       "block-log-flags-nousertalk": "وتئ گپ ئی تاکدیما نتوان ایڈیٹ کورت",
+       "block-log-flags-angry-autoblock": "پیشرفته ئین اتوماتیکین بلاک فعال بوت",
+       "block-log-flags-hiddenname": "چیهرین کار زوروکئ نام",
+       "ipb_expiry_invalid": "الاسی وخت صحیح نه اینت.",
+       "ipb_already_blocked": "«$1» همی انون بسته بوته",
+       "ipb-otherblocks-header": "دیگرین {{PLURAL:$1|بلاک|بلاک ئان}}",
+       "ip_range_invalid": "ناموتبرین آی پی ئی رینج",
+       "proxyblocker": "پروکسی ئی بلاک کنۆک",
+       "lockdb": "مئلوماتئ بانکی قُلپ کورتین",
+       "unlockdb": "مئلوماتئ بانکی قُلپئ پروشتێن",
+       "lockconfirm": "هان، من جدآن لوٹین که مئلومانئ بانکا قُلپ کنین.",
+       "unlockconfirm": "هان، من جدآن لوٹین که مئلوماتئ بانکی قُلپا پاچ کنین.",
+       "lockbtn": "مئلوماتئ بانکی قُلپ کورتین",
+       "unlockbtn": "مئلوماتئ بانکی قُلپئ پروشتێن",
+       "locknoconfirm": "شما بئ تائیدی جئبه ئی تا چیک مه جنیت",
+       "lockdbsuccesssub": "مئلوماتئ بانک قُلپ بوت",
+       "unlockdbsuccesssub": "مئلوماتئ بانکئ قُلپ پاچ بوت",
+       "lockdbsuccesstext": "مئلوماتئ بانک قُلپ بوت.\n<br />شه هوشا مه برێیت که پد شه الاس بوتینا قُلپا پاچ بکنیت.",
+       "unlockdbsuccesstext": "مئلوماتئ بانکی قُلپ پاچ بوت.",
+       "databasenotlocked": "مئلوماتئ بانک قُلپ نه اینت.",
+       "lockedbyandtime": "(بواسطه $1 ئا بئ $2 سائت $3)",
+       "move-page": "انتقال $1",
+       "move-page-legend": "تاکدیمی انتقال",
        "movearticle": "تاکدیمی انتقال:",
+       "newtitle": "گۆ نوکین ئنوانا:",
+       "movepagebtn": "تاکدیمی انتقال",
+       "pagemovedsub": "جابجایی گۆ کامیابیا بوت",
+       "movepage-moved": "'''«$1» بئ «$2» انتقال بوت'''",
+       "movepage-moved-redirect": "یک تغیرمسیر جۆڑ بوت.",
+       "movetalk": "حبر و گپ ئی دیم جابجا بیئت",
+       "move-subpages": "گۆنڈ دیمانی انتقال (تا $1 دیم)",
+       "move-talk-subpages": "حبر وگپ ئی گۆنڈ دیمانی انتقال (تا $1 دیما)",
+       "movepage-page-exists": "$1 ئی تاکدیم شه دیما موجود اینت ، نه توان که آیرا بئ اوتوماتیکین رقما جایگیر بکنت.",
+       "movepage-page-moved": "$1 ئی دیم بئ $2 ئا انتکا بوت.",
+       "movelogpage": "انتقال ئی سیاهه",
+       "movelogpagetext": "بئ جهلگا لیستی شه انتقال ئی دیمانی آته.",
+       "movesubpage": "{{PLURAL:$1|گۆنڈدیم|گۆنڈدیم هان}}",
+       "movenosubpage": "ای تاکدیم هیچ گۆنڈدیم ئی نداریت.",
        "movereason": "دلیل:",
+       "revertmove": "بیرگردینتین",
+       "delete_and_move": "پاک کورتین یا جابیجا",
+       "delete_and_move_confirm": "هان،تاکدیم پاک بیئت",
+       "delete_and_move_reason": "پاک کورتین  «[[$1]]» جابجایی امکانا",
+       "export": "ڈن کورتین  تاکدیمانئ",
+       "exportall": "ڈن کورتین موچین تاکدیمانئ",
+       "exportcuronly": "فقط انونین نخسه شامل بیئت، نه موچین تاریخچه",
+       "export-submit": "دَر کورتین",
+       "export-addcattext": "افاضه کورتین تاکدیمان شه تهر ئا:",
        "export-addcat": "اڈ\tڈ\t کورتین",
+       "export-addnstext": "تاکدیمانی ایزاپه کورتین شه نامی فصای:",
        "export-addns": "اڈ\tڈ\t کورتین",
+       "export-download": "ذخیره کورتین بئ فایلئ رقما",
+       "export-templates": "شامل بوتین تراشوانانئ",
+       "export-pagelinks": "شامل بوتین لینک بوته ئین تاکدیمان تا ای جُهلی ئا:",
+       "allmessages": "سیستم ئی پیام",
        "allmessagesname": "نام",
+       "allmessagesdefault": "پیامی پیش فرضین متن",
+       "allmessagescurrent": "پیامی انونین متن",
+       "allmessages-filter-legend": "فیلتر",
+       "allmessages-filter": "فیلترکورتین بئ اساس ئی شخصی کورتین ئی وزیئتا:",
+       "allmessages-filter-unmodified": "تغیر نه کورته",
        "allmessages-filter-all": "موچ",
+       "allmessages-filter-modified": "تغیر نه کورته",
+       "allmessages-prefix": "فیلتر کورتین بئ اساس پدوند:",
        "allmessages-language": "زبان:",
        "allmessages-filter-submit": "برا",
        "allmessages-filter-translate": "ترجمه",
        "thumbnail-more": "ٹُوه کورتین",
        "filemissing": "فایل وجود نداریت",
+       "thumbnail_error": "خطا بئ ناحُنی ئی جۆڑ کورتین ئی وختا: $1",
+       "thumbnail_error_remote": "خطای پیام $1 :\n$2",
+       "djvu_page_error": "DjVu دیم خارج مجازین محدوده ئا",
+       "djvu_no_xml": "XML ئی فایلی ودی کورتین ئی امکان په DjVu ئی استفاده کورتین ئا وجود نداشت.",
+       "thumbnail-temp-create": "نتوان که موقتین ناحُنی ئین فایلی جۆڑ کورت",
+       "thumbnail-dest-create": "نه توان که ناحُنی ئین اکس ئا بئ وتي مخصد ئی جاه تا ذخیره کورت",
+       "thumbnail_image-missing": "بی نظر ئه رسیت فایل زیان بوته: $1",
+       "import": "تاکدیمانێ بێ تێ کورتین",
+       "importinterwiki": "بي تئ رییتین ترانس ویکی ئی",
+       "import-interwiki-sourcewiki": "ویکی زێ منشا:",
+       "import-interwiki-sourcepage": "تاکدیمئ منشا:",
+       "import-interwiki-history": "ای تاکدیمی موچین تاریخچه ئی نخسه انتقال داته بوتنت",
+       "import-interwiki-templates": "موچین تراشوانانا شامل بیئت",
+       "import-interwiki-submit": "بێ تێ کورتین",
+       "import-interwiki-namespace": "نامی فضای مخصد:",
+       "import-interwiki-rootpage": "مخصدی دیمی ریشگ (اختیاری):",
+       "import-upload-filename": "فایلئ نام:",
+       "import-comment": "کومنیت:",
+       "importstart": "تاکدیمانی بي  تئ ریتینی حالا...",
+       "import-revision-count": "$1 {{PLURAL:$1|نخسه|نخسه}}",
+       "importnopages": "هیچ تاکدیمی په ایمپورت ئا نه اینت.",
+       "importfailed": "ایمپورت شکست وارت: <nowiki>$1</nowiki>",
+       "importunknownsource": "بُنریچی ئی رقم مئلوم نه اینت",
+       "importbadinterwiki": "بدئین انتیرویکی ئی لینک",
+       "importsuccess": "بي تی ریتین یا ایمپورت بوت!",
+       "import-upload": "اکس ام ال ئی دیتای بُرز کورتین",
+       "importlogpage": "ایمپورت لوگ",
+       "import-logentry-upload-detail": "$1 {{PLURAL:$1|نسخه|نسخه}} وارد بوته",
+       "import-logentry-interwiki": "$1 ئا ترانس ویکی کورت",
+       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|نسخه|نسخه}} داخل بوته شه $2",
+       "javascripttest": "جاوا اسکریپتی آزمایش",
+       "javascripttest-pagetext-noframework": "ای تاکدیم په جاوا اسکریپتی آزمایشی خاتیرا ایشته بوته.",
+       "javascripttest-pagetext-unknownaction": "نازانتین اکشن \"$1\".",
+       "javascripttest-pagetext-skins": "پوسته‌ای ئا په آزمایشانی اجرا ئا انتخاب کنیت:",
+       "javascripttest-qunit-intro": "[$1 آزمایشی مشتندانا] بئ mediawiki.org تا بگیندیت.",
+       "tooltip-pt-userpage": "شمی کار زوروکئ تاکدیم",
+       "tooltip-pt-mytalk": "شمی هبر و گپئ تاکدیم",
+       "tooltip-pt-preferences": "نئ تنظیمات",
+       "tooltip-pt-watchlist": "آ دیمانی لیست که شما آوانی تغیرانا پدگیری ئا کنیت",
+       "tooltip-pt-mycontris": "شمی شراکت ئانی لیست",
+       "tooltip-pt-login": "توصیه ئه کنن که بئ سایٹ ئی تا داخل بئیت. اگرچه که ای کار په جبر و زور نه اینت",
+       "tooltip-pt-logout": "در بوتین",
+       "tooltip-pt-createaccount": "شه شما ئه لوٹن که په وت یک کار زوروکئ حساب ئی جۆڑ بکنیت و بئ سایٹ ئی تا داخل بئیت؛هرچینکه که ای کار جبری نه اینت",
+       "tooltip-ca-talk": "ای دیمی محتوا ئانی باره ئا حبر و گپ",
+       "tooltip-ca-edit": "شما ئا توانیت که ای دیما ایڈیٹ بکنیت. مهربانی بکنیت دیم شه ایشی که ای دیما ذخیره بکنیت، شه دیم دیست ئا استفاده بکنیت.",
+       "tooltip-ca-addsection": "نوکین بخشی جۆڑ بکنیت",
+       "tooltip-ca-viewsource": "ای تاکدیم قُلپ بوته.\nفقط توانیت که آیی زي و منشائا بگیندیت",
+       "tooltip-ca-history": "ای تاکدیمی دیمین نخسه ئان",
+       "tooltip-ca-protect": "ای تاکدیمئ قُلپ کورتین",
+       "tooltip-ca-unprotect": "ای تاکدیمی قُلپئ ٹگل داتین",
+       "tooltip-ca-delete": "پاک کورتین ای تاکدیمئ",
+       "tooltip-ca-undelete": "بیئرگردینتین ڈیلیٹ بوته ئین تاکدیمی نسخه ئانی",
+       "tooltip-ca-move": "ای تاکدیمی انتقال",
+       "tooltip-ca-watch": "اضافه کورتین ای تاکدیمی بی نی واچلیستی تا",
+       "tooltip-ca-unwatch": "ڈیلیٹ کورتین ای تاکدیمی شه نی واچلیستی لڑ لیستا",
        "tooltip-search": "گشتین بی {{SITENAME}}",
+       "tooltip-search-go": "اگه امکان داشته بیئت تاکدیمی تا گو ای ناما برا",
+       "tooltip-search-fulltext": "گشتین په ای کلمه ئی خاتیرا بی تاکدیمانی تا",
        "tooltip-p-logo": "بُنیاد ئین تاکدیمی دیستین",
        "tooltip-n-mainpage": "بُنیاد ئین تاکدیمی دیستین",
        "tooltip-n-mainpage-description": "بُنیاد ئین تاکدیمی دیستین",
+       "tooltip-n-portal": "بی پروژه ئی موریدا٬ آنچه که توانیت انجام دهیت و ای که چی چیزی ئا شه گوجا ودی بکنیت",
+       "tooltip-n-currentevents": "پدزمینه ئین مئلوماتئ بدست آورتین شه انونین رویداد ئان",
+       "tooltip-n-recentchanges": "ویکی ئی آخیرین تغیرايانی لڑ لیست",
+       "tooltip-n-randompage": "یک تصادفی ئین دیمی آورتین",
+       "tooltip-n-help": "جای په ودی کورتین ئا",
+       "tooltip-t-whatlinkshere": "موچین تاکدیمانی لڑ لیست که گۆ ای دیما لینک وارته انت",
+       "tooltip-t-recentchangeslinked": "تاکدیمانئ آخیرین تغیران که ای دیم گۆ آوان لینک داریت",
+       "tooltip-feed-atom": "اتم ئی حبرنامه په ای دیما",
+       "tooltip-t-contributions": "ای کار زوروکئ شراکتانی لڑ لیست",
+       "tooltip-t-emailuser": "په ای کار زوروکا ایمیل ئی دیم داتین",
+       "tooltip-t-info": "ای دیمی باره ئا گیشتیرین مئلومات",
        "tooltip-t-upload": "فایلی بُرز کورتین",
+       "tooltip-t-specialpages": "لیستئ شه موچین خاصین تاکدیمانی",
+       "tooltip-t-print": "ای دیمی چاپ ئی وڑ ئین نخسه",
+       "tooltip-t-permalink": "شه تاکدیما ثابت ئین لینک په ای نخسه ئا",
+       "tooltip-ca-nstab-main": "تاکدیمێ محتویاتێ دیستین",
+       "tooltip-ca-nstab-user": "کارزوروکین تاکدیمی دیستین",
+       "tooltip-ca-nstab-media": "میدیایی تاکدیمێ دیستین",
+       "tooltip-ca-nstab-special": "ای یک خاصین تاکدیمی است٬ شما ئه توانیت که ای تاکدیما ایڈیٹ بکنیت",
+       "tooltip-ca-nstab-project": "پروژه ئی تاکدیمی دیستین",
+       "tooltip-ca-nstab-image": "دیستین فایلی تاکدیمی",
+       "tooltip-ca-nstab-mediawiki": "سیستم ئی پیامانی دیستین",
+       "tooltip-ca-nstab-template": "دیستین تراشوانئ",
+       "tooltip-ca-nstab-help": "دیستین کومکی تاکدیمئ",
+       "tooltip-ca-nstab-category": "دیستین تهری تاکدیمی",
+       "tooltip-minoredit": "ای ایڈیٹ ئا گۆنڈ ایڈیٹ نشانگ کن",
+       "tooltip-save": "وتئ تغیرانا ذخیره بکنیت",
+       "tooltip-preview": "شمی تغیرانی دیم دیست، مهربانی بکنیت دیما شه تاکدیمی ذخیره کورتینا شه ای کیلی ئا استفاده بکنیت.",
+       "tooltip-diff": "شمی تغیرانی نمایش که شما بئ متن ئی تا داته ایت.",
+       "tooltip-watchlistedit-normal-submit": "ئنوانانی پاک کورتین",
+       "tooltip-watchlistedit-raw-submit": "واچلیست ئی اپڈیٹ",
+       "tooltip-recreate": "پداجۆڑ کورتین تاکدیمی نه دیستین ایشیرا که ای تاکدیم دیما پاک بوته",
        "tooltip-upload": "بُرز کورتینی شرو",
+       "tooltip-rollback": "«بیئرگردینتین» ای دیمی آخیرئین ایڈیٹ کنۆک ئی ایڈیٹ(هان) گۆ یک کلیک ئا.",
+       "tooltip-preferences-save": "تنظیماتانی ذخیره کورتین",
+       "tooltip-summary": "خلاصه ئا داخل بکنیت",
+       "anonymous": "زیان نامین {{PLURAL:$1|کار زوروک|کار زوروکان}} شه {{SITENAME}}",
+       "siteuser": "$1، کار زوروک {{SITENAME}}",
+       "anonuser": "$1 نا دروست ئین کار زوروک {{SITENAME}}",
+       "lastmodifiedatby": "ای تاکدیم  آخرین وارا  بی $2، $1 بی $3 دستا تغییر داته بوته.",
+       "othercontribs": "بئ اساس اثر ئی شه $1 ئا",
+       "others": "دیگران",
+       "siteusers": "$1، {{PLURAL:$2|کار زوروک|کار زوروکان}} {{SITENAME}}",
+       "anonusers": " {{SITENAME}} نادروست ئین {{PLURAL:$2|کار زوروک|کار زوروکان}} $1",
+       "creditspage": "ای تاکدیمی کریدیت ئان",
+       "nocredits": "ای تاکدیمی جۆڑ کنۆک ئی مئلومات موجود نه انت.",
+       "spamprotectiontitle": "سپم ئانی فیلترینگ",
+       "spambot_username": "میدیا ویکی ئی تمیزکاری شه سپم هان",
+       "spam_reverting": "بیئرگردینتین آخیرین نخسه ئی که بئ $1 ئا لینک نداریت.",
+       "simpleantispam-label": "انتی-سپم ئی چیک .\nای قسمت ئا پُر  '''مه کنیت'''!",
+       "pageinfo-title": "مئلومات په «$1» ئا",
+       "pageinfo-header-basic": "بُنادین مئلومات",
+       "pageinfo-header-edits": "تاریخچه ئی ایڈیٹ",
+       "pageinfo-header-restrictions": "ساتیتین تاکدیمئ",
+       "pageinfo-header-properties": "تاکدیمی خاص ئین ئان",
+       "pageinfo-display-title": "ئنوان ئی نشان داتین",
+       "pageinfo-default-sort": "پیش فرضین مرتب کنوکین کیلی",
+       "pageinfo-length": "تاکدیمی حجم (بایٹ)",
        "pageinfo-article-id": "تاکدیمی آی دی",
+       "pageinfo-language": "تاکدیمی محتوایی زبان",
+       "pageinfo-content-model": "تاکدیمی محتوایی جۆڑیشت",
+       "pageinfo-robot-policy": "لڑلیست کورتین شه رباتانی نیمگا",
+       "pageinfo-robot-index": "مجاز",
        "pageinfo-robot-noindex": "نامجاز",
+       "pageinfo-watchers": "تاکدیمی دیدار کنۆکانی اندازگ",
+       "pageinfo-few-watchers": "کمتیر شه  $1 {{PLURAL:$1| دیدار|دیدار}}",
+       "pageinfo-redirects-name": "تغیرمسیرانی اندازگ په ای تاکدیما",
+       "pageinfo-subpages-name": "ای گۆنڈ دیم ئی تاکدیمانی اندازه گ",
+       "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|تغییرمسیر|تغییرمسیر}}; $3 {{PLURAL:$3|غیرتغییرمسیر|غیرتغییرمسیر}})",
+       "pageinfo-firstuser": "ای تاکدیمئ جوڑ کنوک",
+       "pageinfo-firsttime": "ای تاکدیمئ جوڑ کورتینی وخت",
+       "pageinfo-lastuser": "آخرین ایڈیٹ کنوک",
+       "pageinfo-lasttime": "آخرین ایڈیٹئ تاریخ",
+       "pageinfo-edits": "موچین ایڈیٹانئ اندازه گ",
+       "pageinfo-authors": "موچین نویسوکانئ اندازه گ",
+       "pageinfo-recent-edits": "آخیرئین ایڈیٹانی اندازگ (بئ $1 دیما)",
+       "pageinfo-recent-authors": "یکی ئین آخیرین نویسوکان اندازگ",
+       "pageinfo-magic-words": "{{PLURAL:$1|حرف|حروف}} جادویی ($1)",
+       "pageinfo-hidden-categories": "چیهرین {{PLURAL:$1| تهر|تهر هان}} ( $1 )",
+       "pageinfo-templates": "{{PLURAL:$1|تراشوان|تراشوان}} استفاده‌ بوته ($1)",
+       "pageinfo-transclusions": "{{PLURAL:$1|تاکدیم|تاکدیمان}} ترانسکلوڈ بوتگ بئ ($1) تا",
+       "pageinfo-toolboxlink": "تاکدیمئ مئلومات",
+       "pageinfo-redirectsto": "تغییر مسیر بی",
+       "pageinfo-redirectsto-info": "مئلومات",
        "pageinfo-contentpage-yes": "هان",
        "pageinfo-protect-cascading-yes": "هان",
+       "pageinfo-category-info": "تهری مئلومات",
        "pageinfo-category-pages": "تاکدیمانی نمبر",
+       "pageinfo-category-files": "فایلانی اندازگ",
+       "markaspatrolleddiff": "گشت وارته ئین ئانی برچسپ جتین",
+       "markaspatrolledtext": "بئ دیما گشت وارته ئین ئی برچسپ بجن",
+       "markedaspatrolled": "گشت وارته ئی برچسپ جته بوت",
+       "markedaspatrollederror": "گشت وارته ئی برچسپ جته نه بوت",
+       "markedaspatrollederrornotify": "گشت وارته ئی برچسپ جتین ناکام ات.",
+       "patrol-log-page": "گشتئ سیاه چال",
+       "log-show-hide-patrol": "$1 گشت جنوکین سیاهه",
+       "deletedrevision": "$1 قدیمی پاک بوته ئین نخسه ئی است",
+       "filedeleteerror-short": "خطا بئ فایلی پاک کورتین: $1",
+       "filedeleteerror-long": "بی پدا  پاک کورتین ئی وختا خطا رخ دات:\n\n$1",
+       "previousdiff": "→دیمتیرین ئی فرق",
+       "nextdiff": "نۆکتیرین ئی فرق ←",
+       "widthheightpage": "$1×$2، $3 {{PLURAL:$3|تاکدیم|تاکدیم}}",
+       "file-info": "فایلئ اندازه گ: $1، نوع  MIME $2",
+       "file-info-size": "<span dir=\"ltr\">$1 × $2</span> پیکسل، فایلئ اندازه گ: $3، نوع MIME فایلئ: $4",
+       "file-info-size-pages": "<span style=\"direction:ltr\">$1 × $2</span> نقطه، فایلئ حجم: $3، نوع MIME فایل: $4، $5 تاکدیم",
+       "show-big-image": "اورجینال ئین فایل",
+       "show-big-image-preview": "ای دیم دیست ئی اندازه گ: $1.",
+       "show-big-image-other": "دیگرین {{PLURAL:$2|کیفیت|کیفیت‌هان}}: $1.",
+       "show-big-image-size": "<span dir=\"ltr\">$1 × $2</span> پیکسل",
+       "file-info-gif-looped": "چرخش‌دار",
+       "file-info-gif-frames": "$1 {{PLURAL:$1|قاب|قاب}}",
+       "file-info-png-looped": "چرخش‌دار",
+       "file-info-png-repeat": "$1 {{PLURAL:$1|وار|وار}} پخش بوت",
+       "file-info-png-frames": "$1 {{PLURAL:$1|قاب|قاب}}",
+       "newimages": "نوکین فایلانی البوم",
+       "newimages-summary": "ای تاکدیم خاص په آخیرئین فایلان اینت که بُرز بوته انت.",
+       "newimages-legend": "فیلتر",
+       "newimages-label": "فایلی نام (یا قسمتی شه آیی):",
+       "newimages-showbots": "نشان داتین بُرز بوته ئین گۆ روبات ئا",
+       "noimages": "چیزی په دیستینا نه اینت.",
        "ilsubmit": "گشتین",
        "bydate": "شه تاریخی رُوگا",
+       "sp-newimages-showfrom": "نشان‌داتین نۆکین اکسانی شه $2، $1 بئ بعد",
+       "seconds": "{{PLURAL:$1|$1ثانیه| $1  ثانیه}}",
+       "minutes": "{{PLURAL:$1|دقیقه|دقیقه}}",
+       "hours": "{{PLURAL:$1|سائت|سائت}}",
+       "days": "{{PLURAL:$1|روچ|روچ}}",
+       "weeks": "{{PLURAL:$1|$1 هپتگ|$1 هپتگ ئان}}",
+       "months": "{{PLURAL:$1|$1 ماه|}}",
+       "years": "{{PLURAL:$1|$1 سال|$1 سال ئان}}",
+       "ago": "$1دیما",
        "just-now": "همی انون",
        "hours-ago": "$1 سائت دیما",
        "minutes-ago": "$1 دقیقه دیما",
        "saturday-at": "بی شنبی $1",
        "sunday-at": "یک‌شنبی $1",
        "yesterday-at": "زئ  بی $1",
+       "metadata": "فرادیتا",
+       "metadata-fields": "ای پیامی تا اکس ئی میتادیتا نشان داته بوته و وختی که میتادیتا ئی لیست جم بیئت هم نشان داته ئه بیئت . دیگه موارید تانا وختی نشان داته ئه بیئنت که جدول پاچ بیئت.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
+       "exif-imagewidth": "گوور، عرض",
+       "exif-imagelength": "تَچکي",
+       "exif-bitspersample": "نقطه بئ هر جز ئی تا",
+       "exif-photometricinterpretation": "ٹیک ئانی ترکیب",
+       "exif-orientation": "نیمگ ، جهت",
+       "exif-ycbcrpositioning": "Y و C موقیعتان",
+       "exif-stripoffsets": "اکس ئی دیتای جاگه",
+       "exif-rowsperstrip": "ردیپ هانی اندازگ بئ هر نواری تا",
+       "exif-jpeginterchangeformat": "جابه‌جایی نسبت بئ JPEG SOI",
+       "exif-jpeginterchangeformatlength": "بایٹ  JPEG ئی دیتایی",
+       "exif-whitepoint": "سپیتین ٹیکئ رنگینی",
+       "exif-datetime": "فایلی تغیر ئی وخت و تاریخ",
+       "exif-imagedescription": "اکسئ ئنوان",
+       "exif-make": "کامره ئی جۆڑ کنۆکین شرکت",
+       "exif-model": "کامره ئی موڈیل",
+       "exif-software": "استفاده بوته ئین ساپٹ ایر",
+       "exif-artist": "اکس گيروک/هنرمند",
+       "exif-copyright": "کاپی رایٹ ئی واوُند",
+       "exif-exifversion": "exif ئی نخسه",
+       "exif-flashpixversion": "Flashpix ئی پُشتیوانی بوته ئین نخسه",
+       "exif-colorspace": "رنگانئ فضا",
+       "exif-pixelydimension": "اکسئ گۆر",
+       "exif-pixelxdimension": "اکسئ بُرزی",
+       "exif-usercomment": "کار زوروکئ توضیحات",
+       "exif-datetimeoriginal": "دیتائانی ودئ بوتین ئی تاریخ و وخت",
+       "exif-datetimedigitized": "دیجیتالی بوتین ئی وخت و تاریخ",
+       "exif-exposuretime-format": "$1 ثانیه ($2)",
+       "exif-fnumber": "اف ئی نمبر",
+       "exif-exposureprogram": "نوردهئ پروگرام",
+       "exif-spectralsensitivity": "طیفئ ئین حساسیت",
+       "exif-isospeedratings": "ایزو ئی سرعت ئی درجه بندی",
+       "exif-shutterspeedvalue": "شاتر ئی آپکس ئی سرعت",
+       "exif-aperturevalue": "دیافراگم آپکس ئی اندازه گ",
+       "exif-brightnessvalue": "آپکس روشنائی",
+       "exif-exposurebiasvalue": "نوردهئ خطا",
+       "exif-subjectdistance": "سوژه ئی فاصله",
+       "exif-lightsource": "نور ئی منشا",
+       "exif-flash": "پلاش",
+       "exif-subjectarea": "جسم ئی مساحت",
+       "exif-flashenergy": "پلاش ئی قدرت",
+       "exif-subjectlocation": "سوژه ئی مکان",
+       "exif-filesource": "فایلئ منشا",
+       "exif-contrast": "کنتراست",
+       "exif-saturation": "رنگئ بَزئ",
+       "exif-sharpness": "وضوح",
+       "exif-devicesettingdescription": "دستگاه ئی تنظیماتانی شرح",
+       "exif-gpslatitude": "جوگرافیایی ئین گۆر",
+       "exif-gpslongitude": "جوگرافیایی ئین تچکی",
+       "exif-gpsaltitude": "بُرزئ",
+       "exif-gpstimestamp": "جی‌پی‌اس ئی وخت (اتمی ئین سائت)",
+       "exif-gpsareainformation": "جی‌پی‌اس ئی ناحیه ئی نام",
+       "exif-gpsdatestamp": "جی پی اس ئی تاریخ",
+       "exif-keywords": "کیبورد",
+       "exif-worldregiondest": "جهانئ منطقه نشان داته بوته",
+       "exif-countrydest": "مُلک نشان داته بوته",
+       "exif-countrycodedest": "مُلکی کود نشان داته بوته",
+       "exif-provinceorstatedest": "ولایت یا ایالت نشان داته بوته",
+       "exif-citydest": "شار نشان داته بوته",
+       "exif-sublocationdest": "شاری یک بخش نشان داته بوته",
+       "exif-objectname": "گۆنڈین ئینوان",
+       "exif-headline": "ئنوان",
+       "exif-source": "منشا",
+       "exif-writer": "نویسوک",
        "exif-languagecode": "زبان",
+       "exif-iimversion": "IIM ئی نخسه",
        "exif-iimcategory": "تهر",
+       "exif-iimsupplementalcategory": "تکمیلین تهر ئان",
+       "exif-datetimereleased": "منتشر بوته بی",
+       "exif-lens": "استفاده بوته ئین لینز",
+       "exif-serialnumber": "کامره ئی سریال نمبر",
+       "exif-cameraownername": "کامره ئی واوُند",
+       "exif-label": "برچسب",
+       "exif-nickname": "اکس ئی غیررسمی ئین نام",
+       "exif-rating": "امتیاز (شه 5)",
+       "exif-copyrighted": "کاپی رایٹ ئی وزیئت",
+       "exif-copyrightowner": "کاپی رایٹ ئی واوُند",
+       "exif-usageterms": "استفاده ئی شرایط",
+       "exif-pngfilecomment": "PNG ئی فایلی شرح",
+       "exif-disclaimer": "تکذیب‌نامه",
+       "exif-contentwarning": "محتوایی هشدار",
+       "exif-giffilecomment": "GIF ئی فایلی شرح",
+       "exif-intellectualgenre": "مورید ئی رقم",
+       "exif-subjectnewscode": "موضو ئی کود",
+       "exif-copyrighted-true": "کاپی رایت بوت",
+       "exif-unknowndate": "نامئلومین تاریخ",
+       "exif-orientation-1": "نورمال",
+       "exif-orientation-3": "۱۸۰ درجه چرخ وارته",
+       "exif-componentsconfiguration-0": "وجود نداریت",
+       "exif-exposureprogram-0": "تئریپ نه بوته",
+       "exif-exposureprogram-1": "دستی",
+       "exif-exposureprogram-2": "عادی ئین پروگرام",
+       "exif-exposureprogram-4": "شاتر ئی اولویت",
+       "exif-subjectdistance-value": "$1 متر",
+       "exif-meteringmode-0": "نامئلوم",
+       "exif-meteringmode-1": "میانگین",
+       "exif-meteringmode-2": "میانگین گو سنگین ئین مرکزا",
+       "exif-meteringmode-3": "یک ٹیکی",
+       "exif-meteringmode-4": "چینکه ٹیکئ",
+       "exif-meteringmode-5": "طرح‌والا",
+       "exif-meteringmode-6": "کم ئین",
+       "exif-meteringmode-255": "دیگرین",
+       "exif-lightsource-0": "نامئلوم",
+       "exif-lightsource-1": "روچی روشنائی",
+       "exif-lightsource-2": "فلورسانت",
+       "exif-lightsource-4": "پلاش",
+       "exif-lightsource-9": "جوانین هوا",
+       "exif-lightsource-10": "جمری ئین آسمان",
+       "exif-lightsource-11": "سیاهیگ",
+       "exif-lightsource-12": "ماهتاپئ بی روچئ تا (D 5700 – 7100K)",
+       "exif-lightsource-13": "سپیتین ماهتاپئ بئ روچئ تا (N 4600 – 5400K)",
+       "exif-lightsource-14": "سپیتین ماهتاپئ سرد (W 3900 – 4500K)",
+       "exif-lightsource-15": "سپیتین ماهتاپئ (WW 3200 – 3700K)",
+       "exif-lightsource-17": "A سٹاندارتین نور",
+       "exif-lightsource-18": "B سٹاندارتین نور",
+       "exif-lightsource-19": "C سٹاندارتین نور",
+       "exif-lightsource-24": "ISO ئی کارخانه ئي تنگستن ئی لامپ",
+       "exif-lightsource-255": "نور ئی دیگه منشا ئان",
+       "exif-flash-fired-0": "پلاش جته نه بوت",
+       "exif-flash-fired-1": "گو پلاش جتینا",
+       "exif-customrendered-0": "عادین ظهور",
+       "exif-customrendered-1": "سفارشین ظهور",
+       "exif-exposuremode-0": "اوتوماتیکین نوردهی",
+       "exif-exposuremode-1": "دستئ نور دهی",
+       "exif-exposuremode-2": "Auto bracket",
+       "exif-scenecapturetype-0": "سٹاندارت",
+       "exif-scenecapturetype-1": "چم چران",
+       "exif-scenecapturetype-2": "پرتره",
+       "exif-scenecapturetype-3": "شپئ چم گیند",
+       "exif-gaincontrol-0": "هیچ‌گوجام",
+       "exif-contrast-0": "نورمال",
+       "exif-contrast-1": "نرم",
+       "exif-contrast-2": "سک",
+       "exif-saturation-0": "نورمال",
+       "exif-saturation-1": "کم ئین اشباع",
+       "exif-saturation-2": "بازین اشباع",
        "exif-sharpness-0": "ساددگ",
        "exif-sharpness-1": "نرم",
        "exif-sharpness-2": "سک",
        "exif-subjectdistancerange-0": "نامئلوم",
        "exif-subjectdistancerange-1": "ماکرو",
+       "exif-subjectdistancerange-2": "نزینک گیند",
+       "exif-subjectdistancerange-3": "دور گیند",
+       "exif-gpsspeed-m": "مایل بئ سائت",
+       "exif-gpsspeed-n": "گرین",
+       "exif-gpsdestdistance-k": "کیلومتر",
+       "exif-gpsdestdistance-m": "مایل",
+       "exif-gpsdestdistance-n": "دریا ئین مایل",
+       "exif-gpsdop-excellent": "باز جووان ($1)",
+       "exif-gpsdop-good": "زبر ($1)",
+       "exif-gpsdop-moderate": "متوسط ($1)",
+       "exif-gpsdop-fair": "نه باز جووان ($1)",
+       "exif-gpsdop-poor": "ضعیف ($1)",
+       "exif-objectcycle-a": "تانا سوب",
+       "exif-objectcycle-p": "تانا دیگرونواشام",
+       "exif-objectcycle-b": "سوب و نواشام",
+       "exif-gpsdirection-t": "جوانین نیمگ",
+       "exif-gpsdirection-m": "آهنربائین نیمگ",
+       "exif-ycbcrpositioning-1": "مانجین بوتگ",
+       "exif-ycbcrpositioning-2": "اشتراکی",
+       "exif-dc-contributor": "شراکت کنۆک ئان",
+       "exif-dc-date": "تاریخ(ئان)",
+       "exif-dc-publisher": "ناشر",
+       "exif-dc-relation": "مربوتین میڈیاهان",
+       "exif-dc-rights": "حقوق",
+       "exif-dc-source": "بُنزهی ئین میڈیا",
+       "exif-dc-type": "میڈیایی رقم",
+       "exif-rating-rejected": "رد بوته ئین",
+       "exif-isospeedratings-overflow": "مزنتیر شه ۶۵۵۳۵",
+       "exif-iimcategory-ace": "هنر، فرهنگ و سرگرمی",
+       "exif-iimcategory-clj": "جنایت و قانون",
+       "exif-iimcategory-fin": "اقتصاد و تجارت",
+       "exif-iimcategory-edu": "یادگیپتین",
+       "exif-iimcategory-evn": "محیط زیست",
+       "exif-iimcategory-hth": "سلامت",
+       "exif-iimcategory-hum": "بشر ئی علاقه",
+       "exif-iimcategory-lab": "کار",
+       "exif-iimcategory-pol": "سیاست",
+       "exif-iimcategory-rel": "مذهب و باور",
+       "exif-iimcategory-sci": "علم و تخنیک",
+       "exif-iimcategory-soi": "اجتمائین مسائل",
        "exif-iimcategory-spo": "سپورت",
        "exif-iimcategory-war": "جنگ ، لٹ و کوٹ و ناآرامی",
        "exif-iimcategory-wea": "آپ و هوا",
        "namespacesall": "موچ",
        "monthsall": "موچ",
        "confirmemail": "ایمیل ادرسی تائید کورتین",
+       "confirmemail_loggedin": "شمی ایمیل ادرس انون تائید بوت.",
+       "confirmemail_subject": "شمی ایمیل ادرس ئی تأییدی {{SITENAME}}",
+       "confirmemail_body": "یک نپر، احتمالاً که شما وت ، شه $1 ئی آی پی ادرس ئا یک کار زوروکئ حساب گۆ «$2» ئی ناما بئ ای ایمیل ادرس ئی تا بئ  {{SITENAME}} ئی تا جۆڑ کورته است.\n\nپه تأیید کورتین ایشی  که ای حساب واقئاً بئ شما مربوت اینت و هم پئال کورتین {{SITENAME}} ایمیلی امکاناتانی خاتیرا ، جهلگی لینک ئا بئ وتي بروزیر ئی تا پاچ بکنیت:\n\n$3\n\nاگر شما ای کار زوروکین حساب ئا راجستر *نه کورته ئیت*، مهربانی بکنیت جهلگی لینک \nئی پدا بگیرێت تا که ای ایمیل ادرس ئی تایید بند بێت:\n\n$5\n\nای تاییدی ئی کوڈ بئ تاریخ $4 ئا شه بین ئه رۆت.\n</div>",
+       "confirmemail_invalidated": "ایمیل ادرس ئی تاییدی لگ بوت",
+       "invalidateemail": "ایمیل ادرس ئی لگ کورتین",
+       "deletedwhileediting": "'''هشدار''': ای دیم پدا شه آیی که شما آیی ایڈیٹ ئا شرو کورته ئیت، پاک بوته!",
+       "recreate": "پدا جۆڑ کورتین",
        "confirm_purge_button": "قبول داشتین",
        "confirm-watch-button": "قبول داشتین",
        "confirm-unwatch-button": "قبول داشتین",
+       "quotation-marks": "\"$1\"",
        "imgmultipageprev": "&rarr; دیمتیری تاکدیم",
        "imgmultipagenext": "بئدین تاکدیم &larr;",
        "imgmultigo": "برا!",
        "img-lang-default": "(پیش‌فرض ئین زبان)",
        "img-lang-info": "ارایه کورتین ای اکسی بی  $1 .  $2",
        "img-lang-go": "برا",
+       "ascending_abbrev": "صعودی",
+       "descending_abbrev": "نزولی",
+       "table_pager_next": "دیگرین تاکدیم",
+       "table_pager_prev": "دیمتیرین تاکدیم",
+       "table_pager_first": "اولین تاکدیم",
+       "table_pager_last": "آخرین تاکدیم",
        "table_pager_limit_submit": "برا",
+       "watchlistedit-raw-titles": "ئنوانان:",
+       "watchlistedit-raw-done": "شمی دیدارلیست اپڈیٹ بوت.",
+       "watchlistedit-raw-added": "$1 ئی ئنوان بئ دیدارلیست ئا ایزاپه {{PLURAL:$1|بوت|بوتنت}}:",
+       "watchlistedit-raw-removed": "$1 ئی ئنوان پاک {{PLURAL:$1|بوت|بوتنت}}:",
+       "watchlistedit-clear-title": "دیدارلیست پاک بوته",
+       "watchlistedit-clear-legend": "دیدارلیست ئی پاک کورتین",
+       "watchlistedit-clear-explain": "موچین ئناوین شه شمی دیدارلیست ئا پاک ئه بئنت",
+       "watchlistedit-clear-titles": "ئنوانان:",
+       "watchlistedit-clear-submit": "دیداری ئانی پاک کورتین (ای دائم اینت!)",
+       "watchlistedit-clear-done": "شمی دیدارلیست پاک بوت.",
+       "watchlistedit-clear-removed": "$1 ئی ئنوان پاک {{PLURAL:$1|بوت|بوتنت}}:",
+       "watchlisttools-clear": "دیدارلیست ئی پاک کورتین",
+       "watchlisttools-raw": "واچلیستئ آمگین لیستانی ایڈیٹ",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|گپ و حبر]])",
+       "version": "نخسه",
+       "version-skins": "نصب بوته ئین پوسته ئانی",
+       "version-specialpages": "خاصین تاکدیمان",
+       "version-parserhooks": "تجزیه گرین چنگک ئان",
+       "version-antispam": "دیمگیری شه سپم ئان",
+       "version-other": "دیگرین",
+       "version-hooks": "چنگک ئان",
+       "version-hook-name": "چنگک ئی نام",
+       "version-no-ext-name": "[بی نام]",
+       "version-license": "میڈیاویکی ئی اجازه نامه",
+       "version-ext-license": "اجازه نامه ئان",
+       "version-ext-colheader-name": "پراخئ ئان",
+       "version-skin-colheader-name": "پوست",
+       "version-ext-colheader-version": "نخسه",
+       "version-ext-colheader-license": "اجازه نامه ئان",
+       "version-ext-colheader-description": "توضیح",
+       "version-ext-colheader-credits": "مؤلفان",
+       "version-license-title": "مجوز په $1",
+       "version-credits-title": "کریدیت په $1",
+       "version-poweredby-credits": "ای ویکی شه '''[https://www.mediawiki.org/ میڈیا ویکی]''' ئی نیمگا پُشتیوانی ئه بیئت، موچین حقوق محفوظ انت © 2001-$1 $2.",
+       "version-poweredby-others": "دیگران",
+       "version-poweredby-translators": "translatewiki.net مترجم ئان",
+       "version-software": "لچیته ئین نخسه هان",
+       "version-software-product": "محصول",
+       "version-software-version": "نخسه",
+       "version-entrypoints-header-entrypoint": "داخل بوتین ئی ٹیک",
+       "version-entrypoints-header-url": "انترننئ ئین ادرس",
+       "version-libraries": "نصب بوته ئین کتابخانه",
+       "version-libraries-library": "کتابجاه",
+       "version-libraries-version": "نخسه",
        "redirect-submit": "برا",
        "redirect-lookup": "گشتین:",
+       "redirect-value": "اندازه گ:",
+       "redirect-user": "کار زوروکی آی ڈی",
+       "redirect-page": "تاکدیمی آی ڈی",
+       "redirect-revision": "تاکدیمی نخسه",
+       "redirect-file": "فایلئ نام",
+       "redirect-not-exists": "اندازه گ ودی نه بوت",
+       "fileduplicatesearch": "گشتین په تکرارین فایلان",
+       "fileduplicatesearch-legend": "گشتین په تکرارین موریدان",
+       "fileduplicatesearch-filename": "فایلئ نام:",
+       "fileduplicatesearch-submit": "گشتین",
+       "fileduplicatesearch-info": "<span dir=\"ltr\">$1 × $2</span> پیکسل<br />فایلئ اندازه گ: $3<br />نوع MIME: $4",
+       "fileduplicatesearch-result-1": "«$1» ئی فایل تکرارین مورید نداریت.",
+       "fileduplicatesearch-result-n": " «$1» ئی فایل یک {{PLURAL:$2|تکراری موردئ|$2 تکرارئ مورئ}} داریت.",
+       "fileduplicatesearch-noresults": "فایلئ گو «$1» ئی ناما ودئ نه بوت.",
+       "specialpages": "خاصین تاکدیمان",
+       "specialpages-note-top": "شرح علائم",
+       "specialpages-note": "* عادی ئین خاصین تاکدیمان.\n* <span class=\"mw-specialpagerestricted\">خاصین تاکدیمان محدود بوته انت.</span>",
+       "specialpages-group-maintenance": "ساتیتینئ راپور",
+       "specialpages-group-other": "دیگه خاصین تاکدیمان",
+       "specialpages-group-login": "داخل بوتین  / حسابي جوڑ کورتین",
+       "specialpages-group-changes": "آخیرئین تغیرئان و سیاهه ئان",
+       "specialpages-group-media": "میڈیایی بُرز کورتینوکین راپور",
+       "specialpages-group-users": "کار زوروکان و آوانی حقوق",
+       "specialpages-group-highuse": "باز گیندوکین دیمان",
+       "specialpages-group-pages": "تاکدیمانی لڑ\t لیست",
+       "specialpages-group-pagetools": "تاکدیمانئ وسایلان",
+       "specialpages-group-wiki": "دتا و وسایلان",
+       "specialpages-group-spam": "سپم ئی وسایلان",
+       "blankpage": "خالی ئین دیم",
+       "intentionallyblankpage": "این دیم بئ قصدین رقما خالی ایشته بوته.",
+       "tags": "مجازین تغیرانئ برچسپ",
+       "tag-filter": "[[Special:Tags|برچسپ هاني]] فیلتر:",
+       "tag-filter-submit": "فیلتر",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|برچسپ|برچسپ هان}}]]: $2)",
+       "tags-title": "برچسپ هان",
+       "tags-tag": "برچسپئ نام",
+       "tags-display-header": "نشان داتین بئ تعیراتانی لیست ئي تا",
+       "tags-source-header": "بُن زهی",
+       "tags-active-header": "پئال؟",
+       "tags-actions-header": "عملکردهان",
+       "tags-active-yes": "هان",
+       "tags-active-no": "نه",
+       "tags-edit": "ایڈیٹ",
+       "tags-delete": "پاک کورتین",
+       "tags-activate": "پئال کورتین",
+       "tags-deactivate": "غیرپئال کورتین",
+       "tags-hitcount": "$1 {{PLURAL:$1|ٹگل|ٹگل}}",
+       "tags-create-tag-name": "برچسپئ نام:",
+       "tags-create-reason": "دلیل:",
+       "tags-create-submit": "جوڑ\t کورتین",
+       "tags-activate-reason": "دلیل:",
+       "tags-activate-submit": "پئال کورتین",
+       "tags-deactivate-reason": "دلیل:",
+       "tags-deactivate-submit": "غیرپئال کورتین",
+       "comparepages": "تاکدیمانئ مقایسه",
+       "compare-page1": "تاکدیم ۱",
+       "compare-page2": "تاکدیم ۲",
+       "compare-rev1": "نخسه ۱",
+       "compare-rev2": "نخسه ۲",
+       "compare-submit": "مقایسه",
+       "htmlform-float-invalid": "اندازه ئی که داخل کورته یک ئدد ئی نه ئینت.",
+       "htmlform-int-toolow": "اندازه ئی که داخل کورته ئیت کمتیر شه $1 ئا است.",
+       "htmlform-int-toohigh": "اندازه ئی که داخل کورته ئیت گیشتیر شه $1 ئا اینت.",
+       "htmlform-required": "ای اندازه گ ضرورت اینت",
+       "htmlform-submit": "ثبت کورتین",
+       "htmlform-reset": "تغیرانئ خنثا کورتین",
+       "htmlform-selectorother-other": "دیگرین",
+       "htmlform-no": "نه",
+       "htmlform-yes": "هان",
+       "htmlform-chosen-placeholder": "یک گذینه ئی انتخاب بکنیت",
+       "htmlform-cloner-create": "گیشتیر اضافه کورتین",
+       "htmlform-cloner-delete": "پاک کورتین",
+       "htmlform-cloner-required": "حداقل ضرورت انداره گ.",
+       "sqlite-has-fts": "$1 گۆ پُشتیوانی شه گشتین ئا بئ کامیلین متن ئی تا",
+       "sqlite-no-fts": "$1 بدون پُشتیوانی شه گشتین ئا بئ کاملین متن ئی تا",
+       "logentry-delete-delete": "$1 ، $3 تاکدیما {{GENDER:$2|پاک کورت}}",
+       "logentry-delete-restore": "$1 ، $3 ئی تاکدیما {{GENDER:$2|پدا جۆڑ کورت}}",
+       "logentry-delete-event": "$1 پیدایی {{PLURAL:$5|یک مورد سیاه چال|$5 مورد سیاه چال}} ئا بئ $3 {{GENDER:$2|تا تغیر دات}}: $4",
+       "logentry-delete-revision": "$1 پیدایی {{PLURAL:$5|یک نخسه|$5 نخسه}} تاکدیم $3 ئا {{GENDER:$2|تغییر دات}}: $4",
+       "logentry-suppress-delete": "$1 $3 ئی تاکدیما {{GENDER:$2| سرکوب کورت}}",
+       "logentry-suppress-event": "$1 پیدایی {{PLURAL:$5|یک مورد سیاه چال|$5 مورد سیاه چال}} ئا بئ $3 {{GENDER:$2|تا چیهر دات}}: $4",
+       "logentry-suppress-revision": "$1 پیدایی {{PLURAL:$5|یک نخسه|$5 نخسه}} تاکدیم $3 ئا چیهراکائی {{GENDER:$2|تغییر دات}}: $4",
+       "revdelete-content-hid": "محتوائانه چیهر کورت",
+       "revdelete-summary-hid": "ایڈیٹ ئی خلاصه ئا چیهر کورت",
+       "revdelete-uname-hid": "چیهرین کار زوروکئ نام",
+       "revdelete-content-unhid": "محتوائانه سر درا کورت",
+       "revdelete-summary-unhid": "ایڈیٹ ئی خلاصه ئا دررا کورت",
+       "revdelete-uname-unhid": "کار زوروکئ ناما سر درا کورت",
+       "revdelete-restricted": "مدیر ئانه محدود کورت",
+       "revdelete-unrestricted": "مدیرئانی محدودیت ئا پروشت",
+       "logentry-merge-merge": "$1  $3  را بئ  $4 {{GENDER:$2| ادغام کورت}} (نخسه تا  $5)",
+       "logentry-move-move": "$1، $3 ئی تاکدیما بئ $4 {{GENDER:$2|جابجا کورت}}",
+       "logentry-newusers-newusers": "$1 ئی کار زوروکئ حساب {{GENDER:$2|جۆڑ بوت}}",
+       "logentry-newusers-create": "$1 ئی کار زوروکئ حساب {{GENDER:$2|جۆڑ بوت}}",
+       "logentry-newusers-create2": "$3 ئی کار زوروکئ حساب شه $1 ئی نیمگا {{GENDER:$2|جۆڑ بوت}}",
+       "logentry-newusers-byemail": "$3 ئی کار زوروکئ حساب شه $1 ئی نیمگا {{GENDER:$2|جۆڑ بوت}} و چیهرگال یا پاسورد گو ایمیلا دیم داته بوت",
+       "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|ارتقاء دات}}",
+       "logentry-upload-upload": "$1 $3 ئا {{GENDER:$2|بُرز کورت}}",
+       "logentry-upload-overwrite": "$1 نوکین نخسه ئی شه $3 ئا {{GENDER:$2|بُرز کورت}}",
+       "logentry-upload-revert": "$1 {{GENDER:$2|بُرز کورت}} $3 ئا",
+       "rightsnone": "(هیچ)",
+       "revdelete-summary": "ایڈیتی خاصه",
+       "feedback-subject": "ئنوان:",
        "feedback-message": "پیام:",
        "feedback-cancel": "کنسیل",
+       "feedback-error2": "خطا: پروشت بئ ایڈیٹ ئی تا",
+       "feedback-thanks": "منتوارن! شمی فیدبک بئ «[$1 $2]» ئی دیمی تا ثبت بوت.",
+       "feedback-close": "کار بوت",
        "searchsuggest-search": "گشتین",
+       "api-error-duplicate-popup-title": "تکرارین {{PLURAL:$1|فایل|فایلان}}",
+       "api-error-empty-file": "فایلی که دیم داته بوت خالی ات.",
+       "api-error-emptypage": "خالی ئین دیمانی جۆڑ کورتین جایز نه اینت.",
+       "api-error-file-too-large": "فایلی که دیم داتیت بئ حد ٹوو ات.",
+       "api-error-filename-tooshort": "فایلی نام بئ شه اندازگ ئا گۆنڈ ات.",
+       "api-error-filetype-banned": "ایرنگین فایل ئی اجازه نه اینت.",
+       "api-error-filetype-missing": "فایل ئی نام فرمت نه داریت.",
+       "api-error-hookaborted": "تغیر که شما لۆٹیت جۆڑ کنیت شه یک جنگک یی نیمگا بند بوت.",
+       "api-error-http": "داخلین خطا:وصل بوتین بئ سرویس ئا ممکن نه اینت.",
+       "api-error-illegal-filename": "فایل ئی نام غیرمجاز اینت.",
+       "api-error-invalid-file-key": "داخلین خطا: فایل نام بئ موقت ئین حافظه ئی تا موجود نه اینت.",
+       "api-error-missingparam": "داخلین خطا: ناموجودین پارامیترئان بئ ریکویست ئی تا.",
+       "api-error-mustbeloggedin": "په فایلی بُرز کورتینا، شما باید بئ سایٹ ئی تا داخل بئیت.",
+       "api-error-mustbeposted": "داخلین خطا: ریکویست باید شه POST HTTP ئی روش ئا دیم داته بیئت.",
+       "api-error-unclassified": "یک نا زانتین خطائی رخ دات.",
+       "api-error-unknown-code": "نازانتین خطای: \" $1 \"",
        "duration-seconds": "$1 ثانیه",
        "duration-minutes": "$1 دقیقه",
        "duration-hours": "$1 سائت",
        "duration-decades": "$1 دههگ",
        "duration-centuries": "$1 قرن",
        "duration-millennia": "{{PLURAL:$1|هزار سال |$1 هزار سال}}",
+       "limitreport-walltime": "واقئین مصرفئ مدت",
+       "limitreport-walltime-value": "$1 {{PLURAL:$1|ثانیه|ثانیه}}",
+       "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|بایٹ|بایٹ}}",
+       "limitreport-templateargumentsize": "ارگومان ئی تراشوانی اندازگ",
+       "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|بایٹ|بایٹ}}",
+       "limitreport-expansiondepth": "گیشتیرین پراخی جُهلی",
+       "expandtemplates": "تراشوانی اکسپاند کورتین",
+       "expand_templates_title": "موضوع ئی ئنوان، په {{FULLPAGENAME}} ئا و غیره:",
+       "expand_templates_input": "ورودین متن:",
+       "expand_templates_output": "نتیجه",
+       "expand_templates_xml_output": "خروجی XML",
+       "expand_templates_html_output": "اچ‌تی‌ام‌ال حامگین خروجی",
        "expand_templates_ok": "قبول داشتین",
+       "expand_templates_remove_comments": "ملاحظاتانئ پاک کورتین",
+       "expand_templates_remove_nowiki": "خنثی کورتین <nowiki> تگ هانی بئ  نتیجه ئی",
+       "expand_templates_generate_xml": "XML تجزیه ئی درختی نشان داتین",
+       "expand_templates_generate_rawhtml": "حامیگین اچ تی ام ال ئی نشان داتین",
+       "expand_templates_preview": "دیم دیست",
+       "pagelanguage": "زبانی انتخابی دیم",
        "pagelang-name": "تاکدیم",
        "pagelang-language": "زبان",
        "pagelang-use-default": "استفاده کورتین شه پیش فرض ئین زبانا",
-       "pagelang-select-lang": "زبانی انتخاب"
+       "pagelang-select-lang": "زبانی انتخاب",
+       "right-pagelang": "زبانی تاکدیم ئی تغیر",
+       "action-pagelang": "دیمی زبان ئی تغیر",
+       "mediastatistics-table-mimetype": "مایم ئی رکم",
+       "mediastatistics-table-totalbytes": "ترکیبین حجم",
+       "mediastatistics-header-unknown": "نامئلوم",
+       "mediastatistics-header-bitmap": "بیت مپ ئی اکسان",
+       "mediastatistics-header-drawing": "طراحی‌هان (اکس برداری ئان)",
+       "mediastatistics-header-audio": "توار",
+       "mediastatistics-header-video": "ویدیوئان",
+       "mediastatistics-header-multimedia": "غنی ئین میڈ\tیا ئان",
+       "mediastatistics-header-office": "آفیس",
+       "mediastatistics-header-text": "متنی",
+       "mediastatistics-header-executable": "اجرایی",
+       "json-error-unknown": "مشکلی گو جی‌سن ات. خطا: $1",
+       "json-error-state-mismatch": "جن سن جووان نه اینت یا ناقض اینت",
+       "json-error-syntax": "نحوی ئین خطا",
+       "json-error-inf-or-nan": "INF یا NAN ئی مقادیر یک یا گیشتیر بی مقداری که کدگذاری ئا بیئنت",
+       "json-error-unsupported-type": "یک اندازه که نتوانت کد گذاری بیئت داته بوته"
 }
index 341e53a..0b2bd34 100644 (file)
@@ -22,7 +22,9 @@
                        "Wikitanvir",
                        "Zaheen",
                        "לערי ריינהארט",
-                       "Aftabuzzaman"
+                       "Aftabuzzaman",
+                       "Wikisagnik",
+                       "Aashaa"
                ]
        },
        "tog-underline": "সংযোগগুলির নিচে দাগ দেখানো হোক:",
        "cancel": "বাতিল",
        "moredotdotdot": "আরও...",
        "morenotlisted": "এটি একটি অসম্পূর্ণ তালিকা।",
-       "mypage": "আমার পাতা",
+       "mypage": " পাতা",
        "mytalk": "আলোচনা",
        "anontalk": "এই বেনামী ব্যবহারকারীর আলাপের পাতা",
        "navigation": "পরিভ্রমণ",
        "permalink": "স্থায়ী সংযোগ",
        "print": "মুদ্রণ",
        "view": "দেখাও",
-       "view-foreign": "$1 দেখুন",
+       "view-foreign": "$1-এ দেখুন",
        "edit": "সম্পাদনা",
        "edit-local": "স্থানীয় বিবরণ সম্পাদনা করুন",
        "create": "তৈরি",
        "categorypage": "বিষয়শ্রেণীর পাতাটি দেখুন",
        "viewtalkpage": "আলোচনা দেখুন",
        "otherlanguages": "অন্যান্য ভাষাসমূহ",
-       "redirectedfrom": "($1 à¦¥à§\87à¦\95à§\87 à¦\98à§\81রà§\87 à¦\8fসà§\87à¦\9bà§\87)",
+       "redirectedfrom": "($1 à¦¥à§\87à¦\95à§\87 à¦ªà§\81নরà§\8dনিরà§\8dদà§\87শিত)",
        "redirectpagesub": "পুনর্নির্দেশ পাতা",
        "redirectto": "পুননির্দেশিত হয়েছে:",
        "lastmodifiedat": "এ পাতায় শেষ পরিবর্তন হয়েছিল $2টার সময়, $1 তারিখে।",
        "nosuchsectiontitle": "অনুচ্ছেদ পাওয়া যায়নি",
        "nosuchsectiontext": "আপনি এমন একটি অনুচ্ছেদ সম্পাদনার চেষ্টা করেছেন, যার কোন অস্তিত্ব নেই।\nযখন এই পাতাটি দেখার চেষ্টা করছে, তখন হয়তো এটি সরিয়ে অথবা অপসারণ করা হয়েছে।",
        "loginreqtitle": "লগ-ইন প্রয়োজন",
-       "loginreqlink": "লà¦\97-à¦\87ন",
+       "loginreqlink": "পà§\8dরবà§\87শ",
        "loginreqpagetext": "অন্যান্য পাতা দেখতে হলে আপনাকে অবশ্যই $1 হতে হবে।",
        "accmailtitle": "পাসওয়ার্ড পাঠানো হয়েছে",
        "accmailtext": "[[User talk:$1|$1]] এর জন্য দৈব ভাবে উৎপন্ন শব্দ চাবি $2 এ পাঠানো হয়েছে।\nলগ-ইন করার পর ''[[Special:ChangePassword|পাসওয়ার্ড পরিবর্তন]]'' পাতা থেকে এটি পরিবর্তন করা যাব।",
        "rev-suppressed-unhide-diff": "তুলনা করা হয়েছে এমন সংস্করণগুলোর কোনো একটি '''অপসারিত''' হয়েছে।\nবিস্তারিত কারণ এর [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} অপসারণ লগে] পাওয়া যেতে পারে।\nআপনি ইচ্ছা পোষণ করলে [$1 এই সংস্করণটি দেখতে পারেন]।",
        "rev-deleted-diff-view": "তুলনা করা হয়েছে এমন সংস্করণগুলোর কোনো একটি '''অপসারণ''' করা হয়েছে।\nআপনি এটি দেখতে পারেন; এ সংক্রাস্ত বিস্তারিত বিবরণ [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} অবলুপ্তি লগে] থাকতে পারে।",
        "rev-suppressed-diff-view": "তুলনা করা হয়েছে এমন সংস্করণগুলোর কোনো একটি '''অপসারণ''' করা হয়েছে।\nআপনি এটি দেখতে পারেন; এ সংক্রাস্ত বিস্তারিত বিবরণ [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} অবলুপ্তি লগে] থাকতে পারে।",
-       "rev-delundel": "দà§\87à¦\96াà¦\93/à¦\86ড়াল করো",
+       "rev-delundel": "দà§\83শà§\8dযমানতা à¦ªà¦°à¦¿à¦¬à¦°à§\8dতন করো",
        "rev-showdeleted": "দেখাও",
        "revisiondelete": "অবলুপ্ত/পুনঃস্থাপন সংশোধনসমূহ",
        "revdelete-nooldid-title": "বেঠিক লক্ষ্য সংশোধন",
        "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": "প্রশাসকবৃন্দ এবং অন্যদের ক্ষেত্রে এই ডাটা রোধ করো",
        "prevn": "পূর্ববর্তী {{PLURAL:$1|$1}}টি",
        "nextn": "পরবর্তী {{PLURAL:$1|$1}}টি",
        "prevn-title": "পূর্ববর্তী $1 {{PLURAL:$1|ফলাফল|ফলাফলসমূহ}}",
-       "nextn-title": "পরবর্তী $1 {{PLURAL:$1|ফলাফল|ফলাফলসমূহ}}",
-       "shown-title": "প্রতি পাতায় $1 {{PLURAL:$1|ফলাফল|ফলাফলসমূহ}} দেখাও",
+       "nextn-title": "পরবর্তী $1টি {{PLURAL:$1|ফলাফল}}",
+       "shown-title": "প্রতি পাতায় $1টি {{PLURAL:$1|ফলাফল}} দেখাও",
        "viewprevnext": "($1 {{int:pipe-separator}} $2) ($3) দেখানো হোক।",
        "searchmenu-exists": "'''এই উইকিতে \"[[:$1]]\" নামে একটি পাতা রয়েছে'''",
        "searchmenu-new": "<strong>\"[[:$1]]\" পাতাটি এই উইকিতে তৈরি করুন!</strong> {{PLURAL:$2|0=|এছাড়া আপনার অনুসন্ধানের সাথে পাওয়া পাতা দেখুন।|এছাড়া অনুসন্ধানে পাওয়া ফলাফলগুলি দেখুন।}}",
        "prefs-personal": "ব্যবহারকারীর বৃত্তান্ত",
        "prefs-rc": "সাম্প্রতিক পরিবর্তনসমূহ",
        "prefs-watchlist": "নজরতালিকা",
+       "prefs-editwatchlist": "নজরতালিকা সম্পাদনা করো",
+       "prefs-editwatchlist-label": "আপনার নজরতালিকার ভুক্তিসমূহ সম্পাদনা করুন:",
+       "prefs-editwatchlist-edit": "আপনার নজরতালিকায় থাকা শিরোনাম দেখুন ও সরান",
+       "prefs-editwatchlist-raw": "অশোধিত নজরতালিকা সম্পাদনা করুন",
+       "prefs-editwatchlist-clear": "নজরতালিকা পরিস্কার করুন",
        "prefs-watchlist-days": "যত দিনের নজরতালিকা দেখানো হবে:",
        "prefs-watchlist-days-max": "সর্বোচ্চ $1 {{PLURAL:$1|দিন|দিন}}",
        "prefs-watchlist-edits": "সম্প্রসারিত নজর তালিকায় সর্বোচ্চ সংখ্যার পরিবর্তন দেখানোর জন্য:",
        "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": "উৎস ফাইল",
        "whatlinkshere-next": "{{PLURAL:$1|পরবর্তী|পরবর্তী $1টি}}",
        "whatlinkshere-links": "← সংযোগগুলি",
        "whatlinkshere-hideredirs": "পুননির্দেশনা $1",
-       "whatlinkshere-hidetrans": "$1 ট্রান্সক্লুশন",
+       "whatlinkshere-hidetrans": "ট্রান্সক্লুশন $1",
        "whatlinkshere-hidelinks": "সংযোগ $1",
        "whatlinkshere-hideimages": "$1 ফাইল সংযোগ",
        "whatlinkshere-filters": "ছাকনী",
        "javascripttest": "জাভাস্ক্রিপ্ট পরীক্ষা",
        "javascripttest-pagetext-noframework": "এই পাতাটি জাভাস্ক্রিপ্ট পরীক্ষার জন্য সংরক্ষিত।",
        "javascripttest-pagetext-unknownframework": "পরীক্ষার অজানা ফ্রেমওয়ার্ক \"$1\"।",
+       "javascripttest-pagetext-unknownaction": "অজানা কার্য \"$1\"।",
        "javascripttest-pagetext-frameworks": "অনুগ্রহ করে নিচের কোনো একটি ফ্রেমওয়ার্ক নির্ধারণ করুন: $1",
        "javascripttest-pagetext-skins": "পরীক্ষার জন্য একটি স্কীন নির্ধারণ করুন:",
        "javascripttest-qunit-intro": "mediawiki.org থেকে [$1 পরীক্ষার ডলুমেন্টেশন] দেখুন।",
        "tooltip-pt-preferences": "আমার পছন্দ",
        "tooltip-pt-watchlist": "যে পাতাগুলির পরিবর্তন আপনি নজরে রেখেছেন, তাদের তালিকা",
        "tooltip-pt-mycontris": "আপনার অবদানগুলোর তালিকা",
-       "tooltip-pt-login": "à¦\86পনার à¦²à¦\97-à¦\87ন করাটা বাঞ্চনীয়, কিন্তু তা বাধ্যতামূলক নয়।",
+       "tooltip-pt-login": "à¦\86পনার à¦ªà§\8dরবà§\87শ করাটা বাঞ্চনীয়, কিন্তু তা বাধ্যতামূলক নয়।",
        "tooltip-pt-logout": "প্রস্থান",
+       "tooltip-pt-createaccount": "আপনাকে একটি অ্যাকাউন্ট তৈরি করে প্রবেশ করার পরামর্শ দেওয়া হচ্ছে; তবে এটা বাধ্যতামূলক নয়",
        "tooltip-ca-talk": "বিষয়বস্তু পাতা সম্পর্কে আলোচনা",
        "tooltip-ca-edit": "আপনি এই পাতা সম্পাদনা করতে পারেন। অনুগ্রহ করে সংরক্ষণের আগে প্রাকদর্শন করুন।",
-       "tooltip-ca-addsection": "নতুন অনুচ্ছেদ শুরু করুন",
+       "tooltip-ca-addsection": "নতুন অনুচ্ছেদ শুরু করুন",
        "tooltip-ca-viewsource": "এই পাতাটি সুরক্ষিত। আপনি পাতাটির উৎস দেখতে পারেন।",
        "tooltip-ca-history": "এই পাতার পুরনো সংস্করণগুলি",
        "tooltip-ca-protect": "এই পাতাকে সুরক্ষিত করো",
        "tooltip-ca-unprotect": "এই পাতার সুরক্ষা পরিবর্তন করো",
        "tooltip-ca-delete": "পাতাটি মুছে ফেলো",
        "tooltip-ca-undelete": "পাতাটি মুছে ফেলার আগে যে সম্পাদনাগুলি করা হয়েছিল, সেগুলি উদ্ধার করা হোক।",
-       "tooltip-ca-move": "পাতাà¦\9fি à¦¸à¦°à¦¿à¦¯à¦¼à§\87 à¦«à§\87লুন",
-       "tooltip-ca-watch": "à¦\8fà¦\87 à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦\86পনার à¦¨à¦\9cরতালিà¦\95ায় à¦¯à§\8bà¦\97 à¦\95রà§\8b",
+       "tooltip-ca-move": "পাতাà¦\9fি à¦¸à§\8dথানানà§\8dতর à¦\95রুন",
+       "tooltip-ca-watch": "à¦\8fà¦\87 à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦\86পনার à¦¨à¦\9cরতালিà¦\95ায় à¦¯à§\8bà¦\97 à¦\95রà§\81ন",
        "tooltip-ca-unwatch": "এই পাতাটি আপনার নজরতালিকা থেকে সরিয়ে ফেলুন",
        "tooltip-search": "{{SITENAME}} অনুসন্ধান",
        "tooltip-search-go": "যদি থাকে, তবে ঠিক এই নামের পাতায় চলো",
        "svg-long-desc-animated": "এনিমেটেড এসভিজি ফাইল, সাধারণত $1 × $2 পিক্সেল, ফাইলের আকার: $3",
        "svg-long-error": "অবৈধ SVG ফাইল: $1",
        "show-big-image": "মূল ফাইল",
-       "show-big-image-preview": "à¦\8fà¦\87 à¦ªà§\8dরিভিà¦\89-à¦\8fর আকার: $1।",
+       "show-big-image-preview": "à¦\8fà¦\87 à¦ªà§\8dরাà¦\95দরà§\8dশনà§\87র আকার: $1।",
        "show-big-image-other": "অন্যান্য {{PLURAL:$2|আকার|আকারসমূহ}}: $1।",
        "show-big-image-size": "$1 × $2 পিক্সেল",
        "file-info-gif-looped": "লুপকৃত",
        "exif-datetime": "ফাইল পরিবর্তনের তারিখ ও সময়",
        "exif-imagedescription": "ছবির শিরোনাম",
        "exif-make": "ক্যামেরার তৈরিকারক",
-       "exif-model": "ক্যামেরা মডেল",
+       "exif-model": "ক্যামেরা মডেল",
        "exif-software": "ব্যবহৃত সফটওয়্যার",
        "exif-artist": "স্রষ্টা",
        "exif-copyright": "কপিরাইট ধারক",
        "confirm-watch-top": "এই পাতাটি আপনার নজরতালিকায় যুক্ত করা হবে?",
        "confirm-unwatch-button": "ঠিক আছে",
        "confirm-unwatch-top": "এই পাতাটি আপনার নজরতালিকা থেকে সরিয়ে ফেলতে ইচ্ছুক?",
+       "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← পূর্ববর্তী পাতা",
        "imgmultipagenext": "পরবর্তী পাতা →",
        "imgmultigo": "চলো!",
        "version-entrypoints": "শুরুর ইউআরএল",
        "version-entrypoints-header-entrypoint": "শুরু",
        "version-entrypoints-header-url": "ইউআরএল",
+       "version-libraries": "ইনস্টল লাইব্রেরি",
+       "version-libraries-library": "লাইব্রেরী",
        "version-libraries-version": "সংস্করণ",
        "redirect": "পাতা, ফাইল, ব্যবহারকরী, অথবা সংশোধন আইডি দ্বারা পুনঃনির্দেশ করা হয়েছে",
        "redirect-legend": "একটি ফাইল অথবা পাতায় পুনঃনির্দেশ করা হয়েছে",
        "tags-tag": "ট্যাগ নাম",
        "tags-display-header": "পরিনর্তন পাতার বৈশিষ্ট",
        "tags-description-header": "অর্থের পূর্ণ বণনা",
+       "tags-source-header": "উৎস",
        "tags-active-header": "সক্রিয়?",
        "tags-hitcount-header": "ট্যাগকৃত পরিবর্সতনমূহ",
+       "tags-actions-header": "কার্যসমূহ",
        "tags-active-yes": "হ্যাঁ",
        "tags-active-no": "না",
        "tags-edit": "সম্পাদনা",
+       "tags-delete": "অপসারণ",
+       "tags-deactivate": "নিষ্ক্রিয়",
        "tags-hitcount": "$1টি {{PLURAL:$1|পরিবর্তন}}",
+       "tags-create-reason": "কারণ:",
+       "tags-create-submit": "তৈরি করুন",
+       "tags-delete-reason": "কারণ:",
+       "tags-activate-reason": "কারণ:",
+       "tags-activate-submit": "চালু",
+       "tags-deactivate-reason": "কারণ:",
+       "tags-deactivate-submit": "নিষ্ক্রিয়",
        "comparepages": "পাতার তুলনা",
        "compare-page1": "পাতা ১",
        "compare-page2": "পাতা ২",
        "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": "এটি অনুরোধকৃত পাতার ক্যাশে লিপি, যা হালনাগাতকৃত নাও হতে পারে।",
        "logentry-patrol-patrol": "$1 ব্যবহারকারী $3 পাতার $4 নম্বর সংস্করণ পরীক্ষিত বলে {{GENDER:$2|চিহ্নিত}} করেছেন",
        "logentry-patrol-patrol-auto": "$1 ব্যবহারকারী স্বয়ংক্রিয়ভাবে $3 পাতার $4 নম্বর সংস্করণ পরীক্ষিত বলে {{GENDER:$2|চিহ্নিত}} করেছেন",
        "logentry-newusers-newusers": "$1 ব্যবহারকারী অ্যাকাউন্টটি {{GENDER:$2|তৈরি করা}} হয়েছে",
-       "logentry-newusers-create": "$1 অ্যাকাউন্টটি {{GENDER:$2|তৈরী করা}} হয়েছে",
+       "logentry-newusers-create": "ব্যবহারকারী অ্যাকাউন্ট $1 {{GENDER:$2|তৈরী করা}} হয়েছে",
        "logentry-newusers-create2": "$1 ব্যবহারকারী $3 নামের অ্যাকাউন্টটি {{GENDER:$2|তৈরী}} করেছেন",
        "logentry-newusers-byemail": "$1, $3 ব্যবহারকরী অ্যাকাউন্টটি {{GENDER:$2|তৈরী করেছেন}} এবং পাসওয়ার্ড ইমেইলের মাধ্যমে পাঠানো হয়েছে",
        "logentry-newusers-autocreate": "$1 অ্যাকাউন্টটি স্বয়ংক্রিয়ভাবে {{GENDER:$2|তৈরি}} হয়েছে",
        "logentry-upload-upload": "$1 $3 {{GENDER:$2|আপলোড করেছেন}}",
        "logentry-upload-overwrite": "$1 $3-এর একটি নতুন সংস্করণ {{GENDER:$2|আপলোড করেছেন}}",
        "logentry-upload-revert": "$1 $3 {{GENDER:$2|আপলোড করেছেন}}",
+       "log-name-managetags": "ট্যাগ ব্যবস্থাপনা লগ",
        "rightsnone": "(কিছু নাই)",
        "revdelete-summary": "সম্পাদনা সারাংশ",
        "feedback-bugornote": "কারিগরী ত্রুটির বিস্তারিত বর্ণনা জানতে [$1 বাগ রিপোর্ট করুন]।\nঅথবা নিচের এই সরল ফর্মটি ব্যবহার করতে পারেন। \"[$3 $2]\" পাতায় আপনার ব্যবহারকারী নাম সহ মন্তব্যটি প্রকাশিত হবে।",
        "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 18ba747..8e2e187 100644 (file)
        "prefs-personal": "Korisnički podaci",
        "prefs-rc": "Podešavanja nedavnih izmjena",
        "prefs-watchlist": "Moji praćeni članci",
+       "prefs-editwatchlist": "Uredi spisak praćenja",
        "prefs-watchlist-days": "Broj dana za prikaz u spisku praćenja:",
        "prefs-watchlist-days-max": "Maximum $1 {{PLURAL:$1|dan|dana}}",
        "prefs-watchlist-edits": "Najveći broj izmjena za prikaz u proširenom spisku praćenja:",
index 9f2a58f..fd88aa5 100644 (file)
@@ -45,7 +45,8 @@
                        "F3RaN",
                        "ESM",
                        "Loupeter",
-                       "Macofe"
+                       "Macofe",
+                       "Gerardduenas"
                ]
        },
        "tog-underline": "Subratlla els enllaços:",
        "october": "octubre",
        "november": "novembre",
        "december": "desembre",
-       "january-gen": "de gener",
-       "february-gen": "de febrer",
+       "january-gen": "gener",
+       "february-gen": "febrer",
        "march-gen": "de març",
        "april-gen": "d'abril",
        "may-gen": "de maig",
        "mainpage-description": "Pàgina principal",
        "policy-url": "Project:Polítiques",
        "portal": "Portal de la comunitat",
-       "portal-url": "Project:Portal",
+       "portal-url": "Project:Portal de la comunitat",
        "privacy": "Política de privadesa",
        "privacypage": "Project:Política de privadesa",
        "badaccess": "Error de permisos",
        "pagetitle": "$1 - {{SITENAME}}",
        "pagetitle-view-mainpage": "{{SITENAME}}",
        "backlinksubtitle": "← $1",
-       "retrievedfrom": "Obtingut de «$1»",
+       "retrievedfrom": "Obtingut de \"$1\"",
        "youhavenewmessages": "Tens $1 ($2).",
        "youhavenewmessagesfromusers": "Tens $1 {{PLURAL:$3|d'un altre usuari|de $3 usuaris}} ($2).",
        "youhavenewmessagesmanyusers": "Tens $1 de molts usuaris ($2).",
        "createacct-another-realname-tip": "El nom real és opcional.\nSi decidiu proporcionar-lo, s'utilitzarà per a reconèixer a l'usuari el seu treball.",
        "pt-login": "Inicia la sessió",
        "pt-login-button": "Inicia sessió",
-       "pt-createaccount": "Crea un compte",
+       "pt-createaccount": "Creeu un compte",
        "pt-userlogout": "Finalitza la sessió",
        "php-mail-error-unknown": "Error desconegut en la funció mail() de PHP",
        "user-mail-no-addy": "S'ha intentat enviar un missatge de correu electrònic sense adreça.",
        "changeemail-text": "Completeu el següent formulari per canviar la vostra adreça de correu electrònic. Haureu d'introduir la contrasenya per confirmar el canvi.",
        "changeemail-no-info": "Heu d'entrar en un compte d'usuari per accedir directament a aquesta pàgina.",
        "changeemail-oldemail": "Adreça de correu electrònic actual:",
-       "changeemail-newemail": "Nova adreça de correu electrònic:",
+       "changeemail-newemail": "Adreça electrònica nova:",
        "changeemail-none": "(cap)",
        "changeemail-password": "La vostra contrasenya a {{SITENAME}}:",
        "changeemail-submit": "Canvia de correu electrònic",
        "nosuchsectiontitle": "No es pot trobar la secció",
        "nosuchsectiontext": "Heu intentat editar una secció que no existeix.\nPotser s'ha mogut o eliminat mentre estàveu veient la pàgina.",
        "loginreqtitle": "Cal que inicieu una sessió",
-       "loginreqlink": "inicia una sessió",
+       "loginreqlink": "inicia la sessió",
        "loginreqpagetext": "Cal que seguiu l'enllaç «$1» per a visualitzar altres pàgines.",
        "accmailtitle": "S'ha enviat una contrasenya.",
        "accmailtext": "S'ha enviat una contrasenya aleatòria a $2 per a {{GENDER:$1|l'usuari|la usuària}} [[User talk:$1|$1]].\n\nLa contrasenya per aquest nou compte pot ser canviada a la pàgina de ''[[Special:ChangePassword|canvi de contrasenya]]'' un cop connectat.",
        "nohistory": "No hi ha un historial de revisions per a aquesta pàgina.",
        "currentrev": "Revisió actual",
        "currentrev-asof": "Revisió de $1",
-       "revisionasof": "Revisió de $1",
+       "revisionasof": "Revisió del $1",
        "revision-info": "La revisió el $1 per {{GENDER:$6|$2}}$7",
        "previousrevision": "←Versió més antiga",
        "nextrevision": "Versió més nova→",
        "diff-multi-manyusers": "({{PLURAL:$1|Hi ha una revisió intermèdia|Hi ha $1 revisions intermèdies}} sense mostrar fetes per més {{PLURAL:$2|d'un usuari|de $2 usuaris}})",
        "difference-missing-revision": "{{PLURAL:$2|Una revisió|$2 revisions}} d'aquesta diferència ($1) no {{PLURAL:$2|s'ha|s'han}} trobat.\n\nAixò passa generalment en seguir un enllaç obsolet de diferències a una pàgina que s'ha suprimit.\nEs pot trobar més informació en el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registre de supressions].",
        "searchresults": "Resultats de la cerca",
-       "searchresults-title": "Resultats de la recerca de «$1»",
+       "searchresults-title": "Resultats de la cerca de «$1»",
        "titlematches": "Coincidències de títol de la pàgina",
        "textmatches": "Coincidències de text de pàgina",
        "notextmatches": "No hi ha cap coincidència de text de pàgina",
        "prevn-title": "$1 {{PLURAL:$1|resultat|resultats}} anteriors",
        "nextn-title": "$1 {{PLURAL:$1|resultat|resultats}} següents",
        "shown-title": "Mostra $1 {{PLURAL:$1|resultat|resultats}} per pàgina",
-       "viewprevnext": "Vés a ($1 {{int:pipe-separator}} $2) ($3).",
+       "viewprevnext": "Mostra ($1 {{int:pipe-separator}} $2) ($3).",
        "searchmenu-exists": "'''Hi ha una pàgina anomenada «[[:$1]]» en aquest wiki'''",
        "searchmenu-new": "<strong>Crea la pàgina «[[:$1]]» en aquest wiki!</strong> {{PLURAL:$2|0=|Vegeu també la pàgina trobada amb la cerca.|Vegeu també els resultats de cerca trobats.}}",
        "searchprofile-articles": "Pàgines de contingut",
        "searchprofile-articles-tooltip": "Cerca a $1",
        "searchprofile-images-tooltip": "Cerca fitxers",
        "searchprofile-everything-tooltip": "Cerca tot tipus de contingut (s'hi inclouen pàgines de discussió)",
-       "searchprofile-advanced-tooltip": "Cerca als espais de noms predefinits",
+       "searchprofile-advanced-tooltip": "Cerca als espais de noms personalitzats",
        "search-result-size": "$1 ({{PLURAL:$2|1 paraula|$2 paraules}})",
        "search-result-category-size": "{{PLURAL:$1|1 membre|$1 membres}} ({{PLURAL:$2|1 subcategoria|$2 subcategories}}, {{PLURAL:$3|1 fitxer|$3 fitxers}})",
        "search-redirect": "(redirigit des de $1)",
        "prefs-personal": "Perfil d'usuari",
        "prefs-rc": "Canvis recents",
        "prefs-watchlist": "Llista de seguiment",
+       "prefs-editwatchlist": "Edita la llista de seguiment",
+       "prefs-editwatchlist-label": "Editeu les entrades de la vostra llista de seguiment:",
+       "prefs-editwatchlist-edit": "Mostra i suprimeix títols de la llista de seguiment",
+       "prefs-editwatchlist-raw": "Edita la llista de seguiment crua",
+       "prefs-editwatchlist-clear": "Neteja la llista de seguiment",
        "prefs-watchlist-days": "Nombre de dies per mostrar en la llista de seguiment:",
        "prefs-watchlist-days-max": "Màxim $1 {{PLURAL:$1|dia|dies}}",
        "prefs-watchlist-edits": "Nombre de modificacions a mostrar en una llista estesa de seguiment:",
        "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:",
        "right-override-export-depth": "Exportar pàgines incloent aquelles enllaçades fins a una fondària de 5",
        "right-sendemail": "Enviar missatges de correu electrònic a altres usuaris",
        "right-passwordreset": "Veure les soŀlicituds de restabliment de contrasenya per correu electrònic",
-       "newuserlogpage": "Registre de creació de l'usuari",
+       "right-managechangetags": "Crear i suprimir [[Special:Tags|etiquetes]] des de la base de dades",
+       "newuserlogpage": "Registre de creació d'usuaris",
        "newuserlogpagetext": "Aquest és un registre de creació de nous usuaris.",
        "rightslog": "Registre dels permisos d'usuari",
        "rightslogtext": "Aquest és un registre de canvis dels permisos d'usuari.",
        "action-viewmyprivateinfo": "mostra la informació personal",
        "action-editmyprivateinfo": "edita la informació personal",
        "action-editcontentmodel": "editar el model de contingut d'una pàgina",
+       "action-managechangetags": "crear i suprimir etiquetes de la base de dades",
        "nchanges": "$1 {{PLURAL:$1|canvi|canvis}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|des de la darrera visita}}",
        "enhancedrc-history": "historial",
        "recentchanges-summary": "Seguiu els canvis recents del projecte {{SITENAME}} en aquesta pàgina.",
        "recentchanges-noresult": "Cap canvi corresponent a aquests criteris en el període indicat.",
        "recentchanges-feed-description": "Segueix en aquest canal els canvis més recents del wiki.",
-       "recentchanges-label-newpage": "Aquesta modificació inicià una pàgina",
+       "recentchanges-label-newpage": "Aquesta modificació creà una pàgina",
        "recentchanges-label-minor": "Aquesta és una modificació menor",
        "recentchanges-label-bot": "Aquesta modificació fou feta per un bot",
        "recentchanges-label-unpatrolled": "Aquesta modificació encara no s'ha patrullat",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (vegeu també la [[Special:NewPages|llista de pàgines noves]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "A sota hi ha {{PLURAL:$5|el canvi|els canvis}} a partir de <strong>$3, $4</strong> (fins a <strong>$1</strong>).",
-       "rclistfrom": "Mostra els canvis nous des de $3 $2",
+       "rclistfrom": "Mostra els canvis nous des de $3, $2",
        "rcshowhideminor": "$1 edicions menors",
        "rcshowhideminor-show": "Mostra",
        "rcshowhideminor-hide": "Amaga",
        "rc-old-title": "originàriament creada com «$1»",
        "recentchangeslinked": "Seguiment d'enllaços",
        "recentchangeslinked-feed": "Canvis relacionats",
-       "recentchangeslinked-toolbox": "Seguiment d'enllaços",
+       "recentchangeslinked-toolbox": "Canvis relacionats",
        "recentchangeslinked-title": "Canvis relacionats amb «$1»",
-       "recentchangeslinked-summary": "A continuació trobareu una llista dels canvis recents a les pàgines enllaçades des de la pàgina donada (o entre els membres d'una categoria especificada).\nLes pàgines de la vostra [[Special:Watchlist|llista de seguiment]] apareixen en '''negreta'''.",
+       "recentchangeslinked-summary": "Aquesta llista reflecteix els canvis recents a les pàgines enllaçades des d'una pàgina concreta (o als membres d'una categoria concreta).\nLes pàgines de la vostra [[Special:Watchlist|llista de seguiment]] apareixen en <strong>negreta</strong>.",
        "recentchangeslinked-page": "Nom de la pàgina:",
        "recentchangeslinked-to": "Mostra els canvis de les pàgines enllaçades amb la pàgina donada",
-       "upload": "Carrega",
+       "upload": "Carregueu un fitxer",
        "uploadbtn": "Carrega un fitxer",
        "reuploaddesc": "Torna al formulari per apujar.",
        "upload-tryagain": "Envia la descripció del fitxer modificat",
        "filehist-current": "actual",
        "filehist-datetime": "Data/hora",
        "filehist-thumb": "Miniatura",
-       "filehist-thumbtext": "Miniatura per a la versió de $1",
+       "filehist-thumbtext": "Miniatura per a la versió del $1",
        "filehist-nothumb": "Sense miniatura",
        "filehist-user": "Usuari",
        "filehist-dimensions": "Dimensions",
        "filehist-filesize": "Mida del fitxer",
        "filehist-comment": "Comentari",
        "imagelinks": "Ús del fitxer",
-       "linkstoimage": "{{PLURAL:$1|La següent pàgina enllaça|Les següents pàgines enllacen}} a aquesta imatge:",
+       "linkstoimage": "{{PLURAL:$1|La pàgina següent enllaça|Les $1 pàgines següents enllacen}} a aquest fitxer:",
        "linkstoimage-more": "Hi ha més de $1 {{PLURAL:$1|pàgina que enllaça|pàgines que enllaçen}} a aquest fitxer.\nLa següent llista només mostra {{PLURAL:$1|la primera d'elles|les primeres $1 d'aquestes pàgines}}.\nPodeu consultar la [[Special:WhatLinksHere/$2|llista completa]].",
        "nolinkstoimage": "No hi ha pàgines que enllacin aquesta imatge.",
        "morelinkstoimage": "Visualitza [[Special:WhatLinksHere/$1|més enllaços]] que porten al fitxer.",
        "allpagesfrom": "Mostra les pàgines que comencin per:",
        "allpagesto": "Mostra pàgines que acabin en:",
        "allarticles": "Totes les pàgines",
-       "allinnamespace": "Totes les pàgines (de l'espai de noms $1)",
+       "allinnamespace": "Totes les pàgines (de lespai de noms $1)",
        "allpagessubmit": "Vés-hi",
        "allpagesprefix": "Mostra les pàgines amb prefix:",
        "allpagesbadtitle": "El títol de la pàgina que heu inserit no és vàlid o conté un prefix d'enllaç amb un altre projecte. També pot passar que contingui un o més caràcters que no es puguin fer servir en títols de pàgina.",
        "blocklist-nousertalk": "no podeu modificar la pàgina de discussió pròpia",
        "ipblocklist-empty": "La llista de bloqueigs està buida.",
        "ipblocklist-no-results": "L'adreça IP o nom d'usuari soŀlicitat no està bloquejat.",
-       "blocklink": "bloca",
+       "blocklink": "bloqueja",
        "unblocklink": "desbloca",
        "change-blocklink": "canvia el blocatge",
        "contribslink": "contribucions",
        "delete_and_move_confirm": "Sí, esborra la pàgina",
        "delete_and_move_reason": "S'ha eliminat per a permetre el reanomenament de \" [[$1]] \"",
        "selfmove": "Els títols d'origen i de destinació coincideixen: no és possible de reanomenar una pàgina a si mateixa.",
-       "immobile-source-namespace": "No es poden moure pàgines de l'espai de noms \"$1\"",
+       "immobile-source-namespace": "No es poden moure les pàgines de l’espai de noms «$1»",
        "immobile-target-namespace": "No es poden moure pàgines cap a l'espai de noms \"$1\"",
        "immobile-target-namespace-iw": "No es poden moure pàgines a l'enllaç interwiki",
        "immobile-source-page": "Aquesta pàgina no es pot moure.",
        "export-submit": "Exporta",
        "export-addcattext": "Afegeix pàgines de la categoria:",
        "export-addcat": "Afegeix",
-       "export-addnstext": "Afegeix pàgines de l'espai de noms:",
+       "export-addnstext": "Afegeix pàgines de lespai de noms:",
        "export-addns": "Afegir",
        "export-download": "Ofereix desar com a fitxer",
        "export-templates": "Inclou les plantilles",
        "tooltip-pt-logout": "Finalitza la sessió d'usuari",
        "tooltip-pt-createaccount": "Us animem a què creeu un compte i inicieu sessió, encara que no és obligatori",
        "tooltip-ca-talk": "Discussió sobre el contingut d'aquesta pàgina",
-       "tooltip-ca-edit": "Podeu modificar aquesta pàgina. Si us plau, previsualitzeu-la abans de desar.",
+       "tooltip-ca-edit": "Podeu modificar aquesta pàgina. Si us plau, previsualitzeu-la abans de desar-la",
        "tooltip-ca-addsection": "Comença una nova secció",
        "tooltip-ca-viewsource": "Aquesta pàgina està protegida. Podeu veure el seu codi font.",
-       "tooltip-ca-history": "Versions antigues d'aquesta pàgina.",
+       "tooltip-ca-history": "Versions antigues d'aquesta pàgina",
        "tooltip-ca-protect": "Protegeix aquesta pàgina.",
        "tooltip-ca-unprotect": "Desprotegeix aquesta pàgina",
        "tooltip-ca-delete": "Elimina aquesta pàgina",
        "tooltip-ca-undelete": "Restaura les edicions fetes a aquesta pàgina abans de que fos esborrada.",
        "tooltip-ca-move": "Reanomena aquesta pàgina",
-       "tooltip-ca-watch": "Afegiu aquesta pàgina a la vostra llista de seguiment.",
+       "tooltip-ca-watch": "Afegiu aquesta pàgina a la vostra llista de seguiment",
        "tooltip-ca-unwatch": "Suprimiu aquesta pàgina de la vostra llista de seguiment",
        "tooltip-search": "Cerca a {{SITENAME}}",
        "tooltip-search-go": "Vés a una pàgina amb aquest nom exacte si existeix",
        "tooltip-search-fulltext": "Cerca aquest text a les pàgines",
        "tooltip-p-logo": "Visiteu la pàgina principal",
-       "tooltip-n-mainpage": "Visiteu la pàgina principal.",
+       "tooltip-n-mainpage": "Visiteu la pàgina principal",
        "tooltip-n-mainpage-description": "Vegeu la pàgina principal",
        "tooltip-n-portal": "Sobre el projecte, què podeu fer, on podeu trobar coses",
-       "tooltip-n-currentevents": "Per trobar informació general sobre l'actualitat.",
+       "tooltip-n-currentevents": "Per trobar informació general sobre l'actualitat",
        "tooltip-n-recentchanges": "Llista de canvis recents al wiki",
        "tooltip-n-randompage": "Pàgina a l'atzar",
        "tooltip-n-help": "El lloc per saber més coses",
        "tooltip-t-contributions": "Vegeu la llista de contribucions d'aquest usuari.",
        "tooltip-t-emailuser": "Envia un correu en aquest usuari.",
        "tooltip-t-info": "Més informació sobre aquesta pàgina",
-       "tooltip-t-upload": "Càrrega d'imatges o altres fitxers.",
-       "tooltip-t-specialpages": "Llista de totes les pàgines especials.",
+       "tooltip-t-upload": "Carregueu fitxers",
+       "tooltip-t-specialpages": "Llista de totes les pàgines especials",
        "tooltip-t-print": "Versió per a impressió d'aquesta pàgina",
        "tooltip-t-permalink": "Enllaç permanent a aquesta versió de la pàgina",
-       "tooltip-ca-nstab-main": "Vegeu el contingut de la pàgina.",
+       "tooltip-ca-nstab-main": "Vegeu el contingut de la pàgina",
        "tooltip-ca-nstab-user": "Vegeu la pàgina d'usuari",
        "tooltip-ca-nstab-media": "Vegeu la pàgina de l'element multimèdia",
        "tooltip-ca-nstab-special": "Aquesta és una pàgina especial, no podeu modificar-la",
        "tags-tag": "Nom de l'etiqueta",
        "tags-display-header": "Aparença de la llista de canvis",
        "tags-description-header": "Descripció completa del significat",
+       "tags-source-header": "Font",
        "tags-active-header": "Actiu?",
        "tags-hitcount-header": "Canvis etiquetats",
+       "tags-actions-header": "Accions",
        "tags-active-yes": "Sí",
        "tags-active-no": "No",
+       "tags-source-extension": "Definit per una extensió",
+       "tags-source-manual": "Aplicat manualment per usuaris i bots",
+       "tags-source-none": "Ja no està en ús",
        "tags-edit": "modifica",
+       "tags-delete": "suprimeix",
+       "tags-activate": "activa",
+       "tags-deactivate": "desactiva",
        "tags-hitcount": "$1 {{PLURAL:$1|canvi|canvis}}",
+       "tags-manage-no-permission": "No teniu permisos per administrar etiquetes de canvi",
+       "tags-create-heading": "Crea una nova etiqueta",
+       "tags-create-explanation": "Per defecte, les etiquetes acabades de crear estaran disponibles per usuaris i bots",
+       "tags-create-tag-name": "Nom de l'etiqueta:",
+       "tags-create-reason": "Motiu:",
+       "tags-create-submit": "Crea",
+       "tags-create-no-name": "Heu d'especificar un nom d'etiqueta.",
+       "tags-create-invalid-chars": "Els noms d'etiqueta no han de contenir comes (<code>,</code>) o barres (<code>/</code>).",
+       "tags-create-invalid-title-chars": "Els noms d'etiqueta no poden contenir caracters que no es poden usar en els títols de pàgina",
+       "tags-create-already-exists": "L'etiqueta \"$1\" ja existeix.",
+       "tags-delete-reason": "Motiu:",
+       "tags-activate-reason": "Motiu:",
+       "tags-activate-submit": "Activa",
+       "tags-deactivate-reason": "Motiu:",
+       "tags-deactivate-submit": "Desactiva",
        "comparepages": "Comparar pàgines",
        "compare-page1": "Pàgina 1",
        "compare-page2": "Pàgina 2",
        "expand_templates_generate_xml": "Mostra l'arbre XML",
        "expand_templates_generate_rawhtml": "Mostra l'HTML sense filtrar",
        "expand_templates_preview": "Previsualitza",
+       "expand_templates_preview_fail_html": "<em>Atès que {{SITENAME}} té HTML cru i hi ha hagut una pèrdua de dades de la sessió, s'ha amagat la vista prèvia com a mesura de precaució contra atacs en JavaScript.</em>\n\n<strong>Si això és un intent de previsualització legítim, torneu-ho a provar.</strong>\nSi encara no funciona, intenteu [[Special:UserLogout|finalitzar la sessió]] i iniciar-la de nou.",
+       "expand_templates_preview_fail_html_anon": "<em>Atès que {{SITENAME}} té l'HTML cru habilitat i no heu iniciat una sessió, s'ha amagat la previsualització com a prevenció d'atacs en JavaScript.</em>\n\n<strong>Si això és un intent de previsualització legítim, [[Special:UserLogin|inicieu una sessió]] i torneu-ho a provar.</strong>",
        "pagelanguage": "Selector de l'idioma de les pàgines",
        "pagelang-name": "Pàgina",
        "pagelang-language": "Idioma",
index 2db2e2b..98abb5d 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": "Блоктоха еза хан тӀех йаьлла",
        "poolcounter-usage-error": "Лелочун гӀалат: $1",
        "aboutsite": "{{grammar:genitive|{{SITENAME}}}} лаьцна",
        "aboutpage": "Project:Цуьнах лаьцна",
-       "copyright": "ЧÑ\83лаÑ\86ам Ð»ÐµÐ»Ð¾ Ð¼ÐµÐ³Ð° $1 Ð»Ð¸Ñ\86ензиÑ\86а (кÑ\85ениг билгалйина яцахь).",
+       "copyright": "ЧÑ\83лаÑ\86ам Ð»ÐµÐ»Ð¾ Ð¼ÐµÐ³Ð° $1 Ð»Ð¸Ñ\86ензиÑ\86а (кÑ\85иниг билгалйина яцахь).",
        "copyrightpage": "{{ns:project}}:Авторан бакъонаш",
        "currentevents": "ХӀинцалера хилларш",
        "currentevents-url": "Project:ХӀинцалера хилларш",
        "protectedpagetext": "ХӀара агӀо дӀакъоьвлина ю тадарш ца дайта.",
        "viewsourcetext": "Хьоьга далундерг хьажар а дезахь хlокху агlон чура йоза хьаэцар:",
        "viewyourtext": "Хьан йиш ю '''хьой нисдинчу''' дӀадолалун йозе хьажа а цуна копи ян а:",
-       "protectedinterface": "Ð¥Ó\80аÑ\80а Ñ\81Ñ\85Ñ\8cгайÑ\82аÑ\80на Ð³Ó\80иÑ\80Ñ\81а Ñ\85аамаÑ\88 Ð»Ð°Ñ\82Ñ\82оÑ\88 Ð¹Ð¾Ð»Ñ\83 Ð°Ð³Ó\80о Ñ\8e. Ð\9aÑ\83Ñ\8cйгалÑ\85оÑ\88на Ð±ÐµÐ½ Ð¸Ð·Ð° Ñ\85ийÑ\86а Ñ\86ало.",
+       "protectedinterface": "Ð¥Ó\80окÑ\85Ñ\83 Ð°Ð³Ó\80она Ñ\87оÑ\85Ñ\8c Ð¸Ð½Ñ\82еÑ\80Ñ\84ейÑ\81ан Ð¿Ñ\80огÑ\80амма Ð»Ð°Ñ\82Ñ\82оÑ\80ан Ñ\85аам Ð±Ñ\83. Ð\97Ñ\83лам Ñ\86а Ð´Ð°Ð¹Ñ\82а Ñ\86Ñ\83на Ñ\85ийÑ\86ам Ð±Ð°Ð½ ÐºÑ\83Ñ\8cйгалÑ\85оÑ\88на Ð±ÐµÐ½ Ñ\86ало.\nÐ¥Ó\80окÑ\85Ñ\83 Ñ\85ааман Ð³Ð¾Ñ\87 Ñ\82Ó\80еÑ\82оÑ\85а Ñ\8f Ñ\85ийÑ\86а Ð»ÐµÐ»Ð°Ðµ Ð»Ð¾ÐºÐ°Ð»Ð¸Ð·Ð°Ñ\86ин Ñ\81айÑ\82 MediaWiki [//translatewiki.net/ translatewiki.net]",
        "editinginterface": "<strong>Тергам бе:</strong> Ахьа таеш ю интерфейсан йоза долу агӀо программин латторан.\nЦуна бина хийцам хьокху Википедин кхечу декъашхошна гур бу.",
+       "translateinterface": "ХӀокху хааман гоч тӀетоха я хийца дехар до лелае локализацин сайт MediaWiki [//translatewiki.net/ translatewiki.net].",
        "cascadeprotected": "АгӀо хийцам ца байта гӀоралла дина ю {{PLURAL:$1|хӀокху агӀона|хӀокху агӀонийн}} юкъа йогӀуш хилар бахьнехь:\n$2",
        "namespaceprotected": "ХӀан бакъо яц анна цӀераш чохь тадарш да «$1».",
        "customcssprotected": "Хьан бакъо яц хӀара CSS-агӀо тая, иза кхечу декъашхочун гӀерс болу дера.",
        "createacct-benefit-body1": "{{PLURAL:$1|нисдар|нисдарш}}",
        "createacct-benefit-body2": "{{PLURAL:$1|яззам|яззамаш}}",
        "createacct-benefit-body3": "{{PLURAL:$1|декъашхо|декъашхой}} тӀаьхьарчу хенахь",
-       "badretype": "Ð\90Ñ\85Ñ\8cа Ñ\8fзÑ\8aен Ð¸Ñ\88аÑ\80Ñ\88 Ñ\86Ñ\85Ñ\8cаÑ\82ера яц",
+       "badretype": "Ð\90Ñ\85Ñ\8cа Ñ\8fзÑ\8aен Ð¿Ð°Ñ\80олаÑ\88 Ñ\86Ñ\85Ñ\8cаÑ\82еÑ\80ра яц",
        "userexists": "Ахьа язъен декъашхочун цӀе йолуш ю, дехар до кхин цӀе харжар.",
        "loginerror": "ГӀалат ду декъашхо вовзарехь/йовзарехь",
        "createacct-error": "ДӀаяздар кхуллуш гӀалат ду",
        "missing-revision": "АгӀона «{{FULLPAGENAME}}» верси $1 яц.\n\nИшта хуьйла ширелла дӀаяьккхина агӀонан хьажораган дихьа делча.\nМа-дара хила мега [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} дӀайаьхарш йолу тептар] чохь.",
        "userpage-userdoesnotexist": "Ишта декъашхочун дӀаяздар «<nowiki>$1</nowiki>» хӀинца дац. Хьажа билгал, хьуна бакъалла лаьий кхолла я хийцам ба хӀокху агӀон.",
        "userpage-userdoesnotexist-view": "«$1» ишта декъашхочун дӀаяздар дац.",
-       "blocked-notice-logextract": "ХӀара декъашхочун дӀаяздар блоктоьхна ду.\nЛахахь гойту блоктохарийн тептар чура тӀаьхьарлера дӀаяздар:",
+       "blocked-notice-logextract": "Ð¥Ó\80аÑ\80а Ð´ÐµÐºÑ\8aаÑ\88Ñ\85оÑ\87Ñ\83н Ð´Ó\80аÑ\8fздаÑ\80 Ð±Ð»Ð¾ÐºÑ\82оÑ\8cÑ\85на Ð´Ñ\83.\nÐ\9bаÑ\85аÑ\85Ñ\8c Ð³Ð¾Ð¹Ñ\82Ñ\83 Ð±Ð»Ð¾ÐºÑ\82оÑ\85аÑ\80ийн Ñ\82епÑ\82аÑ\80 Ñ\87Ñ\83Ñ\80а Ñ\82Ó\80аÑ\8cÑ\85Ñ\85Ñ\8cаÑ\80леÑ\80а Ð´Ó\80аÑ\8fздаÑ\80:",
        "clearyourcache": "'''Билгалдаккхар.''' Ӏалашйинчул тӀехьа хийцамаш га браузеран кэш цӀанъян езаш хила мега.\n* '''Firefox / Safari:''' ''Shift'' цӀе йолу пиллиг лаьцна битна, гӀирсийн панелан тӀера тӀетаӀе ''Карлаяккха'' я ''Ctrl-F5'' я ''Ctrl-R'' (''⌘-R'' Mac тӀехь)\n* '''Google Chrome:''' ТӀетаӀе ''Ctrl-Shift-R'' (''⌘-Shift-R'' Mac тӀехь)\n* '''Internet Explorer:''' ''Ctrl'' лаьцна йитан, тӀетаӀе ''Карлаяккха'' я тӀетаӀе ''Ctrl-F5''\n* '''Opera:''' Кэш цӀанъяр харжа меню ''Инструменты → Настройки'' чохь",
        "usercssyoucanpreview": "'''ДӀаалар.''' ТӀетаӀае кнопка «{{int:showpreview}}», хьажа хьай керла CSS-файл Ӏалаш яле.",
        "userjsyoucanpreview": "'''ДӀаалар.''' ТӀетаӀае кнопка «{{int:showpreview}}», хьажа хьай керла JS-файл Ӏалаш яле.",
        "searchresults-title": "Лахар «$1»",
        "titlematches": "АгӀонийн цӀераш цхьаьнанисялар",
        "textmatches": "АгӀонийн йоза цхьаьнанисдалар",
-       "notextmatches": "АгӀонаш чура йозанашца цхьатера йогlуш яц",
+       "notextmatches": "АгӀонаш чура йозанашца цхьатерра йогӀуш яц",
        "prevn": "хьалхарнаш {{PLURAL:$1|$1}}",
        "nextn": "тӀаьхьйогӀурш {{PLURAL:$1|$1}}",
        "prevn-title": "{{PLURAL:$1|1=Хьалхара $1 дӀаяздар|Хьалхара $1 дӀаяздарш}}",
        "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)",
        "timezoneregion-indian": "Индин океан",
        "timezoneregion-pacific": "Тийна океан",
        "allowemail": "Магийта декъашхошна хьайга электрони почтехула кехат кхехьийта",
-       "prefs-searchoptions": "Лаха",
+       "prefs-searchoptions": "Лахар",
        "prefs-namespaces": "ЦӀерийн ана",
        "default": "Iад йитарца",
        "prefs-files": "Файлаш",
        "prefs-help-prefershttps": "И хийцам болх байта юхугӀо системин чу.",
        "prefs-tabs-navigation-hint": "Хьехам: Шу йиш ю аьрру а, аьтту а цхьамзан пиллигаш лелаян цхьана юкъадиллинарг тӀера вукхун тӀе долуш.",
        "email-address-validity-valid": "Го нийса",
-       "userrights": "Декъашхочун бакъона урхалладар",
-       "userrights-lookup-user": "Декъашхошан бакъонашан урхалладар",
+       "userrights": "Декъашхочун бакъонашна урхалладар",
+       "userrights-lookup-user": "Декъашхойн бакъонашна урхалладар",
        "userrights-user-editname": "Язъе цӀе:",
        "editusergroup": "Хийца декъашхочун бакъо",
        "editinguser": "Хийца декъашхочуьна бакъо '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
        "right-override-export-depth": "агӀонаш экспорт ян, 5 кхаччалц къорга агӀонаш цхьан",
        "right-sendemail": "кхечу декъашхошка электронан хаамаш кхехьийта",
        "right-passwordreset": "пароль хийцарца электроннан хаамашка хьажар",
+       "right-managechangetags": "Хаамийн базан чохь [[Special:Tags|билгалонаш]] кхолла а дӀаяха а",
        "newuserlogpage": "Декъашхой дӀабазбина тептар",
        "newuserlogpagetext": "Дукху хан йоцуш дӀабазбелла декъашхойн могӀам",
        "rightslog": "Декъашхочун бакъона тéптар",
        "action-viewmywatchlist": "шен тергаме могӀане хьажар",
        "action-viewmyprivateinfo": "хьан долара хааме хьажар",
        "action-editmyprivateinfo": "хьан долара хаам табар",
+       "action-managechangetags": "хаамийн базан чохь билгалонаш кхоллар а дӀаяхар а",
        "nchanges": "$1 {{PLURAL:$1|хийцам|хийцамаш}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|тӀеххьара чудаларца}}",
        "enhancedrc-history": "истори",
        "rcshowhidemine": "$1 айхьа нисдинарш",
        "rcshowhidemine-show": "Гайта",
        "rcshowhidemine-hide": "Къайладаха",
-       "rclinks": "Ð\93айÑ\82а Ñ\82Ó\80аÑ\8cÑ\85Ñ\8cаÑ\80а $1 Ñ\85ийÑ\86амаÑ\88 $2 Ð´ÐµÐ½<br />$3",
+       "rclinks": "Ð\93айÑ\82а Ñ\82Ó\80аÑ\8cÑ\85Ñ\85Ñ\8cаÑ\80леÑ\80аÑ\87Ñ\83 $2 Ð´Ð¸Ð¹Ð½Ð°Ñ\85Ñ\8c Ð±Ð¸Ð½Ð° Ð±Ð¾Ð»Ñ\83 $1 Ñ\85ийÑ\86амаÑ\88\n<br />$3",
        "diff": "башхалла",
        "hist": "истори",
        "hide": "Къайлаяккха",
        "uploaddisabled": "Чуяккхар магийна дац",
        "copyuploaddisabled": "URL тӀера чуяккхар дӀадайина ду.",
        "uploaddisabledtext": "Файлаш чуяхар дӀадайина ду.",
-       "uploadscriptednamespace": "Ð¥Ó\80окÑ\85Ñ\83 SVG-Ñ\84айлан Ñ\86Ó\80еÑ\80ийн Ð¼ÐµÑ\82Ñ\82иг нийса яц '$1'",
+       "uploadscriptednamespace": "Ð¥Ó\80окÑ\85Ñ\83 SVG-Ñ\84айлан Ñ\86Ó\80еÑ\80ийн Ð°Ð½Ð° нийса яц '$1'",
        "upload-source": "ДIайолалун файл",
        "sourcefilename": "ДIайолалун файл:",
        "sourceurl": "Хьостан URL-адрес:",
        "usercreated": "{{GENDER:$3|дӀавазвелла|дӀаязелла}} $1 $2",
        "newpages": "Керла агӀонаш",
        "newpages-username": "Декъашхо:",
-       "ancientpages": "ТӀаьхьарлерачу хенаца нисбина яззамаш",
+       "ancientpages": "ТÓ\80аÑ\8cÑ\85Ñ\85Ñ\8cаÑ\80леÑ\80аÑ\87Ñ\83 Ñ\85енаÑ\86а Ð½Ð¸Ñ\81бина Ñ\8fззамаÑ\88",
        "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": "Гучé баха декъашхой, болалуш болу тӀера:",
        "protect-title": "ГӀоралла хӀоттор: «$1»",
        "protect-title-notallowed": "ГӀораллин бараме хьажар «$1»",
        "prot_1movedto2": "«[[$1]]» цӀе хийцина → «[[$2]]»",
-       "protect-badnamespace-title": "Ð\93Ó\80оÑ\80аладан Ñ\86алÑ\83Ñ\88 Ð¹Ð¾Ð»Ñ\83 Ñ\86Ó\80еÑ\80ийн Ð¼ÐµÑ\82Ñ\82иг",
+       "protect-badnamespace-title": "Ð\93Ó\80оÑ\80аладан Ñ\86алÑ\83Ñ\88 Ð¹Ð¾Ð»Ñ\83 Ñ\86Ó\80еÑ\80ийн Ð°Ð½Ð°",
        "protect-badnamespace-text": "ХӀокху цӀерийн меттигехь йолу агӀонашна гӀараладан цало.",
        "protect-norestrictiontypes-title": "ГӀараладан цалуш йолу агӀо",
        "protect-legend": "Бакъде гӀоралла дар",
        "undelete-search-title": "ДӀаяхна агӀонаш лахар",
        "undelete-search-box": "ДӀаяхна агӀонаш лахар",
        "undelete-search-prefix": "Гайта агӀонаш йолалуш йолу тӀера:",
-       "undelete-search-submit": "Лаха",
+       "undelete-search-submit": "Лахар",
        "undelete-no-results": "Архив чохь йогӀуш агӀонаш цакарий.",
        "undelete-error": "АгӀо меттахӀоттаяран гӀалат",
        "undelete-error-short": "Файл меттахӀоттаяран гӀалат: $1",
        "undelete-show-file-submit": "ХӀаъ",
        "namespace": "Цlерийн ана:",
        "invert": "Хаьржинарг къайлаяккха",
-       "tooltip-invert": "Ð¥Ó\80оÑ\82Ñ\82ае Ñ\85Ó\80аÑ\80а Ð±Ð¸Ð»Ð³Ð°Ð»Ð¾, Ñ\85аÑ\8cÑ\80жинÑ\87Ñ\83 Ñ\86Ó\80еÑ\80ийн Ð¼ÐµÑ\82Ñ\82иган агӀонийн хийцамаш къайлабаха (кхин дихкина цӀерийн меттигаш, гайтина елахь)",
-       "namespace_association": "Ð\99иÑ\85кина Ð¼ÐµÑ\82Ñ\82иг",
-       "tooltip-namespace_association": "Ð¥Ó\80оÑ\82Ñ\82ае Ñ\85Ó\80аÑ\80а Ð±Ð¸Ð»Ð³Ð°Ð»Ð¾, Ð¸Ñ\88Ñ\82Ñ\82а Ð´Ð¸Ð¹Ñ\86аÑ\80ийн (Ñ\8f ÐºÑ\85ин) Ñ\86Ó\80еÑ\80ийн Ð¼ÐµÑ\82Ñ\82иг юкъахь хилийта",
+       "tooltip-invert": "Ð¥Ó\80оÑ\82Ñ\82ае Ñ\85Ó\80аÑ\80а Ð±Ð¸Ð»Ð³Ð°Ð»Ð¾, Ñ\85аÑ\8cÑ\80жинÑ\87Ñ\83 Ñ\86Ó\80еÑ\80ийн Ð°Ð½ан агӀонийн хийцамаш къайлабаха (кхин дихкина цӀерийн меттигаш, гайтина елахь)",
+       "namespace_association": "Ð\99иÑ\85кина Ð°Ð½Ð°",
+       "tooltip-namespace_association": "Ð¥Ó\80оÑ\82Ñ\82ае Ñ\85Ó\80аÑ\80а Ð±Ð¸Ð»Ð³Ð°Ð»Ð¾, Ð¸Ñ\88Ñ\82Ñ\82а Ð´Ð¸Ð¹Ñ\86аÑ\80ийн (Ñ\8f ÐºÑ\85ин) Ñ\86Ó\80еÑ\80ийн Ð°Ð½Ð° юкъахь хилийта",
        "blanknamespace": "(Коьрта)",
        "contributions": "{{GENDER:$1|Декъашхочун}} къинхьегам",
        "contributions-title": "{{GENDER:$1|Декъашхочун}} къинхьегам $1",
        "sp-contributions-uploads": "Файлаш",
        "sp-contributions-logs": "тéптарш",
        "sp-contributions-talk": "дийцаре",
-       "sp-contributions-userrights": "декъашхочун бакъона урхалладар",
-       "sp-contributions-blocked-notice": "ХӀара декъашхочун дӀаяздар блоктоьхна ду.\nЛахахь гойту блоктохарийн тептар чура тӀаьхьарлера дӀаяздар:",
-       "sp-contributions-blocked-notice-anon": "ХӀара IP-адрес хӀинца блоктоьхна ду.\nЛахахь гойту блоктохарийн тептар чура тӀаьхьарлера дӀаяздар:",
+       "sp-contributions-userrights": "декъашхочун бакъонашна урхалладар",
+       "sp-contributions-blocked-notice": "Ð¥Ó\80аÑ\80а Ð´ÐµÐºÑ\8aаÑ\88Ñ\85оÑ\87Ñ\83н Ð´Ó\80аÑ\8fздаÑ\80 Ð±Ð»Ð¾ÐºÑ\82оÑ\8cÑ\85на Ð´Ñ\83.\nÐ\9bаÑ\85аÑ\85Ñ\8c Ð³Ð¾Ð¹Ñ\82Ñ\83 Ð±Ð»Ð¾ÐºÑ\82оÑ\85аÑ\80ийн Ñ\82епÑ\82аÑ\80 Ñ\87Ñ\83Ñ\80а Ñ\82Ó\80аÑ\8cÑ\85Ñ\85Ñ\8cаÑ\80леÑ\80а Ð´Ó\80аÑ\8fздаÑ\80:",
+       "sp-contributions-blocked-notice-anon": "Ð¥Ó\80аÑ\80а IP-адÑ\80еÑ\81 Ñ\85Ó\80инÑ\86а Ð±Ð»Ð¾ÐºÑ\82оÑ\8cÑ\85на Ð´Ñ\83.\nÐ\9bаÑ\85аÑ\85Ñ\8c Ð³Ð¾Ð¹Ñ\82Ñ\83 Ð±Ð»Ð¾ÐºÑ\82оÑ\85аÑ\80ийн Ñ\82епÑ\82аÑ\80 Ñ\87Ñ\83Ñ\80а Ñ\82Ó\80аÑ\8cÑ\85Ñ\85Ñ\8cаÑ\80леÑ\80а Ð´Ó\80аÑ\8fздаÑ\80:",
        "sp-contributions-search": "Къинхьегам лахар",
        "sp-contributions-username": "IP-адрес я декъашхочун цӀе:",
        "sp-contributions-toponly": "ТӀаьхьара бина хийцамаш гайта",
        "sp-contributions-newonly": "АгӀонаш кхоллар бен ма гайта",
-       "sp-contributions-submit": "Лаха",
+       "sp-contributions-submit": "Лахар",
        "whatlinkshere": "Хьажоргаш кхузе",
        "whatlinkshere-title": "«$1» тӀе хьажоргаш йолу агӀонаш",
        "whatlinkshere-page": "Агlо:",
        "protectedpagemovewarning": "'''ДӀахьедар.''' ХӀара агӀо гӀаролла йина ю; цӀе хийца я нисйа а бакъо йолуш куьйгалхой бе бац.\nЛахахьа тептаро балийна тӀаьхьаралера дӀаязбина хаам:",
        "semiprotectedpagemovewarning": "'''ДӀахьедо.''' ХӀара агӀо гӀаролла йина ю; дӀабазбиначу декъашхошка бе цӀе хийцалуш яц.\nЛахахьа тептаро балийна тӀаьхьаралера дӀаязбина хаам:",
        "export": "АгӀонаш араяхар",
-       "exporttext": "Шуьга далур ду кхечу меттера чудахарш, йоза а хийцаме тептарш билгалла йолу агӀонаш йа гулдина йолу агӀонаш хӀокх XML барамца, юха тӀяхьа чура [[Special:Import|хьаэцалурдолш]] кхечу вики-хьалхен, болх беш йолу хlокху MediaWiki гlирсаца.\n\nКхечу меттера яззамаш чуйаха, чуязйе цӀе тадечу метте, цӀхьа могӀан цӀе могӀаршкахь, юха харжа лаьи шуна Кхечу меттер чуйаха массо яззамашна истори хийцамбарш йа тӀяхьаралера яззамна башхо.\n\nШуьга кхи даландерг, лелаеш йолу меттиг къастаман машан хьажорг кхечу меттер чудаха тӀаьхьарлерачу башхон яззамаш. Масала оцу яззамна [[{{MediaWiki:Mainpage}}]] хӀара хира ю хьажорг [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]].",
+       "exporttext": "Шуьга далур ду кхечу меттера чудахарш, йоза а хийцаме тептарш билгалла йолу агӀонаш я гулдина йолу агӀонаш хӀокху XML барамца, юха тӀаьхьа чура [[Special:Import|хьаэцалурдолш]] кхечу вики-хьалхен, болх беш йолу хӀокху MediaWiki гӀирсаца.\n\nКхечу меттера яззамаш чуяха, чу язъе цӀе тадечу метте, цхьа могӀан цӀе могӀаршкахь, юха харжа лаьий шуна кхечу меттигера чуяха массо яззамашна истори хийцамбарш я тӀаьххьарлера яззаман верси.\n\nШуьга кхи далундерг, лелаеш йолу адресан хьажорг кхечу меттера чудаха тӀаьххьарлерачу версин яззамаш. Масала оцу яззаман [[{{MediaWiki:Mainpage}}]] хӀара хира ю хьажорг [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]].",
        "exportall": "Массо агӀонаш экспорт ян",
        "exportcuronly": "Карара верси бен юкъа ма тоха, юзийна хьалхалерра истори йоцуш",
        "export-submit": "Экспорт ян",
        "import-interwiki-history": "ХӀокху агӀона ерриг хийцаман истори копи ян",
        "import-interwiki-templates": "Юкъайихка массо кепаш",
        "import-interwiki-submit": "Импорт ян",
-       "import-interwiki-namespace": "Ð\9aоÑ\8cÑ\80Ñ\82а Ñ\86Ó\80еÑ\80ийн Ð¼ÐµÑ\82Ñ\82иг:",
+       "import-interwiki-namespace": "Ð\9aоÑ\8cÑ\80Ñ\82а Ñ\86Ó\80еÑ\80ийн Ð°Ð½Ð°:",
        "import-interwiki-rootpage": "Коьрта агӀо (тӀехь дац):",
        "import-upload-filename": "Файлан цӀе:",
        "import-comment": "Билгалдаккхар:",
        "redirect-revision": "АгӀона верси",
        "redirect-file": "Файлан цӀе",
        "redirect-not-exists": "МаьӀна цакарий",
-       "fileduplicatesearch": "Лаха цхьатера йолу файлаш",
-       "fileduplicatesearch-summary": "Ð\9bаÑ\85а Ñ\86Ñ\85Ñ\8cаÑ\82еÑ\80а Ð¹Ð¾Ð»Ñ\83 Ñ\84айлаÑ\88 Ñ\85Ñ\8dÑ\88-кодаÑ\86а.",
-       "fileduplicatesearch-legend": "Цхьатера ерш лахар",
+       "fileduplicatesearch": "Лаха цхьатерра йолу файлаш",
+       "fileduplicatesearch-summary": "Ð¥Ñ\8dÑ\88-кодаÑ\86а Ñ\86Ñ\85Ñ\8cаÑ\82еÑ\80Ñ\80а Ñ\84айлаÑ\88 Ð»Ð°Ñ\85аÑ\80.",
+       "fileduplicatesearch-legend": "Цхьатерра ерш лахар",
        "fileduplicatesearch-filename": "Файлан цӀе:",
        "fileduplicatesearch-submit": "Лахар",
        "fileduplicatesearch-info": "$1 × $2 пиксель<br />Файлан барам: $3<br />MIME-тайп: $4",
        "tags-tag": "Билгалона цӀе",
        "tags-display-header": "МогӀам чохь хийцамаш гар",
        "tags-description-header": "МаьӀнан дуьззина сурт хӀоттор",
+       "tags-source-header": "Хьост",
        "tags-active-header": "Жигара?",
        "tags-hitcount-header": "Къастам бина нисдарш",
+       "tags-actions-header": "Дийраш",
        "tags-active-yes": "ХӀаъ",
        "tags-active-no": "ХӀахӀа",
+       "tags-source-extension": "Билгалйо шоралица",
+       "tags-source-none": "Кхий лелош яц",
        "tags-edit": "нисъе",
+       "tags-delete": "дӀаяккха",
+       "tags-activate": "активациян",
+       "tags-deactivate": "дӀаяйа",
        "tags-hitcount": "$1 {{PLURAL:$1|хийцам|хийцамаш}}",
+       "tags-create-heading": "Кхолла керла билгало",
+       "tags-create-tag-name": "Билгалонна цӀе:",
+       "tags-create-reason": "Бахьна:",
+       "tags-create-submit": "Кхолла",
+       "tags-create-no-name": "Ахьа билгалонан цӀе язъян езаш.",
+       "tags-create-already-exists": "«$1» билгало яц.",
+       "tags-create-warnings-below": "Лаьий хьуна билгало кхоллар чекхдакха?",
+       "tags-delete-title": "ДӀаяккха билгало",
+       "tags-delete-explanation-initial": "Хьо гӀерта «$1» базан чура билгало дӀаяккха.",
+       "tags-delete-reason": "Бахьна:",
+       "tags-activate-title": "Билгалона активациян",
+       "tags-activate-question": "Хьо гӀерта «$1» билгалонан активациян.",
+       "tags-activate-reason": "Бахьна:",
+       "tags-activate-not-allowed": "«$1» билгалонан активациян цало.",
+       "tags-activate-not-found": "«$1» билгало яц.",
+       "tags-activate-submit": "Активациян",
+       "tags-deactivate-title": "ДӀаяйа билгало",
+       "tags-deactivate-reason": "Бахьна:",
+       "tags-deactivate-submit": "ДӀаяйа",
        "comparepages": "АгӀонаш юстар",
        "compare-page1": "Дуьххьаралера агӀо",
        "compare-page2": "ШолгӀа агӀо",
        "logentry-upload-upload": "$1 {{GENDER:$2|чуяьккхина}} $3",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|чуяьккхина}} керла верси $3",
        "logentry-upload-revert": "$1 {{GENDER:$2|чуяьккхина}} $3",
+       "log-name-managetags": "Билгалонашан урхалладаран тептар",
+       "logentry-managetags-create": "$1 {{GENDER:$2|Кхоьллина}} билгало «$4»",
        "rightsnone": "(яц)",
        "revdelete-summary": "хийцамах лаьцна",
        "feedback-bugornote": "Хьайн техникин халонах лаьцна яздан хӀума делахь, дехар до, [$1 хаам бе тхоьга].\nДацахь хьан йиш ю хӀокху атта кепаца «[$3 $2]» агӀонг къамел тӀетоха хьан декъашхочун цӀарца, кхин лелош йолу браузер билгал еш.",
        "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=Файлан|Файлийн}} дубликат.",
index de8be5c..42bddbc 100644 (file)
        "right-override-export-depth": "هەناردنی لاپەڕەکان کە لاپەڕەکانی بەستەر پێ‌دراو تا قووڵایی 5 لەخۆ بگرێت",
        "right-sendemail": "ناردنی ئیمەیل بۆ بەکارھێنەرانی تر",
        "right-passwordreset": "دیتنی ئیمەیلەکانی ڕێکخستنەوەی تێپەڕوشە",
+       "right-managechangetags": "دروستکردن و سڕینەوەی [[Special:Tags|تاگەکان]] لە بنکەدراوە",
        "newuserlogpage": "لۆگی دروستکردنی بەکارھێنەر",
        "newuserlogpagetext": "ئەمە لۆگێکی دروستکردنی بەکارھێنەرە.",
        "rightslog": "لۆگی مافەکانی بەکارھێنەر",
        "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|دەستکاری}}",
index 0e0d207..c8828d1 100644 (file)
        "userlogin-yourpassword-ph": "Паролинъизни язынъыз",
        "createacct-yourpassword-ph": "Парольни язынъыз",
        "yourpasswordagain": "Парольни бир даа язынъыз:",
-       "createacct-yourpasswordagain": "Ð\9fаÑ\80олÑ\8cни Ñ\82аÑ\81дÑ\8bкÑ\8aланÑ\8aÑ\8bз",
+       "createacct-yourpasswordagain": "Ð\9fаÑ\80олÑ\8cни Ñ\82аÑ\81дÑ\8bкÑ\8aлав",
        "createacct-yourpasswordagain-ph": "Парольни бир даа язынъыз",
        "remembermypassword": "Киришимни бу компьютерде хатырла (энъ чокъ $1 {{PLURAL:$1|1=кунь|кунь}} ичюн)",
        "userlogin-remembermypassword": "Системада къалайым",
        "deleteotherreason": "Дигер/илявели себеп:",
        "deletereasonotherlist": "Дигер себеп",
        "rollback": "Денъиштирмелерни кери ал",
-       "rollback_short": "кери ал",
        "rollbacklink": "эски алына кетир",
        "rollbackfailed": "кери алув мувафакъиетсиз",
        "cantrollback": "Денъиштирмелер кери алынамай, саифени сонъки денъиштирген киши онынъ тек бир муэллифидир",
index 323b05f..47e30dd 100644 (file)
        "userlogin-yourpassword-ph": "Paroliñizni yazıñız",
        "createacct-yourpassword-ph": "Parolni yazıñız",
        "yourpasswordagain": "Parolni bir daa yazıñız:",
-       "createacct-yourpasswordagain": "Parolni tasdıqlañız",
+       "createacct-yourpasswordagain": "Parolni tasdıqlav",
        "createacct-yourpasswordagain-ph": "Parolni bir daa yazıñız",
        "remembermypassword": "Kirişimni bu kompyuterde hatırla (eñ çoq $1 {{PLURAL:$1|kün|kün}} içün)",
        "userlogin-remembermypassword": "Sistemada qalayım",
        "deleteotherreason": "Diger/ilâveli sebep:",
        "deletereasonotherlist": "Diger sebep",
        "rollback": "Deñiştirmelerni keri al",
-       "rollback_short": "keri al",
        "rollbacklink": "eski alına ketir",
        "rollbackfailed": "keri aluv muvafaqiyetsiz",
        "cantrollback": "Deñiştirmeler keri alınamay, saifeni soñki deñiştirgen kişi onıñ tek bir müellifidir",
index 54b4a8b..9f9ca0b 100644 (file)
        "prefs-personal": "Údaje o uživateli",
        "prefs-rc": "Poslední změny",
        "prefs-watchlist": "Sledované stránky",
+       "prefs-editwatchlist": "Editovat seznam sledovaných stránek",
+       "prefs-editwatchlist-label": "Editovat položky vašeho seznamu sledovaných stránek:",
+       "prefs-editwatchlist-edit": "Zobrazit a odebrat položky vašeho seznamu sledovaných stránek",
+       "prefs-editwatchlist-raw": "Editovat textový soubor sledovaných stránek",
+       "prefs-editwatchlist-clear": "Vyprázdnit seznam sledovaných stránek",
        "prefs-watchlist-days": "Počet dní zobrazených ve sledovaných stránkách:",
        "prefs-watchlist-days-max": "Maximálně $1 {{PLURAL:$1|den|dny|dní}}",
        "prefs-watchlist-edits": "Počet editací zobrazených ve zdokonalených sledovaných stránkách:",
        "right-override-export-depth": "Exportovat stránky včetně odkazovaných stránek až do hloubky 5",
        "right-sendemail": "Odesílání e-mailů ostatním uživatelům",
        "right-passwordreset": "Prohlížení e-mailů pro znovunastavení hesla",
+       "right-managechangetags": "Vytváření [[Special:Tags|značek]] a jejich mazání z databáze",
        "newuserlogpage": "Kniha nových uživatelů",
        "newuserlogpagetext": "Toto je záznam nově zaregistrovaných uživatelů.",
        "rightslog": "Kniha práv uživatelů",
        "action-viewmyprivateinfo": "prohlížet si své soukromé údaje",
        "action-editmyprivateinfo": "změnit své soukromé údaje",
        "action-editcontentmodel": "editovat model obsahu stránky",
+       "action-managechangetags": "vytvářet a mazat značky z databáze",
        "nchanges": "$1 {{PLURAL:$1|změna|změny|změn}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|od poslední návštěvy}}",
        "enhancedrc-history": "historie",
        "uploaderror": "Při načítání došlo k chybě",
        "upload-recreate-warning": "'''Upozornění: Soubor pod tímto názvem byl dříve smazán či přejmenován.'''\n\nZde je pro přehled zobrazen soupis mazání a přesunů této stránky:",
        "uploadtext": "Níže uvedený formulář slouží k načtení souborů. Již načtené soubory si můžete prohlížet a hledat pomocí [[Special:FileList|seznamu načtených souborů]], každé načtení se také zaznamenává do [[Special:Log/upload|knihy nahrávek]], smazání jsou v [[Special:Log/delete|knize smazaných stránek]].\n\nPro vložení obrázku do stránky použijte jeden z následujících způsobů zápisu:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Soubor.jpg]]</nowiki></code>''' do stránky vloží celý obrázek,\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Soubor.png|thumb|left|Popisek]]</nowiki></code>''' vloží náhled v rámečku zarovnaném na levý okraj, s popiskem „Popisek“,\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Soubor.ogg]]</nowiki></code>''' vloží přímý odkaz na soubor, aniž by se ten na stránce zobrazoval.",
-       "upload-permitted": "Povolené formáty souborů: $1.",
-       "upload-preferred": "Upřednostňované formáty souborů: $1.",
-       "upload-prohibited": "Zakázané formáty souborů: $1.",
+       "upload-permitted": "{{PLURAL:$2|Povolený formát|Povolené formáty}} souborů: $1.",
+       "upload-preferred": "{{PLURAL:$2|Upřednostňovaný formát|Upřednostňované formáty}} souborů: $1.",
+       "upload-prohibited": "{{PLURAL:$2|Zakázaný formát|Zakázané formáty}} souborů: $1.",
        "uploadlogpage": "Kniha nahrávek",
        "uploadlogpagetext": "Níže najdete seznam nejnovějších souborů.",
        "filename": "Soubor",
        "listgrouprights-key": "Legenda:\n* <span class=\"listgrouprights-granted\">Udělená práva</span>\n* <span class=\"listgrouprights-revoked\">Odebraná práva</span>",
        "listgrouprights-group": "Skupina",
        "listgrouprights-rights": "Práva",
-       "listgrouprights-helppage": "Help:Práva skupiny",
+       "listgrouprights-helppage": "Help:Práva uživatelských skupin",
        "listgrouprights-members": "(seznam členů)",
        "listgrouprights-addgroup": "Přidávání uživatelů do {{PLURAL:$2|skupiny|skupin}} $1",
        "listgrouprights-removegroup": "Vyřazování uživatelů ze {{PLURAL:$2|skupiny|skupin}} $1",
        "movepage-moved-noredirect": "Přesměrování nebylo vytvořeno.",
        "articleexists": "Takto nazvaná stránka již existuje, nebo Vámi zvolený název je neplatný. Zvolte jiný název.",
        "cantmove-titleprotected": "Stránku nelze přesunout na zadané místo, protože název je uzamčen proti vytváření",
-       "movetalk": "Přesunout příslušnou diskusní stránku",
+       "movetalk": "Přesunout související diskusní stránku",
        "move-subpages": "Přesunout i podstránky (maximálně $1)",
        "move-talk-subpages": "Přesunout i podstránky diskusní stránky (maximálně $1)",
        "movepage-page-exists": "Stránka $1 již existuje a nemůže být automaticky přepsána.",
        "tags-tag": "Název značky",
        "tags-display-header": "Zobrazení na seznamech změn",
        "tags-description-header": "Úplný popis významu",
+       "tags-source-header": "Zdroj",
        "tags-active-header": "Aktivní?",
        "tags-hitcount-header": "Označené změny",
+       "tags-actions-header": "Akce",
        "tags-active-yes": "Ano",
        "tags-active-no": "Ne",
+       "tags-source-extension": "Definována rozšířením",
+       "tags-source-manual": "Přidávána ručně uživateli a boty",
+       "tags-source-none": "Už nepoužívána",
        "tags-edit": "editovat",
+       "tags-delete": "smazat",
+       "tags-activate": "aktivovat",
+       "tags-deactivate": "deaktivovat",
        "tags-hitcount": "$1 {{PLURAL:$1|změna|změny|změn}}",
+       "tags-manage-no-permission": "Nemáte oprávnění spravovat značky pro změny.",
+       "tags-create-heading": "Vytvořit novou značku",
+       "tags-create-explanation": "Nově vytvořené značky jsou implicitně k dispozici uživatelům a botům.",
+       "tags-create-tag-name": "Název značky:",
+       "tags-create-reason": "Důvod:",
+       "tags-create-submit": "Vytvořit",
+       "tags-create-no-name": "Musíte uvést název značky.",
+       "tags-create-invalid-chars": "Názvy značek nesmí obsahovat čárky (<code>,</code>) ani dopředná lomítka (<code>/</code>).",
+       "tags-create-invalid-title-chars": "Názvy značek nesmí obsahovat znaky, které nelze používat v názvech stránek.",
+       "tags-create-already-exists": "Značka „$1“ již existuje.",
+       "tags-create-warnings-above": "Při pokusu o vytvoření značky „$1“ {{PLURAL:$1|bylo zjištěno|byla zjištěna}} následující varování:",
+       "tags-create-warnings-below": "Chcete i přesto značku vytvořit?",
+       "tags-delete-title": "Smazat značku",
+       "tags-delete-explanation-initial": "Chystáte se smazat značku „$1“ z databáze.",
+       "tags-delete-explanation-in-use": "Bude odstraněna z {{PLURAL:$2|$2 revize nebo protokolovacího záznamu|$2 revizí nebo protokolovacích záznamů}}, kde je momentálně přiřazena.",
+       "tags-delete-explanation-warning": "Tato akce je <strong>nevratná</strong> a <strong>nelze ji vrátit</strong>, ani databázovými správci. Ujistěte se, že toto je značka, kterou chcete smazat.",
+       "tags-delete-explanation-active": "<strong>Značka „$1“ je stále aktivní a bude se i nadále přidávat.</strong> Abyste tomu zabránili, přejděte na místo či místa, kde se značka používá, a vypněte ji tam.",
+       "tags-delete-reason": "Důvod:",
+       "tags-delete-submit": "Nevratně smazat tuto značku",
+       "tags-delete-not-allowed": "Značky definované rozšířeními nelze smazat, leda by to příslušné rozšíření výslovně umožnilo.",
+       "tags-delete-not-found": "Značka „$1“ neexistuje.",
+       "tags-delete-too-many-uses": "Značkou „$1“ {{PLURAL:$2|je označena více než $2 revize|jsou označeny více než $2 revize|je označeno více než $2 revizí}}, což znamená, že ji nelze smazat.",
+       "tags-delete-warnings-after-delete": "Značka „$1“ byla úspěšně smazána, ale {{PLURAL:$1|bylo zjištěno|byla zjištěna}} následující varování:",
+       "tags-activate-title": "Aktivovat značku",
+       "tags-activate-question": "Chystáte se aktivovat značku „$1“.",
+       "tags-activate-reason": "Důvod:",
+       "tags-activate-not-allowed": "Značku „$1“ nelze aktivovat.",
+       "tags-activate-not-found": "Značka „$1“ neexistuje.",
+       "tags-activate-submit": "Aktivovat",
+       "tags-deactivate-title": "Deaktivovat značku",
+       "tags-deactivate-question": "Chystáte se deaktivovat značku „$1“.",
+       "tags-deactivate-reason": "Důvod:",
+       "tags-deactivate-not-allowed": "Značku „$1“ nelze deaktivovat.",
+       "tags-deactivate-submit": "Deaktivovat",
        "comparepages": "Porovnání stránek",
        "compare-page1": "Stránka 1",
        "compare-page2": "Stránka 2",
        "logentry-upload-upload": "$1 {{GENDER:$2|načetl|načetla}} $3",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|načetl|načetla}} novou verzi $3",
        "logentry-upload-revert": "$1 {{GENDER:$2|načetl|načetla}} $3",
+       "log-name-managetags": "Kniha správy značek",
+       "log-description-managetags": "Tato stránka obsahuje seznam správcovských úkonů týkajících se [[Special:Tags|značek]]. Protokol obsahuje pouze akce, které provedl ručně správce; značky může vytvářet či mazat přímo software wiki, aniž by v tomto protokolu vznikl záznam.",
+       "logentry-managetags-create": "$1 {{GENDER:$2|vytvořil|vytvořila}} značku „$4“",
+       "logentry-managetags-delete": "$1 {{GENDER:$2|smazal|smazala}} značku „$4“ (odstraněna z $5 {{PLURAL:$5|revize nebo protokolovacího záznamu|revizí nebo protokolovacích záznamů}})",
+       "logentry-managetags-activate": "$1 {{GENDER:$2|aktivoval|aktivovala}} značku „$4“ pro uživatele a boty",
+       "logentry-managetags-deactivate": "$1 {{GENDER:$2|deaktivoval|deaktivovala}} značku „$4“ pro uživatele a boty",
        "rightsnone": "(žádné)",
        "revdelete-summary": "shrnutí editace",
        "feedback-bugornote": "Pokud dokážete podrobně popsat technický problém, můžete [$1 nahlásit chybu].\nJinak můžete využít jednoduchý formulář níže. Váš komentář bude přidán na stránku „[$3 $2]“ spolu s vaším uživatelským jménem a informací o tom, jaký prohlížeč používáte.",
index 8604ac9..988f141 100644 (file)
        "history-feed-empty": "Den ønskede side findes ikke. Måske er den slettet eller flyttet. [[Special:Search|Gennemsøg]] {{SITENAME}} efter passende nye sider.",
        "rev-deleted-comment": "(redigeringsbeskrivelsen er fjernet)",
        "rev-deleted-user": "(brugernavn fjernet)",
-       "rev-deleted-event": "(loghandling fjernet)",
+       "rev-deleted-event": "(logdetaljer fjernet)",
        "rev-deleted-user-contribs": "[brugernavn eller IP-adresse er fjernet - redigeringer er skjult fra bidragene]",
        "rev-deleted-text-permission": "Denne version af siden er blevet '''slettet'''.\nDer er måske flere detaljer i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} sletteloggen].",
        "rev-deleted-text-unhide": "Denne version af siden er '''slettet'''.\nDer er måske flere detaljer i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} sletningsloggen].\nDu kan du stadig [$1 se versionen], hvis du ønsker at fortsætte.",
        "search-result-category-size": "{{PLURAL:$1|1 medlem|$1 medlemmer}} ({{PLURAL:$2|1 underkategori|$2 underkategorier}}, {{PLURAL:$3|1 fil|$3 filer}})",
        "search-redirect": "(omdirigering $1)",
        "search-section": "(afsnit $1)",
+       "search-category": "(kategorien $1)",
+       "search-file-match": "(svarer til filens indhold)",
        "search-suggest": "Mente du: $1",
        "search-interwiki-caption": "Søsterprojekter",
        "search-interwiki-default": "Resultater fra $1:",
        "uploaderror": "Fejl under oplægning af fil",
        "upload-recreate-warning": "'''Advarsel: En fil med det navn, er blevet slettet eller flyttet.'''\n\nSletnings- og flytnings-loggen for denne side leveres her for nemheds skyld:",
        "uploadtext": "Brug formularen herunder til at lægge filer op.\nGå til [[Special:FileList|listen over filer]] for at se eller søge i eksisterende filer. (Gen-)oplægnigner logges i [[Special:Log/upload|oplægningsloggen]], sletninger i [[Special:Log/delete|sletteloggen]].\n\nBrug en henvisning af en de følgende typer for at bruge en fil på en side:\n*'''<code><nowiki>[[</nowiki>{{ns:file}}:Filnavn.jpg<nowiki>]]</nowiki></code>''' for at bruge den fulde version af et bilede\n*'''<code><nowiki>[[</nowiki>{{ns:file}}:Filnavn.png|200px|thumb|left|Alternativ tekst<nowiki>]]</nowiki></code>''' for at bruge billedet med en bredde på 200&nbsp;pixel i en ramme til venstre med \"Alternativ tekst\" som beskrivelse\n*'''<code><nowiki>[[</nowiki>{{ns:media}}:Filnavn.ogg<nowiki>]]</nowiki></code>''' for at henvise direkte til filen uden at vise den",
-       "upload-permitted": "Tilladte filtyper: $1.",
-       "upload-preferred": "Foretrukne filtyper: $1.",
-       "upload-prohibited": "Uønskede filtyper: $1.",
+       "upload-permitted": "{{PLURAL:$2|Tilladt filtype:|Tilladte filtyper:}} $1.",
+       "upload-preferred": "{{PLURAL:$2|Foretrukken filtype:|Foretrukne filtyper:}} $1.",
+       "upload-prohibited": "{{PLURAL:$2|Uønsket filtype:|Uønskede filtyper:}} $1.",
        "uploadlogpage": "Oplægningslog",
        "uploadlogpagetext": "Herunder vises de senest oplagte filer. Alle de viste tider er serverens tid.",
        "filename": "Filnavn",
        "randomincategory-invalidcategory": "\"$1\" er ikke et gyldigt kategorinavn.",
        "randomincategory-nopages": "Der er ingen sider i [[:Category:$1]].",
        "randomincategory-category": "Kategori:",
+       "randomincategory-legend": "Tilfældig side i en given kategori",
        "randomredirect": "Tilfældige henvisninger",
        "randomredirect-nopages": "Der er ingen omdirigeringer i navnerummet $1.",
        "statistics": "Statistik",
        "listgrouprights-namespaceprotection-header": "Navnerumsbegrænsninger",
        "listgrouprights-namespaceprotection-namespace": "Navnerum",
        "listgrouprights-namespaceprotection-restrictedto": "Rettighed(er) der giver brugeren mulighed for at redigere",
+       "trackingcategories": "Sporingskategorier",
+       "trackingcategories-msg": "Sporingskategori",
        "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.",
        "tooltip-feed-atom": "Atom-feed for denne side",
        "tooltip-t-contributions": "Se denne brugers bidrag",
        "tooltip-t-emailuser": "Send en e-mail til denne bruger",
+       "tooltip-t-info": "Yderligere oplysninger om denne side",
        "tooltip-t-upload": "Upload et billede eller anden mediafil",
        "tooltip-t-specialpages": "Liste over alle specialsider",
        "tooltip-t-print": "Printervenlig udgave af denne side",
        "logentry-rights-rights": "$1 {{GENDER:$2|ændrede}} gruppemedlemskabet for $3 fra $4 til $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|ændrede}} gruppemedlemskabet for $3",
        "logentry-rights-autopromote": "$1 blev automatisk {{GENDER:$2|forfremmet}} fra $4 til $5",
+       "logentry-upload-upload": "$1 {{GENDER:$2|lagde}} $3 op",
+       "logentry-upload-overwrite": "$1 {{GENDER:$2|lagde}} en ny udgave af $3 op",
+       "logentry-upload-revert": "$1 {{GENDER:$2|lagde}} $3 op",
        "rightsnone": "(-)",
        "revdelete-summary": "redigeringsbeskrivelse",
        "feedback-bugornote": "Hvis du er klar til at beskrive et teknisk problem i detaljer, bedes du [$1 rapportere en fejl].\nEllers kan du bruge den enkle formular nedenfor. Din kommentar vil blive tilføjet siden \"[$3 $2]\" sammen med dit brugernavn og den browser, du anvender.",
        "pagelang-language": "Sprog",
        "pagelang-use-default": "Brug standardsprog",
        "pagelang-select-lang": "Vælg sprog",
-       "right-pagelang": "Ændre sidesproget"
+       "right-pagelang": "Ændre sidesproget",
+       "mediastatistics": "Mediestatistik",
+       "mediastatistics-table-count": "Antal filer",
+       "mediastatistics-table-totalbytes": "Samlet størrelse",
+       "mediastatistics-header-unknown": "Ukendt",
+       "mediastatistics-header-audio": "Lyd",
+       "mediastatistics-header-video": "Videoer",
+       "mediastatistics-header-text": "Tekstformat",
+       "mediastatistics-header-executable": "Kørbare filer",
+       "mediastatistics-header-archive": "Komprimerede formater",
+       "json-error-syntax": "Syntaksfejl"
 }
index b528f1e..9bff753 100644 (file)
        "prefs-personal": "Benutzerdaten",
        "prefs-rc": "Letzte Änderungen",
        "prefs-watchlist": "Beobachtungsliste",
+       "prefs-editwatchlist": "Beobachtungsliste bearbeiten",
+       "prefs-editwatchlist-label": "Einträge auf deiner Beobachtungsliste bearbeiten:",
+       "prefs-editwatchlist-edit": "Titel auf deiner Beobachtungsliste ansehen und entfernen",
+       "prefs-editwatchlist-raw": "Rohe Beobachtungsliste bearbeiten",
+       "prefs-editwatchlist-clear": "Deine Beobachtungsliste leeren",
        "prefs-watchlist-days": "Maximale Anzahl der einbezogenen Tage:",
        "prefs-watchlist-days-max": "Maximal {{PLURAL:$1|ein Tag|$1 Tage}}",
        "prefs-watchlist-edits": "Maximale Anzahl der angezeigten Einträge:",
        "right-override-export-depth": "Exportiere Seiten einschließlich verlinkter Seiten bis zu einer Tiefe von 5",
        "right-sendemail": "E-Mails an andere Benutzer senden",
        "right-passwordreset": "Passwort eines Benutzers zurücksetzen und die dazu verschickte E-Mail einsehen",
+       "right-managechangetags": "[[Special:Tags|Markierungen]] erstellen und aus der Datenbank löschen",
        "newuserlogpage": "Neuanmeldungs-Logbuch",
        "newuserlogpagetext": "Dies ist ein Logbuch der neu erstellten Benutzerkonten.",
        "rightslog": "Rechte-Logbuch",
        "action-viewmyprivateinfo": "deine privaten Informationen einzusehen",
        "action-editmyprivateinfo": "deine privaten Informationen zu bearbeiten",
        "action-editcontentmodel": "das Inhaltsmodell einer Seite zu bearbeiten",
+       "action-managechangetags": "Markierungen zu erstellen und aus der Datenbank zu löschen",
        "nchanges": "$1 {{PLURAL:$1|Änderung|Änderungen}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|seit dem letzten Besuch}}",
        "enhancedrc-history": "Versionsgeschichte",
        "version-license": "MediaWiki-Lizenz",
        "version-ext-license": "Lizenz",
        "version-ext-colheader-name": "Bezeichnung",
-       "version-skin-colheader-name": "Benutzeroberfläche",
+       "version-skin-colheader-name": "Bezeichnung",
        "version-ext-colheader-version": "Version",
        "version-ext-colheader-license": "Lizenz",
        "version-ext-colheader-description": "Beschreibung",
        "tags-tag": "Markierungsname",
        "tags-display-header": "Benennung auf den Änderungslisten",
        "tags-description-header": "Vollständige Beschreibung",
+       "tags-source-header": "Quelle",
        "tags-active-header": "Aktiv?",
        "tags-hitcount-header": "Markierte Änderungen",
+       "tags-actions-header": "Aktionen",
        "tags-active-yes": "Ja",
        "tags-active-no": "Nein",
+       "tags-source-extension": "Definiert von einer Erweiterung",
+       "tags-source-manual": "Manuell von Benutzern und Bots eingesetzt",
+       "tags-source-none": "Nicht mehr in Verwendung",
        "tags-edit": "bearbeiten",
+       "tags-delete": "löschen",
+       "tags-activate": "aktivieren",
+       "tags-deactivate": "deaktivieren",
        "tags-hitcount": "$1 {{PLURAL:$1|Änderung|Änderungen}}",
+       "tags-manage-no-permission": "Du hast keine Berechtigung, Änderungsmarkierungen zu verwalten.",
+       "tags-create-heading": "Eine neue Markierung erstellen",
+       "tags-create-explanation": "Standardmäßig werden neu erstellte Markierungen für die Verwendung durch Benutzer und Bots verfügbar gemacht.",
+       "tags-create-tag-name": "Name der Markierung:",
+       "tags-create-reason": "Grund:",
+       "tags-create-submit": "Erstellen",
+       "tags-create-no-name": "Du musst einen Markierungsnamen angeben.",
+       "tags-create-invalid-chars": "Markierungsnamen dürfen keine Kommas (<code>,</code>) oder Schrägstriche (<code>/</code>) enthalten.",
+       "tags-create-invalid-title-chars": "Markierungsnamen dürfen keine Zeichen enthalten, die nicht in Seitennamen verwendet werden können.",
+       "tags-create-already-exists": "Die Markierung „$1“ ist bereits vorhanden.",
+       "tags-create-warnings-above": "Die {{PLURAL:$2|folgende Warnung ist|folgenden Warnungen sind}} beim Versuch, die Markierung „$1“ zu erstellen, aufgetreten:",
+       "tags-create-warnings-below": "Möchtest du mit dem Erstellen der Markierung fortfahren?",
+       "tags-delete-title": "Markierung löschen",
+       "tags-delete-explanation-initial": "Du bist dabei, die Markierung „$1“ aus der Datenbank zu löschen.",
+       "tags-delete-explanation-in-use": "Sie wird von {{PLURAL:$2|einer Version oder einem Logbucheintrag|allen $2 Versionen und/oder Logbucheinträgen}} entfernt, bei {{PLURAL:$2|der/m|denen}} sie derzeit eingesetzt wird.",
+       "tags-delete-explanation-warning": "Diese Aktion ist <strong>unwiderruflich</strong> und <strong>kann nicht rückgängig gemacht werden</strong>, auch nicht von Datenbankadministratoren. Sei dir sicher, dass dies die Markierung ist, die du löschen möchtest.",
+       "tags-delete-explanation-active": "<strong>Die Markierung „$1“ ist noch aktiv und wird auch in Zukunft eingesetzt werden.</strong> Um dies zu beenden, gehe zu den Orten, wo die Anwendung der Markierung festgelegt wird und deaktiviere sie dort.",
+       "tags-delete-reason": "Grund:",
+       "tags-delete-submit": "Diese Markierung unwiderruflich löschen",
+       "tags-delete-not-allowed": "Markierungen, die von einer Erweiterung definiert werden, können nicht gelöscht werden, außer die Erweiterung erlaubt es ausdrücklich.",
+       "tags-delete-not-found": "Die Markierung „$1“ ist nicht vorhanden.",
+       "tags-delete-too-many-uses": "Die Markierung „$1“ wird bei mehr als {{PLURAL:$2|einer Version|$2 Versionen}} verwendet und kann deshalb nicht gelöscht werden.",
+       "tags-delete-warnings-after-delete": "Die Markierung „$1“ wurde erfolgreich gelöscht, aber die {{PLURAL:$2|folgende Warnung ist|folgenden Warnungen sind}} aufgetreten:",
+       "tags-activate-title": "Markierung aktivieren",
+       "tags-activate-question": "Du bist dabei, die Markierung „$1“ zu aktivieren.",
+       "tags-activate-reason": "Grund:",
+       "tags-activate-not-allowed": "Es ist nicht möglich, die Markierung „$1“ zu aktivieren.",
+       "tags-activate-not-found": "Die Markierung „$1“ ist nicht vorhanden.",
+       "tags-activate-submit": "Aktivieren",
+       "tags-deactivate-title": "Markierung deaktivieren",
+       "tags-deactivate-question": "Du bist dabei, die Markierung „$1“ zu deaktivieren.",
+       "tags-deactivate-reason": "Grund:",
+       "tags-deactivate-not-allowed": "Es ist nicht möglich, die Markierung „$1“ zu deaktivieren.",
+       "tags-deactivate-submit": "Deaktivieren",
        "comparepages": "Seiten vergleichen",
        "compare-page1": "Seite 1",
        "compare-page2": "Seite 2",
        "logentry-upload-upload": "$1 {{GENDER:$2|lud}} $3 hoch",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|lud}} eine neue Version von $3 hoch",
        "logentry-upload-revert": "$1 {{GENDER:$2|lud}} $3 hoch",
+       "log-name-managetags": "Markierungsverwaltungs-Logbuch",
+       "log-description-managetags": "Diese Seite listet Verwaltungsaufgaben bezüglich der [[Special:Tags|Markierungen]] auf. Das Logbuch enthält nur Aktionen, die manuell von einem Administrator ausgeführt wurden; Markierungen können auch von der Wikisoftware erstellt oder gelöscht werden, ohne dass ein aufgezeichneter Eintrag in diesem Logbuch vorliegt.",
+       "logentry-managetags-create": "$1 {{GENDER:$2|erstellte}} die Markierung „$4“",
+       "logentry-managetags-delete": "$1 {{GENDER:$2|löschte}} die Markierung „$4“ (entfernt von {{PLURAL:$5|einer Version oder einem Logbucheintrag|$5 Versionen und/oder Logbucheinträgen}})",
+       "logentry-managetags-activate": "$1 {{GENDER:$2|aktivierte}} die Markierung „$4“ zur Verwendung durch Benutzer und Bots",
+       "logentry-managetags-deactivate": "$1 {{GENDER:$2|deaktivierte}} die Markierung „$4“ zur Verwendung durch Benutzer und Bots",
        "rightsnone": "(–)",
        "revdelete-summary": "Zusammenfassungskommentar",
        "feedback-bugornote": "Sofern du detailliert ein technisches Problem beschreiben möchtest, melde bitte [$1 einen Fehler].\nAnderenfalls kannst du auch das untenstehende einfache Formular nutzen. Dein Kommentar wird, zusammen mit deinem Benutzernamen und der Version des von dir verwendeten Webbrowsers sowie Betriebssystems, auf der Seite „[$3 $2]“ hinzugefügt.",
index 437afed..81eeead 100644 (file)
        "sort-ascending": "Rêzkerdışo zêdiyaye",
        "nstab-main": "Wesiqe",
        "nstab-user": "Pela karberi",
-       "nstab-media": "Pera Medya",
+       "nstab-media": "Pela medya",
        "nstab-special": "Pela xase",
        "nstab-project": "Pela procey",
        "nstab-image": "Dosya",
        "badtitletext": "Sernamey pela ke şıma waşt, nêvêrd, thalo/vengo ya ki zıwano miyanêno ğelet gırêdae ya ki sernamey wiki.\nBeno ke, tede yew ya zi zêdê işareti estê ke sernaman de nêxebetiyenê.",
        "perfcached": "Datay cı ver hazır biye. No semedê ra nıkayin niyo! tewr zaf {{PLURAL:$1|netice|$1 netice}} debêno de",
        "perfcachedts": "Cêr de malumatê nımıteyi esti, demdê newe kerdışo peyın: $1. Tewr zaf {{PLURAL:$4|netice|$4 neticey cı}} debyayo de",
-       "querypage-no-updates": "Nıka newe kerdış nêbeno. no datayi ca de newe nêbeni .",
+       "querypage-no-updates": "Rocanebiyayışê na pele nıka cadayiyê.\nDayiyi tiya nıka newe nêbenê.",
        "viewsource": "Çımey bıvêne",
        "viewsource-title": "Cı geyrayışê $1'i bıvin",
        "actionthrottled": "Kerden peysnaya",
        "filehist-nothumb": "Thumbnail çin o.",
        "filehist-user": "Karber",
        "filehist-dimensions": "Ebati",
-       "filehist-filesize": "Ebata dosya",
+       "filehist-filesize": "Eba dosya",
        "filehist-comment": "Mışewre",
        "imagelinks": "Gurenayışê dosya",
        "linkstoimage": "Ena {{PLURAL:$1|pela|$1 pela}} gıreye ena dosya:",
        "statistics": "İstatistiki",
        "statistics-header-pages": "İstatistikê pele",
        "statistics-header-edits": "Îstatistikê vurnayîşî",
-       "statistics-header-users": "Îstatistiksê karberî",
+       "statistics-header-users": "İstatistikê karberi",
        "statistics-header-hooks": "Îstatistiksê binî",
        "statistics-articles": "Pelanê tedesteyî",
        "statistics-pages": "Peli",
        "wantedtemplates": "Şablonê ke waziyenê",
        "mostlinked": "Pelî ke tewr zafî lînk bîy.",
        "mostlinkedcategories": "Kategoriyê ke tewr zehf meqaley tede estê",
-       "mostlinkedtemplates": "Şablonê ke tewr zafî pela re gıre bîye.",
+       "mostlinkedtemplates": "Pelê ke zêdêr gureniyenê",
        "mostcategories": "Pelan ke tewr zaf kategorî estê.",
        "mostimages": "Dosyayan ke tewr zaf link estê.",
        "mostinterwikis": "Pelan ke tewr zaf interwiki biyê.",
        "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:",
        "tooltip-t-permalink": "Gırêyo daimi be ena versiyonê pele",
        "tooltip-ca-nstab-main": "Perra muhtevay bıvin",
        "tooltip-ca-nstab-user": "Pela karberi bıvêne",
-       "tooltip-ca-nstab-media": "Pera medya bıvin",
+       "tooltip-ca-nstab-media": "Pela medya bıvêne",
        "tooltip-ca-nstab-special": "Na yew pela xasa, şıma nêşenê sero vurnayış bıkerê",
        "tooltip-ca-nstab-project": "Pela procey bıvêne",
        "tooltip-ca-nstab-image": "Pera dosyayer bıvin",
        "exif-bitspersample": "yew parçe de biti",
        "exif-compression": "Planê kompresyoni",
        "exif-photometricinterpretation": "Compozisyonê pixeli",
-       "exif-orientation": "Oriyentasyon",
+       "exif-orientation": "Berhetkerdış",
        "exif-samplesperpixel": "teneyê parçeyi",
        "exif-planarconfiguration": "Rezeyê datayi",
        "exif-ycbcrsubsampling": "Subsampleyi ebatê Y heta C",
        "exif-locationdest": "Tarifê cay",
        "exif-locationdestcode": "Lokasyon kodi vaciya",
        "exif-objectcycle": "Qandê medyay deme u roce cı",
-       "exif-contact": "Zanışiya irtibati",
+       "exif-contact": "Melumatê irtıbati",
        "exif-writer": "Nuştekar",
        "exif-languagecode": "Zıwan",
        "exif-iimversion": "Verqaydê IIM",
        "exif-ycbcrpositioning-1": "Wertekerdış",
        "exif-ycbcrpositioning-2": "Wayırê-site",
        "exif-dc-contributor": "İştıraqkeri",
-       "exif-dc-coverage": "Heruna yana wextin grotışa medya",
+       "exif-dc-coverage": "Hal ya zi demê xozerrenayışê medya",
        "exif-dc-date": "Tarix(i)",
        "exif-dc-publisher": "Hesrekar",
        "exif-dc-relation": "Medyay cı",
        "exif-dc-rights": "Heqi",
-       "exif-dc-source": "Medyaya çımey",
+       "exif-dc-source": "Medyaya çımeyi",
        "exif-dc-type": "Babeta medyay",
        "exif-rating-rejected": "Red ke",
        "exif-isospeedratings-overflow": "65535 ra gırdo",
        "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",
+       "specialpages-group-maintenance": "Raporê pawıtışi",
        "specialpages-group-other": "Pelê xasiyê bini",
        "specialpages-group-login": "Cı kewe / hesab vıraze",
        "specialpages-group-changes": "Vurnayişê peni u logan",
-       "specialpages-group-media": "Raporê medya u bar kerdîşî",
+       "specialpages-group-media": "Raporê medya û barkerdışi",
        "specialpages-group-users": "Karber u heqqî",
        "specialpages-group-highuse": "Peleyê ke vêşi karênê",
        "specialpages-group-pages": "Listeyê pelan",
        "api-error-file-too-large": "Dosyaye ke şıma rışta zaf gırda.",
        "api-error-filename-tooshort": "Namayê dosyayi zaf kilm a.",
        "api-error-filetype-banned": "Tipê ena dosya qedexe biya.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|Dosya qebul ne vinena|dosya qebul ne vinena|Ena babeta dosya qebul ne vinena}}. Eke cırê izin deyayo se {{PLURAL:$3|Babatan dosyayan|babeta dosyayan}} de $2 bıvin.",
+       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|babetê dosyayo destûrın niyo|babetên dosyeyanê destûrınan niyê}}. {{PLURAL:$3|Babetê dosyayo destûrın|Babetên dosyeyanê destûrınan}}   $2.",
        "api-error-filetype-missing": "Derganiya dosya kemiya",
        "api-error-hookaborted": "Vurnayişê tu ke to cerbna pê yew çengal ra terkneya.",
        "api-error-http": "Xırabiya zerreki:Wasteriya irtabet bırya.",
index 72636c4..d67a809 100644 (file)
        "prefs-personal": "Prufîl utèint",
        "prefs-rc": "Ûltmi mudéfichi",
        "prefs-watchlist": "Tgnîr sòt ôc",
+       "prefs-editwatchlist": "Mudéfica la lésta 'd qui da tgnîr sòt ôc",
+       "prefs-editwatchlist-raw": "Mudéfica la lésta in furmê tèst",
        "prefs-watchlist-days": "Nómer ed dé da fêr vèder int i tgnû 'd ôc specêl:",
        "prefs-watchlist-days-max": "Mâsim $1 {{PLURAL:$1|dé}}",
        "prefs-watchlist-edits": "Nómer 'd mudéfichi da fêr vèder cun al funsiòun pió şvilupêdi:",
        "recentchanges-label-minor": "Còsta l'é 'na mudéfica céca",
        "recentchanges-label-bot": "Cla mudéfica ché l'é stêda fâta da un bot.",
        "recentchanges-label-unpatrolled": "Cla mudéfica ché an n'é mìa incòra stêda verifichêda.",
+       "recentchanges-label-plusminus": "Cambiamèint ed la pàgina in nómer ed byte",
+       "recentchanges-legend-heading": "'''Spiegasiòun:'''",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (guêrda [[Special:NewPages|al pàgini nōvi]])",
        "rcnotefrom": "Ché sòt a {{PLURAL:$5|gh'é la mudéfica fâta|gh'în al mudéfichi fâti}} a partîr da<strong>$3,$4</strong>(fîn a <strong>$1</strong>).",
        "rclistfrom": "Fà vèder al mudéfichi fâti a partîr da $3 $2",
        "rcshowhideminor": "$1 al mudéfichi céchi",
+       "rcshowhideminor-show": "Fà vèder",
+       "rcshowhideminor-hide": "Lōga",
        "rcshowhidebots": "$1 i bot",
+       "rcshowhidebots-show": "Fà vèder",
+       "rcshowhidebots-hide": "Lōga",
        "rcshowhideliu": "$1 j utèint registrê",
+       "rcshowhideliu-show": "Fà vèder",
+       "rcshowhideliu-hide": "Lōga",
        "rcshowhideanons": "$1 j utèint sèinsa nòm.",
+       "rcshowhideanons-show": "Fà vèder",
+       "rcshowhideanons-hide": "Lōga",
        "rcshowhidepatr": "$1 al mudéfichi verifichêdi",
+       "rcshowhidepatr-show": "Fà vèder",
+       "rcshowhidepatr-hide": "Lōga",
        "rcshowhidemine": "$1 al mē mudéfichi",
+       "rcshowhidemine-show": "Fà vèder",
+       "rcshowhidemine-hide": "Lōga",
        "rclinks": "Fà vèder al $1 ûltmi mudéfichi fâti int j ûltem $2 dé<br />$3",
        "diff": "dif",
        "hist": "stòria",
        "newpageletter": "N",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[vésta da {{PLURAL:$1|un utèint|$1 utèint}}]",
+       "rc_categories": "Lémita al categoréi (divîşi da \"|\")",
        "rc_categories_any": "Bast' ech sia",
+       "rc-change-size-new": "$1 {{PLURAL:$1|byte|byte}} dôp la mudéfica",
+       "newsectionsummary": "/* $1 */ sesiòn nōva",
        "rc-enhanced-expand": "Fà vèder i particulêr.",
        "rc-enhanced-hide": "Lōga i particulêr.",
+       "rc-old-title": "in urégin fâta cme \"$1\"",
        "recentchangeslinked": "Mudéfichi coleghêdi",
+       "recentchangeslinked-feed": "Mudéfichi coleghêdi",
        "recentchangeslinked-toolbox": "Mudéfichi coleghêdi",
        "recentchangeslinked-title": "Mudéfichi coleghêdi a $1.",
        "recentchangeslinked-summary": "Cla pàgina specêla ché la fà vèder al j ûltmi mudéfichi al pàgini coleghêdi da còla sgnêda (o dèinter int la categoréia sgnêda). Al pàgini dèint a la tó lésta 'd j [[Special:Watchlist|tgnû sòt ôc specêl]] în sgnêdi in '''grasèt'''.",
        "recentchangeslinked-page": "Nòm ' d la pàgina.",
        "recentchangeslinked-to": "Fà vèder sōl al mudéfichi fâti al pàgini coleghêdi a còla sgnêda.",
        "upload": "Cârga un file",
+       "uploadbtn": "Cârga un file",
+       "reuploaddesc": "Tōrna al modèl p'r al cargamèint.",
+       "upload-tryagain": "Spidés la spiegasiòun dal file mudifichê",
+       "uploadnologin": "An t'é mìa gnû dèinter",
+       "uploadnologintext": "Per carghêr al file è necesâri $1.",
+       "upload_directory_missing": "La cartèla 'd cargamèint dal j infurmasiòun ($1) l'an gh'é mìa e l'an pōl mìa èser fâta dal prugrâma dal sît.",
+       "upload_directory_read_only": "Al prugrâma dal sît an n'é bòun de scréver int la cartèla 'd cargamèint dal j infurmasiòun ($1).",
+       "uploaderror": "Erōr int al cargamèint",
+       "upload-recreate-warning": "<strong>Atèint: un file cun cól nòm ché l'é stê scanşlê o spustê. </strong> L' elèinch dal scanşladûri e di spustamèint ed cla pàgina ché al vîn scrét ché sòta per cumditê:",
+       "uploadtext": "Druvêr al mudèl ché sòta per scarghêr di file nōv. Per guardêr o serchêr i file bèle scarghê, consultêr la [[Special:FileList| lésta di file scarghê]]. Al câregh di file e dal versiòun nōvi di file în registrê int la [[Special:Log/upload|lésta di file salvê]], al scanşladûri in còl [[Special:Log/delete|apôsta]].\n\nPer mèter un file dèinter 'na pàgina, fêr un colegamèint ed cól gèner ché:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' per druvêr la versiòun intēra dal file\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|tèst divêrs]]</nowiki></code>''' per druvêr 'na versiòun lêrga 200pixel dèinter int 'na scâtla, in rîga a mansèina e cun 'tèst divêrs' cme tétol\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' per fêr un colegamèint dirèt al file sèinsa vèdrel",
+       "upload-permitted": "{{PLURAL:$2|Gèner ed file permés}}: $1.",
+       "upload-preferred": "{{PLURAL:$2| Gèner ed file cunsiliê}}: $1.",
+       "upload-prohibited": "{{PLURAL:$2|Gèner ed file mìa permés}}: $1.",
        "uploadlogpage": "Fil carghê",
+       "uploadlogpagetext": "Ed sègvit a gh'é lelèinch ed j ûltem file carghê. Consultêr la [[Special:NewFiles|galeréia di file nōv]] per vèdri tót.",
+       "filename": "Nòm dal file",
        "filedesc": "Particulêr.",
+       "fileuploadsummary": "Sûnt:",
+       "filereuploadsummary": "Cambiamèint al file:",
+       "filestatus": "Infurmasiòun inséma 'l dirét 'd avtōr:",
+       "filesource": "Surzéia",
+       "ignorewarning": "Trascûra l'avîş e a tóti 'l manēri sêlva al file",
+       "ignorewarnings": "An badêr mìa a i mesâg dal sistēma",
+       "minlength1": "Al nòm dal file al dēv èser fât d' almēno 'na lètra.",
+       "illegalfilename": "Al nòm \"$1\" al gh'à dèinter di carâter mìa permés int i tétol dal pàgini. \nDêr al file un nòm divêrs e pruvêr a carghêrel ed nōv.",
+       "filename-toolong": "I nòm di file an pōlen mìa andêr d'ed sōver î 240 byte.",
+       "badfilename": "Al nòm dal file l'é stê cunvertî in \"$1\".",
+       "filetype-mime-mismatch": "La zûnta dal file \".$1\" an n'é m'a cumpâgna 'l gèner MIME vésta dal file ($2).",
+       "filetype-badmime": "An n'é mìa permés carghê file 'd gèner MIME \"$1\".",
+       "filetype-bad-ie-mime": "Impusébil carghêr al file perché Internet Explorer  l'al vedré cme \"$1\", ch'lé un gèner ed file mìa permés e al pré èser ânca periculōş.",
+       "filetype-unwanted-type": "Carghêr un file dal gèner '''''.$1''''' l'é scunsiliê. {{PLURAL:$3|Al gèner ed file cunsiliê l'é|I gèner di file cunsiliê în }} $2.",
+       "filetype-banned-type": "'''\".$1\"''' {{PLURAL:$4|an n'é mìa un gèner ed file permés| în mìa gèner ed file permés}}.\n{{PLURAL:$3|Al gèner ed file permés l'é|I gèner ed file permés în}} $2.",
+       "filetype-missing": "Al file l'é sèinsa la zûnta (per es. \".jpg\").",
+       "empty-file": "Al file che t'é spidî l'é vōd.",
+       "file-too-large": "Al file che t'é spidî l'é trôp grôs.",
+       "filename-tooshort": "Al nòm dal file l'é trôp cûrt.",
+       "filetype-banned": "Cól gèner ed file ché an n'é mìa permés.",
+       "verification-error": "Cól file ché an n'à mìa pasê la veréfica.",
+       "hookaborted": "La mudéfica che s'é pruvê ed fêr l'é stêda fermêda da un gânc ed 'na zûnta a la fîn dal nòm dal file .",
+       "illegal-filename": "Al nòm dal file an n'é mia acetê.",
+       "overwrite": "Scréver inséma 'n file che al gh'é bèle an n'é mìa permés.",
+       "unknown-error": "É sucès un erōr mìa cgnusû.",
+       "tmp-create-error": "L'é impusébil fêr un file pruvişôri.",
+       "tmp-write-error": "Erōr de scritûra dal file pruvişôri.",
+       "large-file": "A 's arcmânda d' andêr d'ed sōver la larghèsa ed $1 per ógni file; còst l'é grôs $2.",
+       "largefileserver": "Al file al và fōra dal j amzûri permési da l'impustasiòun dal prugrâma.",
        "license": "Licèinsa:",
        "license-header": "Licèinsa",
        "nolicense": "Nisóna licèinsa sgnêda",
index 56a2ee4..7bc5a9d 100644 (file)
        "prefs-personal": "User profile",
        "prefs-rc": "Recent changes",
        "prefs-watchlist": "Watchlist",
+       "prefs-editwatchlist": "Edit watchlist",
+       "prefs-editwatchlist-label": "Edit entries on your watchlist:",
+       "prefs-editwatchlist-edit": "View and remove titles on your watchlist",
+       "prefs-editwatchlist-raw": "Edit raw watchlist",
+       "prefs-editwatchlist-clear": "Clear your watchlist",
        "prefs-watchlist-days": "Days to show in watchlist:",
        "prefs-watchlist-days-max": "Maximum $1 {{PLURAL:$1|day|days}}",
        "prefs-watchlist-edits": "Maximum number of changes to show in expanded watchlist:",
        "right-override-export-depth": "Export pages including linked pages up to a depth of 5",
        "right-sendemail": "Send email to other users",
        "right-passwordreset": "View password reset emails",
+       "right-managechangetags": "Create and delete [[Special:Tags|tags]] from the database",
        "newuserlogpage": "User creation log",
        "newuserlogpagetext": "This is a log of user creations.",
        "rightslog": "User rights log",
        "action-viewmyprivateinfo": "view your private information",
        "action-editmyprivateinfo": "edit your private information",
        "action-editcontentmodel": "edit the content model of a page",
+       "action-managechangetags": "create and delete tags from the database",
        "nchanges": "$1 {{PLURAL:$1|change|changes}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|since last visit}}",
        "enhancedrc-history": "history",
        "tags-tag": "Tag name",
        "tags-display-header": "Appearance on change lists",
        "tags-description-header": "Full description of meaning",
+       "tags-source-header": "Source",
        "tags-active-header": "Active?",
        "tags-hitcount-header": "Tagged changes",
+       "tags-actions-header": "Actions",
        "tags-active-yes": "Yes",
        "tags-active-no": "No",
+       "tags-source-extension": "Defined by an extension",
+       "tags-source-manual": "Applied manually by users and bots",
+       "tags-source-none": "No longer in use",
        "tags-edit": "edit",
+       "tags-delete": "delete",
+       "tags-activate": "activate",
+       "tags-deactivate": "deactivate",
        "tags-hitcount": "$1 {{PLURAL:$1|change|changes}}",
+       "tags-manage-no-permission": "You do not have permission to manage change tags.",
+       "tags-create-heading": "Create a new tag",
+       "tags-create-explanation": "By default, newly created tags will be made available for use by users and bots.",
+       "tags-create-tag-name": "Tag name:",
+       "tags-create-reason": "Reason:",
+       "tags-create-submit": "Create",
+       "tags-create-no-name": "You must specify a tag name.",
+       "tags-create-invalid-chars": "Tag names must not contain commas (<code>,</code>) or forward slashes (<code>/</code>).",
+       "tags-create-invalid-title-chars": "Tag names must not contain characters that cannot be used in page titles.",
+       "tags-create-already-exists": "The tag \"$1\" already exists.",
+       "tags-create-warnings-above": "The following {{PLURAL:$2|warning was|warnings were}} encountered when attempting to create the tag \"$1\":",
+       "tags-create-warnings-below": "Do you wish to continue creating the tag?",
+       "tags-delete-title": "Delete tag",
+       "tags-delete-explanation-initial": "You are about to delete the tag \"$1\" from the database.",
+       "tags-delete-explanation-in-use": "It will be removed from {{PLURAL:$2|$2 revision or log entry|all $2 revisions and/or log entries}} to which it is currently applied.",
+       "tags-delete-explanation-warning": "This action is <strong>irreversible</strong> and <strong>cannot be undone</strong>, not even by database administrators. Be certain this is the tag you mean to delete.",
+       "tags-delete-explanation-active": "<strong>The tag \"$1\" is still active, and will continue to be applied in the future.</strong> To stop this from happening, go to the place(s) where the tag is set to be applied, and disable it there.",
+       "tags-delete-reason": "Reason:",
+       "tags-delete-submit": "Irreversibly delete this tag",
+       "tags-delete-not-allowed": "Tags defined by an extension cannot be deleted unless the extension specifically allows it.",
+       "tags-delete-not-found": "The tag \"$1\" does not exist.",
+       "tags-delete-too-many-uses": "The tag \"$1\" is applied to more than $2 {{PLURAL:$2|revision|revisions}}, which means it cannot be deleted.",
+       "tags-delete-warnings-after-delete": "The tag \"$1\" was deleted successfully, but the following {{PLURAL:$2|warning was|warnings were}} encountered:",
+       "tags-activate-title": "Activate tag",
+       "tags-activate-question": "You are about to activate the tag \"$1\".",
+       "tags-activate-reason": "Reason:",
+       "tags-activate-not-allowed": "It is not possible to activate the tag \"$1\".",
+       "tags-activate-not-found": "The tag \"$1\" does not exist.",
+       "tags-activate-submit": "Activate",
+       "tags-deactivate-title": "Deactivate tag",
+       "tags-deactivate-question": "You are about to deactivate the tag \"$1\".",
+       "tags-deactivate-reason": "Reason:",
+       "tags-deactivate-not-allowed": "It is not possible to deactivate the tag \"$1\".",
+       "tags-deactivate-submit": "Deactivate",
        "comparepages": "Compare pages",
        "comparepages-summary": "",
        "compare-page1": "Page 1",
        "logentry-upload-upload": "$1 {{GENDER:$2|uploaded}} $3",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|uploaded}} a new version of $3",
        "logentry-upload-revert": "$1 {{GENDER:$2|uploaded}} $3",
+       "log-name-managetags": "Tag management log",
+       "log-description-managetags": "This page lists management tasks related to [[Special:Tags|tags]]. The log contains only actions carried out manually by an administrator; tags may be created or deleted by the wiki software without an entry being recorded in this log.",
+       "logentry-managetags-create": "$1 {{GENDER:$2|created}} the tag \"$4\"",
+       "logentry-managetags-delete": "$1 {{GENDER:$2|deleted}} the tag \"$4\" (removed from $5 {{PLURAL:$5|revision or log entry|revisions and/or log entries}})",
+       "logentry-managetags-activate": "$1 {{GENDER:$2|activated}} the tag \"$4\" for use by users and bots",
+       "logentry-managetags-deactivate": "$1 {{GENDER:$2|deactivated}} the tag \"$4\" for use by users and bots",
        "rightsnone": "(none)",
        "revdelete-logentry": "changed revision visibility of \"[[$1]]\"",
        "logdelete-logentry": "changed event visibility of \"[[$1]]\"",
        "json-error-utf8": "Malformed UTF-8 characters, possibly incorrectly encoded",
        "json-error-recursion": "One or more recursive references in the value to be encoded",
        "json-error-inf-or-nan": "One or more NAN or INF values in the value to be encoded",
-       "json-error-unsupported-type": "A value of a type that cannot be encoded was given"
+       "json-error-unsupported-type": "A value of a type that cannot be encoded was given",
+       "headline-anchor-title": "Link to this section",
+       "section-symbol": "§"
 }
index be3ad8e..4703218 100644 (file)
@@ -66,7 +66,7 @@
        "tog-shownumberswatching": "Montri la nombron da priatentaj uzantoj",
        "tog-oldsig": "Ekzistanta subskribo:",
        "tog-fancysig": "Trakti subskribon kiel vikitekston (sen aŭtomata ligo)",
-       "tog-uselivepreview": "Uzi tujan antaŭrigardon (per ĜavaSkripto) (Eksperimenta)",
+       "tog-uselivepreview": "Uzadi tujan antaŭrigardon",
        "tog-forceeditsummary": "Averti min kiam mi konservas malplenan redaktoresumon",
        "tog-watchlisthideown": "Kaŝi miajn redaktojn de la atentaro",
        "tog-watchlisthidebots": "Kaŝi robotajn redaktojn de la atentaro",
        "pool-queuefull": "Atendovico de servilaro estas plena.",
        "pool-errorunknown": "Nekonata eraro",
        "pool-servererror": "La servo manaĝanta aliron al serviloj ne estas disponebla ($1).",
+       "poolcounter-usage-error": "Uzeraro: $1",
        "aboutsite": "Pri {{SITENAME}}",
        "aboutpage": "Project:Enkonduko",
        "copyright": "La enhavo estas disponebla laŭ $1, se ne estas alia indiko.",
        "anoneditwarning": "<strong>Averto:</strong> Vi ne estas ensalutinta.\nVia IP-adreso enregistriĝos en la redakta historio de tiu ĉi paĝo. Se vi <strong>[$1 ensalutas]</strong> aŭ <strong>[$2 kreas konton]</strong>, viaj redaktoj estos atribuitaj al via salutnomo, kune kun aliaj bonaĵoj.",
        "anonpreviewwarning": "''Vi ne estas ensalutita. La konservo de la paĝo registros vian IP-adreson en redakta historio de ĉi tiu paĝo.''",
        "missingsummary": "'''Rememorigilo:''' Vi ne provizis redaktan resumon. Se vi alklakos denove la konservan butonon, via redaktaĵo estos konservita sen resumo.",
+       "selfredirect": "<strong>Atentigo:</strong> Ve alidirektas tiun ĉi paĝon al ĝi mem. Vi eble volas difini alian celan paĝon aŭ vi volas redakti alian paĝon.\nSe vi denove klakos al \"{{int:savearticle}}\", la alidirektilo estos ĉiuokaze kreita.",
        "missingcommenttext": "Bonvolu entajpi komenton malsupre.",
        "missingcommentheader": "'''Atenton:''' Vi ne provizis temon aŭ subtitolon por ĉi tiu komento.\nSe vi klakos \"Konservi\" denove, via redakto estos konservita sen ĝi.",
        "summary-preview": "Resuma antaŭrigardo:",
        "content-model-text": "ordinara teksto",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "Malplena objeto",
+       "content-json-empty-array": "Malplena tabelo",
        "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}}.",
        "history-feed-empty": "La petita paĝo ne ekzistas.\nĜi verŝajne estis forigita de la vikio, aŭ alinomita.\nProvu [[Special:Search|serĉi en la vikio]] por rilataj novaj paĝoj.",
        "rev-deleted-comment": "(komento forigita)",
        "rev-deleted-user": "(uzanto-nomo forigita)",
-       "rev-deleted-event": "(protokola ago forigita)",
+       "rev-deleted-event": "(protokolaj detaloj forigitaj)",
        "rev-deleted-user-contribs": "[salutnomo aŭ IP-adreso estis forigita - redakto estas kaŝita en kontribuoj]",
        "rev-deleted-text-permission": "Ĉi tiu revizio de la paĝo estis '''forigita'''.\nEble estas detaloj en la [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} protokolo pri forigado].",
        "rev-suppressed-text-permission": "Ĉi tiu paĝa revizio estis '''kaŝita'''.\nDetaloj estas troveblaj en la [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} protokolo pri kaŝitoj revizioj].",
        "logdelete-selected": "{{PLURAL:$1|Selektata protokola evento|Selektataj protokolaj eventoj}}:",
        "revdelete-text-text": "Forigitaj versioj ankoraŭ restas en la versia historio, sed partoj de ilia enhavo ne estas alireblaj por la publiko.",
        "revdelete-text-file": "Forigitaj dosieraj versioj ankoraŭ restas en la dosiera historio, sed partoj de ilia enhavo ne estas alireblaj por la publiko.",
+       "logdelete-text": "Forigitaj protokolaĵoj plu aperos en la protokolo, sed partoj de ilia enhavo ne estos alireblaj por publiko.",
        "revdelete-text-others": "Aliaj administrantoj ankoraŭ havas aliron al la kaŝita enhavo kaj povas malforigi ĝin, tiel longe kiel aldonaj restriktoj ne estas difinitaj.",
        "revdelete-confirm": "Bonvolu konfirmi ke vi intencias fari ĉi tion, ke vi komprenas la konsekvencojn kaj ke vi faras ĉi tion laŭ [[{{MediaWiki:Policy-url}}|la regularo]].",
        "revdelete-suppress-text": "Subpremo '''nur''' estu uzata por la jenaj kazoj:\n* Ebla kalumnia informo\n* Netaŭga persona informo\n*: ''hejmaj adresoj kaj telefonnumeroj, ŝtataj identnumeroj, ktp.''",
        "revdelete-legend": "Fari videblecajn limigojn",
        "revdelete-hide-text": "Teksto de revizio",
        "revdelete-hide-image": "Kaŝi enhavon de dosieroj",
-       "revdelete-hide-name": "Kaŝi agon kaj celon",
+       "revdelete-hide-name": "Kaŝi celon kaj parametrojn",
        "revdelete-hide-comment": "Resumo de redakto",
        "revdelete-hide-user": "Salutnomo de redaktanto/IP-adreso",
        "revdelete-hide-restricted": "Subpremi ĉi tiujn datenojn de administrantoj kaj ankaŭ aliaj",
        "mergehistory-empty": "Neniuj versioj estas kunigeblaj.",
        "mergehistory-success": "$3 {{PLURAL:$3|versio|versioj}} de [[:$1]] sukcese {{PLURAL:$3|kunigita|kunigitaj}} en [[:$2]].",
        "mergehistory-fail": "Ne povis fari la historian kunigon; bonvolu konstati la paĝajn kaj tempajn parametrojn.",
+       "mergehistory-fail-toobig": "Ne eblas kunigi historiojn ĉar pli ol sojlo de $1 {{PLURAL:$1|revizio|revizioj}} estus {{PLURAL:$1|movita|movitaj}}.",
        "mergehistory-no-source": "Fontpaĝo $1 ne ekzistas.",
        "mergehistory-no-destination": "Celpaĝo $1 ne ekzistas.",
        "mergehistory-invalid-source": "Fontpaĝo devas esti valida titolo.",
        "prefs-personal": "Profilo de uzanto",
        "prefs-rc": "Lastaj ŝanĝoj",
        "prefs-watchlist": "Atentaro",
+       "prefs-editwatchlist": "Redakti atentaron",
+       "prefs-editwatchlist-label": "Redakti erojn de via atentaro:",
+       "prefs-editwatchlist-edit": "Montri kaj forigi erojn de vi atentaro",
+       "prefs-editwatchlist-raw": "Redakti krudan atentaron",
+       "prefs-editwatchlist-clear": "Malplenigi vian atentaron",
        "prefs-watchlist-days": "Kiom da tagoj montriĝu en la atentaro:",
        "prefs-watchlist-days-max": "Maksimume  $1 {{PLURAL:$1|tago|tagoj}}",
        "prefs-watchlist-edits": "Maksimuma nombro de ŝanĝoj montrendaj en ekspandita atentaro:",
        "prefs-tokenwatchlist": "Ĵetono",
        "prefs-diffs": "Diferencoj",
        "prefs-help-prefershttps": "Ĉi tiu agordo ekefikos je via sekva ensaluto.",
+       "prefswarning-warning": "Vi faris ŝanĝojn al viaj agordoj, kiuj ankoraŭ ne estas konservitaj.\nSe vi foriros de tiu ĉi paĝo sen klaki al \"$1\", viaj agordoj ne estos ĝisdatigitaj.",
        "prefs-tabs-navigation-hint": "Konsileto: Vi povas uzi la maldekstran kaj dekstran sagajn klavojn por navigi inter la langetoj en la langeta listo.",
        "email-address-validity-valid": "Ŝajnas ke la retpoŝtadreso estas valida",
        "email-address-validity-invalid": "Tajpu validan retpoŝtadreson",
        "right-protect": "Ŝanĝi protektniveloj kaj redakti protektitajn paĝojn",
        "right-editprotected": "Redakti protektitajn paĝojn (sen kaskada protektado)",
        "right-editsemiprotected": "Redakti paĝojn protektitajn kiel \"{{int:protect-level-autoconfirmed}}\"",
+       "right-editcontentmodel": "Redakti paĝan enhavmodelon",
        "right-editinterface": "Redakti la uzantointerfacon",
        "right-editusercssjs": "Redaktu CSS- kaj JS-dosierojn de aliaj uzantoj",
        "right-editusercss": "Redaktu CSS-dosierojn de aliaj uzantoj",
        "right-override-export-depth": "Eksporti paĝojn inkluzivante ligitajn paĝojn ĝis profundeco de 5",
        "right-sendemail": "Sendi retpoŝton al aliaj uzantoj",
        "right-passwordreset": "Vidi retpoŝtojn de pasvorta restarado.",
+       "right-managechangetags": "Kreado kaj forigado de [[Special:Tags|etikedoj]] de datumbazo",
        "newuserlogpage": "Protokolo de uzanto-kreado",
        "newuserlogpagetext": "Jen protokolo de lastaj kreadoj de uzantoj.",
        "rightslog": "Protokolo de uzanto-rajtoj",
        "action-viewmywatchlist": "vidi vian atento-liston",
        "action-viewmyprivateinfo": "vidi viajn privatajn informojn",
        "action-editmyprivateinfo": "redakti viajn privatajn informojn",
+       "action-editcontentmodel": "redakti paĝan enhavmodelon",
+       "action-managechangetags": "krei kaj forigi etikedojn de datumbazo",
        "nchanges": "$1 {{PLURAL:$1|ŝanĝo|ŝanĝoj}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|ekde lasta vizito}}",
        "enhancedrc-history": "historio",
        "uploaderror": "Eraro okazis dum alŝuto",
        "upload-recreate-warning": "''Atenton: dosiero kun tiu nomo estis forigita aŭ alinomita.'''\n\nLa forigo kaj mova protokoloj por ĉi tiu paĝo estas provizitaj ĉi tie por oportuno:",
        "uploadtext": "Uzu la jenan formularon por alŝuti dosierojn.\nVidi aŭ serĉi antaŭe alŝutitajn bildojn, iru al [[Special:FileList|Listo de alŝutitaj dosieroj]]; (re)alŝutaĵoj ankaŭ estas registrita en la [[Special:Log/upload|Protokolo de alŝutoj]], forigoj en la [[Special:Log/delete|protokolo de forigoj]].\n\nPor inkluzivi la dosieron en paĝon, skribu ligilon laŭ la formoj\n\n* '''<nowiki>[[</nowiki>{{ns:file}}<nowiki>:Bildo.jpg]]</nowiki>''' por uzi la plenan version de la dosiero\n* '''<nowiki>[[</nowiki>{{ns:file}}<nowiki>:Bildo.png|200px|thumb|left|alternativa teksto]]</nowiki>''' por uzi 200-rastrumeran version en kesto maldekstre (\"left\") kun \"alternativa teksto\" kiel priskribo.\n* '''<nowiki>[[</nowiki>{{ns:media}}<nowiki>:Dosiero.ogg]]</nowiki>''' por ligi rekte al la dosiero ne montrante la dosieron.",
-       "upload-permitted": "Permesitaj dosiertipoj: $1.",
-       "upload-preferred": "Preferitaj dosiertipoj: $1.",
-       "upload-prohibited": "Malpermesitaj dosiero-tipoj: $1.",
+       "upload-permitted": "{{PLURAL:$2|Permesita dosiertipo|Permesitaj dosiertipoj}}: $1.",
+       "upload-preferred": "{{PLURAL:$2|Preferata dosiertipo|Preferataj dosiertipoj}}: $1.",
+       "upload-prohibited": "{{PLURAL:$2|Malpermesita dosiertipo|Malpermesitaj dosiertipoj}}: $1.",
        "uploadlogpage": "Protokolo de alŝutoj",
        "uploadlogpagetext": "Jen la plej laste alŝutitaj dosieroj.\nĈiuj tempoj montriĝas laŭ la horzono UTC.",
        "filename": "Dosiernomo",
        "trackingcategories-msg": "Kategorio pri kontrolado",
        "trackingcategories-name": "Nomo de mesaĝo",
        "trackingcategories-desc": "Kriterio por inkluzivi kategorion",
+       "broken-file-category-desc": "La paĝo enhavas malvalidan ligilon al dosiero (ligilo por uzi dosieron kvankam la dosiero ne ekzistas).",
        "trackingcategories-nodesc": "Neniu priskribo estas disponebla.",
        "trackingcategories-disabled": "Kategorio estas malaktivigita",
        "mailnologin": "Neniu alsendota adreso",
        "mywatchlist": "Atentaro",
        "watchlistfor2": "Por $1 $2",
        "nowatchlist": "Vi ne jam elektis priatenti iun ajn paĝon.",
-       "watchlistanontext": "Bonvolu ensaluti por vidi aŭ redakti erojn en via atentaro.",
+       "watchlistanontext": "Bonvolu ensaluti por vidi aŭ redakti vian atentaron.",
        "watchnologin": "Ne ensalutinta",
        "addwatch": "Aldoniĝi al atentaro",
        "addedwatchtext": "La paĝo \"[[:$1]]\" aldoniĝis al via [[Special:Watchlist|atentaro]]. Estontaj ŝanĝoj de tiu paĝo kaj de ĝia rilata diskutpaĝo aperos tie.",
        "wlnote": "Jen la {{PLURAL:$1|lasta redakto|lastaj <strong>$1</strong> redaktoj}} dum la {{PLURAL:$2|lasta horo|lastaj <strong>$2</strong> horoj}}, ekde $3, $4.",
        "wlshowlast": "Montri el lastaj $1 horoj $2 tagoj",
        "watchlist-options": "Opcioj por atentaro",
-       "watching": "Aldonante al la atentaro...",
+       "watching": "Aldonata al la atentaro...",
        "unwatching": "Malatentante...",
        "watcherrortext": "Eraro okazis ŝanĝinte vian agordojn de atentaro por \"$1\".",
        "enotif_reset": "Marki ĉiujn paĝojn vizititaj",
        "version-entrypoints": "Eniropunktaj URL-oj",
        "version-entrypoints-header-entrypoint": "Eniropunkto",
        "version-entrypoints-header-url": "Retadreso",
+       "version-libraries": "Instalitaj bibliotekoj",
+       "version-libraries-library": "Biblioteko",
+       "version-libraries-version": "Versio",
        "redirect-legend": "Alidirektilo al dosiero aŭ paĝo",
        "redirect-submit": "Ek",
        "redirect-lookup": "Traserĉi:",
        "compare-revision-not-exists": "La revizio kiun vi specifis ne ekzistas.",
        "dberr-problems": "Bedaŭrinde, ĉi tiu retejo suferas pro teknikaj problemoj.",
        "dberr-again": "Bonvolu atendi kelkajn minutojn kaj reŝargi.",
-       "dberr-info": "(Ne eblas kontakti la datenbazan servilon: $1)",
-       "dberr-info-hidden": "(Ne eblas kontakti la datenbazan servilon)",
+       "dberr-info": "(Ne eblas konekti la datumbazon: $1)",
+       "dberr-info-hidden": "(Ne eblas konekti la datenbazon)",
        "dberr-usegoogle": "Vi povas serĉi Guglon dume.",
        "dberr-outofdate": "Notu ke iliaj indeksoj de nia enhavo eble ne estas ĝisdatigaj.",
        "dberr-cachederror": "Jen kaŝmemorigita kopio de la petita paĝo, kaj eble ne estas ĝisdatigita.",
index a203647..6f7cfd7 100644 (file)
                        "Eurodyne",
                        "Gleki",
                        "Jonathan rrr",
-                       "Paynekiller92"
+                       "Paynekiller92",
+                       "Kroji",
+                       "JasterTDC"
                ]
        },
        "tog-underline": "Subrayar los enlaces:",
        "tog-hideminor": "Ocultar las ediciones menores en los cambios recientes",
        "tog-hidepatrolled": "Ocultar las ediciones patrulladas en los cambios recientes",
-       "tog-newpageshidepatrolled": "Ocultar las páginas patrulladas de la lista de páginas nuevas",
-       "tog-extendwatchlist": "Expandir la lista de seguimiento a todos los cambios, no sólo a los más recientes",
+       "tog-newpageshidepatrolled": "Ocultar las páginas patrulladas en la lista de páginas nuevas",
+       "tog-extendwatchlist": "Mostrar todos los cambios en la lista de seguimiento, no solo los más recientes",
        "tog-usenewrc": "Agrupar los cambios por página en los cambios recientes y en la lista de seguimiento",
        "tog-numberheadings": "Numerar automáticamente los encabezados",
        "tog-showtoolbar": "Mostrar la barra de edición",
-       "tog-editondblclick": "Editar las páginas al hacer doble clic",
+       "tog-editondblclick": "Editar páginas al hacer doble clic",
        "tog-editsectiononrightclick": "Permitir modificar secciones al pulsar con el botón secundario del ratón en sus títulos",
        "tog-watchcreations": "Añadir las páginas que cree y los archivos que suba a mi lista de seguimento",
        "tog-watchdefault": "Añadir las páginas y archivos que edite a mi lista de seguimiento",
        "tog-watchmoves": "Añadir las páginas y archivos que mueva a mi lista de seguimiento",
        "tog-watchdeletion": "Añadir las páginas y archivos que borre a mi lista de seguimiento",
-       "tog-watchrollback": "Añadir las páginas donde realicé una reversión a mi lista de seguimento",
+       "tog-watchrollback": "Añadir las páginas donde haya realizado una reversión a mi lista de seguimiento",
        "tog-minordefault": "Marcar todas las ediciones como menores de manera predeterminada",
        "tog-previewontop": "Mostrar previsualización antes del cuadro de edición",
        "tog-previewonfirst": "Mostrar previsualización en la primera edición",
        "tog-enotifwatchlistpages": "Enviarme un correo electrónico cuando se modifique una página o un archivo de mi lista de seguimiento",
-       "tog-enotifusertalkpages": "Enviarme un correo electrónico cuando se modifique mi página de discusión",
+       "tog-enotifusertalkpages": "Enviarme un mensaje de correo electrónico cuando se modifique mi página de discusión",
        "tog-enotifminoredits": "Notificarme también por correo electrónico los cambios menores de las páginas y archivos",
        "tog-enotifrevealaddr": "Revelar mi dirección de correo electrónico en los correos de notificación",
        "tog-shownumberswatching": "Mostrar el número de usuarios que la vigilan",
        "tog-watchlisthideliu": "Ocultar las ediciones de los usuarios registrados en la lista de seguimiento",
        "tog-watchlisthideanons": "Ocultar las ediciones de los usuarios anónimos en la lista de seguimiento",
        "tog-watchlisthidepatrolled": "Ocultar las ediciones patrulladas en la lista de seguimiento",
-       "tog-ccmeonemails": "Enviarme copias de los correos electrónicos que envíe a otros usuarios",
-       "tog-diffonly": "No mostrar el contenido de la página bajo las diferencias",
-       "tog-showhiddencats": "Mostrar las categorías ocultas",
-       "tog-norollbackdiff": "Omitir la diferencia después de revertir",
-       "tog-useeditwarning": "Avisarme cuando abandone una página de edición con cambios sin guardar",
-       "tog-prefershttps": "Utilizar una conexión segura siempre que haya iniciado una sesión",
+       "tog-ccmeonemails": "Recibir copias de los correos electrónicos que envíe a otros usuarios",
+       "tog-diffonly": "No mostrar el contenido de la página debajo de la lista de diferencias",
+       "tog-showhiddencats": "Mostrar categorías ocultas",
+       "tog-norollbackdiff": "Omitir la lista de diferencias después de revertir",
+       "tog-useeditwarning": "Avisarme cuando abandone una página en edición con cambios sin guardar",
+       "tog-prefershttps": "Utilizar siempre conexiones seguras en mis sesiones",
        "underline-always": "Siempre",
        "underline-never": "Nunca",
-       "underline-default": "Tema o valor predeterminado del navegador",
-       "editfont-style": "Estilo de tipografía del área de edición:",
+       "underline-default": "Configuración predeterminada del tema o el navegador",
+       "editfont-style": "Tipo de letra del área de edición:",
        "editfont-default": "Predeterminado del navegador",
        "editfont-monospace": "Tipo de letra monoespaciado",
        "editfont-sansserif": "Tipo de letra de palo seco",
        "category-empty": "<em>Esta categoría no contiene ninguna página o archivo.</em>",
        "hidden-categories": "{{PLURAL:$1|Categoría oculta|Categorías ocultas}}",
        "hidden-category-category": "Categorías ocultas",
-       "category-subcat-count": "{{PLURAL:$2|Esta categoría solo contiene la siguiente subcategoría.|Esta categoría contiene {{PLURAL:$1|la siguiente subcategoría|las siguientes $1 subcategorías}}, de un total de $2.}}",
+       "category-subcat-count": "{{PLURAL:$2|Esta categoría solo contiene la siguiente subcategoría.|{{PLURAL:$1|La siguiente subcategoría pertenece|Las siguientes $1 subcategorías pertenecen}} a esta categoría, de un total de $2.}}",
        "category-subcat-count-limited": "Esta categoría contiene {{PLURAL:$1|la siguiente subcategoría|las siguientes $1 subcategorías}}.",
-       "category-article-count": "{{PLURAL:$2|Esta categoría incluye solamente la siguiente página.|{{PLURAL:$1|La siguiente página página pertenece|Las siguientes $1 páginas pertenecen}} a esta categoría, de un total de $2.}}",
+       "category-article-count": "{{PLURAL:$2|Esta categoría incluye solamente la siguiente página.|{{PLURAL:$1|La siguiente página pertenece|Las siguientes $1 páginas pertenecen}} a esta categoría, de un total de $2.}}",
        "category-article-count-limited": "{{PLURAL:$1|La siguiente página pertenece|Las siguientes $1 páginas pertenecen}} a esta categoría.",
        "category-file-count": "{{PLURAL:$2|Esta categoría contiene solamente el siguiente archivo.|{{PLURAL:$1|El siguiente archivo pertenece|Los siguientes $1 archivos pertenecen}} a esta categoría, de un total de $2.}}",
-       "category-file-count-limited": "{{PLURAL:$1|El siguiente fichero pertenece|Los siguientes $1 ficheros pertenecen}} a esta categoría.",
+       "category-file-count-limited": "{{PLURAL:$1|El siguiente archivo pertenece|Los siguientes $1 archivos pertenecen}} a esta categoría.",
        "listingcontinuesabbrev": "cont.",
        "index-category": "Páginas indizadas",
        "noindex-category": "Páginas no indizadas",
        "broken-file-category": "Páginas con enlaces rotos a archivos",
        "about": "Acerca de",
-       "article": "Artículo",
+       "article": "Página de contenido",
        "newwindow": "(se abre en una ventana nueva)",
        "cancel": "Cancelar",
        "moredotdotdot": "Más...",
        "qbpageoptions": "Opciones de página",
        "qbmyoptions": "Mis páginas",
        "faq": "Preguntas frecuentes",
-       "faqpage": "Project:P+F",
+       "faqpage": "Project:PP. FF.",
        "actions": "Acciones",
        "namespaces": "Espacios de nombres",
        "variants": "Variantes",
        "otherlanguages": "En otros idiomas",
        "redirectedfrom": "(Redirigido desde «$1»)",
        "redirectpagesub": "Página de redirección",
-       "redirectto": "Redirigir a:",
+       "redirectto": "Redirige a:",
        "lastmodifiedat": "Esta página fue modificada por última vez el $1 a las $2.",
-       "viewcount": "Esta página se ha visitado {{PLURAL:$1|una vez|$1 veces}}.",
+       "viewcount": "Esta página ha recibido {{PLURAL:$1|una visita|$1 visitas}}.",
        "protectedpage": "Página protegida",
        "jumpto": "Saltar a:",
        "jumptonavigation": "navegación",
        "jumptosearch": "buscar",
-       "view-pool-error": "Lo sentimos, los servidores están sobrecargados en este momento.\nHay demasiados usuarios que están tratando de ver esta página.\nEspera un momento antes de tratar de acceder nuevamente a esta página.\n\n$1",
-       "generic-pool-error": "Lo sentimos, los servidores están sobrecargados en este momento.\nHay demasiados usuarios que están tratando de ver este recurso.\nEspera un momento antes de tratar de acceder nuevamente a este recurso.",
-       "pool-timeout": "Se agotó el tiempo de espera del candado",
+       "view-pool-error": "Lo sentimos, los servidores están sobrecargados en este momento.\nHay demasiados usuarios tratando de ver esta página.\nEspera un momento antes de intentar acceder de nuevo a esta página.\n\n$1",
+       "generic-pool-error": "Lo sentimos, los servidores están sobrecargados en este momento.\nHay demasiados usuarios tratando de ver este recurso.\nEspera un momento antes de intentar acceder de nuevo a este recurso.",
+       "pool-timeout": "Se agotó el tiempo de espera al cierre de exclusión mutua",
        "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).",
        "badaccess-group0": "No estás autorizado a ejecutar la acción solicitada.",
        "badaccess-groups": "La acción que has solicitado está restringida a los usuarios {{PLURAL:$2|del grupo|de uno de estos $2 grupos}}: $1.",
        "versionrequired": "Se requiere la versión $1 de MediaWiki.",
-       "versionrequiredtext": "Se necesita la versión $1 de MediaWiki para utilizar esta página. Para más información, consultar [[Special:Version|la página de versión]]",
+       "versionrequiredtext": "Se necesita la versión $1 de MediaWiki para utilizar esta página. Para más información, consulta [[Special:Version|la página de versión]].",
        "ok": "Aceptar",
        "retrievedfrom": "Obtenido de «$1»",
        "youhavenewmessages": "{{PLURAL:$3|Tienes}} $1 ($2).",
        "viewdeleted": "¿Quieres ver $1?",
        "restorelink": "{{PLURAL:$1|una edición borrada|$1 ediciones borradas}}",
        "feedlinks": "Canal:",
-       "feed-invalid": "El tipo de canal de suscripción no es válido.",
+       "feed-invalid": "El tipo de canal de suscripción no es correcto.",
        "feed-unavailable": "Los canales de sindicación no están disponibles",
        "site-rss-feed": "Canal RSS de $1",
        "site-atom-feed": "Canal Atom de $1",
        "nstab-help": "Ayuda",
        "nstab-category": "Categoría",
        "nosuchaction": "No existe esa acción",
-       "nosuchactiontext": "La acción especificada en la URL no es válida.\nEs posible que hayas escrito mal la URL o que hayas seguido un enlace incorrecto.\nEsto también podría indicar un error en el software utilizado en {{SITENAME}}.",
+       "nosuchactiontext": "La acción especificada en la URL no es válida.\nEs posible que hayas escrito mal la URL o que hayas seguido un enlace incorrecto.\nEsto también podría indicar un error en el software utilizado por {{SITENAME}}.",
        "nosuchspecialpage": "No existe esa página especial",
-       "nospecialpagetext": "<strong>Ha solicitado una página especial inexistente.</strong>\n\nPuedes ver una lista de las páginas especiales en [[Special:SpecialPages|{{int:specialpages}}]].",
+       "nospecialpagetext": "<strong>Has intentado acceder a una página especial inexistente.</strong>\n\nPuedes ver una lista de las páginas especiales en [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "Error",
        "databaseerror": "Error de la base de datos",
-       "databaseerror-text": "Ocurrió un error de consulta a la base de datos.\nEsto puede indicar un fallo en el software.",
-       "databaseerror-textcl": "Se ha producido un error de consulta a la base de datos.",
+       "databaseerror-text": "Se ha producido un error en la consulta a la base de datos.\nEsto puede indicar un fallo en el software.",
+       "databaseerror-textcl": "Se ha producido un error en la consulta a la base de datos.",
        "databaseerror-query": "Consulta: $1",
        "databaseerror-function": "Función: $1",
        "databaseerror-error": "Error: $1",
-       "laggedslavemode": "<strong>Avertencia:</strong> puede que falten las actualizaciones más recientes en esta página.",
+       "laggedslavemode": "<strong>Advertencia:</strong> puede que falten las actualizaciones más recientes en esta página.",
        "readonly": "Base de datos bloqueada",
        "enterlockreason": "Explica el motivo del bloqueo, incluyendo una estimación de cuándo se producirá el desbloqueo",
        "readonlytext": "La base de datos no permite nuevas entradas u otras modificaciones de forma temporal, probablemente por mantenimiento rutinario, tras lo cual volverá a la normalidad.\n\nLa explicación dada por el administrador que la bloqueó fue: $1",
-       "missing-article": "La base de datos no encuentra el texto de una página que debería hallarse, llamada «$1» $2.\n\nLa causa de esto suele deberse a un ''diff'' anacrónico o un enlace al historial de una página que ha sido borrada.\n\nSi no fuera el caso, puedes haber encontrado un fallo en el software.\n\nPor favor, avisa a un [[Special:ListUsers/sysop|administrador]], tomando nota de la URL.",
-       "missingarticle-rev": "(n.º de revisión: $1)",
-       "missingarticle-diff": "(Dif.: $1, $2)",
-       "readonly_lag": "La base de datos se ha bloqueado automáticamente mientras los servidores de base de datos esclavos se sincronizan con el maestro.",
+       "missing-article": "La base de datos no ha encontrado el texto de la página «$1» $2, cuando debería haberse hallado.\n\nLa causa de esto suele ser un ''diff'' anacrónico o un enlace al historial de una página que ha sido borrada.\n\nSi no fuera el caso, puede que hayas encontrado un fallo en el software.\n\nPor favor, informa de esto a [[Special:ListUsers/sysop|administrador]], y anota la URL actual.",
+       "missingarticle-rev": "(revisión: $1)",
+       "missingarticle-diff": "(diferencia: $1, $2)",
+       "readonly_lag": "La base de datos se ha bloqueado automáticamente mientras sus servidores esclavos se sincronizan con el maestro.",
        "internalerror": "Error interno",
        "internalerror_info": "Error interno: $1",
-       "filecopyerror": "No se pudo copiar el archivo «$1» a «$2».",
-       "filerenameerror": "No se pudo renombrar el archivo «$1» a «$2».",
-       "filedeleteerror": "No se pudo borrar el archivo «$1».",
-       "directorycreateerror": "No se pudo crear el directorio «$1».",
+       "filecopyerror": "No se ha podido copiar el archivo «$1» a «$2».",
+       "filerenameerror": "No se ha podido renombrar el archivo «$1» a «$2».",
+       "filedeleteerror": "No se ha podido borrar el archivo «$1».",
+       "directorycreateerror": "No se ha podido crear el directorio «$1».",
        "directoryreadonlyerror": "La carpeta «$1» es de solo lectura.",
-       "directorynotreadableerror": "La carpeta «$1» no es legible.",
-       "filenotfound": "No se pudo encontrar el archivo «$1».",
+       "directorynotreadableerror": "La carpeta «$1» no tiene permisos de lectura.",
+       "filenotfound": "No se ha encontrado el archivo «$1».",
        "unexpected": "Valor inesperado: «$1»=«$2».",
-       "formerror": "Error: no se pudo enviar el formulario",
+       "formerror": "Error: no se ha podido enviar el formulario.",
        "badarticleerror": "Esta acción no se puede llevar a cabo en esta página.",
-       "cannotdelete": "La página o archivo «$1» no se pudo borrar.\nPuede que ya haya sido borrado por alguien más.",
+       "cannotdelete": "No se ha podido borrar la página o archivo «$1».\nPuede que ya haya sido borrado por otro usuario.",
        "cannotdelete-title": "No se puede borrar la página «$1»",
-       "delete-hook-aborted": "La modificación que intentaste hacer fue cancelada por un gancho de extensión. No hay explicación disponible.",
-       "no-null-revision": "No se pudo crear la revisión nula para la página «$1»",
+       "delete-hook-aborted": "Una extensión ha evitado el borrado de la página. No hay explicación disponible.",
+       "no-null-revision": "No se pudo crear una nueva revisión nula para la página «$1»",
        "badtitle": "Título incorrecto",
        "badtitletext": "El título de la página solicitada está vacío, no es válido, o es un enlace interidioma o interwiki incorrecto.\nPuede que contenga uno o más caracteres que no se pueden usar en los títulos.",
        "perfcached": "Los siguientes datos provienen de la caché y pueden no estar actualizados. La caché puede contener {{PLURAL:$1|un resultado|$1 resultados}} como máximo.",
-       "perfcachedts": "Los siguientes datos provienen de la caché y su última actualización fue: $1. La caché puede contener {{PLURAL:$4|un resultado|$4 resultados}} como máximo.",
+       "perfcachedts": "Los siguientes datos provienen de la caché, y fueron actualizados por última vez a fecha de: $1. La caché contiene {{PLURAL:$4|un resultado|$4 resultados}} como máximo.",
        "querypage-no-updates": "Actualmente las actualizaciones de esta página están desactivadas. Estos datos no serán actualizados a corto plazo.",
        "viewsource": "Ver código",
        "viewsource-title": "Ver el código de «$1»",
        "actionthrottledtext": "Como medida contra el ''spam'', la acción que estás realizando está limitada a un número determinado de veces en un periodo corto de tiempo, y has excedido ese límite. Por favor inténtalo de nuevo en unos minutos.",
        "protectedpagetext": "Esta página ha sido protegida para evitar su edición u otras acciones.",
        "viewsourcetext": "Puedes ver y copiar el código fuente de esta página:",
-       "viewyourtext": "Puedes ver y copiar el código de <strong>tus ediciones</strong> a esta página:",
+       "viewyourtext": "Puedes ver y copiar el código de <strong>tus ediciones</strong> en esta página:",
        "protectedinterface": "Esta página proporciona el texto de la interfaz del software en este wiki, y está protegida para prevenir el abuso.\nPara agregar o cambiar las traducciones para todos los wikis, por favor, usa [//translatewiki.net/ translatewiki.net], el proyecto de localización de MediaWiki.",
-       "editinginterface": "<strong>Advertencia:</strong> Estás editando una página usada para proporcionar el texto de la interfaz para el software. \nLos cambios en esta página afectarán la apariencia de la interfaz para los demás usuarios de este wiki.",
+       "editinginterface": "<strong>Advertencia:</strong> Estás editando una página usada para proporcionar texto de la interfaz al software. \nLos cambios en esta página afectarán la apariencia de la interfaz de los demás usuarios de este wiki.",
        "translateinterface": "Para añadir o cambiar traducciones para todos los wikis, usa [//translatewiki.net/ translatewiki.net], el proyecto de localización de MediaWiki.",
-       "cascadeprotected": "Esta página ha sido protegida para su edición, porque está incluida en {{PLURAL:$1|la siguiente página|las siguientes páginas}}, que están protegidas con la opción de «cascada»:\n$2",
+       "cascadeprotected": "Esta página ha sido protegida contra edición, al estar incluida en {{PLURAL:$1|la siguiente página protegida|las siguientes páginas protegidas}} con la opción de «cascada» activa:\n$2",
        "namespaceprotected": "No tienes permiso para editar las páginas del espacio de nombres <strong>$1</strong>.",
        "customcssprotected": "No tienes permiso para editar esta página CSS, porque contiene configuraciones personales de otro usuario.",
        "customjsprotected": "No tienes permiso para editar esta página JavaScript, porque contiene configuraciones personales de otro usuario.",
        "myprivateinfoprotected": "No tienes permiso para editar tu información privada.",
        "mypreferencesprotected": "No tienes permiso para editar tus preferencias.",
        "ns-specialprotected": "No se pueden editar las páginas especiales.",
-       "titleprotected": "Esta página ha sido protegida contra creación por [[User:$1|$1]].\nEl motivo dado fue \"<em>$2</em>\".",
-       "filereadonlyerror": "No se puede modificar el archivo \"$1\" porque el repositorio de archivos \"$2\" está en modo de sólo lectura.\nEl administrador que lo ha bloqueado ofrece esta explicación: \"$3\".",
+       "titleprotected": "Este título ha sido protegido contra creación por [[User:$1|$1]].\nEl motivo proporcionado es \"<em>$2</em>\".",
+       "filereadonlyerror": "No se puede modificar el archivo \"$1\" porque el repositorio de archivos \"$2\" es de solo lectura.\nEl administrador que lo ha bloqueado ofrece esta explicación: \"$3\".",
        "invalidtitle-knownnamespace": "El título con el espacio de nombres «$2» y el texto «$3» no es válido",
        "invalidtitle-unknownnamespace": "El título con el espacio de nombres desconocido (n.º $1) y el texto «$2» no es válido",
        "exception-nologin": "No has iniciado sesión",
        "exception-nologin-text": "Necesitas acceder para ver esta página o llevar a cabo esta acción.",
-       "exception-nologin-text-manual": "Necesitas $1 para acceder a esta página o acción.",
+       "exception-nologin-text-manual": "Necesitas $1 para poder ver esta página o llevar a cabo esta acción.",
        "virus-badscanner": "Configuración incorrecta: antivirus desconocido: <em>$1</em>",
-       "virus-scanfailed": "falló el análisis (código $1)",
+       "virus-scanfailed": "ha fallado el análisis (código $1)",
        "virus-unknownscanner": "antivirus desconocido:",
-       "logouttext": "<strong>Ha finalizado tu sesión.</strong>\n\nPuede que algunas páginas continúen mostrándose como si la sesión estuviera iniciada hasta que vacíes la memoria caché del navegador.",
+       "logouttext": "<strong>Tu sesión ha finalizado.</strong>\n\nPuede que algunas páginas continúen mostrándose como si la sesión estuviera iniciada hasta que actualices la caché de tu navegador.",
        "welcomeuser": "¡Bienvenido, $1!",
-       "welcomecreation-msg": "Se ha creado tu cuenta.\nPuedes cambiar tus [[Special:Preferences|preferencias]] de {{SITENAME}} si lo deseas.",
+       "welcomecreation-msg": "Se ha creado tu cuenta.\nSi lo deseas, puedes cambiar tus [[Special:Preferences|preferencias]] para {{SITENAME}}.",
        "yourname": "Usuario:",
        "userlogin-yourname": "Usuario",
        "userlogin-yourname-ph": "Escribe tu nombre de usuario",
        "userlogin-signwithsecure": "Usar conexión segura",
        "yourdomainname": "Tu dominio:",
        "password-change-forbidden": "No puedes cambiar las contraseñas en este wiki.",
-       "externaldberror": "Hubo un error de autenticación de la base de datos o bien no tienes autorización para actualizar tu cuenta externa.",
+       "externaldberror": "Hubo un error de autenticación en la base de datos, o bien no tienes autorización para actualizar tu cuenta externa.",
        "login": "Acceder",
        "nav-login-createaccount": "Acceder/crear cuenta",
        "userlogin": "Acceder/crear cuenta",
        "createacct-imgcaptcha-ph": "Escribe el texto de arriba",
        "createacct-submit": "Crea tu cuenta",
        "createacct-another-submit": "Crear otra cuenta",
-       "createacct-benefit-heading": "{{SITENAME}} es hecha por gente como tú.",
+       "createacct-benefit-heading": "Personas como tú son las que construyen {{SITENAME}}.",
        "createacct-benefit-body1": "{{PLURAL:$1|edición|ediciones}}",
        "createacct-benefit-body2": "{{PLURAL:$1|página|páginas}}",
        "createacct-benefit-body3": "{{PLURAL:$1|colaborador reciente|colaboradores recientes}}",
        "loginerror": "Error de inicio de sesión",
        "createacct-error": "Error al crear la cuenta",
        "createaccounterror": "No se pudo crear la cuenta: $1",
-       "nocookiesnew": "La cuenta de usuario ha sido creada, pero no has iniciado sesión.\n{{SITENAME}} usa <em>cookies</em> para identificar a los usuarios registrados.\nTu navegador tiene desactivadas las cookies.\nPor favor, actívalas e inicia sesión con tu nuevo nombre de usuario y contraseña.",
+       "nocookiesnew": "Se ha creado la cuenta de usuario, pero aún no has iniciado sesión.\n{{SITENAME}} usa <em>cookies</em> para identificar a los usuarios registrados.\nTu navegador tiene desactivadas las cookies.\nPor favor, actívalas e inicia sesión con tu nuevo nombre de usuario y contraseña.",
        "nocookieslogin": "{{SITENAME}} utiliza <em>cookies</em> para la autenticación de usuarios. Las <em>cookies</em> están desactivadas en tu navegador. Por favor, actívalas e inténtalo de nuevo.",
        "nocookiesfornew": "No se pudo crear la cuenta de usuario, porque no pudimos confirmar su origen.\nAsegúrate de que tienes las cookies activadas, luego recarga esta página e inténtalo de nuevo.",
        "noname": "No se ha especificado un nombre de usuario válido.",
        "loginsuccesstitle": "Has accedido correctamente",
        "loginsuccess": "<strong>Has accedido a {{SITENAME}} como «$1».</strong>",
-       "nosuchuser": "No existe ningún usuario llamado «$1».\nLos nombres de usuario son sensibles a las mayúsculas.\nRevisa la ortografía, o [[Special:UserLogin/signup|crea una cuenta nueva]].",
-       "nosuchusershort": "No hay un usuario con el nombre «$1». Comprueba que lo has escrito correctamente.",
+       "nosuchuser": "No existe ningún usuario llamado «$1».\nLos nombres de usuario son sensibles a las mayúsculas.\nRevisa tu ortografía, o [[Special:UserLogin/signup|crea una cuenta nueva]].",
+       "nosuchusershort": "No existe ningún usuario llamado «$1». Comprueba que lo has escrito correctamente.",
        "nouserspecified": "Debes especificar un nombre de usuario.",
        "login-userblocked": "No puedes iniciar sesión porque tu cuenta está bloqueada.",
        "wrongpassword": "La contraseña indicada es incorrecta.\nInténtalo de nuevo.",
        "password-login-forbidden": "El uso de este nombre de usuario y contraseña han sido prohibidos.",
        "mailmypassword": "Restablecer la contraseña",
        "passwordremindertitle": "Nueva contraseña temporal para {{SITENAME}}",
-       "passwordremindertext": "Alguien (probablemente tú, desde la dirección IP $1) solicitó que te enviáramos una nueva contraseña para tu cuenta en {{SITENAME}} ($4).\nSe ha creado la siguiente contraseña temporal para el usuario «$2»: «$3»\nAhora deberías iniciar sesión y cambiar tu contraseña. Tu contraseña temporal expirará en {{PLURAL:$5|un día|$5 días}}.\n\nSi fue otro quien solicitó este mensaje o has recordado tu contraseña y ya no deseas cambiarla, puedes ignorar este mensaje y seguir usando tu contraseña original.",
+       "passwordremindertext": "Alguien (probablemente tú, desde la dirección IP $1) solicitó el envío de una contraseña nueva para tu cuenta en {{SITENAME}} ($4). Se ha creado la siguiente contraseña temporal para el usuario «$2»: «$3». Si efectivamente la solicitaste, ahora puedes iniciar sesión y cambiar tu contraseña. Tu contraseña temporal caducará en {{PLURAL:$5|un día|$5 días}}.\n\nSi fue otro quien realizó esta solicitud, o has recordado tu contraseña y ya no deseas cambiarla, puedes ignorar este mensaje y seguir usando tu contraseña original.",
        "noemail": "No hay una dirección de correo electrónico registrada para «$1».",
-       "noemailcreate": "Necesitas proveer una dirección de correo electrónico válida",
+       "noemailcreate": "Necesitas proporcionar una dirección de correo electrónico válida.",
        "passwordsent": "Se ha enviado una nueva contraseña al correo electrónico de «$1».\nPor favor, identifícate de nuevo tras recibirla.",
        "blocked-mailpassword": "Tu dirección IP está bloqueada, y no se te permite el uso de la función de recuperación de contraseñas para prevenir abusos.",
        "eauthentsent": "Se ha enviado un correo electrónico de confirmación a la dirección especificada.\nAntes de que se envíe cualquier otro correo a la cuenta tienes que seguir las instrucciones enviadas en el mensaje para así confirmar que la dirección te pertenece.",
        "noemailprefs": "Especifica una dirección electrónica para habilitar estas características.",
        "emailconfirmlink": "Confirmar dirección de correo electrónico",
        "invalidemailaddress": "La dirección electrónica no puede ser aceptada, pues parece que tiene un formato no válido.\nPor favor, escribe una dirección en el formato adecuado o deja el campo en blanco.",
-       "cannotchangeemail": "Las direcciones de la correo electrónico de las cuentas de usuario no pueden cambiarse en esta wiki.",
+       "cannotchangeemail": "En este wiki no se pueden cambiar las direcciones de correo electrónico de las cuentas de usuario.",
        "emaildisabled": "Este sitio no puede enviar correos electrónicos.",
        "accountcreated": "Se ha creado la cuenta",
-       "accountcreatedtext": "La cuenta de usuario de [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) ha sido creada.",
+       "accountcreatedtext": "Se ha creado la cuenta de usuario de [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|discusión]]).",
        "createaccount-title": "Creación de cuenta para {{SITENAME}}",
-       "createaccount-text": "Alguien creó en {{SITENAME}} ($4) una cuenta asociada a este correo electrónico con el nombre «$2» y contraseña «$3». Por favor entra ahora y cambia tu contraseña.\n\nPuedes ignorar este mensaje si esta cuenta fue creada por error.",
-       "login-throttled": "Has intentado demasiadas veces iniciar sesión recientemente. Por favor espera $1 antes de intentarlo nuevamente.",
-       "login-abort-generic": "Tu inicio de sesión no fue exitoso - Cancelado",
-       "login-migrated-generic": "Tu cuenta se ha migrado y tu nombre de usuario ya no existen en este wiki.",
+       "createaccount-text": "Alguien creó en {{SITENAME}} ($4) una cuenta asociada a este correo electrónico con el nombre «$2» y contraseña «$3». Por favor, accede ahora y cambia tu contraseña.\n\nSi esta cuenta fue creada por error, ignora este mensaje.",
+       "login-throttled": "Has intentado iniciar sesión demasiadas veces seguidas. Por favor espera $1 antes de intentarlo nuevamente.",
+       "login-abort-generic": "Se ha intentado acceder sin éxito - Cancelado",
+       "login-migrated-generic": "Se ha trasladado tu cuenta. Tu nombre de usuario ya no existe en este wiki.",
        "loginlanguagelabel": "Idioma: $1",
        "suspicious-userlogout": "Tu solicitud de desconexión ha sido denegada, pues parece haber sido enviada desde un navegador defectuoso o un proxy caché.",
-       "createacct-another-realname-tip": "El nombre real es opcional.\nSi se proporciona, se usará para dar al usuario la atribución de su trabajo.",
+       "createacct-another-realname-tip": "El nombre real es opcional.\nSi lo proporcionas, se usará para dar atribución al trabajo del usuario.",
        "pt-login": "Acceder",
        "pt-login-button": "Acceder",
        "pt-createaccount": "Crear una cuenta",
        "pt-userlogout": "Salir",
        "php-mail-error-unknown": "Error desconocido en la función mail() de PHP.",
-       "user-mail-no-addy": "Se ha intentado enviar correo electrónico sin una dirección de correo electrónico.",
-       "user-mail-no-body": "Trató de enviar un correo electrónico con un cuerpo vacío o excesivamente corto.",
+       "user-mail-no-addy": "Se ha intentado enviar un mensaje de correo electrónico sin una dirección de correo electrónico.",
+       "user-mail-no-body": "Trató de enviar un mensaje de correo electrónico sin contenido o excesivamente corto.",
        "changepassword": "Cambiar contraseña",
-       "resetpass_announce": "Para completar el inicio de sesión, debes definir una contraseña nueva.",
+       "resetpass_announce": "Para completar el inicio de sesión debes definir una contraseña nueva.",
        "resetpass_text": "<!-- Añada texto aquí -->",
        "resetpass_header": "Cambiar la contraseña de la cuenta",
        "oldpassword": "Contraseña antigua:",
        "resetpass-submit-cancel": "Cancelar",
        "resetpass-wrong-oldpass": "La contraseña actual, o temporal, no es correcta.\nPuede que ya hayas cambiado exitosamente tu contraseña o que hayas pedido una nueva contraseña temporal.",
        "resetpass-recycled": "Restablece tu contraseña a algo distinto de tu contraseña actual.",
-       "resetpass-temp-emailed": "Has iniciado sesión con un código temporal por correo electrónico.\nPara terminar el acceso, debes establecer una nueva contraseña aquí:",
+       "resetpass-temp-emailed": "Has iniciado sesión con una contraseña temporal enviada por correo electrónico.\nPara continuar, debes establecer una nueva contraseña aquí:",
        "resetpass-temp-password": "Contraseña temporal:",
        "resetpass-abort-generic": "Una extensión ha cancelado el cambio de la contraseña.",
        "resetpass-expired": "Tu contraseña ha caducado. Por favor, establece una nueva contraseña para iniciar sesión.",
-       "resetpass-expired-soft": "Tu contraseña ha caducado y necesita restablecerse. Elije una nueva contraseña ahora, o haga clic en \"{{int:resetpass-submit-cancel}}\" para restaurarla más adelante.",
+       "resetpass-expired-soft": "Tu contraseña ha caducado, por lo que debes restablecerla. Cámbiala ahora por una nueva, o haz clic en \"{{int:resetpass-submit-cancel}}\" para restablecerla más adelante.",
        "resetpass-validity-soft": "Tu contraseña no es válida: $1\n\nCámbiala ahora por una nueva, o haz clic en \"{{int:resetpass-submit-cancel}}\" para cambiarla más tarde.",
        "passwordreset": "Restablecer contraseña",
        "passwordreset-text-one": "Completa este formulario para recibir una contraseña temporal por correo electrónico.",
-       "passwordreset-text-many": "{{PLURAL:$1|Rellena uno de los campos para  recibir una contraseña temporal por correo electrónico.}}",
+       "passwordreset-text-many": "{{PLURAL:$1|Elige una de las opciones para recibir una contraseña temporal por correo electrónico.}}",
        "passwordreset-legend": "Restablecer contraseña",
        "passwordreset-disabled": "Se ha desactivado el restablecimiento de contraseñas en este wiki.",
-       "passwordreset-emaildisabled": "Las funciones de correo electrónico han sido desactivadas en esta wiki.",
+       "passwordreset-emaildisabled": "Se han desactivado las funciones de correo electrónico en este wiki.",
        "passwordreset-username": "Nombre de usuario:",
        "passwordreset-domain": "Dominio:",
        "passwordreset-capture": "¿Ver el mensaje resultante?",
        "passwordreset-capture-help": "Si marcas esta casilla, se te mostrará el correo electrónico (con la contraseña temporal) además de enviarse al usuario.",
        "passwordreset-email": "Dirección de correo electrónico:",
        "passwordreset-emailtitle": "Detalles de la cuenta en {{SITENAME}}",
-       "passwordreset-emailtext-ip": "Alguien (probablemente tú, desde la dirección IP $1) ha solicitado la renovación de tu clave para {{SITENAME}} ($4). {{PLURAL:$3|La siguiente cuenta está asociada|Las siguientes cuentas están asociadas}}\ncon esta dirección de correo electrónico:\n\n$2\n\n{{PLURAL:$3|Esta contraseña temporal|Estas contraseñas temporales}} caducarán en {{PLURAL:$5|un día|$5 días}}.\nDeberías iniciar sesión y establecer una contraseña nueva ahora. Si otra persona ha realizado este solicitud\no si recuerdas tu contraseña original y no deseas cambiarla, puedes\nignorar este mensaje y continuar usando tu contraseña anterior.",
-       "passwordreset-emailtext-user": "El usuario $1 en {{SITENAME}} pidió un restablecer tu contraseña para {{SITENAME}}\n($4). {{PLURAL:$3|La siguiente cuenta está asociada|Las siguientes cuentas están asociadas}} con esta dirección de correo electrónico:\n\n$2\n\n{{PLURAL:$3|Esta contraseña temporal|Estas contraseñas temporales}} expirarán en {{PLURAL:$5|un día|$5 días}}.\nDeberías iniciar sesión y establecer una contraseña nueva ahora. Si alguien más hizo este pedido,\no recuerdas tu contraseña original, y no deseas cambiarla, puedes\nignorar este mensaje y continuar usando tu contraseña anterior.",
+       "passwordreset-emailtext-ip": "Alguien (probablemente tú, desde la dirección IP $1) ha solicitado el restablecimiento de tu contraseña en {{SITENAME}} ($4). {{PLURAL:$3|La siguiente cuenta está asociada|Las siguientes cuentas están asociadas}}\na esta dirección de correo electrónico:\n\n$2\n\n{{PLURAL:$3|Esta contraseña temporal|Estas contraseñas temporales}} caducarán en {{PLURAL:$5|un día|$5 días}}.\nAhora puedes iniciar sesión y establecer una nueva contraseña. Si fue otra persona la que realizó esta solicitud, o si ya recuerdas tu contraseña original y, por tanto, no deseas cambiarla, puedes ignorar este mensaje y continuar usando tu contraseña anterior.",
+       "passwordreset-emailtext-user": "El usuario $1 de {{SITENAME}} solicitó el restablecimiento de tu contraseña en {{SITENAME}}\n($4). {{PLURAL:$3|La siguiente cuenta está asociada|Las siguientes cuentas están asociadas}} a esta dirección de correo electrónico:\n\n$2\n\n{{PLURAL:$3|Esta contraseña temporal|Estas contraseñas temporales}} caducarán en {{PLURAL:$5|un día|$5 días}}.\nAhora puedes iniciar sesión y establecer una nueva contraseña. Si fue otra persona la que realizó esta solicitud, o si ya recuerdas tu contraseña original y, por tanto, no deseas cambiarla, puedes ignorar este mensaje y continuar usando tu contraseña anterior.",
        "passwordreset-emailelement": "Nombre de usuario: $1\nContraseña temporal: $2",
        "passwordreset-emailsent": "Se ha enviado un correo electrónico para el restablecimiento de tu contraseña.",
        "passwordreset-emailsent-capture": "Se ha enviado un correo para el restablecimiento de la contraseña, el cual se muestra a continuación.",
-       "passwordreset-emailerror-capture": "Se generó un correo electrónico de restablecimiento de contraseña, que se muestra a continuación, pero el envío {{GENDER:$2|al usuario|a la usuaria}} falló: $1",
+       "passwordreset-emailerror-capture": "Se ha generado un correo electrónico de restablecimiento de contraseña, que se muestra a continuación, pero ha fallado el envío {{GENDER:$2|al usuario|a la usuaria}}: $1",
        "changeemail": "Cambiar la dirección de correo electrónico",
-       "changeemail-text": "Rellena este formulario para cambiar tu dirección de correo electrónico. Debes introducir la contraseña para confirmar este cambio.",
+       "changeemail-text": "Rellena este formulario para cambiar tu dirección de correo electrónico. Debes introducir tu contraseña para confirmar este cambio.",
        "changeemail-no-info": "Debes iniciar sesión para acceder directamente a esta página.",
-       "changeemail-oldemail": "Dirección electrónica actual:",
-       "changeemail-newemail": "Dirección electrónica nueva:",
+       "changeemail-oldemail": "Dirección de correo electrónico actual:",
+       "changeemail-newemail": "Dirección de correo electrónico nueva:",
        "changeemail-none": "(ninguna)",
        "changeemail-password": "Tu contraseña en {{SITENAME}}:",
        "changeemail-submit": "Cambiar correo electrónico",
        "changeemail-throttled": "Has intentado acceder demasiadas veces.\nEspera $1 antes de intentarlo de nuevo.",
        "resettokens": "Restablecer claves",
-       "resettokens-text": "Aquí puedes restablecer las fichas que permiten el acceso a ciertos datos privados asociados con tu cuenta.\n\nDeberías hacerlo si accidentalmente los has compartido o si tu cuenta ha sido intervenida.",
+       "resettokens-text": "Aquí puedes restablecer las claves que permiten el acceso a ciertos datos privados asociados a tu cuenta.\n\nDeberías hacerlo si los has compartido por accidente, o si ha habido intrusiones en tu cuenta.",
        "resettokens-no-tokens": "No hay claves para restablecer.",
        "resettokens-legend": "Restablecer claves",
        "resettokens-tokens": "Claves:",
        "resettokens-token-label": "$1 (valor actual: $2)",
-       "resettokens-watchlist-token": "Clave para la lista de seguimiento (RSS/Atom) de los [[Special:Watchlist|cambios a las páginas en tu lista de seguimiento]]",
+       "resettokens-watchlist-token": "Clave para el canal (RSS/Atom) de los [[Special:Watchlist|cambios a las páginas en tu lista de seguimiento]]",
        "resettokens-done": "Restablecimiento de claves.",
        "resettokens-resetbutton": "Restablecer las claves",
        "bold_sample": "Texto en negrita",
        "showpreview": "Mostrar previsualización",
        "showdiff": "Mostrar los cambios",
        "blankarticle": "<strong>Aviso:</strong> estás a punto de crear una página vacía.\nSi pulsas en «{{int:savearticle}}» de nuevo, se creará la página sin ningún contenido.",
-       "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.",
+       "anoneditwarning": "<strong>Advertencia:</strong> no has iniciado sesión. Tu dirección IP se hará pública si haces cualquier edición en estas condiciones. Si <strong>[$1 inicias sesión]</strong> o <strong>[$2 creas una cuenta]</strong>, tus ediciones se atribuirán a tu nombre de usuario, además de 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.",
+       "missingsummary": "<strong>Atención:</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.\nPuede que hayas especificado erróneamente el destino de la redirección, o quizá estés editando la página equivocada. En cualquier caso, si haces clic de nuevo en \"{{int:savearticle}}\", se creará la redirección.",
        "missingcommenttext": "Escribe un comentario a continuación.",
-       "missingcommentheader": "<strong>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.",
+       "missingcommentheader": "<strong>Atención:</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:",
        "subject-preview": "Previsualización del asunto/encabezado:",
        "blockedtitle": "El usuario está bloqueado",
        "blockedtext": "<strong>Tu nombre de usuario o dirección IP ha sido bloqueada.</strong>\n\nEl bloqueo fue hecho por $1.\nLa razón dada es <em>$2</em>.\n\n* Inicio del bloqueo: $8\n* Caducidad del bloqueo: $6\n* Bloqueo destinado a: $7\n\nPuedes contactar a $1 u otro [[{{MediaWiki:Grouppage-sysop}}|administrador]] para discutir el bloqueo.\nNo puedes utilizar la función «enviar correo electrónico a este usuario»  a menos que tengas una dirección de correo electrónico válida registrada en tus [[Special:Preferences|preferencias de usuario]] y que el bloqueo no haya inhabilitado esta función.\n\nTu dirección IP actual es $3, y el identificador del bloqueo es #$5.\nPor favor incluye todos los datos aquí mostrados en cualquier consulta que hagas.",
-       "autoblockedtext": "Tu dirección IP ha sido bloqueada automáticamente porque fue utilizada por otro usuario que fue bloqueado por $1.\nLa razón dada es esta:\n\n:<em>$2</em>\n\n* Inicio del bloqueo: $8\n* Caducidad del bloqueo: $6\n* Bloqueo destinado a: $7\n\nPuedes contactar con $1 o con otro de los [[{{MediaWiki:Grouppage-sysop}}|administradores]] para discutir el bloqueo.\n\nTen en cuenta que no podrás utilizar la herramienta de «enviar correo electrónico a este usuario» a menos que tengas una dirección de correo electrónico válida registrada en tus [[Special:Preferences|preferencias de usuario]] y que el bloqueo no haya inhabilitado esta función.\n\nTu actual dirección IP es $3, y el identificador del bloqueo es #$5.\nPor favor, incluye todos los datos mostrados aquí en cualquier consulta que hagas.",
+       "autoblockedtext": "Tu dirección IP ha sido bloqueada automáticamente porque fue utilizada por otro usuario, que resultó bloqueado por $1.\nLa explicación proporcionada es la siguiente:\n\n:<em>$2</em>\n\n* Inicio del bloqueo: $8\n* Caducidad del bloqueo: $6\n* Bloqueo destinado a: $7\n\nPuedes contactar con $1 o con otro de los [[{{MediaWiki:Grouppage-sysop}}|administradores]] para discutir el bloqueo.\n\nTen en cuenta que no podrás utilizar la herramienta de «enviar correo electrónico a este usuario» a menos que tengas una dirección de correo electrónico válida registrada en tus [[Special:Preferences|preferencias de usuario]] y la función no haya sido también bloqueada.\n\nTu actual dirección IP es $3, y el identificador del bloqueo es #$5.\nPor favor, incluye todos los datos aquí mostrados en cualquier consulta que hagas al respecto.",
        "blockednoreason": "no se ha especificado el motivo",
        "whitelistedittext": "Tienes que $1 para editar artículos.",
-       "confirmedittext": "Debes confirmar tu dirección electrónica antes de editar páginas. Por favor, establece y valida una dirección electrónica a través de tus [[Special:Preferences|preferencias de usuario]].",
+       "confirmedittext": "Debes confirmar tu dirección de correo electrónico antes de poder editar páginas. Por favor, configura y confirma tu dirección de correo a través de tus [[Special:Preferences|preferencias de usuario]].",
        "nosuchsectiontitle": "Sección no encontrada",
        "nosuchsectiontext": "Has intentado editar una sección que no existe.\nQuizá ha sido movida o borrada mientras visitabas la página.",
        "loginreqtitle": "Es necesario iniciar sesión",
        "loginreqlink": "acceder",
        "loginreqpagetext": "Debes $1 para ver otras páginas.",
        "accmailtitle": "Se ha enviado la contraseña",
-       "accmailtext": "Se ha enviado a $2 una contraseña generada aleatoriamente para [[User talk:$1|$1]]. Puede cambiarse en la página [[Special:ChangePassword|destinada para ello]] después de haber iniciado sesión.",
+       "accmailtext": "Se ha enviado a $2 una contraseña generada aleatoriamente para [[User talk:$1|$1]]. Una vez iniciada la sesión, se puede cambiar en la página [[Special:ChangePassword|destinada para ello]].",
        "newarticle": "(Nuevo)",
-       "newarticletext": "Has seguido un enlace a una página que aún no existe.\nPara crear esta página, escribe en el campo a continuación. Para más información, consulta la [$1 página de ayuda].\nSi llegaste aquí por error, vuelve a la página anterior.",
-       "anontalkpagetext": "---- ''Esta es la página de discusión de un usuario anónimo que aún no ha creado una cuenta, o no la usa. Por lo tanto, tenemos que usar su dirección IP para identificarlo. Una dirección IP puede ser compartida por varios usuarios. Si eres un usuario anónimo y crees que se han dirigido a ti con comentarios improcedentes, por favor [[Special:UserLogin/signup|crea una cuenta]] o si ya la tienes [[Special:UserLogin|identifícate]] para evitar confusiones futuras con otros usuarios anónimos.''",
+       "newarticletext": "Has seguido un enlace a una página que aún no existe.\nPara crear esta página, escribe en el cuadro que aparece a continuación. Para más información, consulta la [$1 página de ayuda].\nSi llegaste aquí por error, vuelve a la página anterior.",
+       "anontalkpagetext": "---- ''Esta es la página de discusión de un usuario anónimo que aún no ha creado una cuenta, o no la usa. Por lo tanto, tenemos que usar su dirección IP para identificarlo. Puede que varios usuarios compartan una misma dirección IP. Si eres un usuario anónimo y crees que se han dirigido a ti con comentarios improcedentes, por favor [[Special:UserLogin/signup|crea una cuenta]] o, si ya la tienes, [[Special:UserLogin|identifícate]] para evitar confusiones futuras con otros usuarios anónimos.''",
        "noarticletext": "En este momento no hay texto en esta página.\nPuedes [[Special:Search/{{PAGENAME}}|buscar el título de esta página]] en otras páginas,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} buscar en los registros],\no [{{fullurl:{{FULLPAGENAME}}|action=edit}} editar esta página]</span>.",
        "noarticletext-nopermission": "Actualmente no hay texto en esta página.\nPuedes [[Special:Search/{{PAGENAME}}|buscar este título de página]] en otras páginas, o <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} buscar en los registros relacionados]</span>, pero no tienes permiso para crear esta página.",
-       "missing-revision": "La revisión n.º $1 de la página llamada «{{FULLPAGENAME}}» no existe.\n\nNormalmente esto ocurre cuando se sigue un enlace de historial obsoleto que apunta a una página ya borrada.\nPuedes encontrar detalles en el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de borrados].",
-       "userpage-userdoesnotexist": "La cuenta de usuario «<nowiki>$1</nowiki>» no está registrada. Por favor comprueba si quieres crear o editar esta página.",
-       "userpage-userdoesnotexist-view": "La cuenta de usuario «$1» no está registrada.",
-       "blocked-notice-logextract": "Este usuario está actualmente bloqueado.\nLa última entrada del registro de bloqueos se proporciona debajo para mayor referencia:",
-       "clearyourcache": "'''Nota:''' después de guardar, quizás necesites refrescar la caché de tu navegador para ver los cambios.\n* '''Firefox / Safari:''' Mantén presionada ''Mayús'' mientras pulsas el botón ''Actualizar'', o presiona ''Ctrl+F5'' o ''Ctrl+R'' (''⌘+R'' en Mac)\n* '''Google Chrome:''' presiona ''Ctrl+Shift+R'' (''⌘+Mayús+R'' en Mac)\n* '''Internet Explorer:''' mantén presionada ''Ctrl'' mientras pulsas ''Actualizar'', o presiona ''Ctrl+F5''\n* '''Opera:''' vacía la caché en ''Herramientas → Preferencias''",
-       "usercssyoucanpreview": "'''Consejo:''' Usa el botón «{{int:showpreview}}» para probar el nuevo CSS antes de guardarlo.",
-       "userjsyoucanpreview": "'''Consejo:''' Usa el botón «{{int:showpreview}}» para probar el nuevo JS antes de guardarlo.",
-       "usercsspreview": "'''Recuerda que sólo estás previsualizando tu CSS de usuario.'''\n'''¡Aún no se ha guardado!'''",
-       "userjspreview": "'''¡Recuerda que solo estás previsualizando tu JavaScript de usuario.'''\n'''¡Aún no se ha guardado!'''",
-       "sitecsspreview": "'''Recuerda que sólo estás previsualizando este CSS'''\n'''¡Aún no se ha guardado!'''",
-       "sitejspreview": "'''Recuerda que sólo estás previsualizando este código JavaScript.'''\n'''¡Aún no se ha guardado!'''",
-       "userinvalidcssjstitle": "'''Aviso:''' No existe la apariencia «$1». Recuerda que las páginas personalizadas ''.css'' y ''.js'' tienen un título en minúsculas. Por ejemplo, {{ns:user}}:Ejemplo/vector.css en vez de {{ns:user}}:Ejemplo/Vector.css.",
+       "missing-revision": "La revisión n.º $1 de la página «{{FULLPAGENAME}}» no existe.\n\nEsto suele ocurrir cuando se sigue un enlace de historial obsoleto que apunta a una página ya borrada.\nPuedes encontrar detalles en el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de borrados].",
+       "userpage-userdoesnotexist": "El usuario «$1» no está registrado. Por favor, asegúrate de que realmente quieres crear o editar esta página.",
+       "userpage-userdoesnotexist-view": "El usuario «$1» no está registrado.",
+       "blocked-notice-logextract": "Este usuario se encuentra actualmente bloqueado.\nA continuación se muestra la última entrada del registro de bloqueos para más información:",
+       "clearyourcache": "<strong>Nota:</strong> tras guardar, quizás necesites actualizar la caché de tu navegador para ver los cambios.\n* <strong>Firefox/Safari:</strong> Mantén presionada la tecla <em>Mayús</em> mientras pulsas el botón <em>Actualizar</em>, o presiona <em>Ctrl+F5</em> o <em>Ctrl+R</em> (<em>⌘+R</em> en Mac)\n* <strong>Google Chrome:</strong> presiona <em>Ctrl+Shift+R</em> (<em>⌘+Mayús+R</em> en Mac)\n* <strong>Internet Explorer:</strong> mantén presionada <em>Ctrl</em> mientras pulsas <em>Actualizar</em>, o presiona <em>Ctrl+F5</em>\n* <strong>Opera:</strong> vacía la caché en <em>Herramientas → Preferencias</em>",
+       "usercssyoucanpreview": "<strong>Consejo:</strong> Usa el botón «{{int:showpreview}}» para probar el nuevo CSS antes de guardarlo.",
+       "userjsyoucanpreview": "<strong>Consejo:</strong> Usa el botón «{{int:showpreview}}» para probar el nuevo código JavaScript antes de guardarlo.",
+       "usercsspreview": "<strong>Recuerda que solo estás previsualizando tu CSS de usuario. ¡Aún no se ha guardado!</strong>",
+       "userjspreview": "<strong>¡Recuerda que solo estás previsualizando tu JavaScript de usuario. ¡Aún no se ha guardado!</strong>",
+       "sitecsspreview": "<strong>Recuerda que solo estás previsualizando este CSS. ¡Aún no se ha guardado!</strong>",
+       "sitejspreview": "<strong>Recuerda que solo estás previsualizando este código JavaScript. ¡Aún no se ha guardado!</strong>",
+       "userinvalidcssjstitle": "<strong>Advertencia:</strong> No existe la apariencia «$1». Recuerda que las páginas personalizadas .css y .js tienen un título en minúsculas. Por ejemplo, se usa {{ns:user}}:Ejemplo/vector.css en vez de {{ns:user}}:Ejemplo/Vector.css.",
        "updated": "(Actualizado)",
        "note": "<strong>Nota:</strong>",
-       "previewnote": "<strong>Recuerda que esta es una previsualización.</strong>\nTodavía no se han guardado tus cambios.",
+       "previewnote": "<strong>Recuerda que esto no es más que una previsualización.</strong>\nAún no se han guardado tus cambios.",
        "continue-editing": "Ir al área de edición",
-       "previewconflict": "Esta previsualización refleja el texto en el área de edición superior como aparecerá una vez guardados los cambios.",
-       "session_fail_preview": "'''No se pudo procesar la edición debido a una pérdida de los datos de sesión.'''\nInténtalo de nuevo.\nSi el problema persiste, [[Special:UserLogout|cierra la sesión]] y vuelve a identificarte.",
-       "session_fail_preview_html": "'''Lo sentimos, no hemos podido procesar tu cambio debido a una pérdida de datos de sesión.'''\n\n''Puesto que este wiki tiene el HTML puro habilitado, la visión preliminar está oculta para prevenirse contra ataques en JavaScript.''\n\n'''Si éste es un intento legítimo de modificación, por favor, inténtalo de nuevo. Si aún así no funcionase, [[Special:UserLogout|cierra la sesión]] e ingresa de nuevo.'''",
-       "token_suffix_mismatch": "'''Tu edición ha sido rechazada porque tu cliente ha mezclado los signos de puntuación en el token de edición.\nSe rechazó la edición para evitar que el texto de la página se corrompa.\nEsto sucede en ocasiones cuando se usa un servicio de proxy anónimo defectuoso.'''",
-       "edit_form_incomplete": "'''Algunas partes del formulario de edición no llegaron al servidor, comprueba que tus ediciones están intactas e inténtalo de nuevo'''.",
+       "previewconflict": "Esta previsualización muestra cómo aparecerá el texto en el área de edición superior una vez guardados los cambios.",
+       "session_fail_preview": "<strong>Lo sentimos, no hemos podido procesar tu edición debido a una pérdida de los datos de sesión.</strong>\nPor favor, inténtalo de nuevo.\nSi el problema persiste, prueba a [[Special:UserLogout|cerrar sesión]] y volver a acceder.",
+       "session_fail_preview_html": "<strong>Lo sentimos, no hemos podido procesar tu edición debido a una pérdida de datos de sesión.</strong>\n\n<em>La previsualización está oculta como prevención frente a ataques JavaScript, puesto que este wiki tiene habilitado el HTML en bruto.</em>\n\n<strong>Si se trata de un intento legítimo de modificación, por favor, inténtalo de nuevo.</strong>\nSi aún así no funcionase, prueba a [[Special:UserLogout|cerrar sesión]] y volver a acceder.",
+       "token_suffix_mismatch": "<strong>Tu edición ha sido rechazada porque tu cliente ha mezclado los signos de puntuación en la clave de edición.\nSe rechazó la edición para evitar la corrupción del texto de la página.\nEsto sucede en ocasiones si se usa un servicio de proxy anónimo defectuoso.</strong>",
+       "edit_form_incomplete": "<strong>Una parte del formulario de edición no ha llegado al servidor. Comprueba que tus cambios están intactos e inténtalo de nuevo.</strong>",
        "editing": "Edición de «$1»",
-       "creating": "Crear la página $1",
-       "editingsection": "Editar $1 (sección)",
+       "creating": "Creación de «$1»",
+       "editingsection": "Edición de «$1» (sección)",
        "editingcomment": "Edición de «$1» (sección nueva)",
        "editconflict": "Conflicto de edición: $1",
-       "explainconflict": "Alguien más ha cambiado esta página desde que empezaste a editarla.\nEl área de texto superior contiene el texto de la página como existe actualmente.\nTus cambios se muestran en el área de texto inferior.\nSi quieres grabar tus cambios, has de trasladarlos al área superior.\n'''Sólo''' el texto en el área de texto superior será grabado cuando pulses «{{int:savearticle}}».",
+       "explainconflict": "Alguien ha realizado cambios en esta página desde que empezaste a editarla.\nEl cuadro de texto superior contiene el texto de la página tal como está guardado en este momento.\nTus cambios sobre la versión que editaste se muestran en el cuadro de texto inferior.\nSi quieres guardar tus cambios, has de trasladarlos al cuadro superior.\nAl pulsar «{{int:savearticle}}», se guardará <strong>solo</strong> el texto del cuadro superior.",
        "yourtext": "Tu texto",
-       "storedversion": "Versión almacenada",
-       "nonunicodebrowser": "'''Atención: Tu navegador no cumple la norma Unicode.'''\nSe ha activado un sistema de edición alternativo que te permitirá editar artículos con seguridad: los caracteres no ASCII aparecerán en la caja de edición como códigos hexadecimales.",
-       "editingold": "'''Aviso: Estás editando una versión antigua de esta página.'''\nSi la guardas, se perderán los cambios realizados desde esta revisión.",
+       "storedversion": "Versión guardada",
+       "nonunicodebrowser": "<strong>Advertencia: tu navegador no es compatible con los caracteres Unicode.</strong>\nSe ha activado un sistema de edición alternativo que te permitirá editar artículos con seguridad: los caracteres no pertenecientes al estándar ASCII aparecerán como códigos hexadecimales en el cuadro de edición.",
+       "editingold": "<strong>Advertencia: estás editando sobre una revisión antigua de esta página.</strong>\nSi la guardas, se perderá cualquier otro cambio realizado desde esa revisión.",
        "yourdiff": "Diferencias",
-       "copyrightwarning": "Por favor observa que todas las contribuciones a {{SITENAME}} se consideran hechas públicas bajo la $2 (véase $1 para más detalles). Si no deseas la modificación y distribución libre de tu obra, entonces no la pongas aquí.<br />También nos aseguras que tú escribiste esto y te pertenecen de los derechos de autor, o lo copiaste desde el dominio público u otra fuente libre. '''¡No uses escritos con copyright sin permiso!'''",
-       "copyrightwarning2": "Por favor, ten en cuenta que todas las contribuciones a {{SITENAME}} pueden ser editadas, modificadas o eliminadas por otros colaboradores. Si no deseas que las modifiquen sin limitaciones y las distribuyan libremente, entonces no las pongas aquí.<br />También nos aseguras que tú escribiste esto y te pertenecen de los derechos de autor, o lo copiaste desde el dominio público u otra fuente libre. (véase $1 para más detalles).\n'''¡No uses escritos con copyright sin permiso!'''",
-       "longpageerror": "'''Error: El texto que has enviado ocupa {{PLURAL:$1|un kilobyte|$1 kilobytes}}, que excede el máximo de {{PLURAL:$2|un kilobyte|$2 kilobytes}}.''' \nNo se lo puede guardar.",
-       "readonlywarning": "'''Advertencia: La base de datos ha sido bloqueada para mantenimiento, así que no podrás guardar tus ediciones en este momento.'''\nQuizás quieras copiar y pegar tu texto en un archivo de texto y guardarlo para después.\n\nEl administrador que lo bloqueó ofreció esta explicación: $1",
-       "protectedpagewarning": "'''Aviso: Esta página ha sido protegida de manera que solo usuarios con permisos de administrador puedan editarla.'''\nA continuación se muestra la última entrada de registro para referencia:",
-       "semiprotectedpagewarning": "'''Nota:''' Esta página ha sido protegida para que solo usuarios registrados puedan editarla.\nA continuación se provee la última entrada de registro para referencia:",
-       "cascadeprotectedwarning": "'''Aviso:''' Esta página está protegida, solo los administradores pueden editarla porque está incluida en  {{PLURAL:$1|la siguiente página protegida|las siguientes páginas protegidas}} en cascada:",
+       "copyrightwarning": "Ten en cuenta que todas las contribuciones a {{SITENAME}} se consideran publicadas bajo la $2 (véase $1 para más información). Si no deseas que las modifiquen sin limitaciones y las distribuyan libremente, no las publiques aquí.<br />Al mismo tiempo, asumimos que eres el autor de lo que escribiste, o lo copiaste de una fuente en el dominio público o con licencia libre. <strong>¡No uses textos con copyright sin permiso!</strong>",
+       "copyrightwarning2": "Ten en cuenta que todas las contribuciones a {{SITENAME}} pueden ser editadas, modificadas o eliminadas por otros colaboradores. Si no deseas que las modifiquen sin limitaciones, no las publiques aquí.<br />Al mismo tiempo, asumimos que eres el autor de lo que escribiste, o lo copiaste de una fuente en el dominio público o con licencia libre (véase $1 para más detalles).\n<strong>¡No uses textos con copyright sin permiso!</strong>",
+       "longpageerror": "<strong>Error: el texto que has enviado ocupa {{PLURAL:$1|un kilobyte|$1 kilobytes}}, que supera el máximo de {{PLURAL:$2|un kilobyte|$2 kilobytes}}.</strong>\nPor tanto, no lo podemos guardar.",
+       "readonlywarning": "<strong>Advertencia: La base de datos ha sido bloqueada por labores de mantenimiento, así que en este momento no puedes guardar tus ediciones.</strong>\nQuizás quieras copiar y pegar tu texto en un archivo de texto y guardarlo para después.\n\nEl administrador que la bloqueó ha dado esta explicación: $1",
+       "protectedpagewarning": "<strong>Advertencia: Esta página ha sido protegida para que solo puedan editarla los usuarios con permisos de administrador.</strong>\nA continuación se muestra la última entrada de registro para más información:",
+       "semiprotectedpagewarning": "<strong>Nota:</strong> Esta página ha sido protegida para que solo puedan editarla los usuarios registrados.\nA continuación se muestra la última entrada de registro para más información:",
+       "cascadeprotectedwarning": "<strong>Aviso:</strong> esta página está protegida y solo los administradores pueden editarla porque está incluida en {{PLURAL:$1|la siguiente página protegida|las siguientes páginas protegidas}} en cascada:",
        "titleprotectedwarning": "<strong>Aviso: esta página está protegida de modo que se necesitan [[Special:ListGroupRights|permisos específicos]] para crearla.</strong>\nA continuación se muestra la última entrada del registro como referencia:",
        "templatesused": "{{PLURAL:$1|Plantilla usada|Plantillas usadas}} en esta página:",
        "templatesusedpreview": "{{PLURAL:$1|Plantilla usada|Plantillas usadas}} en esta previsualización:",
        "templatesusedsection": "{{PLURAL:$1|Plantilla usada|Plantillas usadas}} en esta sección:",
        "template-protected": "(protegida)",
        "template-semiprotected": "(semiprotegida)",
-       "hiddencategories": "Esta página es un miembro de {{PLURAL:$1|1 categoría oculta|$1 categorías ocultas}}:",
+       "hiddencategories": "Esta página pertenece a {{PLURAL:$1|1 categoría oculta|$1 categorías ocultas}}:",
        "edittools": "<!-- Este texto aparecerá bajo los formularios de edición y subida. -->",
-       "nocreatetext": "{{SITENAME}} ha restringido la posibilidad de crear nuevas páginas.\nPuede volver atrás y editar una página existente, [[Special:UserLogin|identificarte o crear una cuenta]].",
+       "nocreatetext": "{{SITENAME}} ha restringido la posibilidad de crear nuevas páginas.\nPuedes volver atrás y editar una página existente, [[Special:UserLogin|identificarte o crear una cuenta]].",
        "nocreate-loggedin": "No tienes permiso para crear páginas nuevas.",
-       "sectioneditnotsupported-title": "Edición de sección no compatible",
-       "sectioneditnotsupported-text": "La edición de sección no es compatible con esta página.",
-       "permissionserrors": "Error de permiso",
+       "sectioneditnotsupported-title": "Edición de sección no admitida",
+       "sectioneditnotsupported-text": "No se admite la edición de secciones en esta página.",
+       "permissionserrors": "Error de permisos",
        "permissionserrorstext": "No tienes permiso para hacer eso, por {{PLURAL:$1|el siguiente motivo|los siguientes motivos}}:",
        "permissionserrorstext-withaction": "No tienes permiso para $2, por {{PLURAL:$1|el siguiente motivo|los siguientes motivos}}:",
-       "recreate-moveddeleted-warn": "'''Atención: estás volviendo a crear una página que ha sido borrada anteriormente.'''\n\nDeberías considerar si es apropiado continuar editando esta página.\nEl registro de borrado y traslados para esta página están provistos aquí por conveniencia:",
-       "moveddeleted-notice": "Esta página ha sido borrada.\nEl registro de borrados y traslados para la página están provistos debajo como referencia.",
+       "recreate-moveddeleted-warn": "<strong>Atención: estás volviendo a crear una página que ha sido borrada anteriormente.</strong>\n\nPiensa si es adecuado continuar editando la página.\nA continuación, se proporciona el registro de borrado y traslados de esta página para más información:",
+       "moveddeleted-notice": "Esta página ha sido borrada.\nA continuación, se proporciona el registro de borrados y traslados de la página para más información.",
        "log-fulllog": "Ver el registro completo",
-       "edit-hook-aborted": "Edición cancelada por la extensión.\nNo se aportaron explicaciones.",
-       "edit-gone-missing": "No se pudo actualizar la página.\nParece que ha sido borrada.",
+       "edit-hook-aborted": "Una extensión ha evitado la edición.\nNo hay explicación disponible.",
+       "edit-gone-missing": "No se ha podido actualizar la página.\nParece haber sido borrada.",
        "edit-conflict": "Conflicto de edición.",
        "edit-no-change": "Se ignoró tu edición porque no se hizo ningún cambio en el texto.",
        "postedit-confirmation-created": "Se ha creado la página.",
        "postedit-confirmation-restored": "Se ha restaurado la página.",
        "postedit-confirmation-saved": "Se ha guardado tu edición.",
        "edit-already-exists": "No se pudo crear una página nueva.\nYa existe.",
-       "defaultmessagetext": "Texto de mensaje predeterminado",
-       "content-failed-to-parse": "No se pudo analizar el contenido $2 del modelo $1: $3",
-       "invalid-content-data": "Datos de contenido inválidos",
+       "defaultmessagetext": "Texto predeterminado",
+       "content-failed-to-parse": "No se ha podido procesar el contenido $2 del modelo de $1: $3",
+       "invalid-content-data": "Datos de contenido incorrectos",
        "content-not-allowed-here": "El contenido «$1» no está permitido en la página [[$2]]",
        "editwarning-warning": "Se perderán los cambios si se cierra esta página.\nSi has iniciado sesión, puedes desactivar este aviso en la sección «{{int:prefs-editing}}» de las preferencias.",
-       "editpage-notsupportedcontentformat-title": "Formato de contenido no admitido",
-       "editpage-notsupportedcontentformat-text": "El formato de contenido $1 no es compatible con el modelo de contenido  $2.",
+       "editpage-notsupportedcontentformat-title": "Formato de contenido no compatible",
+       "editpage-notsupportedcontentformat-text": "El formato de contenido $1 no es compatible con el modelo de contenido $2.",
        "content-model-wikitext": "texto wiki",
-       "content-model-text": "Texto sin formato",
+       "content-model-text": "texto sin formato",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
        "content-json-empty-object": "Objeto vacío",
        "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.",
        "expensive-parserfunction-category": "Páginas con llamadas a funciones sintácticas demasiado costosas",
-       "post-expand-template-inclusion-warning": "Aviso: El tamaño de las plantillas incluidas es muy grande.\nAlgunas plantillas no serán incluidas.",
+       "post-expand-template-inclusion-warning": "<strong>Aviso:</strong> El tamaño de las plantillas incluidas es muy grande.\nAlgunas de ellas no se incluirán.",
        "post-expand-template-inclusion-category": "Páginas con sobrecarga de plantillas",
-       "post-expand-template-argument-warning": "Aviso: Esta página contiene al menos un parámetro de plantilla que tiene un tamaño de expansión demasiado grande.\nEse o esos parámetros han sido omitidos.",
+       "post-expand-template-argument-warning": "Aviso: Esta página contiene al menos un parámetro de plantilla con un tamaño de expansión demasiado grande.\nSe han descartado esos parámetros.",
        "post-expand-template-argument-category": "Páginas que contienen plantillas con parámetros descartados",
-       "parser-template-loop-warning": "Detectado bucle de plantilla: [[$1]]",
-       "parser-template-recursion-depth-warning": "Se ha excedido el límite de recursión de plantillas ($1)",
-       "language-converter-depth-warning": "El límite de profundidad del convertidor de idioma ha excedido ($1)",
-       "node-count-exceeded-category": "Páginas donde se supera el número de nodos",
-       "node-count-exceeded-category-desc": "La página supera el número máximo de nodos.",
-       "node-count-exceeded-warning": "Página que ha superado el número de nodos",
-       "expansion-depth-exceeded-category": "Páginas donde se supera la profundidad de expansión",
-       "expansion-depth-exceeded-category-desc": "Esta página supera el límite de extensión.",
-       "expansion-depth-exceeded-warning": "Página que ha superado la profundidad de expansión",
-       "parser-unstrip-loop-warning": "Se ha detectado un bucle \"unstrip\"",
-       "parser-unstrip-recursion-limit": "Se ha superado el límite de recursión de \"unstrip\" ($1)",
-       "converter-manual-rule-error": "Error detectado en la regla de conversión manual del lenguaje",
-       "undo-success": "La edición puede deshacerse. Antes de deshacer la edición, comprueba la siguiente comparación para verificar que realmente es lo que quieres hacer, y entonces guarda los cambios para así deshacer la edición.",
-       "undo-failure": "No se puede deshacer la edición ya que otro usuario ha realizado una edición intermedia.",
-       "undo-norev": "La edición no puede ser deshecha porque no existe o ha sido borrada.",
-       "undo-nochange": "Parece que ya se ha deshecho la modificación.",
-       "undo-summary": "Deshecha la revisión $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|disc.]])",
-       "undo-summary-username-hidden": "Deshacer revisión $1 por usuario oculto",
+       "parser-template-loop-warning": "Se ha detectado un bucle de plantilla: [[$1]]",
+       "parser-template-recursion-depth-warning": "Se ha superado el límite de profundidad de la recursividad de plantillas ($1)",
+       "language-converter-depth-warning": "Se ha superado el límite de profundidad del convertidor de idioma ($1)",
+       "node-count-exceeded-category": "Páginas que sobrepasan la cantidad de nodos",
+       "node-count-exceeded-category-desc": "Esta página sobrepasa la cantidad máxima de nodos permitida.",
+       "node-count-exceeded-warning": "La página sobrepasa el límite de nodos",
+       "expansion-depth-exceeded-category": "Páginas que sobrepasan la profundidad de expansión",
+       "expansion-depth-exceeded-category-desc": "Esta página sobrepasa la profundidad de expansión máxima.",
+       "expansion-depth-exceeded-warning": "La página ha sobrepasado el límite de profundidad de expansión",
+       "parser-unstrip-loop-warning": "Se ha detectado un bucle en la función \"unstrip\"",
+       "parser-unstrip-recursion-limit": "Se ha superado el límite de recursividad de la función \"unstrip\" ($1)",
+       "converter-manual-rule-error": "Se ha detectado un error en una regla de conversión de lenguaje manual",
+       "undo-success": "Puedes deshacer la edición. Antes de deshacer la edición, comprueba la siguiente comparación para verificar que realmente es lo que quieres hacer, y entonces guarda los cambios para así efectuar la reversión.",
+       "undo-failure": "No se ha podido deshacer la edición ya que otro usuario ha realizado una edición intermedia.",
+       "undo-norev": "No se ha podido deshacer la edición porque no existe o ha sido borrada.",
+       "undo-nochange": "Parece que ya se había deshecho la edición.",
+       "undo-summary": "Se ha deshecho la revisión $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|disc.]])",
+       "undo-summary-username-hidden": "Se ha deshecho la revisión $1 de un usuario oculto",
        "cantcreateaccounttitle": "No se puede crear la cuenta",
-       "cantcreateaccount-text": "La creación de cuentas desde esta dirección IP ('''$1''') ha sido bloqueada por [[User:$3|$3]].\n\nEl motivo dado por $3 es ''$2''",
-       "cantcreateaccount-range-text": "La creación de cuentas de usuario desde direcciones IP en el rango '''$1''', que incluye tu dirección IP ('''$4'''), ha sido bloqueada por [[User:$3|$3]].\n\nEl motivo dado por $3 es ''$2''",
+       "cantcreateaccount-text": "[[User:$3|$3]] ha bloqueado la creación de cuentas desde esta dirección IP ('''$1''').\n\nEl motivo dado por $3 es <em>$2</em>",
+       "cantcreateaccount-range-text": "[[User:$3|$3]] ha bloqueado la creación de cuentas de usuario desde direcciones IP en el rango '''$1''', en el que se encuentra tu dirección IP ('''$4''').\n\nEl motivo dado por $3 es ''$2''",
        "viewpagelogs": "Ver los registros de esta página",
        "nohistory": "No hay historial de ediciones para esta página.",
        "currentrev": "Revisión actual",
-       "currentrev-asof": "Última revisión de $1",
-       "revisionasof": "Revisión de $1",
-       "revision-info": "Revisión de $1 por {{GENDER:$6|$2}}$7",
+       "currentrev-asof": "Revisión actual del $1",
+       "revisionasof": "Revisión del $1",
+       "revision-info": "Revisión del $1 de {{GENDER:$6|$2}}$7",
        "previousrevision": "← Revisión anterior",
        "nextrevision": "Revisión siguiente →",
        "currentrevisionlink": "Revisión actual",
        "last": "ant",
        "page_first": "primeras",
        "page_last": "últimas",
-       "histlegend": "Selección de diferencias: marca los selectores de las versiones a comparar y pulsa ''enter'' o el botón de abajo.<br />\nLeyenda: '''(act)''' = diferencias con la versión actual,\n'''(ant)''' = diferencias con la versión anterior, '''m''' = edición menor",
+       "histlegend": "Selección de diferencias: marca las casillas correspondientes a las versiones a comparar y pulsa Intro o el botón de abajo.<br />\nLeyenda: <strong>(act)</strong> = diferencias con la versión actual,\n<strong>(ant)</strong> = diferencias con la versión anterior, <strong>m</strong> = edición menor",
        "history-fieldset-title": "Buscar en el historial",
        "history-show-deleted": "Solo ediciones ocultadas",
        "histfirst": "primeras",
        "history-feed-title": "Historial de revisiones",
        "history-feed-description": "Historial de revisiones para esta página en el wiki",
        "history-feed-item-nocomment": "$1 en $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.",
+       "history-feed-empty": "La página solicitada no existe.\nPuede que haya sido renombrada o borrada del wiki.\nPrueba a [[Special:Search|buscar en el wiki]] otras páginas relacionadas.",
        "rev-deleted-comment": "(resumen de edición eliminado)",
        "rev-deleted-user": "(nombre de usuario eliminado)",
        "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].",
-       "rev-deleted-text-unhide": "Esta revisión de la página ha sido '''borrada'''.\nPuede haber más detalles en el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de borrados].\nComo administrador todavía puedes [$1 ver esta revisión] si así lo deseas.",
-       "rev-suppressed-text-unhide": "Esta revisión de la página ha sido '''suprimida'''.\nPuede haber más detalles en el [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registro de supresiones].\nComo administrador podrá seguir [$1 viendo esta revisión] si desea continuar.",
-       "rev-deleted-text-view": "Esta revisión de la página ha sido '''borrada'''.\nAún tiene la posibilidad de verla; puede ampliar los detalles en el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de borrados].",
-       "rev-suppressed-text-view": "Esta revisión de la página ha sido '''suprimida'''.\nAún tiene la posibilidad de verla; puede ampliar los detalles en el [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registro de supresiones].",
-       "rev-deleted-no-diff": "No puedes ver esta diferencia porque una de las revisiones ha sido '''borrada'''.\nPuedes encontrar más detalles en el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de borrados].",
-       "rev-suppressed-no-diff": "No puedes ver esta diferencia porque una de las revisiones ha sido '''borrada'''.",
-       "rev-deleted-unhide-diff": "Una de las revisiones de esta diferencia ha sido '''borrada'''.\nPuede ampliar los detalles en el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de borrados].\nAún puede [$1 ver este cambio] si así lo desea.",
-       "rev-suppressed-unhide-diff": "Una de las revisiones de esta diferencia ha sido '''suprimida'''.\nPuede haber detalles en el [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registro de supresiones].\nAún puede [$1 ver esta diferencia] si desea así lo desea.",
-       "rev-deleted-diff-view": "Una de las revisiones de esta diferencia ha sido '''borrada'''.\nAún tiene la posibilidad de verla; puede ampliar los detalles en el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de borrados].",
-       "rev-suppressed-diff-view": "Una de las revisiones de esta diferencia ha sido '''suprimida'''.\nAún tiene la posibilidad de verla; puede ampliar los detalles en el [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registro de supresiones].",
+       "rev-deleted-text-permission": "Esta revisión ha sido <strong>eliminada</strong>.\nPara más información, consulta el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de borrados].",
+       "rev-suppressed-text-permission": "Esta revisión ha sido <strong>suprimida</strong>.\nPara más información, consulta el [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registro de supresiones].",
+       "rev-deleted-text-unhide": "Esta revisión ha sido <strong>eliminada</strong>.\nPara más información, consulta el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de borrados].\nComo administrador, aún puedes [$1 ver esta revisión] si lo deseas.",
+       "rev-suppressed-text-unhide": "Esta revisión ha sido <strong>suprimida</strong>.\nPara más información, consulta el [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registro de supresiones].\nComo supresor, aún puedes [$1 ver esta revisión] si lo deseas.",
+       "rev-deleted-text-view": "Esta revisión ha sido <strong>eliminada</strong>.\nAún tienes la posibilidad de verla. Para más información, consulta el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de borrados].",
+       "rev-suppressed-text-view": "Esta revisión ha sido <strong>suprimida</strong>.\nAún tienes la posibilidad de verla. Para más información, consulta el [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registro de supresiones].",
+       "rev-deleted-no-diff": "No puedes ver la diferencia porque una de las revisiones ha sido <strong>eliminada</strong>.\nPuedes encontrar más detalles en el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de borrados].",
+       "rev-suppressed-no-diff": "No puedes ver la diferencia porque una de las revisiones ha sido <strong>eliminada</strong>.",
+       "rev-deleted-unhide-diff": "Una de las revisiones ha sido <strong>eliminada</strong>.\nPara más información, consulta el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de borrados].\nAún puedes [$1 ver la diferencia] si lo deseas.",
+       "rev-suppressed-unhide-diff": "Una de las revisiones ha sido <strong>suprimida</strong>.\nPara más información, consulta el [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registro de supresiones].\nAún puedes [$1 ver la diferencia] si lo deseas.",
+       "rev-deleted-diff-view": "Una de las revisiones ha sido <strong>eliminada</strong>.\nAún tienes la posibilidad de verla. Para más información, consulta el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de borrados].",
+       "rev-suppressed-diff-view": "Una de las revisiones ha sido <strong>suprimida</strong>.\nAún tienes la posibilidad de verla. Para más información, consulta el [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registro de supresiones].",
        "rev-delundel": "mostrar/ocultar",
        "rev-showdeleted": "mostrar",
        "revisiondelete": "Borrar/restaurar revisiones",
-       "revdelete-nooldid-title": "No hay revisión destino",
-       "revdelete-nooldid-text": "No se ha especificado una revisión o revisiones destino sobre las que realizar esta función.",
+       "revdelete-nooldid-title": "La revisión destino es incorrecta",
+       "revdelete-nooldid-text": "Puede haber ocurrido lo siguiente: no se ha especificado una revisión destino sobre la que realizar esta función, la revisión especificada no existe, o estás intentando ocultar la revisión actual.",
        "revdelete-no-file": "El archivo especificado no existe.",
-       "revdelete-show-file-confirm": "¿Quieres ver la revisión borrada del archivo «<nowiki>$1</nowiki>» del $2 a las $3?",
+       "revdelete-show-file-confirm": "¿Seguro que quieres ver la revisión borrada del archivo «<nowiki>$1</nowiki>» del $2 a las $3?",
        "revdelete-show-file-submit": "Sí",
        "revdelete-selected-text": "{{PLURAL:$1|Revisión seleccionada|Revisiones seleccionadas}} de [[:$2]]:",
-       "revdelete-selected-file": "{{PLURAL:$1|Versión de archivo seleccionada|Versiones de archivo seleccionadas}} de [[:$2]]:",
-       "logdelete-selected": "{{PLURAL:$1|Seleccionado un evento|Seleccionados eventos}}:",
-       "revdelete-text-text": "Las revisiones eliminadas aún aparecerán en el historial de la página, pero parte de su contenido será inaccesible para el público.",
-       "revdelete-text-file": "Las versiones de los archivos eliminados aún aparecerán en el historial del archivo, pero partes de su contenido serán inaccesibles para el público.",
-       "logdelete-text": "Las revisiones eliminadas aún aparecerán en el historial de la página, pero parte de su contenido será inaccesible para el público.",
-       "revdelete-text-others": "Otros administradores aun serán capaces de acceder a los contenidos ocultos y restaurarlos, a menos que se establezcan restricciones adicionales.",
-       "revdelete-confirm": "Por favor confirma que deseas realizar la operación, que entiendes las consecuencias y que estás ejecutando dicha acción acorde con [[{{MediaWiki:Policy-url}}|las políticas]].",
-       "revdelete-suppress-text": "La herramienta de supresión '''solo''' debería usarse en los siguientes casos:\n* información potencialmente injuriosa o calumniante.\n* información personal inapropiada, tal como:\n*: ''nombres, domicilios, números de teléfono, números de la seguridad social e información análoga.''",
-       "revdelete-legend": "Establecer restricciones de revisión:",
+       "revdelete-selected-file": "{{PLURAL:$1|Versión seleccionada|Versiones seleccionadas}} de [[:$2]]:",
+       "logdelete-selected": "{{PLURAL:$1|Evento seleccionado|Eventos seleccionados}}:",
+       "revdelete-text-text": "Las revisiones eliminadas seguirán apareciendo en el historial de la página, pero parte de su contenido será inaccesible para el público.",
+       "revdelete-text-file": "Las versiones eliminadas seguirán apareciendo en el historial del archivo, pero partes de su contenido serán inaccesibles para el público.",
+       "logdelete-text": "Los eventos eliminados seguirán apareciendo en el registro, pero parte de su contenido será inaccesible para el público.",
+       "revdelete-text-others": "Los demás administradores podrán acceder al contenido oculto y restaurarlo, a menos que se establezcan restricciones adicionales.",
+       "revdelete-confirm": "Por favor confirma que deseas realizar la operación, que entiendes sus consecuencias y que realizas esta acción siguiendo [[{{MediaWiki:Policy-url}}|las políticas]].",
+       "revdelete-suppress-text": "La herramienta de supresión <strong>solo</strong> debería usarse en los siguientes casos:\n* información potencialmente injuriosa o calumniante.\n* información personal inapropiada, tal como:\n*: <em>nombres, domicilios, números de teléfono, números de identificación nacional e información análoga.</em>",
+       "revdelete-legend": "Establecer restricciones de visibilidad",
        "revdelete-hide-text": "Texto de la revisión",
        "revdelete-hide-image": "Ocultar el contenido del archivo",
-       "revdelete-hide-name": "Ocultar objetivo y parámetros.",
+       "revdelete-hide-name": "Ocultar la selección y sus 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",
+       "revdelete-hide-restricted": "Suprimir para todos los usuarios, incluidos administradores",
        "revdelete-radio-same": "(no cambiar)",
        "revdelete-radio-set": "Oculta",
        "revdelete-radio-unset": "Visible",
-       "revdelete-suppress": "Suprimir datos a los administradores así como al resto",
-       "revdelete-unsuppress": "Eliminar restricciones de revisiones restauradas",
+       "revdelete-suppress": "Suprimir para todos los usuarios, incluidos administradores",
+       "revdelete-unsuppress": "Eliminar restricciones de las revisiones restauradas",
        "revdelete-log": "Motivo:",
        "revdelete-submit": "Aplicar a {{PLURAL:$1|la revisión seleccionada|las revisiones seleccionadas}}",
-       "revdelete-success": "'''La visibilidad de revisiones ha sido cambiada correctamente.'''",
-       "revdelete-failure": "'''La visibilidad de la revisión no pudo ser establecida:'''\n$1",
-       "logdelete-success": "Visibilidad de eventos cambiada correctamente.",
-       "logdelete-failure": "'''La visibilidad del registro no pudo ser ajustada:'''\n$1",
-       "revdel-restore": "cambiar visibilidad",
+       "revdelete-success": "<strong>Se ha cambiado con éxito la visibilidad de las revisiones.</strong>",
+       "revdelete-failure": "<strong>No se ha podido cambiar la visibilidad de las revisiones:</strong>\n$1",
+       "logdelete-success": "<strong>Se ha cambiado con éxito la visibilidad de los eventos.</strong>",
+       "logdelete-failure": "<strong>No se ha podido cambiar la visibilidad de los eventos:'''\n$1",
+       "revdel-restore": "mostrar/ocultar",
        "pagehist": "Historial de la página",
        "deletedhist": "Historial borrado",
-       "revdelete-hide-current": "Error al ocultar el objeto de fecha $1 a las $2: es la revisión actual.\nNo puede ser ocultada.",
-       "revdelete-show-no-access": "Error mostrando el objeto de fecha $2, $1: este objeto ha sido marcado como \"restringido\".\nNo tiene acceso a él.",
-       "revdelete-modify-no-access": "Error modificando el objeto de fecha $2, $1: este objeto ha sido marcado como \"restringido\".\nNo tiene acceso a él.",
-       "revdelete-modify-missing": "Error modificando el objeto ID $1: ¡no se encuentra en la base de datos!",
-       "revdelete-no-change": "'''Atención:''' la revisión de fecha $1 a las $2 ya tiene las restricciones de visibilidad solicitadas.",
-       "revdelete-concurrent-change": "Error modificando el objeto de fecha $2, $1: su estado parece haber sido cambiado por alguien más cuando tratabas de modificarlo. Por favor verifica los registros.",
-       "revdelete-only-restricted": "Error ocultando el item de fecha $2, $1: no puedes suprimir elementos de vista de los administradores sin seleccionar asímismo una de las otras opciones de visibilidad.",
-       "revdelete-reason-dropdown": "*Razones de borrado comunes\n** Violación a los derechos de autor\n** Comentario o información personal inapropiados\n** Nombre de usuario inapropiado\n** Información potencialmente injuriosa o calumniante",
+       "revdelete-hide-current": "Error al ocultar la revisión del $1 a las $2: es la revisión actual y no se puede ocultar.",
+       "revdelete-show-no-access": "Error al mostrar el elemento del $1 a las $2: este elemento ha sido marcado como \"restringido\", por tanto no tienes acceso a él.",
+       "revdelete-modify-no-access": "Error al modificar el elemento del $1 a las $2: este elemento ha sido marcado como \"restringido\", por tanto no tienes acceso a él.",
+       "revdelete-modify-missing": "Error al modificar el elemento con ID $1: no se ha encontrado en la base de datos.",
+       "revdelete-no-change": "<strong>Atención:<strong> la revisión del $1 a las $2 ya tiene las restricciones de visibilidad seleccionadas.",
+       "revdelete-concurrent-change": "Error al modificar el elemento del $1 a las $2: parece que otro usuario cambió su estado mientras tratabas de modificarlo. Por favor, revisa el registro.",
+       "revdelete-only-restricted": "Error al ocultar el elemento del $1 a las $2: no puedes suprimir elementos de cara a los administradores sin seleccionar al mismo tiempo otra de las opciones de visibilidad.",
+       "revdelete-reason-dropdown": "*Razones de borrado más comunes\n** Violación de los derechos de autor\n** Información personal o comentarios inapropiados\n** Nombre de usuario inapropiado\n** Información potencialmente injuriosa o calumniante",
        "revdelete-otherreason": "Otro motivo:",
        "revdelete-reasonotherlist": "Otro motivo",
        "revdelete-edit-reasonlist": "Editar motivos de borrado",
        "revdelete-offender": "Autor de la revisión:",
        "suppressionlog": "Registro de supresiones",
-       "suppressionlogtext": "A continuación hay una lista con los borrados y bloqueos cuyo contenido se encuentra oculto para los administradores.\nVéase la [[Special:BlockList|lista de bloqueos]] que incluye las prohibiciones y bloqueos actualmente operativos.",
-       "mergehistory": "Fusionar historiales de páginas",
-       "mergehistory-header": "Esta página te permite fusionar revisiones del historial de una página origen en otra más reciente.\nAsegúrate de que esto mantendrá la continuidad histórica de la página.",
+       "suppressionlogtext": "A continuación se muestra una lista de borrados y bloqueos relacionados con contenido oculto para los administradores.\nVéase la [[Special:BlockList|lista de bloqueos]], que incluye las prohibiciones y bloqueos actualmente activos.",
+       "mergehistory": "Fusionar historiales",
+       "mergehistory-header": "Esta página te permite fusionar revisiones del historial de una página origen con los de otra más reciente.\nAsegúrate de que los cambios mantendrán la continuidad histórica de la página.",
        "mergehistory-box": "Fusionar los historiales de dos páginas:",
        "mergehistory-from": "Página origen:",
        "mergehistory-into": "Página destino:",
        "mergehistory-list": "Historial de ediciones fusionable",
-       "mergehistory-merge": "Las siguientes revisiones de [[:$1]] pueden fusionarse en [[:$2]].\nUsa la columna de casillas para fusionar sólo las revisiones creadas en y antes de la fecha especificada.\nNota que usar los enlaces de navegación borrará las selecciones de esta columna.",
+       "mergehistory-merge": "Las siguientes revisiones de [[:$1]] pueden fusionarse con las de [[:$2]].\nUsa la columna de casillas para fusionar sólo las revisiones creadas en y antes de la fecha especificada.\nTen en cuenta que si cambias de página, se borrará la selección actual de esta columna.",
        "mergehistory-go": "Mostrar ediciones fusionables",
        "mergehistory-submit": "Fusionar revisiones",
        "mergehistory-empty": "No hay revisiones fusionables.",
-       "mergehistory-success": "Se {{PLURAL:$3|fusionó $3 revisión|fusionaron $3 revisiones}} de «[[:$1]]» en «[[:$2]]» correctamente.",
+       "mergehistory-success": "Se {{PLURAL:$3|fusionó una revisión|fusionaron $3 revisiones}} de «[[:$1]]» en «[[:$2]]» correctamente.",
        "mergehistory-fail": "No se puede realizar la fusión de historiales, por favor revisa la página y los parámetros de tiempo.",
        "mergehistory-fail-toobig": "No se puede fusionar el historial ya que más del límite de $1 {{PLURAL:$1|revisión|revisiones}} se moverían.",
        "mergehistory-no-source": "La página origen $1 no existe.",
        "mergehistory-no-destination": "La página destino $1 no existe.",
-       "mergehistory-invalid-source": "La página origen debe tener un título válido.",
-       "mergehistory-invalid-destination": "La página de destino ha de tener un título válido.",
-       "mergehistory-autocomment": "Fusionando [[:$1]] en [[:$2]]",
-       "mergehistory-comment": "Fusionando [[:$1]] en [[:$2]]: $3",
-       "mergehistory-same-destination": "Las páginas de origen y destino no pueden ser la misma",
+       "mergehistory-invalid-source": "La página origen ha de tener un título válido.",
+       "mergehistory-invalid-destination": "La página destino ha de tener un título válido.",
+       "mergehistory-autocomment": "Se ha fusionado [[:$1]] en [[:$2]]",
+       "mergehistory-comment": "Se ha fusionado [[:$1]] en [[:$2]]: $3",
+       "mergehistory-same-destination": "Las páginas origen y destino no pueden ser la misma",
        "mergehistory-reason": "Motivo:",
        "mergelog": "Registro de fusiones",
        "revertmerge": "Deshacer fusión",
-       "mergelogpagetext": "Debajo está una lista de las fusiones más recientes de historial de una página en otra.",
+       "mergelogpagetext": "A continuación se muestra una lista de las fusiones de historiales más recientes.",
        "history-title": "Historial de revisiones de «$1»",
        "difference-title": "Diferencia entre revisiones de «$1»",
        "difference-title-multipage": "Diferencia entre las páginas «$1» y «$2»",
        "difference-multipage": "(Diferencia entre las páginas)",
        "lineno": "Línea $1:",
-       "compareselectedversions": "Comparar versiones seleccionadas",
-       "showhideselectedversions": "Mostrar/ocultar versiones seleccionadas",
+       "compareselectedversions": "Comparar revisiones seleccionadas",
+       "showhideselectedversions": "Mostrar/ocultar revisiones seleccionadas",
        "editundo": "deshacer",
        "diff-empty": "(Sin diferencias)",
        "diff-multi-sameuser": "(No se {{PLURAL:$1|muestra una edición intermedia|muestran $1 ediciones intermedias}} del mismo usuario)",
-       "diff-multi-otherusers": "(No se {{PLURAL:$1|muestra una edición intermedia|muestran $1 ediciones intermedias}} de {{PLURAL:$2|un usuario|$2 usuarios}})",
-       "diff-multi-manyusers": "(No se {{PLURAL:$1|muestra una edición intermedia|muestran $1 ediciones intermedias}} de {{PLURAL:$2|un usuario|$2 usuarios}})",
-       "difference-missing-revision": "No {{PLURAL:$2|se ha encontrado|se han encontrado}} {{PLURAL:$2|una revisión|$2 revisiones}} de esta diferencia ($1).\n\nEsto suele deberse a seguir un enlace obsoleto hacia una página que ya ha sido borrada.\nLos detalles pueden encontrarse en el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de borrado].",
+       "diff-multi-otherusers": "(No se {{PLURAL:$1|muestra una edición intermedia|muestran $1 ediciones intermedias}} de {{PLURAL:$2|otro usuario|$2 usuarios}})",
+       "diff-multi-manyusers": "(No se {{PLURAL:$1|muestra una edición intermedia|muestran $1 ediciones intermedias}} de más de {{PLURAL:$2|un usuario|$2 usuarios}})",
+       "difference-missing-revision": "No {{PLURAL:$2|se ha encontrado|se han encontrado}} {{PLURAL:$2|una revisión|$2 revisiones}} de la comparación solicitada ($1).\n\nLa causa de esto suele ser un enlace obsoleto hacia una página que ya ha sido borrada.\nPara más información, consulta el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de borrados].",
        "searchresults": "Resultados de la búsqueda",
        "searchresults-title": "Resultados de la búsqueda de «$1»",
-       "titlematches": "Coincidencias de título de artículo",
-       "textmatches": "Coincidencias de texto de artículo",
-       "notextmatches": "No hay coincidencias de texto de artículo",
-       "prevn": "{{PLURAL:$1|$1}} previas",
+       "titlematches": "Resultados por título de página",
+       "textmatches": "Resultados por texto de página",
+       "notextmatches": "No hay resultados por texto de página",
+       "prevn": "$1 {{PLURAL:$1|anterior|anteriores}}",
        "nextn": "{{PLURAL:$1|$1}} siguientes",
-       "prevn-title": "$1 {{PLURAL:$1|resultado|resultados}} previos",
-       "nextn-title": "Próximos $1 {{PLURAL:$1|resultado|resultados}}",
+       "prevn-title": "$1 {{PLURAL:$1|resultado anterior|resultados anteriores}}",
+       "nextn-title": "$1 {{PLURAL:$1|resultado siguiente|resultados siguientes}}",
        "shown-title": "Mostrar $1 {{PLURAL:$1|resultado|resultados}} por página",
        "viewprevnext": "Ver ($1 {{int:pipe-separator}} $2) ($3).",
-       "searchmenu-exists": "<strong>Hay una página llamada «[[:$1]]» en este wiki.</strong> {{PLURAL:$2|0=|Véase también los otros resultados de búsqueda encontrados.}}",
-       "searchmenu-new": "<strong>Crear la página «[[:$1]]» en este wiki.</strong> {{PLURAL:$2|0=|Véase también la página encontrada con la búsqueda.|Véanse también los resultados de la búsqueda.}}",
+       "searchmenu-exists": "<strong>Hay una página llamada «[[:$1]]» en este wiki.</strong> {{PLURAL:$2|0=|Véanse también los demás resultados de la búsqueda.}}",
+       "searchmenu-new": "<strong>Crear la página «[[:$1]]» en este wiki.</strong> {{PLURAL:$2|0=|Véase también la página encontrada.|Véanse también los resultados de la búsqueda.}}",
        "searchprofile-articles": "Páginas de contenido",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Todo",
        "search-relatedarticle": "Relacionado",
        "searchrelated": "relacionado",
        "searchall": "todos",
-       "showingresults": "Abajo se {{PLURAL:$1|muestra '''1''' resultado|muestran hasta '''$1''' resultados}} comenzando por el n.º '''$2'''.",
-       "showingresultsinrange": "Abajo se muestran hasta {{PLURAL:$1|<strong>1</strong> resultado|<strong>$1</strong> resultados}} en el rango #<strong>$2</strong> hasta #<strong>$3</strong>.",
+       "showingresults": "Abajo se {{PLURAL:$1|muestra <strong>1</strong> resultado|muestran hasta <strong>$1</strong> resultados}} comenzando por el n.º <strong>$2</strong>.",
+       "showingresultsinrange": "Abajo se muestran hasta {{PLURAL:$1|<strong>1</strong> resultado|<strong>$1</strong> resultados}} entre el n.º <strong>$2</strong> y el n.º <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": "No hay resultados que cumplan los criterios de búsqueda.",
        "powersearch-legend": "Búsqueda avanzada",
        "powersearch-togglenone": "Ninguno",
        "powersearch-remember": "Recordar la selección en búsquedas futuras",
        "search-external": "Búsqueda externa",
-       "searchdisabled": "Las búsquedas en {{SITENAME}} están temporalmente desactivadas.\nMientras tanto puedes buscar mediante Google, pero ten en cuenta que sus índices relativos a {{SITENAME}} pueden estar desactualizados.",
+       "searchdisabled": "Las búsquedas en {{SITENAME}} están desactivadas.\nMientras tanto puedes buscar mediante Google, pero ten en cuenta que sus índices relativos a {{SITENAME}} pueden estar desactualizados.",
        "search-error": "Ha ocurrido un error al buscar: $1",
        "preferences": "Preferencias",
        "mypreferences": "Preferencias",
        "prefsnologintext2": "Es necesario acceder para cambiar las preferencias del usuario.",
        "prefs-skin": "Apariencia",
        "skin-preview": "Previsualizar",
-       "datedefault": "Sin preferencia",
-       "prefs-labs": "Características de los laboratorios",
+       "datedefault": "Ninguno en particular",
+       "prefs-labs": "Características de Labs",
        "prefs-user-pages": "Páginas de usuario",
        "prefs-personal": "Perfil de usuario",
        "prefs-rc": "Cambios recientes",
        "prefs-watchlist": "Seguimiento",
+       "prefs-editwatchlist": "Editar lista de seguimiento",
+       "prefs-editwatchlist-label": "Editar entradas de tu lista de seguimiento:",
+       "prefs-editwatchlist-edit": "Ver y quitar los títulos de tu lista de seguimiento",
+       "prefs-editwatchlist-raw": "Editar tu lista de seguimiento en modo texto",
+       "prefs-editwatchlist-clear": "Limpiar tu lista de seguimiento",
        "prefs-watchlist-days": "Número de días a mostrar en la lista de seguimiento:",
        "prefs-watchlist-days-max": "Máximo $1 {{PLURAL:$1|día|días}}",
-       "prefs-watchlist-edits": "Número de ediciones a mostrar en la lista expandida:",
+       "prefs-watchlist-edits": "Número máximo de ediciones a mostrar en la lista expandida:",
        "prefs-watchlist-edits-max": "Cantidad máxima: 1000",
-       "prefs-watchlist-token": "Ficha de lista de seguimiento:",
+       "prefs-watchlist-token": "Clave de lista de seguimiento:",
        "prefs-misc": "Miscelánea",
        "prefs-resetpass": "Cambiar contraseña",
-       "prefs-changeemail": "Cambiar correo electrónico",
+       "prefs-changeemail": "Cambiar la dirección de correo electrónico",
        "prefs-setemail": "Establecer una dirección de correo electrónico",
        "prefs-email": "Opciones de correo electrónico",
        "prefs-rendering": "Apariencia",
        "rows": "Filas:",
        "columns": "Columnas:",
        "searchresultshead": "Búsquedas",
-       "stub-threshold": "Límite para formato de <a href=\"#\" class=\"stub\">enlace a esbozo</a> (bytes):",
+       "stub-threshold": "Límite para cambiar a formato de <a href=\"#\" class=\"stub\">enlace a esbozo</a> (en bytes):",
        "stub-threshold-disabled": "Desactivado",
        "recentchangesdays": "Días que mostrar en Cambios recientes:",
        "recentchangesdays-max": "(máximo {{PLURAL:$1|un día|$1 días}})",
        "recentchangescount": "N.º de ediciones que mostrar de manera predeterminada:",
        "prefs-help-recentchangescount": "Esto incluye cambios recientes, historiales de página, y registros.",
-       "prefs-help-watchlist-token2": "Esta es la clave secreta para el canal de contenido web de tu lista de seguimiento.\nCualquier persona que la conozca podría leer tu lista, así que no la compartas.\n[[Special:ResetTokens|Pulsa aquí si necesitas restablecerla]].",
+       "prefs-help-watchlist-token2": "Esta es la clave secreta del canal de suscripción de tu lista de seguimiento.\nCualquier persona que la conozca podría leer tu lista, así que no la compartas.\n[[Special:ResetTokens|Pulsa aquí si necesitas restablecerla]].",
        "savedprefs": "Se han guardado tus preferencias.",
        "timezonelegend": "Huso horario:",
        "localtime": "Hora local:",
        "timezoneuseserverdefault": "Usar la hora del servidor ($1)",
-       "timezoneuseoffset": "Otra (especifica la diferencia horaria)",
+       "timezoneuseoffset": "Otro (especifica la diferencia horaria)",
        "servertime": "Hora del servidor:",
-       "guesstimezone": "Rellenar a partir de la hora del navegador",
+       "guesstimezone": "Obtener del navegador",
        "timezoneregion-africa": "África",
        "timezoneregion-america": "América",
        "timezoneregion-antarctica": "Antártida",
        "prefs-files": "Archivos",
        "prefs-custom-css": "CSS personalizado",
        "prefs-custom-js": "JavaScript personalizado",
-       "prefs-common-css-js": "CSS/JS compartido para todas las skins:",
-       "prefs-reset-intro": "Puedes usar esta página para restaurar tus preferencias a las predeterminadas del sitio.\nEsto no se puede deshacer.",
+       "prefs-common-css-js": "CSS/JavaScript compartido para todas las apariencias:",
+       "prefs-reset-intro": "Puedes usar esta página para restaurar los valores predeterminados de tus preferencias.\nNo podrás deshacer esta acción.",
        "prefs-emailconfirm-label": "Confirmación de correo electrónico:",
        "youremail": "Correo electrónico:",
        "username": "{{GENDER:$1|Nombre de usuario|Nombre de usuaria}}:",
        "yourvariant": "Variante lingüística del contenido:",
        "prefs-help-variant": "Tu variante u ortografía preferida para mostrar las páginas de contenido de este wiki.",
        "yournick": "Firma nueva:",
-       "prefs-help-signature": "Los comentarios en páginas de discusión deberían firmarse con «<nowiki>~~~~</nowiki>», que se convertirá en tu firma con fecha y hora.",
+       "prefs-help-signature": "Deberías firmar tus comentarios en páginas de discusión con «<nowiki>~~~~</nowiki>», que se convertirá en tu firma acompañada de la fecha y hora.",
        "badsig": "El código de tu firma no es válido; comprueba las etiquetas HTML.",
        "badsiglength": "Tu firma es muy larga.\nDebe contener un máximo de {{PLURAL:$1|un carácter|$1 caracteres}}.",
        "yourgender": "Sexo:",
        "gender-unknown": "Prefiero no especificarlo",
        "gender-male": "Masculino",
        "gender-female": "Femenino",
-       "prefs-help-gender": "Opcional: el software utiliza esta preferencia para dirigirse a ti con el género gramatical apropiado. Esta información es pública.",
+       "prefs-help-gender": "Este campo es opcional. El software lo utiliza para dirigirse a ti con el género gramatical apropiado. Esta información será pública.",
        "email": "Correo electrónico",
        "prefs-help-realname": "El nombre real es opcional. Si lo proporcionas, se usará para dar atribución a tu trabajo.",
        "prefs-help-email": "La dirección de correo electrónico es opcional, pero es necesaria para el restablecimiento de tu contraseña, en caso de que la olvides.",
        "prefs-displaywatchlist": "Opciones de visualización",
        "prefs-tokenwatchlist": "Clave",
        "prefs-diffs": "Diferencias",
-       "prefs-help-prefershttps": "Esta preferencia tendrá efecto en tu próximo inicio de sesión.",
+       "prefs-help-prefershttps": "Los cambios surtirán efecto en tu próximo inicio de sesión.",
        "prefswarning-warning": "Has hecho cambios en tus preferencias que todavía no se han guardado. Si sales de esta página sin pulsar en «$1» no se actualizarán las preferencias.",
        "prefs-tabs-navigation-hint": "Sugerencia: Puede utilizar las teclas de flecha izquierda y derecha para navegar entre las pestañas de la lista de pestañas.",
        "email-address-validity-valid": "La dirección de correo electrónico parece ser válida",
        "email-address-validity-invalid": "Introduce una dirección de correo válida",
-       "userrights": "Gestión de permisos del usuario",
+       "userrights": "Gestión de permisos de usuario",
        "userrights-lookup-user": "Configurar grupos de usuarios",
-       "userrights-user-editname": "Escriba un nombre de usuario:",
-       "editusergroup": "Modificar grupos de usuarios",
-       "editinguser": "Cambiando los derechos del usuario '''[[User:$1|$1]]''' $2",
-       "userrights-editusergroup": "Modificar grupos de usuarios",
-       "saveusergroups": "Guardar grupos de usuarios",
+       "userrights-user-editname": "Escribe un nombre de usuario:",
+       "editusergroup": "Modificar grupos del usuario",
+       "editinguser": "Cambio de los permisos del usuario <strong>[[User:$1|$1]]</strong> $2",
+       "userrights-editusergroup": "Modificar grupos del usuario",
+       "saveusergroups": "Guardar grupos del usuario",
        "userrights-groupsmember": "Miembro de:",
        "userrights-groupsmember-auto": "Miembro implícito de:",
        "userrights-groups-help": "Puedes modificar los grupos a los que pertenece {{GENDER:$1|este usuario|esta usuaria}}:\n* Un recuadro marcado significa que {{GENDER:$1|el usuario|la usuaria}} está en ese grupo.\n* Un recuadro no marcado significa que {{GENDER:$1|el usuario|la usuaria}} no está en ese grupo.\n* Un * indica que no podrás eliminar el grupo una vez que lo agregues, o viceversa.",
        "userrights-no-interwiki": "No tienes permiso para editar los grupos a los que pertenece un usuario en otros wikis.",
        "userrights-nodatabase": "La base de datos $1 no existe o no es local.",
        "userrights-nologin": "Debes [[Special:UserLogin|iniciar sesión]] con una cuenta de administrador para poder editar los grupos de los usuarios.",
-       "userrights-notallowed": "No tienes permiso para agregar o quitar derechos de usuario.",
+       "userrights-notallowed": "No tienes permiso para añadir o quitar permisos de usuario.",
        "userrights-changeable-col": "Grupos que puedes cambiar",
        "userrights-unchangeable-col": "Grupos que no puedes cambiar",
-       "userrights-conflict": "¡Conflicto de cambio de los derechos de usuario! Por favor, revisar y confirmar tus cambios.",
-       "userrights-removed-self": "Usted eliminado con éxito sus propios derechos. Por lo tanto, usted ya no es capaz de acceder a esta página.",
+       "userrights-conflict": "¡Conflicto de cambio de los permisos de usuario! Por favor, revisa y confirma tus cambios.",
+       "userrights-removed-self": "Has eliminado con éxito tus propios permisos. Por tanto, ya no podrás volver a acceder a esta página.",
        "group": "Grupo:",
        "group-user": "Usuarios",
        "group-autoconfirmed": "Usuarios autoconfirmados",
        "group-bot": "Bots",
        "group-sysop": "Administradores",
        "group-bureaucrat": "Burócratas",
-       "group-suppress": "Supresores de ediciones",
+       "group-suppress": "Supresores",
        "group-all": "(todos)",
        "group-user-member": "{{GENDER:$1|usuario|usuaria}}",
        "group-autoconfirmed-member": "{{GENDER:$1|usuario autoconfirmado|usuaria autoconfirmada}}",
        "group-bot-member": "bot",
        "group-sysop-member": "{{GENDER:$1|administrador|administradora}}",
        "group-bureaucrat-member": "burócrata",
-       "group-suppress-member": "{{GENDER:$1|supresor|supresora}} de ediciones",
+       "group-suppress-member": "{{GENDER:$1|supresor|supresora}}",
        "grouppage-user": "{{ns:project}}:Usuarios",
        "grouppage-autoconfirmed": "{{ns:project}}:Usuarios autoconfirmados",
        "grouppage-bot": "{{ns:project}}:Bots",
        "grouppage-sysop": "{{ns:project}}:Administradores",
        "grouppage-bureaucrat": "{{ns:project}}:Burócratas",
-       "grouppage-suppress": "{{ns:project}}:Supresores de ediciones",
+       "grouppage-suppress": "{{ns:project}}:Supresores",
        "right-read": "Leer páginas",
        "right-edit": "Editar páginas",
-       "right-createpage": "Crear páginas que no sean páginas de discusión",
+       "right-createpage": "Crear páginas que no sean de discusión",
        "right-createtalk": "Crear páginas de discusión",
        "right-createaccount": "Crear cuentas de usuario nuevas",
        "right-minoredit": "Marcar ediciones como menores",
        "right-move": "Trasladar páginas",
        "right-move-subpages": "Trasladar páginas con sus subpáginas",
-       "right-move-rootuserpages": "Trasladar páginas de usuario raíz",
-       "right-move-categorypages": "Trasladar páginas de categoría",
+       "right-move-rootuserpages": "Trasladar páginas raíz de usuario",
+       "right-move-categorypages": "Trasladar categorías",
        "right-movefile": "Trasladar archivos",
-       "right-suppressredirect": "No crear redirecciones de las páginas fuente  al trasladar páginas",
+       "right-suppressredirect": "Trasladar páginas sin dejar redirección",
        "right-upload": "Subir archivos",
        "right-reupload": "Subir una nueva versión de un archivo existente",
        "right-reupload-own": "Subir una nueva versión de un archivo creado por uno mismo",
-       "right-reupload-shared": "Sobreescribir localmente ficheros del repositorio multimedia",
+       "right-reupload-shared": "Sobreescribir localmente archivos del repositorio multimedia",
        "right-upload_by_url": "Subir un archivo a traves de un URL",
        "right-purge": "Purgar la caché en el servidor sin tener que dar confirmación",
-       "right-autoconfirmed": "No ser afectado por los límites de frecuencia basados en el IP",
+       "right-autoconfirmed": "No resultar afectado por los límites de frecuencia de edición para las IP",
        "right-bot": "Ser tratado como un programa automático",
-       "right-nominornewtalk": "No accionar el aviso de nuevos mensajes al realizar ediciones menores de páginas de discusión",
-       "right-apihighlimits": "Tener límites más altos de peticiones a través del API",
-       "right-writeapi": "Hacer uso del API para escribir",
+       "right-nominornewtalk": "No accionar el aviso de mensajes nuevos al realizar ediciones menores en páginas de discusión",
+       "right-apihighlimits": "Tener límites más altos para las peticiones a través de la API",
+       "right-writeapi": "Hacer uso de la API de escritura",
        "right-delete": "Borrar páginas",
        "right-bigdelete": "Borrar páginas con historiales grandes",
        "right-deletelogentry": "Borrar y recuperar entradas de registro específicas",
        "right-deleterevision": "Borrar y restaurar revisiones específicas de páginas",
-       "right-deletedhistory": "Ver el historial de páginas borradas, sin el texto asociado",
-       "right-deletedtext": "Ver texto borrado y cambios entre revisiones borradas",
+       "right-deletedhistory": "Ver el historial de páginas borradas sin su texto asociado",
+       "right-deletedtext": "Ver texto borrado y los cambios entre revisiones borradas",
        "right-browsearchive": "Buscar páginas borradas",
        "right-undelete": "Restaurar una página",
        "right-suppressrevision": "Ver, ocultar y mostrar revisiones específicas de páginas de cualquier usuario",
        "right-block": "Bloquear a otros usuarios para que no editen",
        "right-blockemail": "Bloquear a un usuario para que no pueda mandar correos electrónicos",
        "right-hideuser": "Bloquear un nombre de usuario, haciéndolo invisible",
-       "right-ipblock-exempt": "Pasar por encima de bloqueos de IPs, auto-bloqueos y bloqueos de rangos.",
-       "right-proxyunbannable": "Pasar por encima de bloqueos automáticos de proxies",
-       "right-unblockself": "Desbloquearse uno mismo",
+       "right-ipblock-exempt": "Quedar exento de bloqueos a IPs, autobloqueos y bloqueos de rango.",
+       "right-proxyunbannable": "Quedar exento de bloqueos automáticos a proxies",
+       "right-unblockself": "Desbloquearse a sí mismo",
        "right-protect": "Cambiar niveles de protección y editar páginas protegidas en cascada",
        "right-editprotected": "Editar páginas protegidas como «{{int:protect-level-sysop}}»",
        "right-editsemiprotected": "Editar páginas protegidas como «{{int:protect-level-autoconfirmed}}»",
        "right-editusercssjs": "Editar las páginas de CSS y JavaScript de otros usuarios",
        "right-editusercss": "Editar las páginas de CSS de otros usuarios",
        "right-edituserjs": "Editar las páginas de JavaScript de otros usuarios",
-       "right-editmyusercss": "Editar tus archivos de usuario CSS",
-       "right-editmyuserjs": "Editar tus propios archivos JavaScript de usuario",
+       "right-editmyusercss": "Editar tus páginas de CSS",
+       "right-editmyuserjs": "Editar tus páginas de JavaScript",
        "right-viewmywatchlist": "Ver tu lista de seguimiento",
        "right-editmywatchlist": "Editar tu lista de seguimiento. Algunas acciones seguirán agregando páginas aún sin este derecho.",
-       "right-viewmyprivateinfo": "Ver tu información privada (ej. email, nombre real)",
-       "right-editmyprivateinfo": "Editar tus propios datos privados (ej: email, nombre real)",
-       "right-editmyoptions": "Editar tus propias preferencias",
+       "right-viewmyprivateinfo": "Ver tu información privada (ej. correo electrónico, nombre real)",
+       "right-editmyprivateinfo": "Editar tu información privada (ej: correo electrónico, nombre real)",
+       "right-editmyoptions": "Editar tus preferencias",
        "right-rollback": "Revertir rápidamente las ediciones del último usuario que modificó una página en particular",
-       "right-markbotedits": "Marcar ediciones deshechas como ediciones de un bot",
-       "right-noratelimit": "No afectado por límites de frecuencia",
+       "right-markbotedits": "Marcar ediciones revertidas como ediciones de bot",
+       "right-noratelimit": "No resultar afectado por los límites de frecuencia de edición",
        "right-import": "Importar páginas desde otras wikis",
-       "right-importupload": "Importar páginas de un archivo subido",
-       "right-patrol": "Marcar ediciones de otros como patrulladas",
-       "right-autopatrol": "Marcar como patrulladas sus ediciones automáticamente",
-       "right-patrolmarks": "Ver las marcas de patrullaje de cambios recientes",
+       "right-importupload": "Importar páginas desde un archivo",
+       "right-patrol": "Marcar ediciones de otros como verificadas",
+       "right-autopatrol": "Tener automáticamente marcadas como verificadas las ediciones propias",
+       "right-patrolmarks": "Ver las marcas de verificación de cambios recientes",
        "right-unwatchedpages": "Ver una lista de páginas no vigiladas",
        "right-mergehistory": "Fusionar historiales",
-       "right-userrights": "Modificar todos los derechos de usuario",
-       "right-userrights-interwiki": "Modificar los derechos de usuarios en otros wikis",
+       "right-userrights": "Modificar todos los permisos de usuario",
+       "right-userrights-interwiki": "Modificar los permisos de usuario en otros wikis",
        "right-siteadmin": "Bloquear y desbloquear la base de datos",
-       "right-override-export-depth": "Exporta páginas incluyendo aquellas enlazadas hasta una profundidad de 5",
-       "right-sendemail": "Enviar un correo electrónico a otros usuarios",
-       "right-passwordreset": "Ver os correos electrónicos de restablecimiento de contraseñas",
+       "right-override-export-depth": "Exportar páginas, incluyendo aquellas enlazadas hasta una profundidad de 5",
+       "right-sendemail": "Enviar correo electrónico a otros usuarios",
+       "right-passwordreset": "Ver los mensajes de restablecimiento de contraseña",
+       "right-managechangetags": "Crear y eliminar [[Special:Tags|etiquetas]] en la base de datos",
        "newuserlogpage": "Registro de creación de usuarios",
        "newuserlogpagetext": "Este es un registro de creación de usuarios.",
        "rightslog": "Cambios de perfil de usuario",
        "action-createpage": "crear páginas",
        "action-createtalk": "crear páginas de discusión",
        "action-createaccount": "crear esta cuenta de usuario",
-       "action-history": "Ver el historial de esta página",
+       "action-history": "ver el historial de esta página",
        "action-minoredit": "marcar este cambio como menor",
        "action-move": "trasladar esta página",
        "action-move-subpages": "trasladar esta página y sus subpáginas",
-       "action-move-rootuserpages": "trasladar páginas de usuario raíz",
-       "action-move-categorypages": "trasladar páginas de categoría",
+       "action-move-rootuserpages": "trasladar páginas raíz de usuario",
+       "action-move-categorypages": "trasladar categorías",
        "action-movefile": "trasladar este archivo",
        "action-upload": "subir este archivo",
        "action-reupload": "reemplazar este archivo existente",
        "action-reupload-shared": "reemplazar este archivo existente en un depósito compartido",
        "action-upload_by_url": "subir este archivo desde una dirección URL",
-       "action-writeapi": "utilizar el API de escritura",
+       "action-writeapi": "utilizar la API de escritura",
        "action-delete": "borrar esta página",
        "action-deleterevision": "borrar esta revisión",
        "action-deletedhistory": "ver el historial borrado de esta página",
        "action-browsearchive": "buscar páginas borradas",
        "action-undelete": "recuperar esta página",
-       "action-suppressrevision": "revisar y restaurar esta revisión escondida",
+       "action-suppressrevision": "revisar y restaurar esta revisión oculta",
        "action-suppressionlog": "ver este registro privado",
        "action-block": "bloquear a este usuario para que no edite",
        "action-protect": "cambiar los niveles de protección para esta página",
        "action-rollback": "revertir rápidamente las ediciones del último usuario que modificó una página en particular",
        "action-import": "importar páginas desde otro wiki",
        "action-importupload": "importar páginas mediante la carga de un archivo",
-       "action-patrol": "marcar ediciones de otros como patrulladas",
-       "action-autopatrol": "marcar como patrulladas tus propias ediciones",
+       "action-patrol": "marcar ediciones de otros como verificadas",
+       "action-autopatrol": "tener tus ediciones marcadas como verificadas",
        "action-unwatchedpages": "ver la lista de páginas no vigiladas",
        "action-mergehistory": "fusionar el historial de esta página",
-       "action-userrights": "modificar todos los derechos de usuario",
-       "action-userrights-interwiki": "modificar los derechos de usuarios en otros wikis",
+       "action-userrights": "modificar todos los permisos de usuario",
+       "action-userrights-interwiki": "modificar los permisos de los usuarios en otros wikis",
        "action-siteadmin": "bloquear o desbloquear la base de datos",
        "action-sendemail": "enviar correos electrónicos",
-       "action-editmywatchlist": "Editar tu lista de seguimiento",
-       "action-viewmywatchlist": "Ver tu lista de seguimiento",
+       "action-editmywatchlist": "editar tu lista de seguimiento",
+       "action-viewmywatchlist": "ver tu lista de seguimiento",
        "action-viewmyprivateinfo": "ver tu información privada",
-       "action-editmyprivateinfo": "Editar tu información privada",
+       "action-editmyprivateinfo": "editar tu información privada",
        "action-editcontentmodel": "editar el modelo de contenido de una página",
+       "action-managechangetags": "crear y eliminar etiquetas en la base de datos",
        "nchanges": "$1 {{PLURAL:$1|cambio|cambios}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|desde la última visita}}",
        "enhancedrc-history": "historial",
        "recentchanges": "Cambios recientes",
        "recentchanges-legend": "Opciones sobre cambios recientes",
        "recentchanges-summary": "Sigue los cambios más recientes de la wiki en esta página.",
-       "recentchanges-noresult": "No hubo cambios durante el período seleccionado que respondan a esos criterios.",
-       "recentchanges-feed-description": "Realiza un seguimiento de los cambios más recientes en el wiki en este canal.",
+       "recentchanges-noresult": "No hubo cambios que respondan a esos criterios durante el período seleccionado.",
+       "recentchanges-feed-description": "Realiza un seguimiento de los cambios más recientes en el wiki con este canal.",
        "recentchanges-label-newpage": "Esta edición creó una página",
        "recentchanges-label-minor": "Esta es una edición menor",
        "recentchanges-label-bot": "Esta edición fue realizada por un robot",
        "recentchanges-label-plusminus": "El tamaño de la página cambió esta cantidad de bytes",
        "recentchanges-legend-heading": "'''Leyenda:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (véase también la [[Special:NewPages|lista de páginas nuevas]])",
-       "rcnotefrom": "Debajo está{{PLURAL:$5|el cambio|n los cambios}} desde <strong>$3, $4</strong> (se muestran hasta <strong>$1</strong>).",
+       "rcnotefrom": "Debajo aparece{{PLURAL:$5| el cambio|n los cambios}} desde <strong>$3, $4</strong> (se muestran hasta <strong>$1</strong>).",
        "rclistfrom": "Mostrar nuevos cambios desde $2, $3",
        "rcshowhideminor": "$1 ediciones menores",
        "rcshowhideminor-show": "Mostrar",
        "recentchangeslinked-title": "Cambios relacionados con «$1»",
        "recentchangeslinked-summary": "Esta página es una lista de los últimos cambios en las páginas enlazadas desde una página (o en las pertenecientes a una categoría). Las páginas que están en tu [[Special:Watchlist|lista de seguimiento]] aparecen en '''negrita'''.",
        "recentchangeslinked-page": "Nombre de la página:",
-       "recentchangeslinked-to": "Muestra los cambios recientes en lugar de la página indicada",
+       "recentchangeslinked-to": "Mostrar los cambios en páginas enlazadas con la página seleccionada",
        "upload": "Subir un archivo",
        "uploadbtn": "Subir un archivo",
-       "reuploaddesc": "Regresar al formulario para subir.",
-       "upload-tryagain": "Envíe la descripción del archivo modificado",
+       "reuploaddesc": "Cancelar subida y volver al formulario de carga",
+       "upload-tryagain": "Enviar la descripción modificada",
        "uploadnologin": "No has iniciado sesión",
        "uploadnologintext": "Tienes que $1 para subir archivos.",
-       "upload_directory_missing": "El directorio de subida de archivos ($1) no existe, y no puede ser creado por el servidor.",
+       "upload_directory_missing": "El directorio de subida de archivos ($1) no existe, y el servidor no ha podido crearlo.",
        "upload_directory_read_only": "El servidor web no puede escribir en el directorio de subida de archivos ($1).",
-       "uploaderror": "Error al intentar subir archivo",
-       "upload-recreate-warning": "'''Aviso: Un archivo con ese nombre ha sido eliminado o renombrado.'''\n\nA continuación se muestra el registro de borrados y traslados de esta página:",
-       "uploadtext": "Utiliza el siguiente formulario para subir archivos.\nPara ver o buscar archivos subidos con anterioridad, ve a la [[Special:FileList|lista de archivos subidos]].\nLos archivos subidos quedarán registrados además en el [[Special:Log/upload|registro de archivos subidos]] y los borrados en el [[Special:Log/delete|registro de borrados]].\n\nPara incluir un archivo en una página, usa un enlace como los mostrados a continuación:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' para usar el fichero en tamaño completo\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|texto descriptivo]]</nowiki></code>''' para una versión de 200 píxeles de ancho en una caja en el margen izquierdo con 'texto descriptivo' como descripción\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' para enlazar directamente al fichero sin mostrarlo.",
-       "upload-permitted": "Tipos de archivo permitidos: $1.",
-       "upload-preferred": "Tipos de archivo preferidos: $1.",
-       "upload-prohibited": "Tipos de archivo prohibidos: $1.",
+       "uploaderror": "Error al intentar subir",
+       "upload-recreate-warning": "<strong>Aviso: Un archivo con ese nombre ha sido eliminado o renombrado.</strong>\n\nA continuación se muestra el registro de borrados y traslados de esta página:",
+       "uploadtext": "Utiliza el siguiente formulario para subir archivos.\nPara ver o buscar archivos subidos con anterioridad, ve a la [[Special:FileList|lista de archivos subidos]].\nLos archivos subidos también quedarán registrados en el [[Special:Log/upload|registro de archivos subidos]], y los borrados en el [[Special:Log/delete|registro de borrados]].\n\nPara incluir un archivo en una página, usa un enlace como los mostrados a continuación:\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code></strong> para usar la versión a tamaño completo del archivo\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|texto alternativo]]</nowiki></code></strong> para una versión de 200 píxeles de ancho situada en una caja en el margen izquierdo con \"texto alternativo\" como descripción\n* <strong><code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code></strong> para enlazar directamente al archivo sin mostrarlo.",
+       "upload-permitted": "{{PLURAL:$2|Tipo|Tipos}} de archivo permitidos: $1.",
+       "upload-preferred": "{{PLURAL:$2|Tipo|Tipos}} de archivo preferidos: $1.",
+       "upload-prohibited": "{{PLURAL:$2|Tipo|Tipos}} de archivo prohibidos: $1.",
        "uploadlogpage": "Subidas de archivos",
-       "uploadlogpagetext": "Abajo hay una lista de los últimos archivos subidos.\nMira la [[Special:NewFiles|galería de archivos nuevos]] para una descripción visual",
+       "uploadlogpagetext": "Debajo se muestra una lista de los últimos archivos subidos.\nVéase la [[Special:NewFiles|galería de archivos nuevos]] para una vista más estilizada",
        "filename": "Nombre del archivo",
-       "filedesc": "Sumario",
-       "fileuploadsummary": "Descripción:",
+       "filedesc": "Resumen",
+       "fileuploadsummary": "Resumen:",
        "filereuploadsummary": "Cambios de archivo:",
-       "filestatus": "Estado de copyright:",
+       "filestatus": "Información de copyright:",
        "filesource": "Fuente:",
        "ignorewarning": "Ignorar aviso y guardar de todos modos",
-       "ignorewarnings": "Ignorar cualquier aviso",
+       "ignorewarnings": "Ignorar todos los avisos",
        "minlength1": "Los nombres de archivo deben tener al menos una letra.",
-       "illegalfilename": "El nombre de archivo «$1» contiene caracteres que no están permitidos en títulos de páginas. Por favor, renombra el archivo e intenta volver a subirlo.",
+       "illegalfilename": "El nombre de archivo «$1» contiene caracteres que no están permitidos en títulos de página. Por favor, renombra el archivo e intenta subirlo de nuevo.",
        "filename-toolong": "Los nombres de archivo no pueden tener más de 240 bytes.",
-       "badfilename": "El nombre de la imagen se ha cambiado a «$1».",
-       "filetype-mime-mismatch": "La extensión de archivo «.$1» no coincide con el tipo detectado de MIME del archivo ($2).",
+       "badfilename": "Se ha cambiado el nombre del archivo a «$1».",
+       "filetype-mime-mismatch": "La extensión de archivo «.$1» no coincide con el tipo MIME detectado en el archivo ($2).",
        "filetype-badmime": "No se permite subir archivos de tipo MIME «$1».",
-       "filetype-bad-ie-mime": "No se puede subir este archivo porque Internet Explorer podría considerarlo como «$1», que es un tipo de archivo no permitido y potencialmente peligroso.",
-       "filetype-unwanted-type": "'''«.$1»''' no está entre los tipos de fichero aconsejados.\n{{PLURAL:$3|El único tipo aconsejado es|Los tipos aconsejados son}} $2.",
-       "filetype-banned-type": "'''\".$1\"''' {{PLURAL:$4|no es un tipo de archivo permitido|no son tipos de archivos permitidos}}.\n{{PLURAL:$3|El tipo de archivo permitido es|Los tipos de archivos permitidos son}} $2.",
+       "filetype-bad-ie-mime": "No se puede subir este archivo porque Internet Explorer podría considerarlo como «$1», que es un tipo de archivo no autorizado y potencialmente peligroso.",
+       "filetype-unwanted-type": "<strong>«.$1»</strong> no está entre los tipos de archivo aconsejados.\n{{PLURAL:$3|El único tipo aconsejado es|Los tipos aconsejados son}} $2.",
+       "filetype-banned-type": "{{PLURAL:$4|El tipo de archivo|Los tipos de archivo}} <strong>\".$1\"</strong> no {{PLURAL:$4|está permitido|están permitidos}}.\n{{PLURAL:$3|El único tipo de archivo permitido es|Los tipos de archivos permitidos son}} $2.",
        "filetype-missing": "El archivo no tiene extensión (como «.jpg»).",
        "empty-file": "El archivo que enviaste estaba vacío.",
        "file-too-large": "El archivo que enviste era demasiado grande.",
        "filename-tooshort": "El nombre de archivo es demasiado corto.",
        "filetype-banned": "El tipo de archivo está prohibido.",
-       "verification-error": "Este archivo no pasó la verificación de archivos.",
-       "hookaborted": "La modificación que ha intentado realizar fue cancelada por un adicional de extensión.",
+       "verification-error": "Este archivo no superó la verificación de archivos.",
+       "hookaborted": "Una extensión ha impedido la modificación que intentaste realizar.",
        "illegal-filename": "El nombre de archivo no está permitido.",
        "overwrite": "Sobrescribir un archivo existente no está permitido.",
        "unknown-error": "Ocurrió un error desconocido.",
        "delete-confirm": "Borrar «$1»",
        "delete-legend": "Borrar",
        "historywarning": "<strong>Atención:</strong> la página que estás a punto de borrar tiene un historial con $1 {{PLURAL:$1|revisión|revisiones}}:",
-       "confirmdeletetext": "Estás a punto de borrar una página en forma permanente, así como todo su historial.\nPor favor, confirma que realmente quieres hacer eso, que entiendes las\nconsecuencias, y que lo estás haciendo de acuerdo con [[{{MediaWiki:Policy-url}}|las políticas]].",
+       "confirmdeletetext": "Estás a punto de borrar una página, así como todo su historial.\nPor favor, confirma que realmente quieres hacer eso, que entiendes las consecuencias, y que lo estás haciendo de acuerdo con [[{{MediaWiki:Policy-url}}|las políticas]].",
        "actioncomplete": "Acción completada",
        "actionfailed": "Acción fallida",
        "deletedtext": "«$1» ha sido borrado.\nVéase $2 para un registro de los borrados recientes.",
        "tags-tag": "Nombre de etiqueta",
        "tags-display-header": "Apariencia de la lista de cambios",
        "tags-description-header": "Descripción completa de significado",
+       "tags-source-header": "Fuente",
        "tags-active-header": "¿Activo?",
        "tags-hitcount-header": "Cambios etiquetados",
+       "tags-actions-header": "Acciones",
        "tags-active-yes": "Sí",
        "tags-active-no": "No",
+       "tags-source-extension": "Definida por una extensión",
+       "tags-source-manual": "Aplicada manualmente por usuarios y bots",
+       "tags-source-none": "No se utiliza más",
        "tags-edit": "editar",
+       "tags-delete": "eliminar",
+       "tags-activate": "activar",
+       "tags-deactivate": "desactivar",
        "tags-hitcount": "$1 {{PLURAL:$1|cambio|cambios}}",
+       "tags-manage-no-permission": "No tienes permiso para gestionar las etiquetas de cambios.",
+       "tags-create-heading": "Crear una etiqueta",
+       "tags-create-explanation": "De manera predeterminada, las etiquetas nuevas estarán disponibles para su uso por usuarios y bots.",
+       "tags-create-tag-name": "Nombre de la etiqueta:",
+       "tags-create-reason": "Motivo:",
+       "tags-create-submit": "Crear",
+       "tags-create-no-name": "Es necesario especificar el nombre de la etiqueta.",
+       "tags-create-invalid-chars": "Los nombres de las etiquetas no deben contener comas (<code>,</code>) ni barras (<code>/</code>).",
+       "tags-create-invalid-title-chars": "Los nombres de las etiquetas no deben contener caracteres que no puedan usarse en los títulos de las páginas.",
+       "tags-create-already-exists": "La etiqueta «$1» ya existe.",
+       "tags-create-warnings-above": "Se {{PLURAL:$2|produjo el aviso siguiente|produjeron los avisos siguientes}} al intentar crear la etiqueta «$1»:",
+       "tags-create-warnings-below": "¿Continuar con la creación de la etiqueta?",
+       "tags-delete-title": "Eliminar etiqueta",
+       "tags-delete-explanation-initial": "Estás a punto de eliminar la etiqueta «$1» de la base de datos.",
+       "tags-delete-explanation-in-use": "Se removerá de {{PLURAL:$2|$2 revisión o entrada ingresada|todas las $2 revisiones y/o entradas ingresadas}} a la que actualmente es aplicada.",
+       "tags-delete-explanation-warning": "Esta acción es <strong>irreversible</strong> y ni siquiera los administradores de la base de datos podrán deshacerla. Confirma que esta es la etiqueta que se eliminará.",
+       "tags-delete-explanation-active": "<strong>La etiqueta \"$1\" aún está activa y se seguirá utilizándo en el futuro.</strong> Para que esto no ocurra, deshabilítala desde el lugar donde se configuró para ser utilizada.",
+       "tags-delete-reason": "Motivo:",
+       "tags-delete-submit": "Eliminar esta etiqueta irreversiblemente",
+       "tags-delete-not-allowed": "No se pueden eliminar las etiquetas definidas por una extensión, a menos que esta lo permita expresamente.",
+       "tags-delete-not-found": "La etiqueta «$1» no existe.",
+       "tags-delete-too-many-uses": "No se puede borrar la etiqueta \"$1\" porque se ha aplicado a más de {{PLURAL:$2|una revisión|$2 revisiones}}.",
+       "tags-delete-warnings-after-delete": "La etiqueta \"$1\" se borró exitosamente, pero con {{PLURAL:$2|la siguiente advertencia|las siguientes advertencias}}:",
+       "tags-activate-title": "Activar etiqueta",
+       "tags-activate-question": "Estás a punto de activar la etiqueta «$1».",
+       "tags-activate-reason": "Motivo:",
+       "tags-activate-not-allowed": "No es posible activar la etiqueta «$1».",
+       "tags-activate-not-found": "La etiqueta «$1» no existe.",
+       "tags-activate-submit": "Activar",
+       "tags-deactivate-title": "Desactivar etiqueta",
+       "tags-deactivate-question": "Estás a punto de desactivar la etiqueta «$1».",
+       "tags-deactivate-reason": "Motivo:",
+       "tags-deactivate-not-allowed": "No es posible desactivar la etiqueta «$1».",
+       "tags-deactivate-submit": "Desactivar",
        "comparepages": "Comparar páginas",
        "compare-page1": "Página 1",
        "compare-page2": "Página 2",
        "logentry-upload-upload": "$1 {{GENDER:$2|subió}} $3",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|subió}} una nueva versión de $3",
        "logentry-upload-revert": "$1 {{GENDER:$2|subió}} $3",
+       "log-name-managetags": "Registro de gestión de etiquetas",
+       "log-description-managetags": "Esta página muestra las acciones realizadas sobre las [[Special:Tags|etiquetas]]. El registro solo contiene acciones llevadas a cabo por un administrador de forma manual; el software del wiki podría crear o eliminar etiquetas sin que se registre aquí.",
+       "logentry-managetags-create": "$1 {{GENDER:$2|creó}} la etiqueta «$4»",
+       "logentry-managetags-delete": "$1 {{GENDER:$2|eliminó}} la etiqueta «$4» (quitada de $5 {{PLURAL:$5|revisión o entrada de registro|revisiones o entradas de registro}})",
+       "logentry-managetags-activate": "$1 {{GENDER:$2|activó}} la etiqueta «$4» para su uso por usuarios y bots",
+       "logentry-managetags-deactivate": "$1 {{GENDER:$2|desactivó}} la etiqueta «$4» para evitar su uso por usuarios y bots",
        "rightsnone": "(ninguno)",
        "revdelete-summary": "resumen de edición",
        "feedback-bugornote": "Si estás preparado para describir en detalle un problema técnico, [$1 informa de un bug] por favor.\n\nEn otro caso, puedes usar el siguiente formulario. Tu comentario será añadido a la página [$3 $2], junto con tu nombre de usuario y el navegador que usas.",
        "expand_templates_generate_xml": "Mostrar el árbol XML.",
        "expand_templates_generate_rawhtml": "Mostrar HTML en crudo",
        "expand_templates_preview": "Previsualización",
+       "expand_templates_preview_fail_html": "<em>Se ha ocultado la previsualización como precaución frente a ataques JavaScript. Esto se debe a que {{SITENAME}} tiene habilitada la característica de código HTML en bruto, y se perdieron los datos de la sesión.</em>\n\n<strong>Si se trata de un intento de previsualización legítimo, por favor inténtelo de nuevo.</strong>\nSi aun así no funciona, pruebe a [[Special:UserLogout|cerrar sesión]] y volver a acceder.",
+       "expand_templates_preview_fail_html_anon": "<em>Se ha ocultado la previsualización como precaución frente a ataques JavaScript. Esto se debe a que {{SITENAME}} tiene habilitada la característica de código HTML en bruto, y usted no ha iniciado sesión.</em>\n\n<strong>Si se trata de un intento de previsualización legítimo, por favor [[Special:UserLogin|inicie sesión]] e inténtelo de nuevo.</strong>",
        "pagelanguage": "Selector de idioma de página",
        "pagelang-name": "Página",
        "pagelang-language": "Idioma",
        "log-name-pagelang": "Registro de cambios en idiomas",
        "log-description-pagelang": "Este es un registro de los cambios en los idiomas de las páginas.",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2|cambió}} el idioma de la página «$3» del $4 al $5.",
-       "default-skin-not-found": "¡Oops! La apariencia predeterminada de la wiki, definida en <code dir=\"ltr\">$wgDefaultSkin</code> como <code>$1</code>, no está disponible.\n\nLa instalación parece poseer las siguientes apariencias. Revisa [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual:Configuración de apariencias] para mayor información sobre cómo configurar y seleccionar la apariencia predeterminada.\n\n$2\n\n; Si acabas de instalar MediaWiki:\n: Probablemente la hayas instalado desde git, o directamente desde el código fuente usando algún otro método. Esto es lo esperado. Intenta instalar algunas apariencias desde [https://www.mediawiki.org/wiki/Category:All_skins el directorio de apariencias de mediawiki.org] ya sea:\n:* Descargando [https://www.mediawiki.org/wiki/Download el instalador tarball], el cual contiene varias apariencias y extensiones. Puedes copiar y pegar el directorio <code>skins/</code> desde ahí.\n:* Clonando uno de los repositorios en <code>mediawiki/skins/*</code> via git dentro del directorio <code dir=\"ltr\">skins/</code> de tu instalación de MediaWiki.\n: Hacer esto no debería interferir con tu repositorio git si eres un desarrollador de MediaWiki.\n\n; Si acabas de actualizar MediaWiki:\n: MediaWiki 1.24 y versiones posteriores ya no tiene habilitada la actualización de apariencia (revisa [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Skin autodiscovery]). Puedes pegar las siguientes líneas en <code>LocalSettings.php</code> para habilitar todas las apariencias instaladas:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Si acabas de modificar <code>LocalSettings.php</code>:\n: Comprueba detenidamente posibles errores tipográficos en los nombres de las apariencias.",
-       "default-skin-not-found-no-skins": "¡Vaya! La apariencia predeterminada de tu wiki, definida en <code>$wgDefaultSkin</code> como <code>$1</code>, no está disponible.\n\nNo tienes apariencias instaladas.\n\n; Si has instalado o actualizado MediaWiki recientemente:\n: Probablemente has instalado desde git, o directamente desde el código fuente usando algún otro método. Esto es lo esperado. MediaWiki 1.24 y versiones posteriores no incluyen ninguna apariencia en el repositorio principal. Trata de instalar algunas apariencias desde el [https://www.mediawiki.org/wiki/Category:All_skins directorio de apariencias de mediawiki.org], siguiendo el siguiente procedimiento:\n:* Descarga el [https://www.mediawiki.org/wiki/Download instalador tarball], que viene con varias apariencias y extensiones. Puedes copiar y pegar el directorio <code>skins/</code> desde ahí.\n:* Clonando alguno de los repositorios en <code>mediawiki/skins/*</code> usando git en el directorio <code dir=\"ltr\">skins/</code> de tu instalación de MediaWiki.\n: Hacer esto no debería interferir con tu repositorio de MediaWiki si eres un desarrollador de MediaWiki. Revisa [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual:Configuración de apariencias] para información sobre cómo habilitar las apariencias y seleccionar la predeterminada.",
+       "default-skin-not-found": "¡Vaya! La apariencia predeterminada de tu wiki, definida en <code dir=\"ltr\">$wgDefaultSkin</code> como <code>$1</code>, no está disponible.\n\nLa instalación parece contener las siguientes apariencias. Revisa [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual:Configuración de apariencias] para más información sobre cómo configurar y seleccionar la apariencia predeterminada.\n\n$2\n\n; Si acabas de instalar MediaWiki:\n: Probablemente la hayas instalado desde git, o directamente desde el código fuente usando algún otro método. Es normal que ocurra esto. Intenta instalar algunas apariencias desde [https://www.mediawiki.org/wiki/Category:All_skins el directorio de apariencias de mediawiki.org] ya sea:\n:* Descargando [https://www.mediawiki.org/wiki/Download el instalador tarball], el cual contiene varias apariencias y extensiones. Puedes copiar y pegar el directorio <code>skins/</code> desde ahí.\n:* Descargando tarballs individuales de cada apariencia de [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* Clonando uno de los repositorios en <code>mediawiki/skins/*</code> via git dentro del directorio <code dir=\"ltr\">skins/</code> de tu instalación de MediaWiki.\n: Hacer esto no debería interferir con tu repositorio git si eres un desarrollador de MediaWiki.\n\n; Si acabas de actualizar MediaWiki:\n: A partir de MediaWiki 1.24 ya no se habilitan automáticamente las apariencias instaladas (revisa [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Skin autodiscovery]). Puedes pegar las siguientes líneas en <code>LocalSettings.php</code> para habilitar todas las apariencias instaladas:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Si acabas de modificar <code>LocalSettings.php</code>:\n: Comprueba detenidamente posibles errores tipográficos en los nombres de las apariencias.",
+       "default-skin-not-found-no-skins": "¡Vaya! La apariencia predeterminada de tu wiki, definida en <code>$wgDefaultSkin</code> como <code>$1</code>, no está disponible.\n\nNo tienes apariencias instaladas.\n\n; Si has instalado o actualizado MediaWiki recientemente:\n: Probablemente has instalado desde git, o directamente desde el código fuente usando algún otro método. Esto puede ocurrir en este caso. A partir de MediaWiki 1.24 ya no se incluye ninguna apariencia en el repositorio principal. Trata de instalar algunas apariencias desde el [https://www.mediawiki.org/wiki/Category:All_skins directorio de apariencias de mediawiki.org], ya sea:\n:* Descargando el [https://www.mediawiki.org/wiki/Download instalador tarball], que viene con varias apariencias y extensiones. Puedes copiar y pegar el directorio <code>skins/</code> desde ahí.\n:* Descargando tarballs individuales de cada apariencia de [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* Clonando alguno de los repositorios en <code>mediawiki/skins/*</code> usando git en el directorio <code dir=\"ltr\">skins/</code> de tu instalación de MediaWiki.\n: Hacer esto no debería interferir con tu repositorio de MediaWiki si eres un desarrollador de MediaWiki. Revisa [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual:Configuración de apariencias] para información sobre cómo habilitar las apariencias y seleccionar la predeterminada.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (activado)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''desactivado''')",
        "mediastatistics": "Estadísticas de multimedia",
index 3cad8d4..4aa7182 100644 (file)
        "deletethispage": "Kustuta see lehekülg",
        "undeletethispage": "Taasta see lehekülg",
        "undelete_short": "Taasta {{PLURAL:$1|üks muudatus|$1 muudatust}}",
-       "viewdeleted_short": "Vaata {{PLURAL:$1|üht|$1}} kustutatud redaktsiooni",
+       "viewdeleted_short": "Vaata {{PLURAL:$1|üht|$1}} kustutatud muudatust",
        "protect": "Kaitse",
        "protect_change": "muuda",
        "protectthispage": "Kaitse seda lehekülge",
        "confirmable-no": "Ei",
        "thisisdeleted": "Vaata $1 või taasta?",
        "viewdeleted": "Vaata $1?",
-       "restorelink": "{{PLURAL:$1|üht|$1}} kustutatud versiooni",
+       "restorelink": "{{PLURAL:$1|üht|$1}} kustutatud muudatust",
        "feedlinks": "Voog:",
        "feed-invalid": "Vigane vootüüp.",
        "feed-unavailable": "Uudisvood ei ole saadaval.",
        "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.",
        "prefs-personal": "Kasutaja andmed",
        "prefs-rc": "Viimased muudatused",
        "prefs-watchlist": "Jälgimisloend",
+       "prefs-editwatchlist": "Jälgimisloendi redigeerimine",
+       "prefs-editwatchlist-label": "Redigeeri jälgimisloendi sissekandeid:",
+       "prefs-editwatchlist-edit": "Vaata ja eemalda jälgimisloendi linke",
+       "prefs-editwatchlist-raw": "Redigeeri toorandmeid",
+       "prefs-editwatchlist-clear": "Tühjenda jälgimisloend",
        "prefs-watchlist-days": "Mitme päeva muudatusi näidata loendis:",
        "prefs-watchlist-days-max": "Ülemmäär $1 {{PLURAL:$1|päev|päeva}}",
        "prefs-watchlist-edits": "Mitu muudatust näidatakse laiendatud jälgimisloendis:",
        "userrights": "Kasutajaõiguste haldus",
        "userrights-lookup-user": "Kasutajarühma muutmine",
        "userrights-user-editname": "Sisesta kasutajanimi:",
-       "editusergroup": "Muuda kasutajarühma",
+       "editusergroup": "Muuda kasutajarühmi",
        "editinguser": "Kasutaja '''[[User:$1|$1]]''' $2 õiguste muutmine",
-       "userrights-editusergroup": "Kasutajarühma valik",
-       "saveusergroups": "Salvesta rühma muudatused",
+       "userrights-editusergroup": "Kasutajarühmade muutmine",
+       "saveusergroups": "Salvesta kasutajarühmad",
        "userrights-groupsmember": "Kuulub rühmadesse:",
        "userrights-groupsmember-auto": "Kuulub vaikimisi rühmadesse:",
        "userrights-groups-help": "Sa võid muuta selle kasutaja kuuluvust eri kasutajarühmadesse.\n* Märgitud kast tähendab, et kasutaja kuulub sellesse rühma.\n* Märkimata kast tähendab, et kasutaja ei kuulu sellesse rühma.\n* Aga * kasutajarühma juures tähistab õigust, mida sa peale lisamist enam eemaldada ei saa, või siis ka vastupidi.",
        "right-override-export-depth": "Eksportida lehekülgi, kaasates viidatud leheküljed kuni viienda tasemeni",
        "right-sendemail": "Saata teistele kasutajatele e-kirju",
        "right-passwordreset": "Vaadata parooli lähtestamise e-kirju",
+       "right-managechangetags": "Koostada [[Special:Tags|märgiseid]] ja kustutada neid andmebaasist",
        "newuserlogpage": "Konto loomise logi",
        "newuserlogpagetext": "Siin on logitud kasutajate registreerimine.",
        "rightslog": "Kasutajaõiguste logi",
        "action-viewmyprivateinfo": "oma eraandmeid vaadata",
        "action-editmyprivateinfo": "oma eraandmeid redigeerida",
        "action-editcontentmodel": "lehekülje sisumudelit muuta",
+       "action-managechangetags": "märgiseid koostada ege neid andmebaasist kustutada",
        "nchanges": "$1 {{PLURAL:$1|muudatus|muudatust}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|viimase vaatamise järel}}",
        "enhancedrc-history": "ajalugu",
        "unusedtemplates": "Kasutamata mallid",
        "unusedtemplatestext": "See lehekülg loetleb kõik leheküljed nimeruumis {{ns:template}}, mida teistel lehekülgedel ei kasutata.\nEnne kustutamist kontrolli ka muid malli juurde viitavaid linke.",
        "unusedtemplateswlh": "teised lingid",
-       "randompage": "Juhuslik artikkel",
+       "randompage": "Juhuslik lehekülg",
        "randompage-nopages": "{{PLURAL:$2|Järgmises nimeruumis|Järgmistes nimeruumides}} ei ole ühtegi lehekülge: $1.",
        "randomincategory": "Juhuslik lehekülg kategoorias",
        "randomincategory-invalidcategory": "\"$1\" pole sobiv kategooria nimi.",
        "movepage-moved": "'''\"$1\" teisaldatud pealkirja \"$2\" alla'''",
        "movepage-moved-redirect": "Ümbersuunamisleht loodud.",
        "movepage-moved-noredirect": "Ümbersuunamist ei loodud.",
-       "articleexists": "Selle nimega artikkel on juba olemas või pole valitud nimi lubatav. Palun valige uus nimi.",
+       "articleexists": "Sellise pealkirjaga lehekülg on juba olemas või pole valitud pealkiri lubatav.\nPalun vali teistsugune pealkiri.",
        "cantmove-titleprotected": "Lehte ei saa sinna teisaldada, sest uus pealkiri on artikli loomise eest kaitstud",
        "movetalk": "Teisalda seonduv arutelulehekülg",
        "move-subpages": "Teisalda alamleheküljed (kuni $1)",
        "tooltip-diff": "Näita tehtavaid muudatusi.",
        "tooltip-compareselectedversions": "Näita erinevusi selle lehe kahe valitud versiooni vahel.",
        "tooltip-watch": "Lisa see lehekülg oma jälgimisloendisse",
-       "tooltip-watchlistedit-normal-submit": "Eemalda leheküljed",
+       "tooltip-watchlistedit-normal-submit": "Eemalda pealkirjad",
        "tooltip-watchlistedit-raw-submit": "Uuenda jälgimisloendit",
        "tooltip-recreate": "Taasta kustutatud lehekülg",
        "tooltip-upload": "Alusta üleslaadimist",
        "lag-warn-high": "Andmebaasiserveri töö viivituste tõttu ei pruugi viimase {{PLURAL:$1|ühe sekundi|$1 sekundi}} jooksul tehtud muudatused selles loendis näha olla.",
        "watchlistedit-normal-title": "Jälgimisloendi redigeerimine",
        "watchlistedit-normal-legend": "Jälgimisloendist lehtede eemaldamine",
-       "watchlistedit-normal-explain": "Need lehed on sinu jälgimisloendis.\nJälgimisloendist lehtekülgede eemaldamiseks tee vastava lehekülje ees olevasse kastikesse linnuke ja klõpsa nuppu \"{{int:Watchlistedit-normal-submit}}\". Saad ka jälgimisloendi [[Special:EditWatchlist/raw|algandmeid muuta]].",
-       "watchlistedit-normal-submit": "Eemalda valitud lehed",
+       "watchlistedit-normal-explain": "Need pealkirjad on sinu jälgimisloendis.\nJälgimisloendist pealkirja eemaldamiseks tee selle juurde linnuke ja klõpsa nuppu \"{{int:Watchlistedit-normal-submit}}\".\nSaad ka jälgimisloendi [[Special:EditWatchlist/raw|toorandmeid redigeerida]].",
+       "watchlistedit-normal-submit": "Eemalda pealkirjad",
        "watchlistedit-normal-done": "Jälgimisloendist eemaldati {{PLURAL:$1|üks lehekülg|$1 lehekülge}}:",
-       "watchlistedit-raw-title": "Jälgimisloendi algandmed",
-       "watchlistedit-raw-legend": "Redigeeritavad jälgimisloendi algandmed",
-       "watchlistedit-raw-explain": "Sinu jälgimisloendis olevad leheküljed on kuvatud allpool asuvas tekstikastis, kus sa saad neid lisada või eemaldada;\nIga pealkiri asub ise real.\nKui sa oled lõpetanud, kliki nuppu \"{{int:Watchlistedit-raw-submit}}\".\nSa võid [[Special:EditWatchlist|kasutada ka harilikku tekstiredaktorit]].",
+       "watchlistedit-raw-title": "Jälgimisloendi toorandmete redigeerimine",
+       "watchlistedit-raw-legend": "Jälgimisloendi toorandmete redigeerimine",
+       "watchlistedit-raw-explain": "Allpool on sinu jälgimisloendisse kantud pealkirjade loend, kus saab sissekandeid lisada ja eemaldada.\nIga rea kohta peab olema üks pealkiri.\nKui oled lõpetanud, klõpsa nuppu \"{{int:Watchlistedit-raw-submit}}\".\nSaad kasutada ka [[Special:EditWatchlist|standardset redaktorit]].",
        "watchlistedit-raw-titles": "Pealkirjad:",
        "watchlistedit-raw-submit": "Uuenda jälgimisloendit",
        "watchlistedit-raw-done": "Sinu jälgimisloend on uuendatud.",
        "tags-tag": "Märgise nimi",
        "tags-display-header": "Tähistus muudatusloendis",
        "tags-description-header": "Täiskirjeldus",
+       "tags-source-header": "Allikas",
        "tags-active-header": "Aktiivne?",
        "tags-hitcount-header": "Märgistatud muudatused",
+       "tags-actions-header": "Toimingud",
        "tags-active-yes": "Jah",
        "tags-active-no": "Ei",
+       "tags-source-extension": "Määratletud tarkvaralisas",
+       "tags-source-manual": "Kasutaja või robot rakendab käsitsi",
+       "tags-source-none": "Pole enam kasutuses",
        "tags-edit": "muuda",
+       "tags-delete": "kustuta",
+       "tags-activate": "luba",
+       "tags-deactivate": "keela",
        "tags-hitcount": "$1 {{PLURAL:$1|muudatus|muudatust}}",
+       "tags-manage-no-permission": "Sul pole õigust muudatusmärgiseid hallata.",
+       "tags-create-heading": "Uue märgise koostamine",
+       "tags-create-explanation": "Vaikimisi on vastkoostatud märgised kasutajate ja robotite jaoks kasutatavad.",
+       "tags-create-tag-name": "Märgise nimi:",
+       "tags-create-reason": "Põhjus:",
+       "tags-create-submit": "Koosta",
+       "tags-create-no-name": "Pead määrama märgise nime.",
+       "tags-create-invalid-chars": "Märgise nimi ei tohi sisaldada koma (<code>,</code>) ega kaldkriipsu (<code>/</code>).",
+       "tags-create-invalid-title-chars": "Märgise nimi ei tohi sisaldada märki, mida ei saa kasutada lehekülje pealkirjas.",
+       "tags-create-already-exists": "Märgis \"$1\" on juba olemas.",
+       "tags-create-warnings-above": "Prooviti koostada märgist \"$1\". Sellega seoses väljastati \"{{PLURAL:$2|järgmine hoiatus|järgmised hoiatused}}:",
+       "tags-create-warnings-below": "Kas soovid märgise koostamisega jätkata?",
+       "tags-delete-title": "Märgise kustutamine",
+       "tags-delete-explanation-initial": "Oled kustutamas märgist \"$1\" andmebaasist.",
+       "tags-delete-explanation-in-use": "See eemaldatakse {{PLURAL:$2|ühelt redaktsioonilt või|kõigilt $2 redaktsioonilt ja/või}} logisissekandelt, mille juures seda on praegu rakendatud.",
+       "tags-delete-explanation-warning": "Seda toimingut <strong>ei saa tagasi pöörata</strong> isegi mitte andmebaasi administraator. Veendu, et tegu on märgisega, mida kustutada tahad.",
+       "tags-delete-explanation-active": "<strong>Märgis \"$1\" on endiselt aktiivne ja seda rakendatakse edaspidi.</strong> Et nii poleks, mine kohtadesse, kust märgist rakendatakse, ja keela märgis seal.",
+       "tags-delete-reason": "Põhjus:",
+       "tags-delete-submit": "Kustuta märgis pöördumatult",
+       "tags-delete-not-allowed": "Tarkvaralisas määratletud märgiseid ei saa kustutada, kui märgis on tarkvaralisas eraldi lubatud.",
+       "tags-delete-not-found": "Märgist \"$1\" pole.",
+       "tags-delete-too-many-uses": "Märgist \"$1\" on rakendatud rohkem kui {{PLURAL:$2|ühe|$2}} redaktsiooni juures, mistõttu ei saa seda kustutada.",
+       "tags-delete-warnings-after-delete": "Märgis \"$1\" on edukalt kustutatud, kuid väljastati {{PLURAL:$2|järgmine hoiatus|järgmised hoiatused}}:",
+       "tags-activate-title": "Märgise lubamine",
+       "tags-activate-question": "Siinkohal lubad märgise \"$1\".",
+       "tags-activate-reason": "Põhjus:",
+       "tags-activate-not-allowed": "Märgist \"$1\" pole võimalik lubada.",
+       "tags-activate-not-found": "Märgist \"$1\" pole.",
+       "tags-activate-submit": "Luba",
+       "tags-deactivate-title": "Märgise keelamine",
+       "tags-deactivate-question": "Siinkohal keelad märgise \"$1\".",
+       "tags-deactivate-reason": "Põhjus:",
+       "tags-deactivate-not-allowed": "Märgist \"$1\" pole võimalik keelata.",
+       "tags-deactivate-submit": "Keela",
        "comparepages": "Lehekülgede kõrvutamine",
        "compare-page1": "Lehekülg 1",
        "compare-page2": "Lehekülg 2",
        "logentry-upload-upload": "$1 {{GENDER:$2|laadis üles}} faili $3",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|laadis üles}} uue versiooni failist $3",
        "logentry-upload-revert": "$1 {{GENDER:$2|laadis üles}} faili $3",
+       "log-name-managetags": "Märgiste haldamise logi",
+       "log-description-managetags": "Sellel leheküljel on toodud [[Special:Tags|märgiste]] haldamisega seotud tegevused. Logis on ainult toimingud, mida administraatorid on teinud käsitsi. Siin puuduvad logisissekanded viki tarkvaras koostatud või sealt kustutatud märgiste kohta.",
+       "logentry-managetags-create": "$1 {{GENDER:$2|koostas}} märgise \"$4\"",
+       "logentry-managetags-delete": "$1 {{GENDER:$2|kustutas}} märgise \"$4\" (eemaldatud {{PLURAL:$5|ühe redaktsiooni või|$5 redaktsiooni ja/või}} logisissekande juurest)",
+       "logentry-managetags-activate": "$1 {{GENDER:$2|lubas}} märgise \"$4\" kasutamise kasutajate ja robotite jaoks",
+       "logentry-managetags-deactivate": "$1 {{GENDER:$2|keelas}} märgise \"$4\" kasutamise kasutajate ja robotite jaoks",
        "rightsnone": "(puudub)",
        "revdelete-summary": "resümee",
        "feedback-bugornote": "Kui arvad, et oskad tehnilist probleemi üksikasjalikult kirjeldada, [$1 teata veast].\nKui ei, kasuta allolevat lihtsat vormi. Sinu kommentaar lisatakse koos kasutajanime ja teabega kasutatava võrgulehitsejaga kohta leheküljele \"[$3 $2]\".",
index 7828673..74baa82 100644 (file)
        "pool-timeout": "Lock-a itxoiten denbora amaitu da",
        "pool-queuefull": "Prozesuen zerrenda beteta dago",
        "pool-errorunknown": "Errore ezezaguna",
+       "poolcounter-usage-error": "Erabilera-errorea: $1",
        "aboutsite": "{{SITENAME}} guneari buruz",
        "aboutpage": "Project:Honi_buruz",
        "copyright": "Eduki guztia $1(r)en babespean dago, ez bada kontrakoa esaten.",
        "filerenameerror": "Ezin izan zaio \"$1\" fitxategiari \"$2\" izen berria eman.",
        "filedeleteerror": "Ezin izan da \"$1\" fitxategia ezabatu.",
        "directorycreateerror": "Ezin izan da \"$1\" karpeta sortu.",
+       "directoryreadonlyerror": "\"$1\" direktorioa soilik irakurtzekoa da.",
+       "directorynotreadableerror": "\"$1\" direktorioa ez da irakurgarria.",
        "filenotfound": "Ezin izan da \"$1\" fitxategia aurkitu.",
        "unexpected": "Espero ez zen balioa: \"$1\"=\"$2\".",
        "formerror": "Errorea: ezin izan da formularioa bidali",
        "prefs-personal": "Erabiltzaile profila",
        "prefs-rc": "Azken aldaketak",
        "prefs-watchlist": "Jarraipen zerrenda",
+       "prefs-editwatchlist": "Aldatu jarraipen-zerrenda",
+       "prefs-editwatchlist-clear": "Garbitu zure jarraipen-zerrenda",
        "prefs-watchlist-days": "Jarraipen zerrendan erakutsi beharreko egun kopurua:",
        "prefs-watchlist-days-max": "Gehienez $1 {{PLURAL:$1|egun|egun}}",
        "prefs-watchlist-edits": "Jarraipen zerrendan erakutsi beharreko aldaketa kopurua:",
        "action-createpage": "orrialdeak sortu",
        "action-createtalk": "eztabaida orrialdeak sortu",
        "action-createaccount": "lankide hau sortu",
+       "action-history": "orrialde honen historia ikusi",
        "action-minoredit": "markatu aldaketa hau txikitzat",
        "action-move": "orri hau mugitu",
        "action-move-subpages": "orri hau eta haren azpiorriak mugitu",
        "action-move-rootuserpages": "mugitu lankidearen oinarri orrialdeak",
+       "action-move-categorypages": "kategoria orrialdeak mugitu",
        "action-movefile": "fitxategi hau mugitu",
        "action-upload": "fitxategi hau igo",
        "action-reupload": "dagoeneko baden fitxategi honen gainean idatzi",
        "uploaderror": "Errorea igotzerakoan",
        "upload-recreate-warning": "'''Kontuz: Izen hori duen fitxategi bat berrizendatua edo mugitua izan da.'''",
        "uploadtext": "Fitxategiak igotzeko beheko formularioa erabil dezakezu. \nAurretik igotako irudiak ikusi edo bilatzeko [[Special:FileList|igotako fitxategien zerrendara]] jo. Igoerak [[Special:Log/upload|igoera erregistroan]] ikus daitezke eta ezabatutakoak [[Special:Log/delete|ezabaketa erregistroan]] zerrendatzen dira.\n\nOrrialde baten irudi bat txertatzeko, erabili kode hauetako bat:\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>''' * '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' irudia zuzenean erabiltzeko.",
-       "upload-permitted": "Baimendutako fitxategi motak: $1.",
-       "upload-preferred": "Fitxategi mota hobetsiak: $1.",
-       "upload-prohibited": "Debekatutako fitxategi motak: $1.",
+       "upload-permitted": "Baimendutako fitxategi-{{PLURAL:$2|mota|motak}}: $1.",
+       "upload-preferred": "Hobetsitako fitxategi-{{PLURAL:$2|mota|motak}}: $1.",
+       "upload-prohibited": "Debekatutako fitxategi-{{PLURAL:$2|mota|motak}}: $1.",
        "uploadlogpage": "Igoera erregistroa",
        "uploadlogpagetext": "Jarraian, igotako azken fitxategien zerrenda ageri da.\nIkus ezazu [[Special:NewFiles|fitxategi berrien galeria]], irudizkoagoa den ikuspegi orokor bat izateko.",
        "filename": "Fitxategi izena",
        "sharedupload": "Elkarbanatutako fitxategi hau $1-(e)ko igoera bat da eta beste proiektuek ere erabil dezakete.",
        "sharedupload-desc-here": "Fitxategi hau $1-(e)koa da eta beste proeiktuetan erabilia izan liteke.\nBere [$2 fitxategiaren deskribapen orrialdea] behean dago.",
        "filepage-nofile": "Izen horrekin ez dago fitxategirik.",
+       "filepage-nofile-link": "Ez dago fitxategirik izen honekin, baina [$1 igo dezakezu].",
        "uploadnewversion-linktext": "Fitxategi honen bertsio berri bat igo",
        "shared-repo-from": "$1-tik",
        "shared-repo": "elkarbanatutako biltegia",
        "wantedtemplates": "Eskatutako txantiloiak",
        "mostlinked": "Gehien lotutako orrialdeak",
        "mostlinkedcategories": "Gehien lotutako kategoriak",
-       "mostlinkedtemplates": "Txantiloi erabilienak",
+       "mostlinkedtemplates": "Orrialde transkluituenak",
        "mostcategories": "Sailkapenean kategoria gehien dituzten orrialdeak",
        "mostimages": "Gehien lotutako irudiak",
        "mostinterwikis": "Interwiki gehien dituzten orrialdeak",
        "protectedpages-indef": "Babes mugagabeak bakarrik",
        "protectedpages-cascade": "Kaskada moduko babesak bakarrik",
        "protectedpagesempty": "Ez dago parametro horiek dituen babesturiko orrialderik oraintxe.",
+       "protectedpages-reason": "Arrazoia",
+       "protectedpages-unknown-timestamp": "Ezezaguna",
+       "protectedpages-unknown-performer": "Erabiltzaile ezezaguna",
        "protectedtitles": "Babestutako tituluak",
        "protectedtitlesempty": "Ez dago parametro horiek dituen babesturiko izenbururik oraintxe.",
        "listusers": "Erabiltzaileen zerrenda",
        "pager-older-n": "{{PLURAL:$1|zaharragoa den 1|zaharragoak diren $1}}",
        "suppress": "Gain-ikuspena",
        "querypage-disabled": "Orrialde berezi hau desgaituta dago funtzionamendu arrazoiengatik.",
+       "apihelp-no-such-module": "Ez da \"$1\" modulua aurkitu.",
        "booksources": "Iturri liburuak",
        "booksources-search-legend": "Liburuen bilaketa",
+       "booksources-search": "Bilatu",
        "booksources-text": "Jarraian liburu berri eta erabiliak saltzen dituzten guneetarako loturen zerrenda bat ikus dezakezu, bilatzen ari zaren liburu horientzako informazio gehigarria aurkitzeko lagungarria izan daitekeena:",
        "booksources-invalid-isbn": "Badirudi emandako ISBNa ez dela baliagarria; egiazta ezazu ea akatsik egin duzun jatorrizko iturritik kopiatzean.",
        "specialloguserlabel": "Egilea:",
        "badipaddress": "Baliogabeko IP helbidea",
        "blockipsuccesssub": "Blokeoa burutu da",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] blokeatua izan da.<br />\nIkus [[Special:BlockList|blokeoen zerrenda]] blokeoak aztertzeko.",
+       "ipb-confirmaction": "Ziur bazaude egin nahi duzula, marka ezazu behean dagoen \"{{int:ipb-confirm}}\" eremua, mesedez.",
        "ipb-edit-dropdown": "Blokeatzeko arrazoiak aldatu",
        "ipb-unblock-addr": "$1 lankide edo IP helbideari blokeoa baliogabetu",
        "ipb-unblock": "Erabiltzaile izen edo IP helbide bati blokeoa kendu",
        "javascripttest": "JavaScript frogatzen",
        "javascripttest-pagetext-noframework": "Orrialde hau JavaScript frogak egiteko gordeta dago.",
        "javascripttest-pagetext-unknownframework": "Froga eremu ez-ezaguna \"$1\".",
+       "javascripttest-pagetext-unknownaction": "Ekintza ezezaguna \"$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.",
        "tooltip-feed-atom": "Orrialde honen atom jarioa",
        "tooltip-t-contributions": "Lankide honen ekarpen zerrenda ikusi",
        "tooltip-t-emailuser": "Lankide honi e-posta mezua bidali",
+       "tooltip-t-info": "Orrialde honi buruzko informazio gehiago",
        "tooltip-t-upload": "Irudiak edo media fitxategiak igo",
        "tooltip-t-specialpages": "Orri berezi guztien zerrenda",
        "tooltip-t-print": "Orrialde honen bertsio inprimagarria",
        "newimages-summary": "Orrialde berezi honek igotako azkeneko fitxategiak erakusten ditu.",
        "newimages-legend": "Iragazkia",
        "newimages-label": "Fitxategia (edo bere zati bat):",
+       "newimages-showbots": "Erakutsi botek igotako fitxategiak",
        "noimages": "Ez dago ezer ikusteko.",
        "ilsubmit": "Bilatu",
        "bydate": "dataren arabera",
        "confirm-purge-top": "Orrialde honen katxea ezabatu?",
        "confirm-purge-bottom": "Orrialdea purgatzean katxea ezabatzen du eta orrialdearen bertsiorik eguneratuena erakustera behartzen du.",
        "confirm-watch-button": "Ados",
+       "confirm-watch-top": "Orrialde hau zure jarraipen-zerrendara gehitu?",
        "confirm-unwatch-button": "Ados",
+       "confirm-unwatch-top": "Orrialde hau zure jarraipen-zerrendatik kendu?",
        "quotation-marks": "«$1»",
        "imgmultipageprev": "&larr; aurreko orrialdea",
        "imgmultipagenext": "hurrengo orrialdea &rarr;",
        "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-title": "Garbitutako jarraipen-zerrenda",
+       "watchlistedit-clear-legend": "Garbitu jarraipen-zerrenda",
+       "watchlistedit-clear-explain": "Izenburu guztiak zure jarraipen-zerrendatik kenduko dira",
        "watchlistedit-clear-titles": "Izenburuak:",
+       "watchlistedit-clear-submit": "Garbitu jarraipen zerrenda (Behin betiko da!)",
+       "watchlistedit-clear-done": "Zure jarraipen-zerrenda garbitu da.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|Izenburu 1 kendu da|$1 izenburu kendu dira}}:",
+       "watchlisttools-clear": "Garbitu jarraipen-zerrenda",
        "watchlisttools-view": "Aldaketa garrantzitsuak ikusi",
        "watchlisttools-edit": "Zerrenda ikusi eta aldatu",
        "watchlisttools-raw": "Zerrenda idatziz aldatu",
        "tags-active-no": "Ez",
        "tags-edit": "aldatu",
        "tags-hitcount": "$1 {{PLURAL:$1|aldaketa|aldaketa}}",
+       "tags-create-submit": "Sortu",
        "comparepages": "Orrialdeak alderatu",
        "compare-page1": "1. orrialdea",
        "compare-page2": "2. orrialdea",
        "htmlform-no": "Ez",
        "htmlform-yes": "Bai",
        "htmlform-chosen-placeholder": "Aukeratu",
+       "htmlform-cloner-create": "Gehitu gehiago",
+       "htmlform-cloner-delete": "Kendu",
        "sqlite-has-fts": "$1 testu osoan bilatzeko laguntzarekin",
        "sqlite-no-fts": "$1 testu osoan bilatzeko laguntzarik gabe",
        "logentry-delete-delete": "$1 {{GENDER:$2|wikilariak}} «$3» orria ezabatu du",
        "api-error-filename-tooshort": "Fitxategiaren izena laburregia da.",
        "api-error-filetype-banned": "Mota horretako fitxategiak debekatuta daude.",
        "api-error-filetype-missing": "Fitxategiak ez zuen luzapenik.",
+       "api-error-http": "Barne-errorea: Ezin da zerbitzariarekin konektatu.",
        "api-error-illegal-filename": "Fitxategiaren izena ez da onartzen.",
+       "api-error-internal-error": "Barne-errorea: Zerbaitek huts egin du zuk wikira igotakoa prozesatzean.",
+       "api-error-invalid-file-key": "Barne-errorea: Ez da fitxategia aurkitu aldi baterako biltegian.",
+       "api-error-missingparam": "Barne-errorea: Parametroak falta dira eskaeran.",
+       "api-error-missingresult": "Barne-errorea: Ezin da zehaztu kopia ondo burutu den ala ez.",
        "api-error-mustbeloggedin": "Fitxategiak igotzeko izena emanda eduki behar duzu.",
        "api-error-mustbeposted": "Barne arazoa: HTTP POST beharrezkoa da.",
        "api-error-noimageinfo": "Igoera ondo egin da, baina zerbitzariak ez digu informaziorik eman zerbitzariaren inguruan.",
        "api-error-ok-but-empty": "Barne arazoa: zerbitzariaren erantzunik ez.",
        "api-error-overwrite": "Existitzen den fitxategi bat gain-idaztea ez da posible.",
        "api-error-stashfailed": "Barne arazoa: Zerbitzariak ezin izan du behin-behineko fitxategia gorde",
+       "api-error-publishfailed": "Barne-errorea: Zerbitzariak ezin izan du aldi baterako fitxategia gorde.",
        "api-error-timeout": "Zerbitzariak ez du erantzun espero zitekeen denboran.",
        "api-error-unclassified": "Ezezaguna den errorea gertatu da.",
        "api-error-unknown-code": "Akats ezezaguna: \"$1\".",
        "pagelang-language": "Hizkuntza",
        "pagelang-select-lang": "Hizkuntza aukeratu",
        "right-pagelang": "Aldatu orrialdearen hizkuntza",
+       "action-pagelang": "orrialdearen hizkuntza aldatu",
+       "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (gaituta)",
+       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''desgaituta''')",
        "mediastatistics-nbytes": "{{PLURAL:$1|$1 byte|$1 byte}} ($2; %$3)",
+       "mediastatistics-table-mimetype": "MIME mota",
        "mediastatistics-table-count": "Fitxategi kopurua",
+       "mediastatistics-header-unknown": "Ezezaguna",
        "mediastatistics-header-video": "Bideoak",
        "json-error-syntax": "Sintaxi-errorea"
 }
index d4465ee..1a90601 100644 (file)
@@ -42,7 +42,8 @@
                        "Mogoeilor",
                        "Hosseinblue",
                        "فلورانس",
-                       "Saeidpourbabak"
+                       "Saeidpourbabak",
+                       "Arash.pt"
                ]
        },
        "tog-underline": "خط کشیدن زیر پیوندها:",
        "userlogin-resetlink": "جزئیات ورود را فراموش کرده‌اید؟",
        "userlogin-resetpassword-link": "گذرواژه‌تان را فراموش کردید؟",
        "userlogin-helplink2": "کمک با ورود",
-       "userlogin-loggedin": "شما در حال حاضر به‌عنوان {{GENDER:$1|$1}} وارد شده‌اید.\nاز فرم پایین برای ورود به‌عنوان یک کاربر دیگر استفاده کنید.",
+       "userlogin-loggedin": "شما در حال حاضر به عنوان {{GENDER:$1|$1}} وارد شده‌اید.\nاز فرم پایین برای ورود به عنوان یک کاربر دیگر استفاده کنید.",
        "userlogin-createanother": "ایجاد یک حساب کاربری دیگر",
        "createacct-emailrequired": "نشانی رایانامه",
        "createacct-emailoptional": "نشانی رایانامه (اختیاری)",
        "passwordremindertitle": "یادآور گذرواژهٔ {{SITENAME}}",
        "passwordremindertext": "یک نفر (احتمالاً خود شما، با نشانی آی‌پی $1) گذرواژهٔ جدیدی برای حساب کاربری شما در {{SITENAME}} درخواست کرده‌است ($4). \nیک گذرواژهٔ موقت برای کاربر «$2» ساخته شده و برابر با «$3» قرار داده شده‌است.\nاگر هدفتان همین بوده‌است، اکنون باید وارد سامانه شوید و گذرواژهٔ جدیدی برگزینید.\nگذرواژهٔ موقت شما ظرف {{PLURAL:$5|یک روز|$5 روز}} باطل می‌شود.\n\nاگر کس دیگری این درخواست را کرده‌است یا اینکه شما گذرواژهٔ پیشین خود را به یاد آورده‌اید و دیگر تمایلی به تغییر آن ندارید، می‌توانید این پیغام را نادیده بگیرید و همان گذرواژهٔ پیشین را به کار برید.",
        "noemail": "هیچ نشانی رایانامه‌ای برای کاربر «$1» ثبت نشده‌است.",
-       "noemailcreate": "باÛ\8cد Û\8cÚ© Ù\86شاÙ\86Û\8c Ø±Ø§Û\8cاÙ\86اÙ\85Ù\87 Ù\85عتبر Ù\88ارد کنید",
+       "noemailcreate": "Ø´Ù\85ا Ø¨Ø§Û\8cد Û\8cÚ© Ù\86شاÙ\86Û\8c Ù¾Ø³Øª Ø§Ù\84کترÙ\88Ù\86Û\8cÚ©Û\8c Ø¯Ø±Ø³Øª Ù\81راÙ\87Ù\85 کنید",
        "passwordsent": "گذرواژه‌ای جدید به نشانی رایانامه ثبت‌شده برای «$1» فرستاده شد.\nلطفاً پس از دریافت آن دوباره به سامانه وارد شوید.",
        "blocked-mailpassword": "نشانی آی‌پی شما از ویرایش بازداشته شده‌است و از این رو به منظور جلوگیری از سوءاستفاده اجازهٔ بهره‌گیری از قابلیت بازیابی گذرواژه را ندارد.",
        "eauthentsent": "یک نامه برای تأیید نشانی رایانامه به نشانی موردنظر ارسال شد.\nقبل از اینکه نامهٔ دیگری قابل ارسال به این نشانی باشد، باید دستورهایی که در آن نامه آمده است را جهت تأیید این مساله که این نشانی متعلق به شماست، اجرا کنید.",
        "throttled-mailpassword": "یک رایانامهٔ بازنشانی گذرواژه در $1 {{PLURAL:$1|ساعت|ساعت}} گذشته فرستاده شده است.\nبرای جلوگیری از سوءاستفاده، هر $1 {{PLURAL:$1|ساعت|ساعت}} تنها یک رایانامهٔ بازنشانی گذرواژه فرستاده می‌شود.",
-       "mailerror": "خطا در فرستادن رایانامه: $1",
+       "mailerror": "خطا در فرستادن پست الکترونیکی: $1",
        "acct_creation_throttle_hit": "بازدیدکنندگان این ویکی که از نشانی آی‌پی شما استفاده می‌کنند در روز گذشته {{PLURAL:$1|یک حساب کاربری|$1 حساب کاربری}} ساخته‌اند، که بیشترین تعداد مجاز در آن بازهٔ زمانی است.\nبه همین خاطر، بازدیدکنندگانی که از این نشانی آی‌پی استفاده می‌کنند نمی‌توانند در حال حاضر حساب جدیدی بسازند.",
        "emailauthenticated": "نشانی رایانامهٔ شما در $2 ساعت $3 تصدیق شد.",
        "emailnotauthenticated": "نشانی رایانامهٔ شما هنوز تصدیق نشده‌است.\nبرای هیچ‌یک از ویژگی‌های زیر رایانامه ارسال نخواهد شد.",
        "emailconfirmlink": "تأیید نشانی رایانامه",
        "invalidemailaddress": "نشانی واردشدهٔ رایانامه قابل‌قبول نیست، چرا که دارای ساختار نامعتبری است.\nلطفاً نشانی‌ای با ساختار صحیح وارد کنید و یا بخش مربوط را خالی بگذارید.",
        "cannotchangeemail": "نشانی‌های رایانامهٔ حساب کاربری در این ویکی قابل تغییر نیست.",
-       "emaildisabled": "این وب‌گاه قادر به ارسال رایانامه نیست.",
+       "emaildisabled": "این وب سایت قادر به فرستادن پست الکترونیکی نیست.",
        "accountcreated": "حساب کاربری ایجاد شد",
        "accountcreatedtext": "حساب کاربری برای [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|بحث]]) ایجاد شده است.",
        "createaccount-title": "ایجاد حساب کاربری در {{SITENAME}}",
        "passwordreset-domain": "دامنه:",
        "passwordreset-capture": "رایانامهٔ نهایی نشان داده شود؟",
        "passwordreset-capture-help": "اگر این گزینه را علامت بزنید رایانامهٔ (حاوی گذرواژهٔ موقت) به شما نشان داده خواهد شد و برای کاربر نیز فرستاده خواهد شد.",
-       "passwordreset-email": "نشانی رایانامه:",
+       "passwordreset-email": "نشانی پست الکترونیکی:",
        "passwordreset-emailtitle": "جزئیات حساب در {{SITENAME}}",
        "passwordreset-emailtext-ip": "یک نفر (احتمالاً شما، با نشانی آی‌پی $1) درخواست بازنشانی گذرواژه‌تان در {{SITENAME}} ($4) را کرده‌است. {{PLURAL:$3|حساب|حساب‌های}} کاربری زیر با این رایانشانی مرتبط هستند:\n\n$2\n\n{{PLURAL:$3|این گذرواژهٔ موقت|این گذرواژه‌های موقت}} پس از {{PLURAL:$5|یک روز|$5 روز}} باطل خواهند شد.\nشما باید هم‌اکنون ثبت ورود کنید و گذرواژه‌ای جدید برگزینید. اگر فکر می‌کنید شخص دیگری این درخواست را داده‌است یا اگر گذرواژهٔ اصلی‌تان را به یاد آوردید و دیگر نمی‌خواهید آن را تغییر دهید، می‌توانید این پیغام را نادیده بگیرید و به استفاده از گذرواژهٔ قبلی‌تان ادامه دهید.",
        "passwordreset-emailtext-user": "کاربر $1 از {{SITENAME}} درخواست بازنشانی گذرواژهٔ شما در {{SITENAME}} ($4) را کرده است. {{PLURAL:$3|حساب|حساب‌های}} کاربری زیر با این رایانشانی مرتبط است:\n\n$2\n\n{{PLURAL:$3|این گذرواژهٔ موقت|این گذرواژه‌های موقت}} تا {{PLURAL:$5|یک روز|$5 روز}} باطل می‌شود.\nشما باید هم‌اکنون وارد شده و یک گذرواژهٔ جدید برگزینید. اگر شخص دیگری این درخواست را داده است، یا اگر گذرواژهٔ اصلی‌تان را به خاطر آوردید و دیگر نمی‌خواهید آن را تغییر دهید، می‌توانید این پیغام را نادیده بگیرید و به استفاده از گذرواژهٔ قبلی‌تان ادامه دهید.",
        "prefs-personal": "داده‌های کاربر",
        "prefs-rc": "تغییرات اخیر",
        "prefs-watchlist": "فهرست پی‌گیری‌ها",
+       "prefs-editwatchlist": "ویرایش فهرست پی‌گیری‌ها",
+       "prefs-editwatchlist-label": "ویرایش همه فهرست پیگیری‌هایتان:",
+       "prefs-editwatchlist-edit": "دیدن و حذف عنوان‌ها از فهرست پیگیری‌هایتان",
+       "prefs-editwatchlist-raw": "ویرایش فهرست خام پیگیری‌ها",
+       "prefs-editwatchlist-clear": "پاک کردن فهرست پیگیری‌هایتان",
        "prefs-watchlist-days": "تعداد روزهایی که باید در فهرست پی‌گیری‌ها نمایش داده شود:",
        "prefs-watchlist-days-max": "حداکثر $1 {{PLURAL:$1|روز}}",
        "prefs-watchlist-edits": "تعداد ویرایش‌های نشان‌داده‌شده در فهرست پی‌گیری‌های گسترش‌یافته:",
        "prefs-watchlist-token": "رمز فهرست پی‌گیری:",
        "prefs-misc": "متفرقه",
        "prefs-resetpass": "تغییر گذرواژه",
-       "prefs-changeemail": "تغÛ\8cÛ\8cر Ø±Ø§Û\8cاÙ\86اÙ\85Ù\87",
-       "prefs-setemail": "تنظیم نشانی رایانامه",
-       "prefs-email": "گزینه‌های رایانامه",
+       "prefs-changeemail": "دگرش Ø¯Ø± Ù\86شاÙ\86Û\8c Ù¾Ø³Øª Ø§Ù\84کترÙ\88Ù\86Û\8cÚ©Û\8c",
+       "prefs-setemail": "کار گذاشتن نشانی پست الکترونیکی",
+       "prefs-email": "گزینه‌های پست الکترونیکی",
        "prefs-rendering": "نمایش صفحه",
        "saveprefs": "ذخیره",
        "restoreprefs": "برگرداندن تمام تنظیمات پیش‌فرض (در تمامی قسمت‌ها)",
        "prefs-common-css-js": "سی‌اس‌اس/جاوااسکریپت مشترک برای تمام پوسته‌ها:",
        "prefs-reset-intro": "شما می‌توانید از این صفحه برای بازگرداندن تنظیمات خود به پیش‌فرض تارنما استفاده کنید.\nاین کار بازگشت‌ناپذیر است.",
        "prefs-emailconfirm-label": "تأیید رایانامه:",
-       "youremail": "رایانامه:",
+       "youremail": "پست الکترونیکی:",
        "username": "{{GENDER:$1|نام کاربری}}:",
        "prefs-memberingroups": "{{GENDER:$2|عضو}} {{PLURAL:$1|گروه|گروه}}:",
        "prefs-registration": "زمان ثبت‌نام:",
        "prefs-help-realname": "نام واقعی اختیاری است.\nاگر وارد شده است هنگام ارجاع به آثارتان و انتساب آن‌ها به شما ممکن است از نام واقعی‌تان استفاده شود.",
        "prefs-help-email": "نشانی رایانامه اختیاری‌است، اما فرستادن گذرواژه‌ای جدید را اگر گذرواژهٔ خود را فراموش کنید ممکن می‌کند.",
        "prefs-help-email-others": "شما همچنین می‌توانید انتخاب کنید که کاربران بتوانند از طریق پیوندی در صفحهٔ کاربری یا صفحهٔ بحث کاربری‌تان به شما رایانامه بفرستند.\nنشانی رایانامه شما زمانی که دیگران با شما تماس بگیرند فاش نمی‌شود.",
-       "prefs-help-email-required": "نشانی رایانامه الزامی‌است.",
+       "prefs-help-email-required": "نشانی پست الکترونیکی نیاز است.",
        "prefs-info": "اطلاعات اولیه",
        "prefs-i18n": "بین‌المللی‌سازی",
        "prefs-signature": "امضا",
        "userrights-removed-self": "شما با موفقیت دسترسی‌های خود را واستاندید. به این ترتیب شما دیگر به این صفحه دسترسی ندارید.",
        "group": "گروه:",
        "group-user": "کاربران",
-       "group-autoconfirmed": "کاربران تأییدشده",
+       "group-autoconfirmed": "کاربران تأییدشدهٔ خودکار",
        "group-bot": "ربات‌ها",
        "group-sysop": "مدیران",
        "group-bureaucrat": "دیوان‌سالاران",
        "right-createpage": "ایجاد صفحه (در مورد صفحه‌های غیر بحث)",
        "right-createtalk": "ایجاد صفحه‌های بحث",
        "right-createaccount": "ایجاد حساب‌های کاربری",
-       "right-minoredit": "علامت‌زدن ویرایش‌ها بهعنوان جزئی",
+       "right-minoredit": "علامت‌زدن ویرایش‌ها به عنوان جزئی",
        "right-move": "انتقال صفحه",
        "right-move-subpages": "انتقال صفحات به همراه زیر‌صفحات‌شان",
        "right-move-rootuserpages": "انتقال صفحه‌های کاربری سرشاخه",
        "right-proxyunbannable": "تاثیر نپذیرفتن از قطع دسترسی خودکار پروکسی‌ها",
        "right-unblockself": "بازکردن دسترسی خود",
        "right-protect": "تغییر میزان محافظت صفحات و ویرایش صفحات محافظت‌شده آبشاری",
-       "right-editprotected": "ویرایش صفحه‌های محافظت‌شده بهعنوان «{{int:protect-level-sysop}}»",
+       "right-editprotected": "ویرایش صفحه‌های محافظت‌شده به عنوان «{{int:protect-level-sysop}}»",
        "right-editsemiprotected": "ویرایش صفحه حفاظت‌شده به عنوان \"{{int:protect-level-autoconfirmed}}\"",
        "right-editcontentmodel": "ویرایش مدل محتوای یک صفحه",
        "right-editinterface": "ویرایش واسط کاربری",
        "right-editmyprivateinfo": "داده‌های خصوصی خود را ویرایش کنید (مانند رایانشانی و نام واقعی)",
        "right-editmyoptions": "ترجیحات خود را ویرایش",
        "right-rollback": "واگردانی سریع ویرایش‌های آخرین کاربری که یک صفحه را ویرایش کرده‌است",
-       "right-markbotedits": "علامت‌زدن ویرایش‌های واگردانی‌شده بهعنوان ویرایش ربات",
+       "right-markbotedits": "علامت‌زدن ویرایش‌های واگردانی‌شده به عنوان ویرایش ربات",
        "right-noratelimit": "تاثیر نپذیرفتن از محدودیت سرعت",
        "right-import": "واردکردن صفحه از ویکی‌های دیگر",
        "right-importupload": "واردکردن صفحه از طریق بارگذاری پرونده",
        "right-override-export-depth": "برون‌بری صفحه‌ها شامل صفحه‌های پیوند شده تا عمق ۵",
        "right-sendemail": "ارسال رایانامه به دیگر کاربران",
        "right-passwordreset": "مشاهدهٔ نامه‌های تنظیم مجدد گذرواژه",
+       "right-managechangetags": "ایجاد و حذف [[Special:Tags|برچسب‌ها]] از پایگاه داده",
        "newuserlogpage": "سیاههٔ ایجاد کاربر",
        "newuserlogpagetext": "این سیاهه‌ای از نام‌های کاربری تازه‌ساخته‌شده است.",
        "rightslog": "سیاههٔ اختیارات کاربر",
        "recentchanges-label-minor": "این یک ویرایش جزئی‌است",
        "recentchanges-label-bot": "این ویرایش را یک ربات انجام داده‌است",
        "recentchanges-label-unpatrolled": "این ویرایش هنوز گشت‌زنی نشده‌است",
-       "recentchanges-label-plusminus": "حجم صفحه به اندازه این بایت‌ها تغییر یافته‌است",
+       "recentchanges-label-plusminus": "حجم صفحه به اندازه این مقدار بایت تغییر یافته است",
        "recentchanges-legend-heading": "'''اختصارها:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (همچنین به [[Special:NewPages|فهرست صفحات تازه]] نگاه کنید)",
        "recentchanges-legend-plusminus": "(<em>±۱۲۳</em>)",
        "badfilename": "نام پرونده به «$1» تغییر کرد.",
        "filetype-mime-mismatch": "پسوند پرونده «$1.‎» با نوع MIME آن ($2) مطابقت ندارد.",
        "filetype-badmime": "پرونده‌هایی که نوع MIME آن‌ها $1 باشد برای بارگذاری مجاز نیستند.",
-       "filetype-bad-ie-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": "این پرونده پسوند (مثلاً «‎.jpg») ندارد.",
        "trackingcategories-nodesc": "توضیحی وجود ندارد.",
        "trackingcategories-disabled": "رده غیرفعال‌شده است",
        "mailnologin": "نشانی‌ای از فرستنده موجود نیست",
-       "mailnologintext": "برای فرستادن رایانامه به کاربران دیگر باید [[Special:UserLogin|به سامانه وارد شوید]] و نشانی رایانامهٔ معتبری در [[Special:Preferences|ترجیحات]] خود داشته باشید.",
-       "emailuser": "Ù\81رستادÙ\86 Ù\86اÙ\85Ù\87 Ø¨Ù\87 Ø§Û\8cÙ\86 Ú©Ø§Ø±Ø¨Ø±",
-       "emailuser-title-target": "رایانامه به {{GENDER:$1|کاربر}}",
-       "emailuser-title-notarget": "رایانامه به کاربر",
+       "mailnologintext": "برای فرستادن پست الکترونیکی به کاربران دیگر باید [[Special:UserLogin|به سیستم وارد شوید]] و نشانی پست الکترونیکی معتبری در [[Special:Preferences|ترجیح‌های]] خود داشته باشید.",
+       "emailuser": "پست Ø§Ù\84کترÙ\88Ù\86Û\8cÚ©Û\8c",
+       "emailuser-title-target": "فرستادن پست الکترونیکی به {{GENDER:$1|کاربر}}",
+       "emailuser-title-notarget": "فرستادن پست الکترونیکی به کاربر",
        "emailpage": "رایانامه به کاربر",
        "emailpagetext": "شما می‌توانید از فرم زیر برای ارسال یک رایانامه به این {{GENDER:$1|کاربر}} استفاده کنید.\nنشانی رایانامه‌ای که در [[Special:Preferences|ترجیحات کاربریتان]] وارد کرده‌اید در نشانی فرستنده (From) نامه خواهد آمد، تا گیرنده بتواند پاسخ دهد.",
-       "defemailsubject": "رایانامه {{SITENAME}} از طرف کاربر «$1»",
+       "defemailsubject": "پست الکترونیکی {{SITENAME}} از طرف کاربر «$1»",
        "usermaildisabled": "رایانامهٔ کاربر غیرقعال است",
        "usermaildisabledtext": "شما در این ویکی نمی‌توانید به دیگر کاربران رایانامه بفرستید",
        "noemailtitle": "نشانی رایانامه موجود نیست",
        "emailccme": "رونوشت پیغام را برایم بفرست.",
        "emailccsubject": "رونوشت پیغام شما به $1: $2",
        "emailsent": "رایانامه فرستاده شد",
-       "emailsenttext": "Ù¾Û\8cغاÙ\85 Ø±Ø§Û\8cاÙ\86اÙ\85Ù\87 شما فرستاده شد.",
-       "emailuserfooter": "این رایانامه با استفاده از ویژگی «فرستادن نامه به این کاربر» {{SITENAME}} توسط $1 به $2 فرستاده شد.",
+       "emailsenttext": "Ù¾Û\8cاÙ\85 Ù¾Ø³Øª Ø§Ù\84کترÙ\88Ù\86Û\8cÚ©Û\8c شما فرستاده شد.",
+       "emailuserfooter": "این پست الکترونیکی با استفاده از ویژگی «پست الکترونیکی» {{SITENAME}} توسط $1 به $2 فرستاده شد.",
        "usermessage-summary": "گذاشتن پیغام سامانه.",
        "usermessage-editor": "پیغام رسان سامانه",
        "watchlist": "فهرست پی‌گیری",
        "watching": "پی‌گیری...",
        "unwatching": "توقف پی‌گیری...",
        "watcherrortext": "ایرادی در هنگام عوض کردن تنظیمات فهرست پیگیرتان برای «$1» رخ داد.",
-       "enotif_reset": "نشان‌گذاری همهٔ صفحات بهعنوان بازدیدشده",
+       "enotif_reset": "نشان‌گذاری همهٔ صفحات به عنوان بازدیدشده",
        "enotif_impersonal_salutation": "کاربر {{SITENAME}}",
        "enotif_subject_deleted": "{{SITENAME}} صفحهٔ $1 توسط {{gender:$2|$2}} حذف شد.",
        "enotif_subject_created": "{{SITENAME}} صفحهٔ $1 توسط {{gender:$2|$2}} ایجاد شده.",
        "move-page-legend": "انتقال صفحه",
        "movepagetext": "با استفاده از فرم زیر نام صفحه تغییر خواهد کرد، و تمام تاریخچه‌اش به نام جدید منتقل خواهد شد.\nعنوان قدیمی تبدیل به یک صفحهٔ تغییرمسیر به عنوان جدید خواهد شد.\nشما می‌توانید تغییرمسیرهایی که به عنوان اصلی اشاره دارند را به صورت خودکار به‌روزرسانی کنید.\nپیوندهای که به عنوان صفحهٔ قدیمی وجود دارند، تغییر نخواهند کرد؛ حتماً تغییرمسیرهای [[Special:DoubleRedirects|دوتایی]] یا [[Special:BrokenRedirects|خراب]] را بررسی کنید.\n'''شما''' مسئول اطمینان از این هستید که پیوندها هنوز به همان‌جایی که قرار است بروند.\n\nتوجه کنید که اگر از قبل صفحه‌ای در عنوان جدید وجود داشته باشد صفحه منتقل '''نخواهد شد'''،\nمگر این آخرین ویرایش تغییرمسیر باشد و در  تاریخچهٔ ویرایشی نداشته باشد.\nاین یعنی اگر اشتباه کردید می‌توانید صفحه را به همان جایی که از آن منتقل شده بود برگردانید، و این که نمی‌توانید روی صفحات موجود بنویسید.\n\n'''هشدار!'''\nانتقال صفحات به نام جدید ممکن است تغییر اساسی و غیرمنتظره‌ای برای صفحات محبوب باشد؛\nلطفاً مطمئن شوید که قبل از انتقال دادن صفحه، عواقب این کار را درک می‌کنید.",
        "movepagetext-noredirectfixer": "استفاده از فرم زیر سبب تغییر نام یک صفحه و انتقال تمام تاریخچهٔ آن به نام جدید می‌شود.\nعنوان پیشین تغییرمسیری به عنوان جدید خواهد شد.\nبه خاطر داشته باشید که [[Special:DoubleRedirects|تغییرمسیرهای دوتایی]] یا [[Special:BrokenRedirects|تغییرمسیرهای خراب]] را بررسی کنید.\nشما مسئولید که مطمئن شوید پس از انتقال، پیوندها به عنوان پیشین به جایی منتهی می‌شوند که باید.\n\nتوجه کنید که اگر صفحه‌ای تحت عنوان جدید از قبل موجود باشد، انتقال انجام '''نخواهد شد'''، مگر اینکه صفحه خالی و یا تغییرمسیر باشد و تاریخچهٔ ویرایشی دیگری نداشته باشد.\nاین یعنی اگر صفحه را به نامی اشتباه منتقل کردید می‌توانید این تغییر را واگردانی کنید، اما نمی‌توانید یک صفحه را به صفحه‌ای که از قبل موجود است انتقال دهید.\n\n'''هشدار!'''\nانتقال صفحه‌های پربیننده ممکن است عملی غیرمنتظره باشد؛\nلطفاً پیش از انتقال مطمئن شوید از نتیجهٔ کار آگاهید.",
-       "movepagetalktext": "صفحهٔ بحث مربوط، اگر وجود داشته باشد، بطور خودکار همراه با مقالهٔ اصلی منتقل خواهد شد '''مگر اینکه''' :\n* در حال انتقال صفحه از این فضای نام به فضای نام دیگری باشید،\n* یک صفحهٔ بحث غیرخالی تحت این نام جدید وجود داشته باشد، یا\n* جعبهٔ زیر را تیک نزده باشید.\n\nدر این حالات، باید صفحه را بطور دستی انتقال داده و یا محتویات دو صفحه را با ویرایش ادغام کنید.",
+       "movepagetalktext": "صفحهٔ بحث مربوط، اگر وجود داشته باشد، بطور خودکار همراه با مقالهٔ اصلی منتقل خواهد شد <strong>مگر اینکه:</strong>\n* در حال انتقال صفحه از این فضای نام به فضای نام دیگری باشید،\n* یک صفحهٔ بحث غیرخالی تحت این نام جدید وجود داشته باشد، یا\n* جعبهٔ زیر را تیک نزده باشید.\n\nدر این حالات، باید صفحه را بطور دستی انتقال داده و یا محتویات دو صفحه را با ویرایش ادغام کنید.",
        "movearticle": "انتقال صفحه:",
        "moveuserpage-warning": "'''هشدار:''' شما در حال انتقال دادن یک صفحهٔ کاربر هستید. توجه داشته باشید که تنها صفحه منتقل می‌شود و نام کاربر تغییر '''نمی‌یابد'''.",
        "movecategorypage-warning": "<strong>هشدار:</strong> شما در حال انتقال صفحه رده هستید. لطفاً توجه داشته باشید که فقط صفحه منتقل خواهد شد و  صفحات در رده قدیمی می‌مانند و به رده جدید <em>نمی‌روند</em>.",
        "tooltip-feed-rss": "خبرنامه آراس‌اس برای این صفحه",
        "tooltip-feed-atom": "خبرنامهٔ اتم برای این صفحه",
        "tooltip-t-contributions": "فهرست مشارکت‌های این کاربر",
-       "tooltip-t-emailuser": "فرستادن رایانامه به این کاربر",
+       "tooltip-t-emailuser": "فرستادن پست الکترونیکی به این کاربر",
        "tooltip-t-info": "اطلاعات بیشتر دربارهٔ این صفحه",
        "tooltip-t-upload": "بارگذاری تصاویر و پرونده‌های دیگر",
        "tooltip-t-specialpages": "فهرستی از همهٔ صفحه‌های ویژه",
        "pageinfo-toolboxlink": "اطلاعات صفحه",
        "pageinfo-redirectsto": "تغییرمسیر به",
        "pageinfo-redirectsto-info": "اطلاعات",
-       "pageinfo-contentpage": "شمرده شده به عنوان صفحهٔ محتویی",
+       "pageinfo-contentpage": "شمرده شده به عنوان صفحهٔ محتوایی",
        "pageinfo-contentpage-yes": "بله",
        "pageinfo-protect-cascading": "محافظت آبشاری از اینجا",
        "pageinfo-protect-cascading-yes": "بله",
        "logentry-move-move_redir": "$1 صفحهٔ $3 را به $4 که تغییرمسیر بود {{GENDER:$2|منتقل کرد}}",
        "logentry-move-move_redir-noredirect": "$1 صفحهٔ $3 را بدون برجای‌گذاشتن تغییرمسیر به $4 که تغییرمسیر بود {{GENDER:$2|منتقل کرد}}",
        "logentry-patrol-patrol": "$1 نسخه $4 صفحه $3 را به عنوان گشت خورده {{GENDER:$2|علامت زد}}",
-       "logentry-patrol-patrol-auto": "$1 نسخهٔ $4 صفحهٔ $3 را به‌طور خودکار بهعنوان گشت‌خورده {{GENDER:$2|علامت زد}}",
+       "logentry-patrol-patrol-auto": "$1 نسخهٔ $4 صفحهٔ $3 را به‌طور خودکار به عنوان گشت‌خورده {{GENDER:$2|علامت زد}}",
        "logentry-newusers-newusers": "حساب کاربری $1 {{GENDER:$2|ایجاد شد}}",
        "logentry-newusers-create": "حساب کاربری $1 {{GENDER:$2|ایجاد شد}}",
        "logentry-newusers-create2": "حساب کاربری $3 توسط $1 {{GENDER:$2|ایجاد شد}}",
        "log-name-pagelang": "تغییر سیاههٔ زبان",
        "log-description-pagelang": "این سیاههٔ تغییرات صفحهٔ زبان‌ها است.",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2| تغییریافت}} زبان صفحه برای  $3  از  $4  به  $5 .",
-       "default-skin-not-found": "اوه! پوسته پیش‌فرض برای ویکی شما تعریف‌شده در <code dir=\"ltr\"<$wgDefaultSkin</code> بهعنوان <code>$1</code>، در دسترس نیست.\n\nبه نظر می‌آید نصب شما شامل پوسته‌های زیر می‌شود. [https://www.mediawiki.org/wiki/Manual:Skin_configuration راهنما: تنظیمات پوسته] را برای کسب اطلاعات در باره چگونگی فعال‌ساختن آن‌ها و انتخاب پیش‌فرض ببینید.\n\n$2\n\n; اگر اخیراً مدیاویکی را نصب کرده‌اید:\n: احتمالاً از گیت، یا به طور مستقیم از کد مبدأ که از چند متد دیگر استفاده می‌کند نصب کردید. انتظار می‌رود. چند پوسته از [https://www.mediawiki.org/wiki/Category:All_skins فهرست پوسته mediawiki.org] نصب کنید، که همراه چندین پوسته و افزونه هستند. شما می‌توانید شاخه <code>skins/</code> را از آن نسخه‌برداری کرده و بچسبانید.\n\n:* همسانه‌سازی یکی از مخازن <code>mediawiki/skins/*</code> از طریق گیت به داخل شاخه <code dir=\"ltr\">skins/</code> از نصب مدیاویکی‌تان.\n: انجام این کار با مخزن گیت‌تان تداخل نمی‌کند اگر توسعه‌دهنده مدیاویکی هستید.\n\n; اگر اخیراً مدیاویکی را ارتقاء دادید:\n: مدیاویکی ۱٫۲۴ و تازه‌تر دیگر به طور خودکار پوسته‌های نصب‌شده را فعال نمی‌کند ([https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery راهنما: کشف خودکار پوسته] را ببینید). شما می‌توانید خطوط زیر را به داخل <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>$wgDefaultSkin</code> بهعنوان <code>$1</code>، هست موجود نیست.\n\nشما پوسته‌ها را نصب نکرده‌اید.\n\n:اگر مدیاویکی را به‌روز یا نصب کرده‌اید:\n:ممکن است از گیت یا از کند منبع با روش های دیگر نصب کرده‌اید. انتظار می‌رود MediaWiki 1.24 یا جدیدتر در پوشهٔ اصلی هیچ پوسته‌ای نداشته باشند.\nسعی کنید تعدادی پوسته از [https://www.mediawiki.org/wiki/Category:All_skins پوشهٔ پوسته‌های مدیاویکی]، با:\n:*دانلود کردن [https://www.mediawiki.org/wiki/Download نصب‌کننده تاربال]، که با چندین پوسته و افزونه هست. شما می توانید پوستهٔ <code>skins/</code> را  از آن کپی و پیست کنید.\n:*کلون کردن یکی از <code dir=\"ltr\">mediawiki/skins/*</code> از ریپوزیتوری در پوشهٔ <code>skins/</code> مدیاویکی‌تان.\n:اگر توسعه‌دهندهٔ مدیاویکی هستید، انجام این کار نباید تعارضی با ریپوزیتوری گیت شما داشته باشد. برای اطلاعات بیشتر و فعال کردن پوسته‌ها و انتخاب آنها به عنوان پیش‌فرض [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 راهنما: تنظیمات پوسته] را برای کسب اطلاعات در باره چگونگی فعال‌ساختن آن‌ها و انتخاب پیش‌فرض ببینید.\n\n$2\n\n; اگر اخیراً مدیاویکی را نصب کرده‌اید:\n: احتمالاً از گیت، یا به طور مستقیم از کد مبدأ که از چند متد دیگر استفاده می‌کند نصب کردید. انتظار می‌رود. چند پوسته از [https://www.mediawiki.org/wiki/Category:All_skins فهرست پوسته mediawiki.org] نصب کنید، که همراه چندین پوسته و افزونه هستند. شما می‌توانید شاخه <code>skins/</code> را از آن نسخه‌برداری کرده و بچسبانید.\n\n:* همسانه‌سازی یکی از مخازن <code>mediawiki/skins/*</code> از طریق گیت به داخل شاخه <code dir=\"ltr\">skins/</code> از نصب مدیاویکی‌تان.\n: انجام این کار با مخزن گیت‌تان تداخل نمی‌کند اگر توسعه‌دهنده مدیاویکی هستید.\n\n; اگر اخیراً مدیاویکی را ارتقاء دادید:\n: مدیاویکی ۱٫۲۴ و تازه‌تر دیگر به طور خودکار پوسته‌های نصب‌شده را فعال نمی‌کند ([https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery راهنما: کشف خودکار پوسته] را ببینید). شما می‌توانید خطوط زیر را به داخل <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>$wgDefaultSkin</code> به عنوان <code>$1</code>، هست موجود نیست.\n\nشما پوسته‌ها را نصب نکرده‌اید.\n\n:اگر مدیاویکی را به‌روز یا نصب کرده‌اید:\n:ممکن است از گیت یا از کند منبع با روش های دیگر نصب کرده‌اید. انتظار می‌رود MediaWiki 1.24 یا جدیدتر در پوشهٔ اصلی هیچ پوسته‌ای نداشته باشند.\nسعی کنید تعدادی پوسته از [https://www.mediawiki.org/wiki/Category:All_skins پوشهٔ پوسته‌های مدیاویکی]، با:\n:*دانلود کردن [https://www.mediawiki.org/wiki/Download نصب‌کننده تاربال]، که با چندین پوسته و افزونه هست. شما می توانید پوستهٔ <code>skins/</code> را  از آن کپی و پیست کنید.\n:*کلون کردن یکی از <code dir=\"ltr\">mediawiki/skins/*</code> از ریپوزیتوری در پوشهٔ <code>skins/</code> مدیاویکی‌تان.\n:اگر توسعه‌دهندهٔ مدیاویکی هستید، انجام این کار نباید تعارضی با ریپوزیتوری گیت شما داشته باشد. برای اطلاعات بیشتر و فعال کردن پوسته‌ها و انتخاب آنها به عنوان پیش‌فرض [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 9301295..c9e210a 100644 (file)
@@ -42,7 +42,8 @@
                        "Syreeni",
                        "MrTapsa",
                        "SMAUG",
-                       "SuperPete"
+                       "SuperPete",
+                       "McSalama"
                ]
        },
        "tog-underline": "Linkkien alleviivaus:",
        "prefs-personal": "Käyttäjätiedot",
        "prefs-rc": "Tuoreet muutokset",
        "prefs-watchlist": "Tarkkailulista",
+       "prefs-editwatchlist": "Muokkaa tarkkailulistaa",
+       "prefs-editwatchlist-label": "Muokkaa tarkkailulistasi merkintöjä:",
+       "prefs-editwatchlist-edit": "Näytä ja poista kohteita tarkkailulistallasi",
+       "prefs-editwatchlist-raw": "Muokkaa tarkkailulistan raakaversiota",
+       "prefs-editwatchlist-clear": "Tyhjennä tarkkailulistasi",
        "prefs-watchlist-days": "Näytettävien päivien määrä tarkkailulistalla",
        "prefs-watchlist-days-max": "Enintään $1 {{PLURAL:$1|päivä|päivää}}",
        "prefs-watchlist-edits": "Tarkkailulistalla näytettävien muokkausten määrä",
        "right-override-export-depth": "Viedä sivuja sisältäen viitatut sivut viiden syvyydellä",
        "right-sendemail": "Lähettää sähköpostia muille käyttäjille",
        "right-passwordreset": "Tarkastella salasanan alustusviestejä",
+       "right-managechangetags": "Luoda ja poistaa [[Special:Tags|merkkauksia]] tietokannasta",
        "newuserlogpage": "Uudet käyttäjät",
        "newuserlogpagetext": "Tämä on loki luoduista käyttäjätunnuksista.",
        "rightslog": "Käyttöoikeusloki",
        "action-viewmyprivateinfo": "katsoa omia yksityisiä tietojasi",
        "action-editmyprivateinfo": "muokata omia yksityisiä tietojasi",
        "action-editcontentmodel": "muokata sivun sisältömallia",
+       "action-managechangetags": "luoda ja poistaa merkkauksia tietokannasta",
        "nchanges": "$1 {{PLURAL:$1|muutos|muutosta}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|viimeisen käynnin jälkeen}}",
        "enhancedrc-history": "historia",
        "delete-confirm": "Poista ”$1”",
        "delete-legend": "Sivun poisto",
        "historywarning": "<strong>Varoitus:</strong> Sivulla, jota olet poistamassa, on muokkaushistoriaa ja sitä on muokattu $1 {{PLURAL:$1|kerran|kertaa}}:",
-       "confirmdeletetext": "Olet poistamassa sivun tai tiedoston ja kaiken sen historian. Ymmärrä teon seuraukset ja tee poisto {{GRAMMAR:genitive|{{SITENAME}}}} [[{{MediaWiki:Policy-url}}|käytäntöjen]] mukaisesti.",
+       "confirmdeletetext": "Olet poistamassa sivun ja kaiken sen historian.\nVahvista, että olet aikeissa tehdä tämän ja että ymmärrät teon seuraukset ja teet poiston [[{{MediaWiki:Policy-url}}|käytäntöjen]] mukaisesti.",
        "actioncomplete": "Toiminto suoritettu",
        "actionfailed": "Toiminto epäonnistui",
        "deletedtext": "”$1” on poistettu.\nSivulla $2 on lista viimeaikaisista poistoista.",
        "intentionallyblankpage": "Tämä sivu on tarkoituksellisesti tyhjä.",
        "external_image_whitelist": " #Älä muuta tätä riviä lainkaan.<pre>\n#Laita säännöllisten lausekkeiden palaset (vain osa, joka menee //-merkkien väliin) alle\n#Niitä verrataan ulkoisten (suoralinkitettyjen) kuvien URLeihin\n#Ne jotka sopivat, näytetään kuvina, muutoin kuviin näytetään vain linkit\n#Rivit, jotka alkavat #-merkillä ovat kommentteja\n#Tämä on riippumaton kirjainkoosta\n\n#Laita kaikki säännöllisten lausekkeiden palaset tämän rivit yläpuolelle. Älä muuta tätä riviä lainkaan</pre>",
        "tags": "Voimassa olevat muutosmerkinnät",
-       "tag-filter": "[[Special:Tags|Merkintä]]suodatin:",
+       "tag-filter": "[[Special:Tags|Merkkausten]] suodatin:",
        "tag-filter-submit": "Suodata",
-       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Merkintä|Merkinnät}}]]: $2)",
-       "tags-title": "Merkinnät",
-       "tags-intro": "Tämä sivu luetteloi ne merkinnät eli merkkaukset (''engl.'' tags), joilla ohjelmisto voi merkitä muokkauksia, ja mitä ne tarkoittavat.",
-       "tags-tag": "Merkinnän nimi",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Merkkaus|Merkkaukset}}]]: $2)",
+       "tags-title": "Merkkaukset",
+       "tags-intro": "Tämä sivu luetteloi ne merkkaukset (''engl.'' tags), joilla ohjelmisto voi merkitä muokkauksia, ja mitä ne tarkoittavat.",
+       "tags-tag": "Merkkauksen nimi",
        "tags-display-header": "Näkyvyys muutosluetteloissa",
        "tags-description-header": "Täysi kuvaus tarkoituksesta",
+       "tags-source-header": "Lähde",
        "tags-active-header": "Aktiivinen?",
-       "tags-hitcount-header": "Merkityt muutokset",
+       "tags-hitcount-header": "Merkatut muutokset",
+       "tags-actions-header": "Toiminnot",
        "tags-active-yes": "Kyllä",
        "tags-active-no": "Ei",
+       "tags-source-extension": "Laajennuksen määrittelemä",
+       "tags-source-manual": "Käyttäjien ja bottien käsin asettama",
+       "tags-source-none": "Ei enää käytössä",
        "tags-edit": "muokkaa",
+       "tags-delete": "tuhoa",
+       "tags-activate": "aktivoi",
+       "tags-deactivate": "ota pois käytöstä",
        "tags-hitcount": "$1 {{PLURAL:$1|muutos|muutosta}}",
+       "tags-manage-no-permission": "Sinulla ei ole oikeutta käsitellä merkkauksia.",
+       "tags-create-heading": "Luo uusi merkkaus",
+       "tags-create-explanation": "Oletuksena on, että uutena luodut merkkaukset tulevat käyttäjien ja bottien käyttöön.",
+       "tags-create-tag-name": "Merkkauksen nimi:",
+       "tags-create-reason": "Syy:",
+       "tags-create-submit": "Luo",
+       "tags-create-no-name": "Sinun täytyy antaa merkkaukselle nimi.",
+       "tags-create-invalid-chars": "Merkkausten nimissä ei saa olla pilkkuja (<code>,</code>) tai kauttaviivoja (<code>/</code>).",
+       "tags-create-invalid-title-chars": "Merkkausten nimissä ei saa olla sellaisia merkkejä, joita ei voida käyttää sivujen nimissä.",
+       "tags-create-already-exists": "Merkkaus \"$1\" on jo olemassa.",
+       "tags-create-warnings-above": "{{PLURAL:$2|Seuraava varoitus|Seuraavat varoitukset}} ilmenivät, kun yritettiin luoda merkkausta \"$1\":",
+       "tags-create-warnings-below": "Haluatko jatkaa merkkauksen luomista?",
+       "tags-delete-title": "Hävitä merkkaus pysyvästi",
+       "tags-delete-explanation-initial": "Olet parhaillaan poistamassa (eli tuhoamassa pysyvästi) merkkauksen \"$1\" tietokannasta.",
+       "tags-delete-explanation-in-use": "Se poistuu {{PLURAL:$2|$2 sivun versiosta tai lokimerkinnästä|kaikista $2 sivuversiosta tai lokimerkinnöistä}}, joissa se tällä hetkellä on käytössä.",
+       "tags-delete-explanation-warning": "Tämä toimenpide on <strong>peruuttamaton</strong> and <strong>poistettua merkkausta ei voida palauttaa takaisin</strong>. Siihen eivät pysty edes tietokannan ylläpito. Sinun pitää olla täysin varma, että haluat poistettavaksi juuri tämän merkkauksen.",
+       "tags-delete-explanation-active": "<stron>Merkkaus \"$1\" on edelleen käytössä ja sitä käytetään myös jatkossa.</strong>. Jos haluat merkkauksen pois käytöstä, mene sinne missä merkkaus on asetettu ja ota se pois siellä.",
+       "tags-delete-reason": "Syy:",
+       "tags-delete-submit": "Tuhoa tämä merkkaus peruuttamattomasti ja pysyvästi",
+       "tags-delete-not-allowed": "Sellaisia merkkauksia, jotka tulevat erityisestä ohjelmistolaajennuksesta, ei voi poistaa ennen kuin tämä laajennus erityisesti sallii sen.",
+       "tags-delete-not-found": "Merkkausta \"$1\" ei ole olemassa.",
+       "tags-delete-too-many-uses": "Tämä merkkaus \"$1\" on käytössä useammassa kuin $2 sivuversiossa, joten sitä ei voi poistaa.",
+       "tags-delete-warnings-after-delete": "Merkkaus \"$1\" poistettiin onnistuneesta, mutta {{PLURAL:$2|seuraava varoitus|seuraavat varoitukset}} ilmeni samalla:",
+       "tags-activate-title": "Aktivoi merkkaus",
+       "tags-activate-question": "Olet nyt aktivoimassa merkkausta \"$1\".",
+       "tags-activate-reason": "Syy:",
+       "tags-activate-not-allowed": "Ei ole mahdollista aktivoida merkkausta \"$1\".",
+       "tags-activate-not-found": "Merkkausta \"$1\" ei ole olemassa.",
+       "tags-activate-submit": "Aktivoi",
+       "tags-deactivate-title": "Ota merkkaus pois käytöstä",
+       "tags-deactivate-question": "Olet parhaillaan poistamassa käytöstä (eli deaktivoimassa) merkkausta \"$1\".",
+       "tags-deactivate-reason": "Syy:",
+       "tags-deactivate-not-allowed": "Ei ole mahdollista poistaa käytöstä merkkausta \"$1\".",
+       "tags-deactivate-submit": "Poista käytöstä",
        "comparepages": "Vertaile sivuja",
        "compare-page1": "Sivu 1",
        "compare-page2": "Sivu 2",
        "logentry-upload-upload": "$1 {{GENDER:$2|tallensi}} tiedoston $3",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|tallensi}} uuden version tiedostosta $3",
        "logentry-upload-revert": "$1 {{GENDER:$2|tallensi}} tiedoston $3",
+       "log-name-managetags": "Merkkausten hallinnan loki",
+       "log-description-managetags": "Tällä sivulla on luettelo tehtävistä, jotka koskevat [[Special:Tags|merkkauksia]]. Lokissa ovat vain ne toimenpiteet, jotka ylläpitäjä on suorittanut käsin. Merkkauksia voi syntyä ja poistua myös wikin ohjelmiston kautta eivätkä ne näy tässä lokissa.",
+       "logentry-managetags-create": "$1 {{GENDER:$2|on luonut}} merkkauksen \"$4\"",
+       "logentry-managetags-delete": "$1 {{GENDER:$2|tuhosi}} merkkauksen \"$4\" (poistettu $5 {{PLURAL:$5|sivun versiosta tai lokimerkinnästä|sivun versiosta tai lokimerkinnästä}})",
+       "logentry-managetags-activate": "$1 {{GENDER:$2|aktivoi}} merkkauksen \"$4\" käyttäjien ja bottien käytettäväksi",
+       "logentry-managetags-deactivate": "$1 {{GENDER:$2|otti pois käytöstä}} merkkauksen \"$4\" käyttäjiltä ja boteilta",
        "rightsnone": "(ei oikeuksia)",
        "revdelete-summary": "yhteenvedon",
        "feedback-bugornote": "Jos voit kuvailla teknisen ongelman tarkasti – [$1 ilmoita ohjelmointivirheestä].\nMuussa tapauksessa voit käyttää alla olevaa helpompaa lomaketta. Kommenttisi lisätään sivulle [$3 $2], ja siinä on mukana käyttäjätunnuksesi.",
index 6b1479e..7d02461 100644 (file)
@@ -37,7 +37,7 @@
        "tog-shownumberswatching": "Vís tal av brúkarum sum fylgja við",
        "tog-oldsig": "Verandi undirskrift:",
        "tog-fancysig": "Viðgerð undirskriftina sum wikitekstur (uttan sjálvvirkandi leinkju)",
-       "tog-uselivepreview": "Nýt \"live preview\" (á royndarstøði)",
+       "tog-uselivepreview": "Nýt beinleiðis forskoðan",
        "tog-forceeditsummary": "Gev mær boð, um eg ikki havi skrivað ein samandrátt um mína rætting",
        "tog-watchlisthideown": "Fjal mínar rættingar frá eftirliti",
        "tog-watchlisthidebots": "Vís ikki rættingar frá botti í eftirlitslistanum",
        "otherlanguages": "Á øðrum málum",
        "redirectedfrom": "(Ávíst frá $1)",
        "redirectpagesub": "Ávísingarsíða",
+       "redirectto": "Snarvegur til:",
        "lastmodifiedat": "Hendan síðan var seinast broytt $2, $1.",
        "viewcount": "Onkur hevur verið á hesi síðu {{PLURAL:$1|eina ferð|$1 ferðir}}.",
        "protectedpage": "Friðað síða",
        "jumptonavigation": "navigatión",
        "jumptosearch": "leita",
        "view-pool-error": "Haldið okkum til góðar, servarnir hava ov nógv at gera í løtuni.\nOv nógvir brúkarir royna at síggja hesa síðuna.\nVinarliga bíða eina løtu, áðrenn tú roynir enn einaferð at fáa atgongd til hesa síðuna.\n\n$1",
+       "generic-pool-error": "Haldið okkum til góðar, servararnir hava ov nógv at gera í løtuni.\nOv nógvir brúkarir royna at síggja hetta tilfeingi.\nVinarliga bíða eina løtu, áðrenn tú roynir enn einaferð at fáa atgongd til hetta tilfeingi.\n\n$1",
        "pool-timeout": "Støðgur, bíða verður eftir lásinum",
        "pool-queuefull": "Køin til \"hylin\" er full",
        "pool-errorunknown": "Ókend villa",
        "hidetoc": "fjal",
        "collapsible-collapse": "Samanbrot",
        "collapsible-expand": "Víðka",
+       "confirmable-yes": "Ja",
+       "confirmable-no": "Nei",
        "thisisdeleted": "Sí ella endurstovna $1?",
        "viewdeleted": "Vís $1?",
        "restorelink": "{{PLURAL:$1|strikaða rætting|$1 strikaðar rættingar}}",
        "nospecialpagetext": "<strong>Tú hevur biðið um eina serliga síðu, sum wiki ikki kennir aftur.</strong>\n\n<!-- A list of valid special pages can be found at [[Special:SpecialPages]]. -->",
        "error": "Villa",
        "databaseerror": "Villa í dátagrunni",
+       "databaseerror-text": "Ein feilur hendi í fyrispurninginum til dátagrunnin.\nHetta kann týða uppá ein feil í ritbúnaðinum.",
        "databaseerror-query": "Fyrispurningur: $1",
        "databaseerror-function": "Funksjón: $1",
        "databaseerror-error": "Feilur: $1",
        "delete-warning-toobig": "Henda síðan hevur eina langa rættingarsøgu, yvir $1 {{PLURAL:$1|versjón|versjónir}}.\nUm tú slettar hana kann tað órógva virksemi hjá dátugrunninum {{SITENAME}};\nfar varliga fram.",
        "deleting-backlinks-warning": "'''Ávaring:''' Aðrar síður slóða til ella hava síðuna við, ið tú ert í ferð við at sletta.",
        "rollback": "Rulla broytingar aftur",
-       "rollback_short": "Rulla aftur",
        "rollbacklink": "afturrulling",
        "rollbacklinkcount": "rulla aftur $1 {{PLURAL:$1|rætting|rættingar}}",
        "rollbacklinkcount-morethan": "rulla aftur meira enn $1 {{PLURAL:$1|rætting|rættingar}}",
        "import-logentry-interwiki": "$1 varð flutt millum wikiir",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|versjón|versjónir}} frá $2",
        "javascripttest": "Royndarkoyring av JavaScript",
-       "javascripttest-title": "Koyrir $1 royndir",
        "javascripttest-pagetext-noframework": "Henda síðan er løgd av til at koyra JavaScript royndir.",
        "javascripttest-pagetext-skins": "Vel eina útsjónd at koyra royndirnar við:",
        "tooltip-pt-userpage": "Tín brúkarasíða",
index d98b255..f0f0fbe 100644 (file)
                        "Elodark",
                        "Macofe",
                        "Sam",
-                       "JackPotte"
+                       "JackPotte",
+                       "Weft"
                ]
        },
        "tog-underline": "Souligner les liens :",
        "prefs-personal": "Informations personnelles",
        "prefs-rc": "Modifications récentes",
        "prefs-watchlist": "Liste de suivi",
+       "prefs-editwatchlist": "Modifier la liste de suivi",
+       "prefs-editwatchlist-label": "Modifier des titres de votre liste de suivi",
+       "prefs-editwatchlist-edit": "Voir et retirer des titres de votre liste de suivi",
+       "prefs-editwatchlist-raw": "Modifier la liste de suivi en mode brut",
+       "prefs-editwatchlist-clear": "Effacer la liste de suivi",
        "prefs-watchlist-days": "Nombre de jours à afficher dans la liste de suivi :",
        "prefs-watchlist-days-max": "(maximum $1 jour{{PLURAL:$1||s}})",
        "prefs-watchlist-edits": "Nombre de modifications à afficher dans la liste de suivi étendue :",
        "right-override-export-depth": "Exporter les pages en incluant les pages liées jusqu'à une profondeur de 5 niveaux",
        "right-sendemail": "Envoyer un courriel aux autres utilisateurs",
        "right-passwordreset": "Voir les courriels de réinitialisation des mots de passe",
+       "right-managechangetags": "Créer et supprimer des [[Spécial:Balises|balises]] de la base de données",
        "newuserlogpage": "Journal des créations de comptes utilisateur",
        "newuserlogpagetext": "Cette page affiche l’historique des créations de comptes utilisateur.",
        "rightslog": "Journal des modifications de droits d’utilisateurs",
        "action-viewmyprivateinfo": "voir vos informations personnelles",
        "action-editmyprivateinfo": "modifier vos informations personnelles",
        "action-editcontentmodel": "modifier le modèle de contenu d’une page",
+       "action-managechangetags": "créer et supprimer des balises de la base de données",
        "nchanges": "$1 modification{{PLURAL:$1||s}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|depuis la dernière visite}}",
        "enhancedrc-history": "historique",
        "uploaderror": "Erreur lors de l’import",
        "upload-recreate-warning": "'''Attention : Un fichier portant ce nom a été supprimé ou déplacé.'''\n\nLe journal des suppressions et celui des déplacements de cette page sont affichés ici pour informations :",
        "uploadtext": "Utilisez ce formulaire pour importer des fichiers sur le serveur.\nPour voir ou rechercher des images précédemment envoyées, consultez la [[Special:FileList|liste des images]]. L’import est aussi enregistré dans le [[Special:Log/upload|journal d’import des fichiers]], et les suppressions dans le [[Special:Log/delete|journal des suppressions]].\n\nPour inclure un fichier dans une page, utilisez un lien de la forme :\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:fichier.jpg]]</nowiki></code>''', pour afficher le fichier en pleine résolution (dans le cas d’une image) ;\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:fichier.png|200px|thumb|left|texte descriptif]]</nowiki></code>''' pour utiliser une miniature de 200 pixels de large dans une boîte à gauche avec « texte descriptif » comme description ;\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:fichier.ogg]]</nowiki></code>''' pour lier directement vers le fichier sans l’afficher.",
-       "upload-permitted": "Formats de fichiers autorisés : $1.",
-       "upload-preferred": "Formats de fichiers préférés : $1.",
-       "upload-prohibited": "Formats de fichiers interdits : $1.",
+       "upload-permitted": "{{PLURAL:$2|Format|Formats}} de fichiers {{PLURAL:$2|autorisé|autorisés}} : $1.",
+       "upload-preferred": "{{PLURAL:$2|Format|Formats}} de fichiers {{PLURAL:$2|préféré|préférés}} : $1.",
+       "upload-prohibited": "‎{{PLURAL:$2|Format|Formats}} de fichiers {{PLURAL:$2|interdit|interdits}} : $1.",
        "uploadlogpage": "Journal d’import de fichiers",
        "uploadlogpagetext": "Voici la liste des derniers fichiers importés sur le serveur.\nVoyez la [[Special:NewFiles|galerie des nouvelles images]] pour une présentation plus visuelle.",
        "filename": "Nom du fichier",
        "tags-tag": "Nom de la balise",
        "tags-display-header": "Apparence dans les listes de modifications",
        "tags-description-header": "Description complète de la balise",
+       "tags-source-header": "Source",
        "tags-active-header": "Actif ?",
        "tags-hitcount-header": "Modifications balisées",
+       "tags-actions-header": "Actions",
        "tags-active-yes": "Oui",
        "tags-active-no": "Non",
+       "tags-source-extension": "Définie par une extension",
+       "tags-source-manual": "Appliquée manuellement par les utilisateurs et les bots",
+       "tags-source-none": "Obsolète",
        "tags-edit": "modifier",
+       "tags-delete": "supprimer",
+       "tags-activate": "activer",
+       "tags-deactivate": "désactiver",
        "tags-hitcount": "$1 modification{{PLURAL:$1||s}}",
+       "tags-manage-no-permission": "Vous n'avez pas la permission de gérer les modifications de balises.",
+       "tags-create-heading": "Créer une nouvelle balise",
+       "tags-create-explanation": "Par défaut, les nouvelles balises créées seront disponibles pour les utilisateurs et les bots.",
+       "tags-create-tag-name": "Nom de la balise :",
+       "tags-create-reason": "Raison :",
+       "tags-create-submit": "Créer",
+       "tags-create-no-name": "Vous devez spécifier un nom de balise.",
+       "tags-create-invalid-chars": "Les noms de balise ne doivent pas contenir de virgules (<code>,</code>) ou des barres obliques (<code>/</code>).",
+       "tags-create-invalid-title-chars": "Les noms de balise ne doivent pas contenir de caractères qui ne peuvent pas être utilisés dans les titres des pages.",
+       "tags-create-already-exists": "La balise « $1 » existe déjà.",
+       "tags-create-warnings-above": "{{PLURAL:$2|L'avertissement suivant|Les avertissements suivants}} ont été rencontrés lors de la tentative de création de la balise « $1 » :",
+       "tags-create-warnings-below": "Voulez-vous continuer la création de la balise?",
+       "tags-delete-title": "Supprimer la balise",
+       "tags-delete-explanation-initial": "Vous êtes sur le point de supprimer la balise « $1 » de la base de données.",
+       "tags-delete-explanation-in-use": "Elle sera supprimée de {{PLURAL:$2|$2 révision ou entrée de journal à laquelle|toutes les $2 révisions et/ou entrées de journal auxquelles}} elle est actuellement appliquée.",
+       "tags-delete-explanation-warning": "Cette action est <strong>irréversible</strong> et <strong>ne peut pas être annulée</strong>, même pas par les administrateurs de base de données. Soyez certain que c'est la balise que vous voulez supprimer.",
+       "tags-delete-explanation-active": "<strong>La balise « $1 » est toujours active, et continuera à être appliquée dans le futur. </strong> Pour arrêter cela, allez à l'endroit (ou aux endroits) où la balise est appliquée, et désactivez la.",
+       "tags-delete-reason": "Motif :",
+       "tags-delete-submit": "Supprimer cette balise de manière irréversible",
+       "tags-delete-not-allowed": "Les balises définies par une extension ne peuvent pas être supprimées, à moins que l'extension ne le permette spécifiquement.",
+       "tags-delete-not-found": "La balise « $1 » n’existe pas.",
+       "tags-delete-too-many-uses": "La balise « $1 » est appliquée à plus de $2 {{PLURAL:$2|révision|révisions}}, ce qui signifie qu'elle ne peut pas être supprimée.",
+       "tags-delete-warnings-after-delete": "La balise « $1 » a été supprimée avec succès, mais {{PLURAL:$2|l' avertissement suivant a|avertissements suivants ont}} été rencontré{{PLURAL:$2||s}} :",
+       "tags-activate-title": "Activer la balise",
+       "tags-activate-question": "Vous êtes sur le point d'activer la balise « $1 ».",
+       "tags-activate-reason": "Motif :",
+       "tags-activate-not-allowed": "Il n'est pas possible d'activer la balise « $1 ».",
+       "tags-activate-not-found": "La balise « $1 » n'existe pas.",
+       "tags-activate-submit": "Activer",
+       "tags-deactivate-title": "Désactiver la balise",
+       "tags-deactivate-question": "Vous êtes sur le point de désactiver la balise « $1 ».",
+       "tags-deactivate-reason": "Motif :",
+       "tags-deactivate-not-allowed": "Il n'est pas possible de désactiver la balise « $1 ».",
+       "tags-deactivate-submit": "Désactiver",
        "comparepages": "Comparer des pages",
        "compare-page1": "Page 1",
        "compare-page2": "Page 2",
        "logentry-upload-upload": "$1 {{GENDER:$2|a téléchargé}} $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",
+       "log-name-managetags": "Journal des modifications de balises",
+       "log-description-managetags": "Cette page recense les tâches de maintenance liées aux [[Special:Tags|balises]]. Le journal contient uniquement les actions faites manuellement par un administrateur ; les balises peuvent être créées ou supprimées par le logiciel wiki sans que cette action ne soit inscrite dans ce journal.",
+       "logentry-managetags-create": "$1 {{GENDER:$2|a créé}} la balise « $4 ».",
+       "logentry-managetags-delete": "$1 {{GENDER:$2|a supprimé}} la balise « $4 » (retirée {{PLURAL:$5|d'une révision ou entrée de journal|de $5 révisions ou entrées de journal}})",
+       "logentry-managetags-activate": "$1 {{GENDER:$2|a activé}} la balise \"$4\" pour l’usage des utilisateurs et des robots",
+       "logentry-managetags-deactivate": "$1 {{GENDER:$2|a désactivé}} la balise « $4 » pour l’usage des utilisateurs et des robots",
        "rightsnone": "(aucun)",
        "revdelete-summary": "résumé de modification",
        "feedback-bugornote": "Si vous êtes prêt à décrire un problème technique en détail, veuillez [$1 signaler un bogue].\nSinon, vous pouvez utiliser le formulaire simplifié ci-dessous. Votre commentaire sera ajouté à la page « [$3 $2] », avec votre nom d'utilisateur.",
index 86d0d12..014f1e6 100644 (file)
@@ -35,7 +35,7 @@
        "tog-shownumberswatching": "Taal faan brükern uunwise, diar det sidj uun't uug haa",
        "tog-oldsig": "Aktuel signatuur:",
        "tog-fancysig": "Signatuur üs wikitekst uunsä (saner ferwisangen)",
-       "tog-uselivepreview": "Live-föörskau funktjuun brük (eksperimentel)",
+       "tog-uselivepreview": "Live-föörskau funktjuun brük",
        "tog-forceeditsummary": "Wäärne, wan bi't seekrin nian tuupfaadang uunden woort",
        "tog-watchlisthideown": "Aanj feranrangen bi a sidjen, diar ik uun't uug behual wal, fersteeg",
        "tog-watchlisthidebots": "Feranrangen faan bots bi a sidjen, diar ik uun't uug behual wal, fersteeg",
        "pool-queuefull": "Pool as auerläästet",
        "pool-errorunknown": "Ünbekäänd feeler",
        "pool-servererror": "Di pooltäälersiinst werket ei ($1).",
+       "poolcounter-usage-error": "Feeler bi't bewerkin: $1",
        "aboutsite": "Auer {{SITENAME}}",
        "aboutpage": "Project:Auer",
        "copyright": "Det sidj as tu fun oner $1 , wan diar niks ööders stäänt.",
        "anoneditwarning": "'''Paase üüb:''' Dü beest ei uunmeldet. Din aktuel IP-adres komt tu sen, wan dü feranrangen föörnamst. Wan dü di <strong>[$1 uunmeldest]</strong> of <strong>[$2 en konto iinrachtst]</strong>, wurd din feranrangen mä dan brükernööm ferbünjen, tuup mä ööder föördialen.",
        "anonpreviewwarning": "\"Dü beest ei uunmeldet. Bi't seekrin woort din IP-adres uun a ferluup faan werjuunen aptiakent.\"",
        "missingsummary": "'''Paase üüb:''' Dü heest det ei tuupfaadet.\nWan dü det sidj seekerst, woort det saner en kurtfaadet beskriiwang auernimen.",
+       "selfredirect": "<strong>Paase üüb:</strong> Dü feerst detheer sidj tu detsalew sidj widjer.\nDü heest was det ferkiard mual uunden, of dü bewerkest det ferkiard sidj.\nWan dü noch ans üüb „{{int:savearticle}}“ trakst, woort det widjerfeerang likes iinracht.",
        "missingcommenttext": "Faade det oner tuup.",
        "missingcommentheader": "'''Paase üüb:''' Dü heest nian auerskraft uunden.\nWan dü det sidj seekerst, woort det saner auerskraft auernimen.",
        "summary-preview": "Föörskau faan det tuupfaadang:",
        "content-model-text": "normool tekst",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "Leesag objekt",
+       "content-json-empty-array": "Leesag array",
        "duplicate-args-category": "Sidjen, diar dobelt argumenten uun föörlaagen aprep.",
        "duplicate-args-category-desc": "Detdair sidj rept föörlaagen ap, diar dobelt argumenten brük, so üs <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> of <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "'''Paase üüb:''' Detdiar sidj brükt tuföl widjloftag server-funktjuunen.\n\nDiar mut ei muar üs {{PLURAL:$2|1|$2}} brükt wurd. Nü {{PLURAL:$1|woort diar 1|wurd diar $1}} brükt.",
        "revdelete-legend": "Iinstelangen, hüföl tu sen wees skal",
        "revdelete-hide-text": "Tekst faan det werjuun",
        "revdelete-hide-image": "Fersteeg, wat uun det datei stäänt",
-       "revdelete-hide-name": "Logbuk-aktjuun fersteeg",
+       "revdelete-hide-name": "Mual an parameetern fersteeg",
        "revdelete-hide-comment": "Tuupfaadet beskriiwang",
        "revdelete-hide-user": "Brükernööm/IP-adres faan di brüker",
        "revdelete-hide-restricted": "Dooten uk för administratooren an öödern fersteeg",
        "prefs-personal": "Brüker dooten",
        "prefs-rc": "Leetst feranrangen",
        "prefs-watchlist": "Uun't uug behual",
+       "prefs-editwatchlist": "List mä sidjen, diar dü uun't uug behual wel, bewerke",
+       "prefs-editwatchlist-label": "Iindracher üüb det list mä sidjen, diar dü uun't uug behual wel, bewerke:",
+       "prefs-editwatchlist-edit": "Iindracher üüb det list mä sidjen, diar dü uun't uug behual wel, uunluke an strik",
+       "prefs-editwatchlist-raw": "Uun't listenformoot bewerke",
+       "prefs-editwatchlist-clear": "Nian sidjen muar uun't uug behual",
        "prefs-watchlist-days": "So föl daar uun't uug behual:",
        "prefs-watchlist-days-max": "Ei muar üs {{PLURAL:$1|ään dai|$1 daar}}",
        "prefs-watchlist-edits": "Ei muar feranrangen üs:",
        "uploaderror": "Bi't huuchschüüren as wat skiaf gingen",
        "upload-recreate-warning": "'''Paase üüb: En datei mä didiar nööm as al ans stregen of fersköwen wurden.'''\n\nWat nü komt, as ütj det logbuk för't striken an fersküüwen faan detdiar datei.",
        "uploadtext": "Brük detdiar formulaar, am nei datein huuchtuschüüren.\n\nGung tu det [[Special:FileList|list faan huuchschüürd datein]], am datein tu schüken of uuntuwisin. Luke uk iin uun't logbuk för't [[Special:Log/upload|huuchschüüren]] of [[Special:Log/delete|striken]] faan datein.\n\nAm en '''bil''' uun en artiikel tu brüken, brük en link faan det furem:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Datei.jpg]]</nowiki></code>''' – för en grat bil\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Datei.png|200px|thumb|left|alternatiif tekst]]</nowiki></code>''' – för en 200px briad bil uun en box, mä „alternatiif tekst“ üs beskriiwang faan det bil\n*'''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Datei.ogg]]</nowiki></code>''' – för en direkt ferwisang üüb det datei, saner det datei uuntuwisin",
-       "upload-permitted": "Tuläät slacher faan datein: $1.",
-       "upload-preferred": "Slacher faan datein, diar dü brük skulst: $1.",
-       "upload-prohibited": "Ei tuläät slacher faan datein: $1.",
+       "upload-permitted": "Tuläät {{Plural:$2|slach|slacher}} faan datein: $1.",
+       "upload-preferred": "{{Plural:$2|Slach|Slacher}} faan datein, diar dü brük skulst: $1.",
+       "upload-prohibited": "Ei tuläät {{Plural:$2|slach|slacher}} faan datein: $1.",
        "uploadlogpage": "Datei-logbuk",
        "uploadlogpagetext": "Detheer as det logbuk för huuchschüürd datein. Dü könst uk det [[Special:NewFiles|galerii faan nei datein]] uunluke.",
        "filename": "Dateinööm",
        "deleteprotected": "Dü könst detdiar sidj ei strik, auer det seekert wurden as.",
        "deleting-backlinks-warning": "'''Paase üüb:''' Diar ferwise noch [[Special:WhatLinksHere/{{FULLPAGENAME}}|ööder sidjen]] üüb det sidj, diar dü strik wel. Of det sidj as noch huarööders iinbünjen.",
        "rollback": "Feranrangen turagsaat",
-       "rollback_short": "Turagsaat",
        "rollbacklink": "turagsaat",
        "rollbacklinkcount": "$1 {{PLURAL:$1|feranrang|feranrangen}} turagsaat",
        "rollbacklinkcount-morethan": "Muar üs $1 {{PLURAL:$1|werjuun|werjuunen}} turagsaat",
        "namespace": "Nöömrüm:",
        "invert": "Ütjwool amkiir",
        "tooltip-invert": "Saat diar en tiaken, am feranrangen faan sidjen uun didiar nöömrüm ei uuntuwisin.",
+       "tooltip-whatlinkshere-invert": "Saat diar en tiaken, am sidjen uun didiar nöömrüm ei uuntuwisin.",
        "namespace_association": "Ferbünjen nöömrüm",
        "tooltip-namespace_association": "Saat diar en tiaken, am di ferbünjen nöömrüm of diskusjuunsnöömrüm mä iintubetjin.",
        "blanknamespace": "(Sidjen)",
        "thumbnail-temp-create": "Det datei för det tidjwiis sümnaielbil küd ei skrewen wurd",
        "thumbnail-dest-create": "Det föörskaubil küd diar ei seekert wurd.",
        "thumbnail_invalid_params": "Sümnaieldooten steme ei",
+       "thumbnail_toobigimagearea": "Datei mä en grate faan muar üs $1",
        "thumbnail_dest_directory": "Det fertiaknis koon ei skrewen wurd.",
        "thumbnail_image-type": "Sok bilen kön ei brükt wurd",
        "thumbnail_gd-library": "GD-bibleteek ei gans diar: Det funktjuun $1 waant",
        "import-logentry-interwiki": "„$1“ mä transwiki importiaret",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|werjuun|werjuunen}} faan $2 importiaret",
        "javascripttest": "JavaScript-test",
-       "javascripttest-title": "$1-tests wurd ütjfeerd.",
        "javascripttest-pagetext-noframework": "Detdiar sidj as för JavaScript-tests föörsen.",
        "javascripttest-pagetext-unknownframework": "Ünbekäänd test-framework „$1“.",
+       "javascripttest-pagetext-unknownaction": "Ünbekäänd aktjuun „$1“.",
        "javascripttest-pagetext-frameworks": "Schük ian faan jodiar test-frameworks ütj: $1",
        "javascripttest-pagetext-skins": "Schük en brüker-skak ütj, am di test ütjtufeeren:",
        "javascripttest-qunit-intro": "Luke efter bi [$1 test dokumentatjuun] üüb mediawiki.org",
-       "javascripttest-qunit-heading": "JavaScript-QUnit-tester faan MediaWiki",
        "tooltip-pt-userpage": "Din brükersidj",
        "tooltip-pt-anonuserpage": "Brükersidj faan det IP-adres, faan huar ütj dü werkest",
        "tooltip-pt-mytalk": "Din diskusjuunssidj",
        "version-entrypoints": "URLs faan hüsdörsidjen",
        "version-entrypoints-header-entrypoint": "Hüsdörsidj",
        "version-entrypoints-header-url": "URL",
+       "version-libraries": "Instaliaret bibleteeken",
+       "version-libraries-library": "Bibleteek",
+       "version-libraries-version": "Werjuun",
        "redirect": "Widjerfeerang faan en brüker, en sidj, en sidjenwerjuun of en datei.",
        "redirect-legend": "Widjerfeerang üüb en sidjenwerjuun of datei.",
        "redirect-summary": "Detdiar spezial-sidj feert widjer üüb en brükersidj, sidj, sidjenwerjuun of datei.\nAn det woort so brükt:  [[{{#Special:Redirect}}/user/101]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]] of [[{{#Special:Redirect}}/file/Example.jpg]].",
        "compare-revision-not-exists": "Son werjuun as diar ei.",
        "dberr-problems": "Dää mi iarag! Det sidj hää technisk komer.",
        "dberr-again": "Teew en uugenblak an ferschük det noch ans.",
-       "dberr-info": "(Koon ei mä a dootenbeenk-server ferbinj: $1)",
-       "dberr-info-hidden": "(Ferbinjang mä a dootenbeenk-server as skiaf gingen)",
+       "dberr-info": "(Koon ei üüb det dootenbeenk tugrip: $1)",
+       "dberr-info-hidden": "(Üüb det dootenbeenk küd ei tugreben wurd)",
        "dberr-usegoogle": "Uun a teskentidj küdst dü det mä Google ferschük.",
        "dberr-outofdate": "Seenk diaram, dat Google ferlicht ual dooten uunwiset.",
        "dberr-cachederror": "Detheer komt ütj en cache an as ferlicht ei muar aktuel.",
index 377d3ac..fc967f5 100644 (file)
@@ -39,7 +39,7 @@
        "tog-shownumberswatching": "It tal brûkers sjen litte dat dizze side folget",
        "tog-oldsig": "Aktuele sinjatuerprintallyk:",
        "tog-fancysig": "Sinjatuer as wikitekst behannelje (sûnder automatyske keppeling)",
-       "tog-uselivepreview": "\"live proefbyld\" brûke (JavaScript nedich - eksperimenteel)",
+       "tog-uselivepreview": "\"Live proefbyld\" brûke",
        "tog-forceeditsummary": "Warskôgje at ik de gearfetting leech lit.",
        "tog-watchlisthideown": "Eigen bewurkings op myn folchlist ferbergje",
        "tog-watchlisthidebots": "Lit gjin bot wizigings sjen yn de folchlist",
        "talkpage": "Sideoerlis",
        "talkpagelinktext": "Oerlis",
        "specialpage": "Bysûndere side",
-       "personaltools": "Persoanlike ynstellings",
+       "personaltools": "Persoanlike ynstellingen",
        "articlepage": "Side lêze",
        "talk": "Oerlis",
        "views": "Aspekten/aksjes",
        "backlinksubtitle": "← $1",
        "retrievedfrom": "Untfongen fan \"$1\"",
        "youhavenewmessages": "Jo hawwe $1 ($2).",
+       "newmessageslinkplural": "{{PLURAL:$1|in nij berjocht|999=nije berjochten}}",
        "youhavenewmessagesmulti": "Jo hawwe nije berjochten op $1",
        "editsection": "bewurkje",
        "editold": "bewurkje",
        "nospecialpagetext": "<strong>Jo hawwe in Wiki-side opfrege dy't net bekend is by it Wiki-programma.</strong>",
        "error": "Flater",
        "databaseerror": "Databankfout",
+       "databaseerror-function": "Funksje: $1",
        "databaseerror-error": "Flater: $1",
        "laggedslavemode": "<strong>Warskôging:</strong> Mûglik binne resinte bewurkings noch net trochfierd.",
        "readonly": "Databank is 'Net-skriuwe'.",
        "virus-scanfailed": "scannen is mislearre (koade $1)",
        "virus-unknownscanner": "ûnbekend antivirus:",
        "logouttext": "<strong>Jo binne no ôfmeld.</strong>\n\nGuon siden kinne noch foar it ljocht komme, krekt as wiesto noch oanmeld. Asto de cache fan dyn webblêder leechhellest feroaret dat wer.",
+       "welcomeuser": "Wolkom, $1!",
        "yourname": "Brûkersnamme:",
        "userlogin-yourname": "Brûkersnamme",
        "userlogin-yourname-ph": "Jou dyn brûkersnamme",
        "userlogin-joinproject": "Meidwaan {{SITENAME}}",
        "nologin": "Noch net oanmelden as meidogger? $1.",
        "nologinlink": "Meitsje in brûker oan",
-       "createaccount": "Nije ynstellings oanmeitsje",
+       "createaccount": "Registrearje",
        "gotaccount": "Hawwe jo jo al as meidogger oanmelde? '''$1'''.",
        "gotaccountlink": "Oanmelde",
        "userlogin-resetlink": "Ynlochdata fergetten?",
        "createaccount-text": "Immen hat in brûker op {{SITENAME}} ($4) oanmakke mei de namme \"$2\" en jo e-mailadres. It wachtwurd foar \"$2\" is \"$3\". Meld jo oan en feroarje jo wachtwurd.\n\nNegearje it berjocht as dizze brûker sûnder jo meiwitten oanmakke is.",
        "login-throttled": "Jo hawwe koartlyn te faak besocht oan te melden mei in ûnkrekt wachtwurd.\nJo moatte efkes wachtsje foar't jo it op'e nij besykje kinne.",
        "loginlanguagelabel": "Taal: $1",
+       "pt-login": "Oanmelde",
+       "pt-login-button": "Oanmelde",
+       "pt-createaccount": "Registrearje",
+       "pt-userlogout": "Ofmelde",
        "changepassword": "Wachtwurd feroarje",
        "resetpass_announce": "Jo binne oanmeld mei in tydlike koade dy't jo per e-mail tastjoerd is. Fier in nij wachtwurd yn om it oanmelden ôf te meitsjen.",
        "resetpass_header": "Wachtwurd feroarje",
        "resetpass-submit-cancel": "Annulearje",
        "resetpass-wrong-oldpass": "It momintele of tydlike wachtwurd is ûnjildich.\nMûglik hawwe Jo Jo wachtwurd al feroare of in nij tydlik wachtwurd oanfrege.",
        "resetpass-temp-password": "Tydlik wachtwurd:",
+       "passwordreset": "Wachtwurd ferfarskje",
        "passwordreset-legend": "Wachtwurd weromsette",
        "passwordreset-username": "Brûkersnamme:",
        "passwordreset-domain": "Domein:",
        "autoblockedtext": "Jo IP-adres is automatysk útsletten om't brûkt is troch in oare brûker, dy't útsletten is troch $1.\nDe opjûne reden is:\n\n:''$2''\n\n* Begjin útsluting : $8\n* Ein útsluting : $6\n* Bedoeld út te sluten: $7\n\nJo kinne kontakt opnimme mei $1 of in oare [[{{MediaWiki:Grouppage-sysop}}|behearder]] om de útsluting te besprekken.\nJo kinne gjin gebrûk meitsje fan 'e funksje 'Skriuw meidogger', of jo moatte in jildich e-postadres opjûn hawwe yn jo [[Special:Preferences|foarkarren]] en it gebrûk fan dy funksje moat net útsletten wêze.\nJo tsjintwurdich e-postadres is $3 en it útsletnûmer is #$5. Neam beide gegevens as jo earne op dizze útsluting reagearje.",
        "blockednoreason": "gjin reden opjûn",
        "whitelistedittext": "Jo moatte $1 om siden te bewurkjen.",
-       "confirmedittext": "Jo moatte jo e-mailadres befêstichje foar't jo siden feroarje kinne. Fier in e-mailedres yn by jo [[Special:Preferences|ynstellings]] en befêstichje it.",
+       "confirmedittext": "Jo moatte jo e-mailadres befêstichje foar't jo siden feroarje kinne.\nFier in e-mailadres yn by jo [[Special:Preferences|foarkarren]] en befêstichje it.",
        "nosuchsectiontitle": "Dizze subkop bestiet net",
        "nosuchsectiontext": "Jo besochten in subkop te bewurkjen dy't net bestiet.",
        "loginreqtitle": "Oanmelding frege",
        "postedit-confirmation-saved": "Dyn bewurking is fêstlein.",
        "edit-already-exists": "De side is net oanmakke.\nHy bestie al.",
        "defaultmessagetext": "Standert berjochttekst",
+       "content-model-wikitext": "wikitekst",
+       "content-model-javascript": "JavaScript",
        "expensive-parserfunction-warning": "<strong>Warskôging:</strong> Dizze side brûkt tefolle kostbere parserfunksjes.\n\nWylst it minder as $2 {{PLURAL:$2|parserfunksje|parserfunksjes}} wêze moatte, no {{PLURAL:$1|is it $1 |binne it $1}}",
        "expensive-parserfunction-category": "Siden dy't tefolle kostbere parserfuksjes brûke",
        "post-expand-template-inclusion-warning": "<strong>Warskôging:</strong> jo geane oer de maksimale opnamegrutte foar sjabloanen.\nGuon sjabloanen wurden net opnommen.",
        "powersearch-togglenone": "Gjin",
        "search-external": "Utwindich sykje",
        "searchdisabled": "<p>Op it stuit stiet it trochsykjen fan tekst út omdat dizze funksje tefolle kompjûterkapasiteit ferget. As we nije apparatuer krije, en dy is ûnderweis, dan wurdt dizze funksje wer aktyf. Oant salang kinne jo sykje fia Google:</p>",
-       "preferences": "Ynstellings",
-       "mypreferences": "Ynstellings",
+       "preferences": "Foarkarren",
+       "mypreferences": "Foarkarren",
        "prefs-edits": "Tal bewurkings:",
        "prefs-skin": "Side-oansjen",
        "skin-preview": "Proefbyld",
        "prefs-watchlist-edits-max": "Maksimum oantal: 1000",
        "prefs-misc": "Ferskaat",
        "prefs-resetpass": "Wachtwurd feroarje",
-       "saveprefs": "Ynstellings fêstlizze",
+       "saveprefs": "Fêstlizze",
        "restoreprefs": "Tebek nei de standertynstellings",
        "prefs-editing": "Siden bewurkje",
        "rows": "Rigen",
        "recentchangesdays": "Dagen om sjen te litten yn Koartlyn feroare:",
        "recentchangesdays-max": "(maksimaal $1 {{PLURAL:$1|dei|dagen}})",
        "recentchangescount": "Tal titels op 'Koartlyn feroare'",
-       "savedprefs": "Jo ynstellings binne fêstlein.",
+       "savedprefs": "Jo foarkarren binne fêstlein.",
        "timezonelegend": "Tiidsône:",
        "localtime": "Pleatslike tiid:",
        "timezoneuseserverdefault": "Wikistandert brûke ($1)",
        "prefs-signature": "Sinjatuer",
        "prefs-dateformat": "Datumopmaak",
        "prefs-timeoffset": "Tiidsferskil",
+       "prefs-preview": "Proefbyld",
        "userrights": "Behear fan meidoggerrjochten",
        "userrights-lookup-user": "Behear fan meidoggerrjochten",
        "userrights-user-editname": "Meidoggernamme:",
        "savefile": "Lis triem fêst",
        "uploaddisabled": "Sorry, op dizze tsjinner kin net oanbean wurde.",
        "uploaddisabledtext": "It oanbieden fan triemmen is útskeakele.",
-       "php-uploaddisabledtext": "PHP-triemuploads binne útskeakele. Kontrolearje a.j.w. de triem_uploads-ynstelling.",
+       "php-uploaddisabledtext": "PHP-triemuploads binne útskeakele.\nKontrolearje de ynstelling \"file_uploads\".",
        "uploadscripted": "Dizze triem befettet HTML- of scriptkoade dy't ferkeard troch jo browser werjûn wurde kin.",
        "uploadvirus": "De triem befettet in firus! Details: $1",
        "sourcefilename": "Triemnamme boarne:",
        "deletereasonotherlist": "Oare reden",
        "deletereason-dropdown": "*Faak-brûkte redenen\n** Frege troch de skriuwer\n** Skeining fan auteursrjocht\n** Fandalisme",
        "rollback": "Feroarings werom sette",
-       "rollback_short": "Werom sette",
        "rollbacklink": "feroaring werom sette",
        "rollbackfailed": "Feroaring werom sette net slagge",
        "cantrollback": "Dizze feroaring kin net werom setten wurde, om't der mar ien skriuwer is.",
        "protect_expiry_invalid": "Tiid fan ferrinnen is net jildich.",
        "protect_expiry_old": "Tiid fan ferrinnen leit yn it ferline.",
        "protect-text": "Hjir kin jo it nivo fan skoatteljen sjen en oanpasse foar de side '''$1'''.",
-       "protect-locked-blocked": "Jo kinne it befeiligingsnivo net feroarje wylst jo blokkearre binne.\nHjir binne de hjoeddeiske ynstellings foar de side '''$1''':",
-       "protect-locked-dblock": "It befeiligingsnivo kin net feroare wurde om't de database sletten is.\nHjir binne de hjoeddeiske ynstellings foar de side '''$1''':",
-       "protect-locked-access": "'''Jo brûker hat gjin rjochten om it befeiligingsnivo te feroarjen.'''\nDit binne de rinnende ynstellings foar de side '''$1''':",
+       "protect-locked-blocked": "Jo kinne it befeiligingsnivo net feroarje wylst jo blokkearre binne.\nHjir binne de hjoeddeiske ynstellingen foar de side '''$1''':",
+       "protect-locked-dblock": "It befeiligingsnivo kin net feroare wurde om't de database sletten is.\nHjir binne de hjoeddeiske ynstellingen foar de side '''$1''':",
+       "protect-locked-access": "'''Jo brûker hat gjin rjochten om it befeiligingsnivo te feroarjen.'''\nDit binne de rinnende ynstellingen foar de side '''$1''':",
        "protect-cascadeon": "Dizze side is op 't stuit befeilige, om't er yn 'e folgjende {{PLURAL:$1|side|siden}} opnommen is, dy't befeilige {{PLURAL:$1|is|binne}} mei de kaskade-opsje. It befeiligingsnivo feroarje hat alhiel gjin effekt.",
        "protect-default": "Tastean foar alle brûkers",
        "protect-fallback": "Hjir is it rjocht \"$1\" foar nedich",
        "ipb_cant_unblock": "Flater: It útsluten fan ID $1 kin net fûn wurde. It is miskien al net mear útsluten.",
        "lockdb": "Meitsje de database 'Net-skriuwe'",
        "unlockdb": "Meitsje de databank skriuwber",
-       "lockdbtext": "Wylst de databank skoattele is, is foar meidoggers it feroarjen fan siden, ynstellings, folchlisten, ensfh. net mooglik.\n\nBefêstigje dat dit is sa't jo it hawwe wolle, en dat jo de databank wer frijjouwe as jo ûnderhâld ree is.",
-       "unlockdbtext": "As de databank frijjûn wurdt, is foar meidoggers it feroarjen fan siden, ynstellings, folchlisten ensfh. wer mooglik. Befêstigje dat dit is wat jo wolle.",
+       "lockdbtext": "Wylst de databank skoattele is, is foar meidoggers it feroarjen fan siden, ynstellingen, folchlisten, ensfh. net mooglik.\n\nBefêstigje dat dit is sa't jo it hawwe wolle, en dat jo de databank wer frijjouwe as jo ûnderhâld ree is.",
+       "unlockdbtext": "As de database frijjûn wurdt, is foar meidoggers it feroarjen fan siden, ynstellingen, folchlisten ensfh. wer mooglik.\nBefêstigje dat dit is wat jo wolle.",
        "lockconfirm": "Ja, ik wol wier de databank 'Net--skriuwe' meitsje.",
        "unlockconfirm": "Ja, ik wol wier de databank skriuwber meitsje.",
        "lockbtn": "Meitsje de database 'Net-skriuwe'",
index e4dcacc..0dc55f8 100644 (file)
        "enhancedrc-history": "eachdraidh",
        "recentchanges": "Mùthaidhean ùra",
        "recentchanges-legend": "Roghainnean nam mùthaidhean ùra",
-       "recentchanges-summary": "Cum sùil air na mùthaidhean as ùire a nithear air an uicidh air an duilleag seo.",
+       "recentchanges-summary": "Tha an duilleag seo a’ cumail sùil air na mùthaidhean as ùire a rinneadh air an uicidh.",
        "recentchanges-noresult": "Cha fhreagair atharrachadh sam bith san ùine seo ris na cuspairean-deuchainn seo.",
        "recentchanges-feed-description": "Cum sùil air na mùthaidhean as ùire a nithear air an uicidh seo san inbhir seo.",
        "recentchanges-label-newpage": "Chruthaich thu duilleag ùr leis a sin",
        "deleteprotected": "Chan urrainn dhut an duilleag seo a sguabadh às on a chaidh a dìon.",
        "deleting-backlinks-warning": "'''Rabhadh:''' Tha [[Special:WhatLinksHere/{{FULLPAGENAME}}|duilleag eile]] a' ceangal ris an duilleag a tha thu airson sguabadh às no 'ga gabhail a-steach 'na h-iomradh.",
        "rollback": "Roilig atharraichean air ais",
-       "rollback_short": "Roladh air ais",
        "rollbacklink": "roilig air ais",
        "rollbacklinkcount": "roilig $1 {{PLURAL:$1|deasachadh|dheasachadh|deasachaidhean|deasachadh}} air ais",
        "rollbacklinkcount-morethan": "roilig barrachd air $1 {{PLURAL:$1|deasachadh|dheasachadh|deasachaidhean|deasachadh}} air ais",
        "import-logentry-interwiki": "air fhaighinn 'na thar-uicidh $1",
        "import-logentry-interwiki-detail": "Chaidh $1 {{PLURAL:$1|mhùthadh|mhùthadh|mùthaidhean|mùthadh}} ion-phortachadh o $2",
        "javascripttest": "Deuchainn air JavaScript",
-       "javascripttest-title": "A' ruith deuchainnean aig $1",
        "javascripttest-pagetext-noframework": "Tha an duilleag seo glèidhte airson deuchainnean JavaScript a ruith.",
        "javascripttest-pagetext-unknownframework": "Framework deuchainn \"$1\" neo-aithnichte.",
        "javascripttest-pagetext-frameworks": "Feuch an tagh thu aon dhe na frameworks deuchainn seo: $1",
        "javascripttest-pagetext-skins": "Tagh craiceann airson ruith nan deuchainnean:",
        "javascripttest-qunit-intro": "Faic [$1 docamaideadh nan deuchainnean] air mediawiki.org.",
-       "javascripttest-qunit-heading": "MediaWiki JavaScript QUnit test suite",
        "tooltip-pt-userpage": "An duilleag phearsanta agad",
        "tooltip-pt-anonuserpage": "Duilleag a' chleachdaiche airson an t-seòlaidh IP leis a bheil thu a' deasachadh",
        "tooltip-pt-mytalk": "Duilleag do dheasbaireachd",
index b912499..8096ff6 100644 (file)
                        "לערי ריינהארט",
                        "Fitoschido",
                        "McDutchie",
-                       "Josep Maria 15."
+                       "Josep Maria 15.",
+                       "Fisterraeomar",
+                       "Breogan2008",
+                       "VaiPolaSombra"
                ]
        },
        "tog-underline": "Subliñar as ligazóns:",
        "tog-usenewrc": "Agrupar as modificacións por páxina nos cambios recentes e na lista de vixilancia",
        "tog-numberheadings": "Numerar automaticamente as cabeceiras",
        "tog-showtoolbar": "Mostrar a barra de ferramentas de edición",
-       "tog-editondblclick": "Editar as páxinas logo de facer dobre clic",
+       "tog-editondblclick": "Facer dobre clic para editar as páxinas",
        "tog-editsectiononrightclick": "Permitir a edición de seccións premendo co botón dereito nos títulos das seccións",
        "tog-watchcreations": "Engadir as páxinas que cree e os ficheiros que cargue á miña lista de vixilancia",
        "tog-watchdefault": "Engadir as páxinas e os ficheiros que edite á miña lista de vixilancia",
        "tog-watchmoves": "Engadir as páxinas e os ficheiros que mova á miña lista de vixilancia",
        "tog-watchdeletion": "Engadir as páxinas e os ficheiros que borre á miña lista de vixilancia",
        "tog-watchrollback": "Engadir as páxinas nas que realice unha reversión á miña lista de vixilancia",
-       "tog-minordefault": "Marcar por omisión todas as edicións como pequenas",
+       "tog-minordefault": "Marcar todas as edicións como pequenas por defecto",
        "tog-previewontop": "Mostrar a vista previa antes da caixa de edición",
        "tog-previewonfirst": "Mostrar a vista previa na primeira edición",
-       "tog-enotifwatchlistpages": "Enviádeme unha mensaxe de correo electrónico cando unha páxina ou un ficheiro da miña lista de vixilancia sufra un cambio",
-       "tog-enotifusertalkpages": "Enviádeme unha mensaxe de correo electrónico cando a miña páxina de conversa cambie",
+       "tog-enotifwatchlistpages": "Desexo recibir un aviso por correo electrónico cando unha páxina ou un ficheiro da miña lista de vixilancia sufra algún cambio",
+       "tog-enotifusertalkpages": "Desexo recibir un aviso por correo electrónico cando a miña páxina de conversa cambie",
        "tog-enotifminoredits": "Enviádeme tamén unha mensaxe de correo electrónico cando se produzan edicións pequenas nas páxinas ou nos ficheiros",
        "tog-enotifrevealaddr": "Revelar o meu enderezo de correo electrónico nos correos de notificación",
        "tog-shownumberswatching": "Mostrar o número de usuarios que están a vixiar",
        "readonly_lag": "A base de datos bloqueouse automaticamente mentres os servidores levan a cabo a sincronización co servidor principal",
        "internalerror": "Erro interno",
        "internalerror_info": "Erro interno: $1",
-       "filecopyerror": "Non se deu copiado o ficheiro \"$1\" a \"$2\".",
-       "filerenameerror": "Non se pode cambiar o nome do ficheiro \"$1\" a \"$2\".",
+       "filecopyerror": "Non se puido copiar o ficheiro \"$1\" en \"$2\".",
+       "filerenameerror": "Non se puido cambiar o nome do ficheiro \"$1\" a \"$2\".",
        "filedeleteerror": "Non se deu borrado o ficheiro \"$1\".",
        "directorycreateerror": "Non se puido crear o directorio \"$1\".",
-       "directoryreadonlyerror": "«$1» é un cartafol de só lectura.",
-       "directorynotreadableerror": "Non ten permisos de lectura no cartafol «$1».",
+       "directoryreadonlyerror": "\"$1\" é un cartafol de só lectura.",
+       "directorynotreadableerror": "Non ten permisos de lectura no cartafol \"$1\".",
        "filenotfound": "Non se deu atopado o ficheiro \"$1\".",
        "unexpected": "Valor inesperado: \"$1\"=\"$2\".",
        "formerror": "Erro: Non se pode enviar o formulario.",
        "nocookiesfornew": "Non se creou a conta de usuario porque non puidemos confirmar a súa orixe.\nAsegúrese de que ten as cookies habilitadas, volva cargar a páxina e inténteo de novo.",
        "noname": "Non especificou un nome de usuario válido.",
        "loginsuccesstitle": "Accedeu correctamente",
-       "loginsuccess": "'''Accedeu ao sistema {{SITENAME}} como \"$1\".'''",
+       "loginsuccess": "<strong>Accedeu ao sistema de {{SITENAME}} como \"$1\".</strong>",
        "nosuchuser": "Non existe ningún usuario chamado \"$1\".\nOs nomes de usuario diferencian entre maiúsculas e minúsculas.\nVerifique o nome que inseriu ou [[Special:UserLogin/signup|cree unha nova conta]].",
        "nosuchusershort": "Non existe ningún usuario chamado \"$1\".\nVerifique o nome que inseriu.",
        "nouserspecified": "Cómpre especificar un nome de usuario.",
        "createaccount-text": "Alguén creou unha conta chamada \"$2\" para o seu enderezo de correo electrónico en {{SITENAME}} ($4), e con contrasinal \"$3\".\nDebe acceder ao sistema e mudar o contrasinal agora.\n\nPode facer caso omiso desta mensaxe se se creou esta conta por erro.",
        "login-throttled": "Fixo demasiados intentos de acceder ao sistema.\nPor favor, agarde $1 antes de probar outra vez.",
        "login-abort-generic": "Acceso ao sistema incorrecto; abortado",
-       "login-migrated-generic": "A súa conta foi migrada, e o seu nome de usuario xa non existe nesta wiki.",
+       "login-migrated-generic": "A súa conta foi migrada e o seu nome de usuario xa non existe neste wiki.",
        "loginlanguagelabel": "Lingua: $1",
        "suspicious-userlogout": "Rexeitouse a súa petición de saír do sistema porque semella que a enviou un navegador roto ou a caché dun proxy.",
        "createacct-another-realname-tip": "O nome real é opcional.\nSe escolle dalo utilizarase para atribuír ao usuario o seu traballo.",
        "noarticletext": "Actualmente non hai ningún texto nesta páxina.\nPode [[Special:Search/{{PAGENAME}}|procurar polo título desta páxina]] noutras páxinas,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ollar os rexistros relacionados]\nou [{{fullurl:{{FULLPAGENAME}}|action=edit}} editar a páxina]</span>.",
        "noarticletext-nopermission": "Actualmente non hai ningún texto nesta páxina.\nPode [[Special:Search/{{PAGENAME}}|procurar polo título desta páxina]] noutras páxinas ou <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ollar os rexistros relacionados]</span>, pero non ten os permisos necesarios para crear esta páxina.",
        "missing-revision": "A revisión nº$1 da páxina chamada \"{{FULLPAGENAME}}\" non existe.\n\nA miúdo, isto está provocado por seguir unha ligazón de historial obsoleta cara a unha páxina que foi borrada.\nO [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rexistro de borrados] contén máis detalles.",
-       "userpage-userdoesnotexist": "A conta do usuario \"<nowiki>$1</nowiki>\" non está rexistrada. Comprobe se desexa crear/editar esta páxina.",
+       "userpage-userdoesnotexist": "A conta de usuario \"$1\" non está rexistrada.\nComprobe se desexa crear/editar esta páxina.",
        "userpage-userdoesnotexist-view": "A conta de usuario \"$1\" non está rexistrada.",
        "blocked-notice-logextract": "Este usuario está bloqueado.\nVelaquí está a última entrada do rexistro de bloqueos, por se quere consultala:",
        "clearyourcache": "'''Nota:''' Despois de gardar, cómpre limpar a memoria caché do seu navegador para ver os cambios.\n* '''Firefox/Safari:''' Prema ''Maiúsculas'' á vez que en ''Recargar'', ou prema en ''Ctrl-F5'' ou ''Ctrl-R'' (''⌘-R'' nos Mac)\n* '''Google Chrome:''' Prema en ''Ctrl-Maiús-R'' (''⌘-Maiús-R'' nos Mac)\n* '''Internet Explorer:''' Prema ''Ctrl'' ao tempo que fai clic en ''Refrescar'', ou prema en ''Ctrl-F5''\n* '''Opera:''' Limpe a súa memoria caché en ''Ferramentas → Preferencias''",
        "sectioneditnotsupported-title": "A edición de seccións non está soportada",
        "sectioneditnotsupported-text": "A edición de seccións non está soportada nesta páxina.",
        "permissionserrors": "Erro de permisos",
-       "permissionserrorstext": "Non dispón de permiso para facelo por {{PLURAL:$1|esta razón|estas razóns}}:",
+       "permissionserrorstext": "Non ten os permisos necesarios para facelo {{PLURAL:$1|pola seguinte razón|polas seguintes razóns}}:",
        "permissionserrorstext-withaction": "Non ten os permisos necesarios para $2, {{PLURAL:$1|pola seguinte razón|polas seguintes razóns}}:",
        "recreate-moveddeleted-warn": "'''Atención: Vai volver crear unha páxina que xa foi eliminada anteriormente.'''\n\nDebería considerar se é apropiado continuar a editar esta páxina.\nVelaquí están o rexistro de borrados e mais o de traslados desta páxina, por se quere consultalos:",
        "moveddeleted-notice": "Esta páxina foi borrada.\nA continuación pódese ver o rexistro de borrados e traslados desta páxina, por se quere consultalos.",
        "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 destino e parámetros",
+       "revdelete-hide-name": "Agochar o destino e os 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",
        "mergehistory-fail-toobig": "Non se puido fusionar o historial, xa que supón trasladar máis revisións que o límite de $1 {{PLURAL:$1|revisión|revisións}}.",
        "mergehistory-no-source": "Non existe a páxina de orixe \"$1\".",
        "mergehistory-no-destination": "Non existe a páxina de destino \"$1\".",
-       "mergehistory-invalid-source": "A páxina de orixe ten que ter un título válido.",
-       "mergehistory-invalid-destination": "A páxina de destino ten que ter un título válido.",
+       "mergehistory-invalid-source": "A páxina de orixe debe ter un título válido.",
+       "mergehistory-invalid-destination": "A páxina de destino debe ter un título válido.",
        "mergehistory-autocomment": "\"[[:$1]]\" fusionouse con \"[[:$2]]\"",
        "mergehistory-comment": "\"[[:$1]]\" fusionouse con \"[[:$2]]\": $3",
-       "mergehistory-same-destination": "A páxina de orixe e a páxina de destino non pode ser a mesma",
+       "mergehistory-same-destination": "A páxina de orixe e a páxina de destino non poden ser a mesma",
        "mergehistory-reason": "Motivo:",
        "mergelog": "Rexistro de fusións",
        "revertmerge": "Desfacer a fusión",
        "prefs-personal": "Información de usuario",
        "prefs-rc": "Cambios recentes",
        "prefs-watchlist": "Lista de vixilancia",
+       "prefs-editwatchlist": "Editar a lista de vixilancia",
+       "prefs-editwatchlist-label": "Editar as entradas da súa lista de vixilancia:",
+       "prefs-editwatchlist-edit": "Ver e eliminar títulos da súa lista de vixilancia",
+       "prefs-editwatchlist-raw": "Editar a lista de vixilancia simple",
+       "prefs-editwatchlist-clear": "Limpar a súa lista de vixilancia",
        "prefs-watchlist-days": "Número de días que mostrar na lista de vixilancia:",
        "prefs-watchlist-days-max": "Máximo: $1 {{PLURAL:$1|día|días}}",
        "prefs-watchlist-edits": "Número máximo de edicións que mostrar na lista de vixilancia completa:",
        "right-override-export-depth": "Exportar páxinas incluíndo as páxinas ligadas ata unha profundidade de 5",
        "right-sendemail": "Enviar correos electrónicos a outros usuarios",
        "right-passwordreset": "Ver os correos electrónicos de restablecemento de contrasinais",
+       "right-managechangetags": "Crear e borrar [[Special:Tags|tags]] da base de datos",
        "newuserlogpage": "Rexistro de creación de usuarios",
        "newuserlogpagetext": "Este é un rexistro de creación de contas de usuario.",
        "rightslog": "Rexistro de dereitos de usuario",
        "action-viewmyprivateinfo": "ver a súa información privada",
        "action-editmyprivateinfo": "editar a súa información privada",
        "action-editcontentmodel": "editar o modelo de contido dunha páxina",
+       "action-managechangetags": "crear e borrar etiquetas da base de datos",
        "nchanges": "$1 {{PLURAL:$1|modificación|modificacións}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|desde a última visita}}",
        "enhancedrc-history": "historial",
        "uploaderror": "Erro ao cargar",
        "upload-recreate-warning": "'''Atención: Borrouse ou trasladouse un ficheiro con ese nome.'''\n\nVelaquí están o rexistro de borrados e mais o de traslados desta páxina, por se quere consultalos:",
        "uploadtext": "Use o formulario de embaixo para cargar ficheiros.\nPara ver ou procurar imaxes subidas con anterioridade vaia á [[Special:FileList|lista de imaxes]]; os envíos tamén se rexistran no [[Special:Log/upload|rexistro de cargas]] e as eliminacións no [[Special:Log/delete|rexistro de borrados]].\n\nPara incluír un ficheiro nunha páxina, use unha ligazón do seguinte xeito:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' para usar a versión completa do ficheiro\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|texto alternativo]]</nowiki></code>''' para usar unha resolución de 200 píxeles de ancho nunha caixa na marxe esquerda cunha descrición (\"texto alternativo\")\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' para ligar directamente co ficheiro sen que este saia na páxina",
-       "upload-permitted": "Tipos de ficheiro permitidos: $1.",
-       "upload-preferred": "Tipos de ficheiro preferidos: $1.",
-       "upload-prohibited": "Tipos de ficheiro prohibidos: $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|prohibido|prohibidos}}: $1.",
        "uploadlogpage": "Rexistro de cargas",
        "uploadlogpagetext": "A continuación está a lista cos últimos ficheiros cargados no servidor.\nVexa a [[Special:NewFiles|galería de imaxes novas]] para ollar unha visión máis xeral.",
        "filename": "Nome do ficheiro",
        "backend-fail-describe": "Non se puideron cambiar os metadatos do ficheiro \"$1\".",
        "backend-fail-alreadyexists": "O ficheiro \"$1\" xa existe.",
        "backend-fail-store": "Non se deu almacenado o ficheiro \"$1\" en \"$2\".",
-       "backend-fail-copy": "Non se deu copiado o ficheiro \"$1\" en \"$2\".",
-       "backend-fail-move": "Non se deu trasladado o ficheiro \"$1\" a \"$2\".",
+       "backend-fail-copy": "Non se puido copiar o ficheiro \"$1\" en \"$2\".",
+       "backend-fail-move": "Non se puido trasladar o ficheiro \"$1\" a \"$2\".",
        "backend-fail-opentemp": "Non se puido abrir o ficheiro temporal.",
        "backend-fail-writetemp": "Non se puido escribir no ficheiro temporal.",
        "backend-fail-closetemp": "Non se puido pechar o ficheiro temporal.",
        "namespace": "Espazo de nomes:",
        "invert": "Inverter a selección",
        "tooltip-invert": "Marque esta caixa para agochar os cambios nas páxinas pertencentes ao espazo de nomes seleccionado (e o espazo de nomes asociado, se escolleu a opción)",
+       "tooltip-whatlinkshere-invert": "Marque esta caixa para agochar as ligazóns ás páxinas pertencentes ao espazo de nomes seleccionado.",
        "namespace_association": "Espazo de nomes asociado",
        "tooltip-namespace_association": "Marque esta caixa para incluír tamén o espazo de nomes de conversa ou de contidos asociado a aquel seleccionado",
        "blanknamespace": "(Principal)",
        "move-watch": "Vixiar esta páxina",
        "movepagebtn": "Mover a páxina",
        "pagemovedsub": "O movemento foi un éxito",
-       "movepage-moved": "'''A páxina \"$1\" foi movida a \"$2\"'''",
+       "movepage-moved": "<strong>A páxina \"$1\" foi movida a \"$2\"</strong>",
        "movepage-moved-redirect": "Creouse unha redirección da primeira cara á segunda.",
        "movepage-moved-noredirect": "Cancelouse a creación da redirección da primeira cara á segunda.",
        "articleexists": "Xa existe unha páxina con ese nome, ou o nome que escolleu non é válido.\nPor favor, escolla outro nome.",
        "import-rootpage-invalid": "A páxina raíz dada é un título non válido.",
        "import-rootpage-nosubpage": "O espazo de nomes \"$1\" da páxina raíz non permite as subpáxinas.",
        "importlogpage": "Rexistro de importacións",
-       "importlogpagetext": "Rexistro de importación de páxinas xunto co seu historial de edicións procedentes doutros wikis.",
+       "importlogpagetext": "Importacións administrativas de páxinas procedentes doutros wikis xunto co seu historial de edicións.",
        "import-logentry-upload": "importou \"[[$1]]\" mediante a carga dun ficheiro",
        "import-logentry-upload-detail": "{{PLURAL:$1|Importouse $1 revisión|Importáronse $1 revisións}}",
        "import-logentry-interwiki": "importou \"$1\"",
        "rcpatroldisabled": "A patrulla dos cambios recentes está desactivada",
        "rcpatroldisabledtext": "A funcionalidade da patrulla dos cambios recentes está actualmente desactivada.",
        "markedaspatrollederror": "Non se pode marcar como revisada",
-       "markedaspatrollederrortext": "É preciso especificar unha revisión para marcala como revisada.",
-       "markedaspatrollederror-noautopatrol": "Non está permitido que un mesmo marque as propias edicións como revisadas.",
+       "markedaspatrollederrortext": "Cómpre especificar unha revisión para marcala como revisada.",
+       "markedaspatrollederror-noautopatrol": "Non está permitido marcar as edicións propias como revisadas.",
        "markedaspatrollednotify": "A modificación feita en \"$1\" marcouse como revisada.",
        "markedaspatrollederrornotify": "Erro ao marcar como revisada.",
        "patrol-log-page": "Rexistro de revisións patrulladas",
        "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": "Bibliotecas instaladas",
+       "version-libraries-library": "Biblioteca",
        "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",
        "tags-tag": "Nome da etiqueta",
        "tags-display-header": "Aparición nas listas de cambios",
        "tags-description-header": "Descrición completa do significado",
+       "tags-source-header": "Fonte",
        "tags-active-header": "Activa?",
        "tags-hitcount-header": "Edicións etiquetadas",
+       "tags-actions-header": "Accións",
        "tags-active-yes": "Si",
        "tags-active-no": "Non",
+       "tags-source-extension": "Definida por unha extensión",
+       "tags-source-manual": "Aplicado manualmente por usuarios e bots",
+       "tags-source-none": "Xa non está en uso",
        "tags-edit": "editar",
+       "tags-delete": "Borrar",
+       "tags-activate": "activar",
+       "tags-deactivate": "Reactivar",
        "tags-hitcount": "$1 {{PLURAL:$1|modificación|modificacións}}",
+       "tags-manage-no-permission": "Non ten os permisos necesarios para modificar etiquetas.",
+       "tags-create-heading": "Crear unha nova etiqueta",
+       "tags-create-explanation": "Por defecto, as etiquetas creadas recentemente poderán ser empregadas polos usuarios e os bots.",
+       "tags-create-tag-name": "Nome da páxina:",
+       "tags-create-reason": "Motivo:",
+       "tags-create-submit": "Crear",
+       "tags-create-no-name": "Debe especificar unha páxina.",
+       "tags-create-invalid-chars": "Os nomes das etiquetas non poden conter nin comas (<code>,</code>) nin barras (<code>/</code>).",
+       "tags-create-invalid-title-chars": "As páxinas non deben conter caracteres que non se poidan usar nos títulos das páxinas.",
+       "tags-create-already-exists": "A páxina \"$1\" xa existe.",
+       "tags-create-warnings-below": "Desexa continuar creando a etiqueta?",
+       "tags-delete-title": "Borrar etiqueta",
+       "tags-delete-explanation-initial": "Está a piques de borrar a etiqueta \"$1\" da base de datos.",
+       "tags-delete-explanation-warning": "Esta acción é <strong>irreversible</strong> e nin sequera os administradores da base de datos poderán desfacela. Asegúrese de que é esta a etiqueta que desexa borrar.",
+       "tags-delete-explanation-active": "<strong>A etiqueta \"$1\" segue activa e continuará aplicándose no futuro.</strong> Para evitalo, vaia ao(s) lugar(es) onde se establece a aplicación desta etiqueta e desactívea alí.",
+       "tags-delete-reason": "Motivo:",
+       "tags-delete-submit": "Eliminar esta etiqueta irreversiblemente",
+       "tags-delete-not-allowed": "As etiquetas definidas por unha extensión non se poden borrar, agás que a extensión específica o permita.",
+       "tags-delete-not-found": "A páxina \"$1\" non existe.",
+       "tags-delete-too-many-uses": "A etiqueta \"$1\" aplícase a máis de $2 {{PLURAL:$2|revision|revisions}}, polo que non pode borrarse.",
+       "tags-activate-title": "Activar etiqueta",
+       "tags-activate-question": "Está a piques de activar a etiqueta\"$1\".",
+       "tags-activate-reason": "Motivo:",
+       "tags-activate-not-allowed": "Non é posible activar a páxina \"$1\".",
+       "tags-activate-not-found": "A páxina \"$1\" non existe.",
+       "tags-activate-submit": "Activar",
+       "tags-deactivate-title": "Desactivar etiqueta",
+       "tags-deactivate-question": "Está a piques de desactivar a etiqueta \"$1\".",
+       "tags-deactivate-reason": "Motivo:",
+       "tags-deactivate-not-allowed": "Non é posible reactivar a páxina \"$1\".",
+       "tags-deactivate-submit": "Reactivar",
        "comparepages": "Comparar páxinas",
        "compare-page1": "Páxina 1",
        "compare-page2": "Páxina 2",
        "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 acceder ó servidor da base de datos: $1)",
-       "dberr-info-hidden": "(Non se pode acceder ó servidor da base de datos)",
+       "dberr-info": "(Non se pode acceder ao servidor da base de datos: $1)",
+       "dberr-info-hidden": "(Non se pode acceder ao 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.",
        "logentry-upload-upload": "$1 {{GENDER:$2|cargou}} \"$3\"",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|cargou}} unha nova versión de \"$3\"",
        "logentry-upload-revert": "$1 {{GENDER:$2|cargou}} \"$3\"",
+       "log-name-managetags": "Rexistro de xestión de etiquetas",
+       "log-description-managetags": "Esta páxina contén unha lista das tarefas de xestión relacionadas con [[Special:Tags|tags]]. No rexistro figuran só aquelas accións realizadas de forma manual por un administrador; pódense crear ou borrar etiquetas por medio do software wiki sen que se engada unha nova entrada ao rexistro.",
+       "logentry-managetags-create": "$1 {{GENDER:$2|created}} a etiqueta \"$4\"",
        "rightsnone": "(ningún)",
        "revdelete-summary": "o resumo de edición",
        "feedback-bugornote": "Se está listo para describir un problema técnico en detalle, [$1 informe do erro].\nEn caso contrario, pode empregar o formulario sinxelo inferior. O seu comentario aparecerá na páxina \"[$3 $2]\" xunto ao seu nome de usuario e o navegador que está usando.",
        "expand_templates_ok": "Aceptar",
        "expand_templates_remove_comments": "Eliminar os comentarios",
        "expand_templates_remove_nowiki": "Suprimir as etiquetas <nowiki> no resultado",
-       "expand_templates_generate_xml": "Mostrar as árbores de análise XML",
+       "expand_templates_generate_xml": "Mostrar a árbore de análise XML",
        "expand_templates_generate_rawhtml": "Mostrar o HTML en bruto",
        "expand_templates_preview": "Vista previa",
        "expand_templates_preview_fail_html": "<em>Dado que o código HTML puro está activado en {{SITENAME}} e produciuse unha perda dos datos da sesión, a vista previa está oculta como precaución contra ataques mediante código JavaScript.</em>\n\n<strong>Se este é un intento lexítimo de acceso á vista previa, inténteo de novo.</strong>\nSe segue sen funcionar, probe a [[Special:UserLogout|saír]] e volver a entrar coa súa conta.",
        "default-skin-not-found-no-skins": "Ups! O aspecto predeterminado do wiki, definido en <code dir=\"ltr\">$wgDefaultSkin</code> como <code>$1</code>, non está dispoñíbel.\n\nNon ten aspectos instalados.\n\n; Se acaba de instalar MediaWiki:\n: Probablemente instalou MediaWiki a partir de Git, ou directamente a partir do código fonte mediante algún outro método. En tal caso, este problema é normal. Probe a instalar algúns aspectos do [https://www.mediawiki.org/wiki/Category:All_skins cartafol de aspectos de mediawiki.org]. Para instalar aspectos, siga calquera destes pasos:\n:* Descargue o [https://www.mediawiki.org/wiki/Download arquivo do instalador], que inclúe varios aspectos e complementos. Pode copiar e pegar o cartafol <code>skins/</code> que atopará no arquivo.\n:* Descargue arquivos de aspectos individuais de [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* Clone un dos repositorios de <code>mediawiki/skins/*</code> mediante Git no cartafol <code dir=\"ltr\">skins/</code> da súa instalación de MediaWiki.\n: Isto non debería interferir co seu repositorio Git se é vostede un desenvolvedor de MediaWiki. Lea o [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual de configuración de aspectos] para obter información sobre como activar aspectos e escoller o aspecto predeterminado.",
        "default-skin-not-found-row-enabled": "* <code>$1</code>/$2 (activada)",
        "default-skin-not-found-row-disabled": "* <code>$1</code>/$2 ('''desactivada''')",
-       "mediastatistics": "Estatísticas de contido multimedia",
-       "mediastatistics-summary": "Estatísticas sobre tipos de ficheiros enviados. Isto inclúe unicamente a última versión de cada ficheiro. As versións de ficheiros vellas ou eliminadas quedan excluídas.",
+       "mediastatistics": "Estatísticas do contido multimedia",
+       "mediastatistics-summary": "Estatísticas sobre os tipos de ficheiros enviados. Isto inclúe unicamente a última versión de cada ficheiro. As versións vellas ou borradas dos ficheiros quedan excluídas.",
        "mediastatistics-nbytes": "{{PLURAL:$1|$1 byte|$1 bytes}} ($2; $3%)",
        "mediastatistics-table-mimetype": "Tipo MIME",
-       "mediastatistics-table-extensions": "Extensións posíbeis",
+       "mediastatistics-table-extensions": "Extensións posibles",
        "mediastatistics-table-count": "Número de ficheiros",
        "mediastatistics-table-totalbytes": "Tamaño combinado",
        "mediastatistics-header-unknown": "Descoñecido",
        "mediastatistics-header-bitmap": "Imaxes de mapas de bits",
-       "mediastatistics-header-drawing": "Imaxes vectoriais",
+       "mediastatistics-header-drawing": "Debuxos (imaxes vectoriais)",
        "mediastatistics-header-audio": "Son",
-       "mediastatistics-header-video": "Vídeo",
+       "mediastatistics-header-video": "Vídeos",
        "mediastatistics-header-multimedia": "Contido enriquecido",
-       "mediastatistics-header-office": "Oficina",
+       "mediastatistics-header-office": "Documentos",
        "mediastatistics-header-text": "Texto",
-       "mediastatistics-header-executable": "Executábeis",
+       "mediastatistics-header-executable": "Executables",
        "mediastatistics-header-archive": "Formatos comprimidos",
        "json-warn-trailing-comma": "{{PLURAL:$1|Eliminouse $1 coma final|Elimináronse $1 comas finais}} do JSON.",
        "json-error-unknown": "Houbo un problema co JSON. Erro: $1",
index 1444e99..72adfca 100644 (file)
        "currentrev": "હાલની આવૃત્તિ",
        "currentrev-asof": "$1એ જોઈ શકાતી હાલની આવૃત્તિ",
        "revisionasof": "$1 સુધીનાં પુનરાવર્તન",
-       "revision-info": "$2 દ્વારા $1 સુધીમાં કરવામાં આવેલાં ફેરફારો",
+       "revision-info": "{{GENDER:$6|$2}}$7 દ્વારા $1 સુધીમાં કરવામાં આવેલાં ફેરફારો",
        "previousrevision": "← જુના ફેરફારો",
        "nextrevision": "આ પછીનું પુનરાવર્તન→",
        "currentrevisionlink": "વર્તમાન આવૃત્તિ",
        "booksources": "પુસ્તક સ્રોત",
        "booksources-search-legend": "પુસ્તક સ્રોત શોધો",
        "booksources-isbn": "આઇએસબીએન:",
+       "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સંભાળ પૂર્વક આગળ વધો.\n\n\nDeleting it may disrupt database operations of {{SITENAME}};",
        "rollback": "ફેરફારો ઉલટાવો",
-       "rollback_short": "ઉલટાવો",
        "rollbacklink": "પાછું વાળો",
        "rollbacklinkcount": "$1 {{PLURAL:$1|ફેરફાર પાછો વાળો|ફેરફારો પાછા વાળો}}",
        "rollbacklinkcount-morethan": "$1 {{PLURAL:$1|ફેરફાર|ફેરફારો}} કરતાં ઓછું પાછું લાવો",
        "tooltip-pt-mycontris": "તમારા યોગદાનની યાદી",
        "tooltip-pt-login": "આપને પ્રવેશ કરવા ભલામણ કરવામાં આવે છે, જોકે તે આવશ્યક નથી",
        "tooltip-pt-logout": "બહાર નીકળો/લૉગ આઉટ કરો",
+       "tooltip-pt-createaccount": "તમને ખાતું બનાવીને પ્રવેશ કરવા માટે આમંત્રણ છે; તેમ કરવું જોકે, જરૂરી નથી.",
        "tooltip-ca-talk": "અનુક્રમણિકાનાં પાના વિષે ચર્ચા",
        "tooltip-ca-edit": "આપ આ પાનામાં ફેરફાર કરી શકો છો, કાર્ય સુરક્ષિત કરતાં પહેલાં 'ઝલક' બટન ઉપર ક્લિક કરીને જોઇ લેશો",
        "tooltip-ca-addsection": "ચર્ચાનો નવો મુદ્દો ઉમેરો.",
index 8cbba19..4fdf7a0 100644 (file)
@@ -27,7 +27,8 @@
                        "שומבלע",
                        "תומר ט",
                        "Matanya",
-                       "GilCahana"
+                       "GilCahana",
+                       "Ldorfman"
                ]
        },
        "tog-underline": "סימון קישורים בקו תחתי:",
        "yourpasswordagain": "חזרה על הסיסמה:",
        "createacct-yourpasswordagain": "אימות הסיסמה",
        "createacct-yourpasswordagain-ph": "יש להקליד את הסיסמה שנית",
-       "remembermypassword": "שמירת הכניסה שלי בדפדפן הזה (ל{{PLURAL:$1|יום אחד|יומיים|־$1 ימים}} לכל היותר)",
+       "remembermypassword": "שמירת הכניסה שלי בדפדפן הזה ({{PLURAL:$1|ליום אחד|ליומיים|ל־$1 ימים}} לכל היותר)",
        "userlogin-remembermypassword": "לזכור שנכנסתי",
        "userlogin-signwithsecure": "שימוש בחיבור מאובטח",
        "yourdomainname": "המתחם שלך:",
        "session_fail_preview_html": "'''לא ניתן לבצע את עריכתם עקב אובדן מידע הכניסה.'''\n\nכיוון שבאתר זה אפשרות השימוש ב־HTML מאופשרת, התצוגה המקדימה מוסתרת כדי למנוע התקפות JavaScript.\n\n'''אם זהו ניסיון עריכה לגיטימי, אנא נסו שוב.'''\nאם זה לא עוזר, נסו [[Special:UserLogout|לצאת מהחשבון]] ולהיכנס אליו שנית.",
        "token_suffix_mismatch": "'''עריכתך נדחתה כיוון שהדפדפן שלך מחק את תווי הפיסוק באסימון העריכה.'''\nהעריכה נדחתה כדי למנוע בעיות כאלה בטקסט של הדף.\nלעתים התקלה מתרחשת עקב שימוש בשירות פרוקסי אנונימי פגום.",
        "edit_form_incomplete": "'''כמה חלקים מטופס העריכה לא הגיעו לשרת; בדקו היטב שעריכותיכם לא נפגעו ונסו שוב.'''",
-       "editing": "עריכת $1",
-       "creating": "יצירת $1",
-       "editingsection": "עריכת $1 (פסקה)",
-       "editingcomment": "עריכת $1 (פסקה חדשה)",
+       "editing": "עריכת הדף $1",
+       "creating": "יצירת הדף $1",
+       "editingsection": "עריכת הדף $1 (פסקה)",
+       "editingcomment": "עריכת הדף $1 (פסקה חדשה)",
        "editconflict": "התנגשות עריכה: $1",
        "explainconflict": "משתמש אחר שינה את הדף מאז שהתחלתם לערוך אותו.\nחלון העריכה העליון מכיל את הטקסט בדף כפי שהוא עתה.\nהשינויים שלכם מוצגים בחלון העריכה התחתון.\nעליכם למזג את השינויים שלכם לתוך הטקסט הקיים.\n'''רק''' הטקסט בחלון העריכה העליון יישמר כשתלחצו על \"{{int:savearticle}}\".",
        "yourtext": "הטקסט שלך",
        "prefs-personal": "פרטי המשתמש",
        "prefs-rc": "שינויים אחרונים",
        "prefs-watchlist": "רשימת המעקב",
+       "prefs-editwatchlist": "עריכת רשימת המעקב",
+       "prefs-editwatchlist-label": "עריכת ערכים ברשימת המעקב שלך:",
+       "prefs-editwatchlist-edit": "צפייה והסרת כותרות ברשימת המעקב שלך",
+       "prefs-editwatchlist-raw": "עריכת רשימת המעקב הגולמית",
+       "prefs-editwatchlist-clear": "ניקוי רשימת המעקב שלך",
        "prefs-watchlist-days": "מספר הימים המרבי שיוצגו ברשימת המעקב:",
        "prefs-watchlist-days-max": "לכל היותר {{PLURAL:$1|יום אחד|יומיים|$1 ימים}}",
        "prefs-watchlist-edits": "מספר העריכות המרבי שיוצגו ברשימת המעקב המורחבת:",
        "right-override-export-depth": "ייצוא דפים כולל דפים מקושרים עד עומק של חמישה",
        "right-sendemail": "שליחת דואר אלקטרוני למשתמשים אחרים",
        "right-passwordreset": "צפייה בדואר אלקטרוני של איפוס סיסמה",
+       "right-managechangetags": "יצירת ומחיקת [[Special:Tags|תגיות]] מבסיס הנתונים",
        "newuserlogpage": "יומן רישום משתמשים",
        "newuserlogpagetext": "זהו יומן המכיל הרשמות של משתמשים.",
        "rightslog": "יומן תפקידים",
        "action-viewmyprivateinfo": "לצפות במידע הפרטי שלך",
        "action-editmyprivateinfo": "לערוך את המידע הפרטי שלך",
        "action-editcontentmodel": "לערוך את מודל התוכן של דף",
+       "action-managechangetags": "ליצור ולמחוק תגיות מבסיס הנתונים",
        "nchanges": "{{PLURAL:$1|שינוי אחד|$1 שינויים}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|מאז ביקורך האחרון}}",
        "enhancedrc-history": "היסטוריה",
        "allarticles": "כל הדפים",
        "allinnamespace": "כל הדפים (מרחב שם $1)",
        "allpagessubmit": "הצגה",
-       "allpagesprefix": "הדפים ששמם מתחיל ב:",
+       "allpagesprefix": "הדפים ששמם מתחיל ב־:",
        "allpagesbadtitle": "כותרת הדף שניתנה הייתה בלתי־תקינה או שהייתה בה קידומת של קישור לשפה אחרת או לוויקי אחר.\nייתכן שהיא מכילה תו אחד או יותר האסורים לשימוש בכותרות.",
        "allpages-bad-ns": "מרחב השם \"$1\" לא קיים ב{{grammar:תחילית|{{SITENAME}}}}.",
        "allpages-hide-redirects": "הסתרת הפניות",
        "tags-tag": "שם התגית",
        "tags-display-header": "הופעה ברשימות השינויים",
        "tags-description-header": "תיאור מלא של המשמעות",
+       "tags-source-header": "מקור",
        "tags-active-header": "פעילה?",
        "tags-hitcount-header": "שינויים עם תגיות",
+       "tags-actions-header": "פעולות",
        "tags-active-yes": "כן",
        "tags-active-no": "לא",
+       "tags-source-extension": "הוגדר על־ידי הרחבה",
+       "tags-source-manual": "הוחל באופן ידני על־ידי משתמשים ובוטים",
+       "tags-source-none": "אינו בשימוש כעת",
        "tags-edit": "עריכה",
+       "tags-delete": "מחיקה",
+       "tags-activate": "הפעלה",
+       "tags-deactivate": "ביטול הפעלה",
        "tags-hitcount": "{{PLURAL:$1|שינוי אחד|$1 שינויים}}",
+       "tags-manage-no-permission": "אין לך הרשאה לנהל תגיות לסימון שינויים.",
+       "tags-create-heading": "יצירת תגית חדשה",
+       "tags-create-explanation": "כברירת מחדל, תגיות חדשות שנוצרות יהיו זמינות לשימושם של משתמשים ובוטים.",
+       "tags-create-tag-name": "שם התגית:",
+       "tags-create-reason": "הסבר:",
+       "tags-create-submit": "יצירה",
+       "tags-create-no-name": "יש לציין שם לתגית.",
+       "tags-create-invalid-chars": "שמות תגיות אינם יכולים לכלול תווי פסיק (<code>,</code>) או סלש ימני (<code>/</code>).",
+       "tags-create-invalid-title-chars": "שמות תגיות אינם יכולים לכלול תווים שאינם ניתנים לשימוש בכותרות דפים.",
+       "tags-create-already-exists": "התגית \"$1\" כבר קיימת.",
+       "tags-create-warnings-above": "{{PLURAL:$2|האזהרה הבאה התקבלה|האזהרות הבאות התקבלו}} בעת הניסיון ליצירת התגית \"$1\":",
+       "tags-create-warnings-below": "האם ברצונך להמשיך ביצירת התגית?",
+       "tags-delete-title": "מחיקת התגית",
+       "tags-delete-explanation-initial": "אתם עומדים למחוק את התגית \"$1\" מבסיס הנתונים.",
+       "tags-delete-explanation-in-use": "התגית תוסר {{PLURAL:$2|מגרסה אחת/פריט יומן אחד|מכל $2 הגרסאות/פריטי היומן}} עבורם היא מוחלת כרגע.",
+       "tags-delete-explanation-warning": "פעולה זו <strong>אינה הפיכה</strong> ו<strong>אינה ניתנת לביטול</strong>, אפילו לא על־ידי מנהלי בסיס הנתונים. אנא ודאו שזוהי התגית שאתם מתכוונים למחוק.",
+       "tags-delete-explanation-active": "<strong>התגית \"$1\" עדיין פעילה, והיא תמשיך להיות מוחלת בעתיד.</strong> כדי למנוע זאת, יש לעבור למקום (או למקומות) בהם התגית מוחלת, ולבטל אותה שם.",
+       "tags-delete-reason": "הסבר:",
+       "tags-delete-submit": "מחיקה בלתי הפיכה של תגית זו",
+       "tags-delete-not-allowed": "תגיות שהוגדרו על־ידי הרחבה אינן ניתנות למחיקה אלא אם כן ההרחבה מתירה זאת במיוחד.",
+       "tags-delete-not-found": "התגית \"$1\" אינה קיימת.",
+       "tags-delete-too-many-uses": "התגית \"$1\" מוחלת על יותר {{PLURAL:$2|מגרסה אחת|מ־$2 גרסאות}}, ולכן לא ניתן למחוק אותה.",
+       "tags-delete-warnings-after-delete": "התגית \"$1\" נמחקה בהצלחה, אבל {{PLURAL:$2|התקבלה האזהרה הבאה|התקבלו האזהרות הבאות}}:",
+       "tags-activate-title": "הפעלת תגית",
+       "tags-activate-question": "אתם עומדים להפעיל את התגית \"$1\".",
+       "tags-activate-reason": "הסבר:",
+       "tags-activate-not-allowed": "לא ניתן להפעיל את התגית \"$1\".",
+       "tags-activate-not-found": "התגית \"$1\" אינה קיימת.",
+       "tags-activate-submit": "הפעלה",
+       "tags-deactivate-title": "ביטול הפעלת תגית",
+       "tags-deactivate-question": "אתם עומדים לבטל את הפעלת התגית \"$1\".",
+       "tags-deactivate-reason": "הסבר:",
+       "tags-deactivate-not-allowed": "לא ניתן לבטל את הפעלת התגית \"$1\".",
+       "tags-deactivate-submit": "ביטול הפעלה",
        "comparepages": "השוואת דפים",
        "compare-page1": "דף 1",
        "compare-page2": "דף 2",
        "logentry-upload-upload": "$1 {{GENDER:$2|העלה|העלתה}} את $3",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|העלה|העלתה}} גרסה חדשה של $3",
        "logentry-upload-revert": "$1 {{GENDER:$2|העלה|העלתה}} את $3",
+       "log-name-managetags": "יומן ניהול תגיות",
+       "log-description-managetags": "דף זה כולל רשימה של פעולות ניהול הקשורות ל[[Special:Tags|תגיות]]. היומן כולל רק פעולות שבוצעו ידנית על־ידי מפעיל מערכת; ייתכן שתגיות ייווצרו או יימחקו על־ידי תוכנת הוויקי ללא הוספת ערך ליומן זה.",
+       "logentry-managetags-create": "$1 {{GENDER:$2|יצר|יצרה}} את התגית \"$4\"",
+       "logentry-managetags-delete": "$1 {{GENDER:$2|מחק|מחקה}} את התגית \"4$\" (שהוסרה {{PLURAL:$5|מגרסה אחת/פריט יומן אחד|מ־$5 גרסאות ו/או פריטי יומן}})",
+       "logentry-managetags-activate": "$1 {{GENDER:$2|הפעיל|הפעילה}} את התגית \"$4\" לשימוש על־ידי משתמשים ובוטים",
+       "logentry-managetags-deactivate": "$1 {{GENDER:$2|ביטל|ביטלה}} את הפעלת התגית \"$4\" לשימוש על־ידי משתמשים ובוטים",
        "rightsnone": "(כלום)",
        "revdelete-summary": "תקציר העריכה",
        "feedback-bugornote": "אם אתם מוכנים לתאר בעיה טכנית בפרטים, אנא [$1 דווחו באג].\nאחרת, תוכלו להשתמש בטופס הפשוט שלהלן. הערתכם תתווסף לדף \"[$3 $2]\", יחד עם שם המשתמש שלכם.",
index f9b6f59..1ac3c47 100644 (file)
        "watchlistedit-raw-done": "आपकी ध्यानसूची अपडेट कर दी गई हैं",
        "watchlistedit-raw-added": "{{PLURAL:$1|1शीर्षक|$1 शीर्षक}} बढा दिये:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1शीर्षक|$1 शीर्षक}} हटा दिये:",
+       "watchlisttools-clear": "ध्यानसूची खाली करें",
        "watchlisttools-view": "आधारित बदलाव देखें",
        "watchlisttools-edit": "ध्यानसूची देखें एवं संपादित करें",
        "watchlisttools-raw": "रॉ ध्यानसूची देखें एवं संपादित करें",
index 2cb308e..4fd9066 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",
        "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|Temporary password ke email se le ke khatir ek field me likho}}",
        "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:",
        "content-not-allowed-here": "Panna [[$2]] me \"$1\" likhe ke ijaajat nai 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-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.",
        "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",
        "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 <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",
        "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",
        "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",
        "prefs-personal": "Sadasya ke profile",
        "prefs-rc": "Nawaa badlao",
        "prefs-watchlist": "Dhyan suchi",
+       "prefs-editwatchlist": "Dhyan suchi ke badlo",
+       "prefs-editwatchlist-label": "Dhyan suchi ke entries ke badlo",
+       "prefs-editwatchlist-edit": "Dhyan suchi me title ke dekho aur hatao",
+       "prefs-editwatchlist-raw": "Raw dhyan suchi ke badlo",
+       "prefs-editwatchlist-clear": "Aapan dhyan suchi ke clear karo",
        "prefs-watchlist-days": "Dhyan suchi me ketna roj dekhawa jaae:",
        "prefs-watchlist-days-max": "Jaada se jaada $1 {{PLURAL:$1|din|din}}",
        "prefs-watchlist-edits": "Barraa dhyan suchi me jaada se jaada ketna badlao dekhawa jaae:",
        "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-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",
        "right-override-export-depth": "Panna aur jurra panna, 5 ke gahirrai talak, ke export karo",
        "right-sendemail": "Duusra sadasya ke lage e-mail bhejo",
        "right-passwordreset": "Password ke badle waala e-mail ke dekho",
+       "right-managechangetags": "Database se banao aur mitao [[Special:Tags|tags]]",
        "newuserlogpage": "Sadasya ke banae waala log",
        "newuserlogpagetext": "Ii sadasya ke banae waala log hai.",
        "rightslog": "Sadasya adhikar suchi",
        "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-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",
+       "action-managechangetags": "database se tags ke banao aur mitao",
        "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",
        "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",
        "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-prop": "Property ke naam:",
        "pageswithprop-submit": "Jaao",
        "pageswithprop-prophidden-long": "lamba text property value hidden ($1)",
-       "pageswithprop-prophidden-binary": "binary property ke hidden value ($1 kilobytes)",
+       "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",
        "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",
        "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.",
+       "trackingcategories": "Vibhag ke track karaa jaawe hae",
+       "trackingcategories-summary": "Ii panna me tracking vibhag ke suchi hae, jiske MediaWiki software automatically populate kare hae. Iske naam can be changed by altering the relevant system messages in the {{ns:8}} namespace.",
+       "trackingcategories-msg": "Tracking category",
+       "trackingcategories-name": "Sandes ke naam",
+       "trackingcategories-desc": "Category inclusion ke criteria",
+       "noindex-category-desc": "Ii panna ke robots nai index karis hae kaheki ispe magic word <code><nowiki>__NOINDEX__</nowiki></code> hae aur ii uu namespace me hae jisme uu flag allowed nai hae.",
+       "index-category-desc": "Ii panna me  <code><nowiki>__INDEX__</nowiki></code> hae(aur ii uu namespace me hae jahaan pe flag allowed haeand), tab iske robots se index karaa gais hae where it normally wouldn't be.",
+       "post-expand-template-inclusion-category-desc": "Ii panna ke size <code>$wgMaxArticleSize</code> se barraa hae after expanding all the templates, so some templates were not expanded.",
+       "post-expand-template-argument-category-desc": "Ii panna <code>$wgMaxArticleSize</code> se barraa hae after expanding a template argument (something in triple braces, like <code>{{{Foo}}}</code>).",
+       "expensive-parserfunction-category-desc": "Ii panna dher expensive parser functions (jaise ki <code>#ifexist</code>) ke use kare hae. See [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+       "broken-file-category-desc": "Ii panna  me tuuta file link hae(a link to embed a file when the file does not exist).",
+       "hidden-category-category-desc": "Ii category me <code><nowiki>__HIDDENCAT__</nowiki></code> iske content panna me hae, which prevents it from showing up in the category links box on pages by default.",
+       "trackingcategories-nodesc": "Koi description nai he",
+       "trackingcategories-disabled": "Category ke disable kar dewa gais 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",
        "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.",
+       "addedwatchtext-short": "Panna \"$1\" ke aap ke watchlist me jorraa gais hae.",
        "removewatch": "Dhyan suchi me se hatao",
        "removedwatchtext": "Panna \"[[:$1]]\" ke aap ke [[Special:Watchlist|aap ke dhyan suchi]] se hatae dewa gais hai.",
+       "removedwatchtext-short": "Panna \"$1\" ke aap ke watchlist me se hataawa gais hae.",
        "watch": "Dekho",
        "watchthispage": "Ii panna par dhyan rakho",
        "unwatch": "Nai dhyaan rakho",
        "watchlist-details": "{{PLURAL:$1|$1 panna|$1 panna}} pe dhyan dewa jae hai, baat waala panna ke chhorr ke.",
        "wlheader-enotif": "E-mail notification ke enable kar dewa gais hai.",
        "wlheader-showupdated": "Panna jiske aap ke pichhla visit ke ke baad badal dewa gais hia ke '''bold''' me dekhawa jaawe hai.",
-       "wlnote": "Niche ke {{PLURAL:$1|pahile waala badlao hai| pahile '''$1''' badlao hai}} pichhle {{PLURAL:$2|ghanta|'''$2''' ghanta}} me as of $3, $4..",
+       "wlnote": "Niche ke {{PLURAL:$1|pahile waala badlao hai| pahile <strong>$1</strong> badlao hai}} pichhle {{PLURAL:$2|ghanta|<strong>$2</strong> ghanta}} me as of $3, $4.",
        "wlshowlast": "Pichhla $1 ghanta $2 din  ke dekhao",
        "watchlist-options": "Dhyan suchi ke options",
        "watching": "Dekhtaa...",
        "exbeforeblank": "blanking se pahile content rahaa: '$1'",
        "delete-confirm": "\"$1\" ke mitao",
        "delete-legend": "Mitao",
-       "historywarning": "Sawadhan: Jon panna ke aap mitae waala hai ke itihaas hai lagbhag $1 {{PLURAL:$1|badlao|badlao}}:",
+       "historywarning": "<strong>Sawadhan</strong>: Jon panna ke aap mitae waala hai ke itihaas hai $1 {{PLURAL:$1|badlao|badlao}} ke saathe:",
        "confirmdeletetext": "Aap ek panna ke uske itihaas ke saathe delete kare waala hai.\nMeharbani kar ke iske confirm karo, ki aap iske consequences ke samajhta hai, aur aap iske [[{{MediaWiki:Policy-url}}|the policy]] ke policy ke niche delete karta hai.",
        "actioncomplete": "Action puura hoe gais hai",
        "actionfailed": "Action fail hoe gais",
        "deletecomment": "Kaaran:",
        "deleteotherreason": "Aur/duusra kaaran:",
        "deletereasonotherlist": "Duusra kaaran",
-       "deletereason-dropdown": "*Sadharan mitae ke kaaran\n** Author ke request\n** Copyright ke violation\n** Vandalism",
+       "deletereason-dropdown": "*Sadharan mitae ke kaaran\n** Spam\n** Vandalism\n** Copyright ke violation\n** Author ke request\n** Tuuta redirect",
        "delete-edit-reasonlist": "Mitae ke kaaran ke badlo",
        "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.",
+       "deleteprotected": "Aap ii panna ke mitae nai saktaa hae kaaheki iske protect karaa gais hae.",
+       "deleting-backlinks-warning": "'''Chetauni:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Duusra panna]] uu panna se link, nai to transclude kare hae jiske aap delete kare waala hae.",
        "rollback": "Pahile jaise kare waala badlao",
        "rollbacklink": "pahile jaise karo",
        "rollbacklinkcount": "$1 {{PLURAL:$1|edit|edits}} ke rollback karo",
        "alreadyrolled": "[[:$1]] by [[User:$2|$2]] ke pahile jaise nai kare sakta hai. ([[User talk:$2|Talk]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);\naur koi ii panna ke badal nai to pahile jaise kar diis hai.\n\nIi panna ke pichla badla [[User:$3|$3]] ([[User talk:$3|Talk]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]) se rahaa",
        "editcomment": "Badlao ke summary rahaa: \"''$1''\".",
        "revertpage": "[[Special:Contributions/$2|$2]] ([[User talk:$2|Talk]]) ke badlao ke [[User:$1|$1]] ke aakhri badlao ke jaise kar dewa gais hai.",
-       "revertpage-nouser": "badlao ke  [[User:$1|$1]] ke badlao ke rakam kar dewa gais hae.",
+       "revertpage-nouser": "Reverted edits by a hidden user to last revision by {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "$1 ke badlao ke pahile jaise kar dewa gais hai;\nbadal ke $2 ke aakhri version kar dewa gais hai.",
        "sessionfailure-title": "Session fail hoe gais hae",
        "sessionfailure": "Aap ke login session me kuch karrbarr hai.\niske cancel kar dewa gais hai jisse ki koi iisession ke hijack nai kar.\nMeharbani kar ke  \"back\" ke press kar ke jon pana se aap aae rahaa ke fir se load karo, tab fir kosis karo.",
        "protect-othertime": "Duusra time:",
        "protect-othertime-op": "duusra time",
        "protect-existing-expiry": "Abhi ke khatam hoe waala time: $3, $2",
+       "protect-existing-expiry-infinity": "Abhi ke expiry time: infinite",
        "protect-otherreason": "Duusra/aur kaaran:",
        "protect-otherreason-op": "Duusra kaaran:",
        "protect-dropdown": "*Bachae ke sadharan kaaran\n** Jaada vandalism\n** Jaada spamming\n** Counter-productive edit warring\n** Jaada traffic waala panna",
        "namespace": "Namespace:",
        "invert": "Selection ke ulto",
        "tooltip-invert": "Cuna gais namespace (and the associated namespace if checked) ke badlao ke lukae ke khatir ii box ke tick karo",
+       "tooltip-whatlinkshere-invert": "Ii bix ke check karo, to hide links from pages within the selected namespace.",
        "namespace_association": "Associated namespace",
        "tooltip-namespace_association": "Chuna gais panna ke baat waala panna, nai to, subject namespace ke include kare ke khatir, ii box ke tick karo",
        "blanknamespace": "(Pahila)",
        "contributions": "{{GENDER:$1|Sadasya}} ke yogdaan",
        "contributions-title": "$1 ke yogdaan",
        "mycontris": "Yogdaan",
-       "contribsub2": "$1 ($2) ke khatir",
+       "contribsub2": "{{GENDER:$3|$1}} ($2) ke khatir",
+       "contributions-userdoesnotexist": "User account \"$1\" register nai karaa gais hae",
        "nocontribs": "Ii critera ke rakam ke koi badlao nai pawa gais hai.",
        "uctop": "(abhi waala)",
        "month": "Mahina se (aur pahile):",
        "sp-contributions-newbies-sub": "Nawaa account khatir",
        "sp-contributions-newbies-title": "Nawaa account ke sadasya ke yogdaan",
        "sp-contributions-blocklog": "Suchi roko",
+       "sp-contributions-suppresslog": "Sadasya ke yogdaan jiske suppress karaa gais hae",
        "sp-contributions-deleted": "Mitawa gais adasya ke yogdaan",
        "sp-contributions-uploads": "upload karaa gais file",
        "sp-contributions-logs": "logs",
        "sp-contributions-search": "Yogdaan ke khojo",
        "sp-contributions-username": "IP Address nai to username:",
        "sp-contributions-toponly": "Khaali sab se nawaa badlao ke dekhao",
+       "sp-contributions-newonly": "Khaali uu badlao ke dekhao jon ke panna banae waala hae",
        "sp-contributions-submit": "Khojo",
        "whatlinkshere": "Hian konchij jurre hae",
        "whatlinkshere-title": "Panna jon ki $1 se jurre hai",
        "autoblockid": "#$1 ke apne se block karo",
        "block": "Sadasya ke roko",
        "unblock": "Sadasya ke rukawat k khalaas karo",
-       "blockip": "Sadasya ke roko",
+       "blockip": "{{GENDER:$1|sadasya}} ke roko",
        "blockip-legend": "Sadasya ke roko",
        "blockiptext": "Niche ke form ke use kar ke koi khaas IP address nai to username ke write access ke roko.\nIske khaali vandalism ke roke ke khatir use kare ke chaahi [[{{MediaWiki:Policy-url}}|policy]] ke niche.\nNiche ek khaas kaaran likho (jaise ki, citing particular pages that were vandalized).",
        "ipaddressorusername": "IP Address nai to username:",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] ke rok dewa gais hai.<br />\nIi rukawat pe fir se bichar kare ke khatir [[Special:BlockList|block list]] ke dekho.",
        "ipb-blockingself": "Aap abhi apne ke block kare waala hae! Aap sure hai koi aap ii kare mangtaa hae?",
        "ipb-confirmhideuser": "Aap abhi ek sadasya ke \"hide user\" enabled se block kare waala hae. Isse sadasya ke naam ke sab lists aur log entries se hatae dewa jaai.  Aap sure hae ki aap ii kare mangtaa hae?",
+       "ipb-confirmaction": "Agar aap sure hae ki aap konchi kare mantaa hae, tab meharbaani kar ke niche  \"{{int:ipb-confirm}}\" field ke check karo",
        "ipb-edit-dropdown": "Badlao ke roke ke kaaran",
        "ipb-unblock-addr": "$1 ke rukawat ke khalaas karo",
        "ipb-unblock": "Ek username nai to IP address ke rukawat ke khalaas karo",
        "ipb-blocklist": "Abhi ke rukawat ke dekho",
-       "ipb-blocklist-contribs": "$1 ke yogdaan",
+       "ipb-blocklist-contribs": "{{GENDER:$1|$1}} ke yogdaan",
        "unblockip": "Sadasya ke rukawat ke khalaas karo",
        "unblockiptext": "Niche ke form ke use kar ke pahile roka gais IP address nai to username ke likhe ke adhikar do.",
        "ipusubmit": "Ii rukawat ke hatao",
        "unblocked": "[[User:$1|$1]] ke rukawat ke khalaas kar dewa gais hai",
        "unblocked-range": "$1 ke unblock kar dewa gais hae",
        "unblocked-id": "Roko $1 ke khalaas kar dewa gais hai",
+       "unblocked-ip": "[[Special:Contributions/$1|$1]] ke unblock kar dewa gais hae.",
        "blocklist": "Roka gais sadasya",
        "ipblocklist": "Roka gais sadasya",
        "ipblocklist-legend": "Ek roka gais sadasya ke khojo",
        "change-blocklink": "rukawat ke badlo",
        "contribslink": "yogdaan",
        "emaillink": "E-mail bhejo",
-       "autoblocker": "Apne se rokaa gais hai kaahe ki aap ke IP address ke abhi haali \"[[User:$1|$1]]\" use karis hai.\n$1 ke roke ke kaaran hai: \"$2\"",
+       "autoblocker": "Apne ke rokaa gais hai kaaheki aap ke IP address ke abhi haali \"[[User:$1|$1]]\" use karis hai.\n$1 ke roke ke kaaran hai: \"$2\"",
        "blocklogpage": "Suchi ke roko",
        "blocklog-showlog": "Ii sadasya ke pahile rokaa gais hae.\nRoke waala suchi  ke niche dekhawa jaawe hae aap ke jankari ke khatir:",
        "blocklog-showsuppresslog": "Ii sadasya ke pahile rokaa aur lukawa gais hae.\nIske suchi ke niche dekhawa jaawe hae aap ke jankari ke khatir.",
        "range_block_disabled": "Administrator ke adhikar, jisse range block banawa jaawat rahaa, ke rok dewa gais hai.",
        "ipb_expiry_invalid": "Khalaas hoe waala time galat hai.",
        "ipb_expiry_temp": "Lukawa gais username ke rukawat ke permanent hoe ke chaahi.",
-       "ipb_hide_invalid": "Ii account ke dabae nai sakaa hai; saait bahut jaada badlao hoi.",
+       "ipb_hide_invalid": "Ii account ke dabae nai sakaa hai; saait {{PLURAL:$1|one edit|$1 edits}} se jaada badlao hae.",
        "ipb_already_blocked": "\"$1\" ke pahile rok dewa gais hai",
        "ipb-needreblock": "$1 ke rok dewa gais hai.\nKa aapp ii settings ke badle mangtaa hai?",
        "ipb-otherblocks-header": "Duusra {{PLURAL:$1|block|blocks}}",
        "movepagetalktext": "Saathe ke talk panna ke automatically move kar dewa jai ii panna ke saathe '''agar jo:'''\n* khali nahi talk page nawaa naam ke already hai, yah\n* Aap nivhe waala box ke uncheck karo\nIi prastithi me, aap ke manually move yah merge kare ke parri.",
        "movearticle": "Panna ke naam badli karo:",
        "moveuserpage-warning": " '''Chetauni:'''  Aap ek sadasya ke panna ke naam badle waala hae. Ii yaad rakhna ki khaali panna ke naam badla jaai, sadasya ke naam ''nai'' badlaa jaai.",
+       "movecategorypage-warning": "<strong>Chetauni:</strong> Aap ek category panna ke hatae waala hae. Khaali ii panna ke hataawa jaai aur purana category ke aur panna ke nawaa category me <em>nai</em>  recategorize karaa jaai.",
        "movenologintext": "Panna ke naam badle ke khatir aap ke ek registered sadasya rahe ke parri aur  [[Special:UserLogin|logged in]].",
        "movenotallowed": "Aap ke panna ke naam badle ke ijajat nai hai.",
        "movenotallowedfile": "Aap ke file ke naam badle ke ijajat nai hai.",
        "cant-move-user-page": "Aap ke sadasya ke panna ke namm badle ke ijajat nai hai (subpages ke chhorr ke).",
        "cant-move-to-user-page": "Aap ke koi panna ke hatae ke sadasya ke panna pe kare ke ijajat nai hai (sadasya ke subpage ke chhorr ke).",
+       "cant-move-category-page": "Aap ke panna ke category panna ke hatae ke ijajat nai hai.",
+       "cant-move-to-category-page": "Aap ke panna ke category panna me hatae ke ijajat nai hai.",
        "newtitle": "Nawaa title pe:",
        "move-watch": "Ii panna pe dhyan rakho",
        "movepagebtn": "Panna ke naam badlo",
        "allmessages-prefix": "Prefix se chhaano:",
        "allmessages-language": "Bhasa:",
        "allmessages-filter-submit": "Jaao",
+       "allmessages-filter-translate": "Translate karo",
        "thumbnail-more": "Barraa karo",
        "filemissing": "File missing",
        "thumbnail_error": "Thumbnail banae me galti hoe gais: $1",
        "thumbnail-temp-create": "Temporary thumbnail file ke nai banae sakaa hae",
        "thumbnail-dest-create": "Destination ke thumbnail ke bajae nai sakaa hae",
        "thumbnail_invalid_params": "Thumbnail ke parameter valid nai hae",
+       "thumbnail_toobigimagearea": "File jiske dimension $1 se jaada hae",
        "thumbnail_dest_directory": "Destination directory ke nai banaawe sakaa hae",
        "thumbnail_image-type": "Ii rakam ke chapa ke support nai karaa jaawe hai",
        "thumbnail_gd-library": "Incomplete GD library configuration: missing function $1",
        "thumbnail_image-missing": "Ii naam ke file nai hae: $1",
+       "thumbnail_image-failure-limit": "Ii thumbnail ke render kare ke bahut dher unsuccessful kosis ($1 or more) rahaa. Meharbaani kar ke baad me fir kosis karna.",
        "import": "Panna ke import karo",
        "importinterwiki": "Transwiki se ayaat",
        "import-interwiki-text": "Ek wiki aur panna ke title ke select karo.\nBadalo ke tarik aur badle waala sadasya ke naam wahii rakam rahii.\nSab transwiki import actions ke [[Special:Log/import|import log]] pe log karaa jaawe hai.",
+       "import-interwiki-sourcewiki": "Source wiki:",
+       "import-interwiki-sourcepage": "Source panna:",
        "import-interwiki-history": "Ii panna ke sab badlao ke itihaas ke copy karo",
        "import-interwiki-templates": "Sab template ke include karo",
        "import-interwiki-submit": "Import karo",
        "importuploaderrortemp": "Import file ke upload nai kare sakaa hai.\nEk temporary file nai hai.",
        "import-parse-failure": "XML import parse fail hoe gais hai",
        "import-noarticle": "Koi panna import kare ke nai hai!",
-       "import-nonewrevisions": "Sab badlao ke pahile import karaa gais hai.",
+       "import-nonewrevisions": "Koi badalo ke import nai karaa gais hae (sab ke chaahe pahile import karaa gais rahaa, nai to error ke kaaran skip karaa gais rahaa).",
        "xml-error-string": "$1 line $2 me, col $3 (byte $4): $5",
        "import-upload": "XML data ke upload karo",
        "import-token-mismatch": "Loss of session data.\nMeharbani kar ke, fir se kosis karo.",
        "import-invalid-interwiki": "Naam dewa gais wiki se import nai kare saktaa hai.",
        "import-error-edit": "Panna \"$1\" ke import nai kara gais kaahe ki aap ke badle ke adhikar nai hae.",
        "import-error-create": "Panna \"$1\" ke import nai kara gais kaahe ki aap ke panna banae ke adhikar nai hae.",
-       "import-error-interwiki": "Panna \"$1\" ke import nai kara gais kaahe ki ii panna ke external linking (interwiki) ke khatir reserve karaa gais hae.",
+       "import-error-interwiki": "Panna \"$1\" ke import nai kara gais kaaheki ii panna ke naam external linking (interwiki) ke khatir reserve karaa gais hae.",
        "import-error-special": "Panna \"$1\" ke import nai karaa gais hae kaaheki ii ek khaas namespace hae jisme panna nai banawa jaae sake hae.",
        "import-error-invalid": "Panna \"$1\" ke import nai karaa gais hae kaaheki iske naam kharaab hae.",
        "import-error-unserialize": "Panna \"$1\" ke $2 badlao ke unserialize kare nai sakaa hae. Ii badlao me content model $3 serialized as $4 ke kaam me lawa gais hae.",
+       "import-error-bad-location": "Badlao $2, jon ki content model $3 ke use kare hae, ke \"$1\" me nai store karaa jaae sake hae, kaaheki uu panna me uu model ke nai support karaa jaae hae.",
        "import-options-wrong": "Galat {{PLURAL:$2|option|options}}: <nowiki>$1</nowiki>",
        "import-rootpage-invalid": "Derwa gais root panna ek kharaab title hae",
        "import-rootpage-nosubpage": "Root panna ke namespace \"$1\" sub panna ke nai allow kare hae.",
        "importlogpage": "Suchi ke import karo",
        "importlogpagetext": "Duusra wiki se panna aur badlao ke itihaas ke administrative imports.",
        "import-logentry-upload": "file upload se [[$1]] ke import karaa gais hai",
-       "import-logentry-upload-detail": "$1 {{PLURAL:$1|badlao|badlao}}",
+       "import-logentry-upload-detail": "$1 {{PLURAL:$1|badlao|badlao}} import karaa gais hae",
        "import-logentry-interwiki": "transwikied $1",
-       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|badlao|badlao}} $2 se",
+       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|badlao|badlao}} $2 se import karaa gais hae",
        "javascripttest": "JavaScript ke testing",
        "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-unknownaction": "Unknown action \"$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.",
        "tooltip-pt-mycontris": "Aap ke yogdaan ke suchi",
        "tooltip-pt-login": "Aap log in kartaa tab achchha rahataa; lekin jaruri nai hae.",
        "tooltip-pt-logout": "Log out",
+       "tooltip-pt-createaccount": "Aap ke ek account banae ke log in kare ke encourage karaa jaae hae; lekin iske jaruri nai hae",
        "tooltip-ca-talk": "Content waala panna ke baare me salah",
        "tooltip-ca-edit": "Aap ii panna ke badle sakta hai. Meherbaani kar ke bachae se pahile preview button ke kaam me laana.",
        "tooltip-ca-addsection": "Nawaa section suruu karo",
        "tooltip-feed-atom": "Ii panna ke khatir atom feed",
        "tooltip-t-contributions": "Ii sadasya ke yogdaan ke suchi dekho",
        "tooltip-t-emailuser": "Ii user ke lage ek mail bhejo",
+       "tooltip-t-info": "Ii panna ke bare me aur jankari",
        "tooltip-t-upload": "File upload karo",
        "tooltip-t-specialpages": "Sab khaas panna ke suchi",
        "tooltip-t-print": "Ii panna ke chhape waala version",
        "spam_reverting": "Pahile waala badalo, jisme $1 se link nai hai, pe karaa jaawe hai",
        "spam_blanking": "Sab badlao jisme $1 se jorr hai, ke mitawa jaawe hai",
        "spam_deleting": "Sab badlao jisme $1 se jorr hai, ke mitawa jaawe hai",
+       "simpleantispam-label": "Anti-spam check.\nIske fill <strong>NAI</strong> karo!",
        "pageinfo-title": "\"$1\" ke khatir jaankari",
        "pageinfo-not-current": "Maaf karna, lekin purana badlao ke baare me ii jaankari nai de saktaa hae.",
        "pageinfo-header-basic": "Basic jaankari",
        "pageinfo-length": "Panna ke lambai (bytes me)",
        "pageinfo-article-id": "Panna ke ID",
        "pageinfo-language": "Panna ke bhasa",
-       "pageinfo-robot-policy": "Search engine ke status",
-       "pageinfo-robot-index": "Indexable",
-       "pageinfo-robot-noindex": "Indexable nai hae",
+       "pageinfo-content-model": "Page content model",
+       "pageinfo-robot-policy": "Robots se indexing",
+       "pageinfo-robot-index": "Ijajat hae",
+       "pageinfo-robot-noindex": "Ijajat nai hae",
        "pageinfo-watchers": "Ketnaa jane panna ke dekhe hae",
        "pageinfo-few-watchers": "$1 {{PLURAL:$1|watcher|watchers}} se kamtii log hae",
-       "pageinfo-redirects-name": "Ii panna pe redirect karo",
+       "pageinfo-redirects-name": "Ii panna me etna redirect hae",
        "pageinfo-subpages-name": "Ii panna ke subpage",
        "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|redirect|redirects}}; $3 {{PLURAL:$3|non-redirect|non-redirects}})",
        "pageinfo-firstuser": "Panna ke suruu kare waala",
        "svg-long-desc": "SVG file, naam kare ke khatir  $1 × $2 pixels, file size: $3",
        "svg-long-desc-animated": "Animated SVG file, naam kare ke khatir  $1 × $2 pixels, file size: $3",
        "svg-long-error": "SCG file valid nai hae: $1",
-       "show-big-image": "Puura resolution",
+       "show-big-image": "Original file",
        "show-big-image-preview": "Ii preview ke size: $1",
        "show-big-image-other": "Duusra {{PLURAL:$2|resolution|resolutions}}: $1",
        "show-big-image-size": "$1 × $2 pixels",
        "newimages-summary": "Ii khaas panna pahile waala upload karaa gais file ke dekhae hai.",
        "newimages-legend": "Chaalo",
        "newimages-label": "Filename (nai to iske ek hissa):",
+       "newimages-showbots": "Bots se upload dekhawa jaae hae",
        "noimages": "Koi chij dekhe ke nai hai.",
        "ilsubmit": "Khojo",
        "bydate": "tarik se",
        "exif-compression-3": "CCITT Group 3 fax ke encoding",
        "exif-compression-4": "CCITT Group 4 fax ke encoding",
        "exif-copyrighted-true": "Copyright karaa gais hae",
-       "exif-copyrighted-false": "Janata ke khatir",
+       "exif-copyrighted-false": "Copyright status ke nai set karaa gais hae",
        "exif-unknowndate": "Taarik nai maalum",
        "exif-orientation-1": "Saamaan",
        "exif-orientation-2": "Baraabar ultawa gais hae",
        "confirm-watch-top": "Ii panna ke aap ke dhyan suchi me jorro?",
        "confirm-unwatch-button": "Thiik hae",
        "confirm-unwatch-top": "Ii panna ke aap ke dhyan suchi se hatao?",
+       "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← pahile waala panna",
        "imgmultipagenext": "aage waala panna →",
        "imgmultigo": "Jaao!",
        "imgmultigoto": "$1 panna pe jaao",
+       "img-lang-default": "(default bhasa)",
+       "img-lang-info": "Ii chaapa ke $1. $2 me render karo",
+       "img-lang-go": "Jaao",
        "ascending_abbrev": "chhota se barraa",
        "descending_abbrev": "barraa se chhota",
        "table_pager_next": "Aage waala panna",
        "autosumm-replace": "Contwnt ke \"$1\" se replace kar dewa gais hae",
        "autoredircomment": "Panna ke [[$1]] pe redirect kar dewa gais hae",
        "autosumm-new": "Panna jisme \"$1\" hae ke banae dewa gais hae.",
+       "autosumm-newblank": "Blank panna banawa gais hae",
        "lag-warn-normal": "$1 {{PLURAL:$1|second|seconds}} se nawaa badlao, saait ii suchi me nai dekhai.",
        "lag-warn-high": "Jaada database server lag ke kaaran $1 {{PLURAL:$1|second|seconds}} se nawaa badlao suchi me saait nai dekhaai.",
        "watchlistedit-normal-title": "Dhyan suchi ke badlo",
        "watchlistedit-normal-done": "{{PLURAL:$1|1 title was|$1 titles were}} dhyan suchi me se hataa gais:",
        "watchlistedit-raw-title": "Raw dhyan suchi ke badlo",
        "watchlistedit-raw-legend": "Raw dhyan suchi ke badlo",
+       "watchlistedit-raw-explain": "Aap ke watchlist me ke title ke niche dekhawa jaae hae, aur iske list me se jorra aur hatae ke badla jaae sake hae;\nek line per ek title.\nJab khalaas hoe jaae tab \"{{int:Watchlistedit-raw-submit}}\" pe click karo.\nAap[[Special:EditWatchlist|standard editor ke bhi kaam me laae saktaa hae]].",
+       "watchlistedit-raw-titles": "Titles:",
+       "watchlistedit-raw-submit": "Watchlist ke update karo",
+       "watchlistedit-raw-done": "Aap ke watchlist ke update kar dewa gais hae.",
+       "watchlistedit-raw-added": "{{PLURAL:$1|1 title was|$1 titles were}} added:",
+       "watchlistedit-raw-removed": "{{PLURAL:$1|1 title was|$1 titles were}} removed:",
+       "watchlistedit-clear-title": "Watchlist ke clear karaa gais hae",
+       "watchlistedit-clear-legend": "Watchlist ke clear karo",
+       "watchlistedit-clear-explain": "Aap ke watchlist me se sab title ke hatae dewa jaai",
+       "watchlistedit-clear-titles": "Titles:",
+       "watchlistedit-clear-submit": "Watchlist ke clear karo (Ii permanent hae!)",
+       "watchlistedit-clear-done": "Aap ke watchlist ke update kar dewa gais hae.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|1 title was|$1 titles were}} removed:",
+       "watchlistedit-too-many": "Hian pe bahut dher panna ke dekhae ke hae",
+       "watchlisttools-clear": "Watchlist ke clear karo",
        "watchlisttools-view": "Jaruri badlao dekho",
        "watchlisttools-edit": "Dhyan suchi ke dekho aur badlo",
        "watchlisttools-raw": "Dhyan suchi ke apne sampadan karo",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|talk]])",
        "duplicate-defaultsort": "'''Chetauni:''' Default sort key \"$2\" pahile ke default sort key \"$1\" ke override kare hae.",
+       "duplicate-displaytitle": "<strong>Chetauni:</strong> Display title \"$2\" pahile ke display title \"$1\" ke override kare hae.",
+       "invalid-indicator-name": "<strong>Error:</strong> Panna status indicators' <code>naam</code> attribute khaali nai rahe sake hae.",
        "version": "Badlao",
+       "version-extensions": "Installed extensions",
+       "version-skins": "Installed skins",
        "version-specialpages": "Khaas panna",
+       "version-parserhooks": "Parser hooks",
+       "version-variables": "Variables",
+       "version-antispam": "Spam prevention",
        "version-other": "Duusra",
+       "version-mediahandlers": "Media handlers",
+       "version-hooks": "Hooks",
+       "version-parser-extensiontags": "Parser extension tags",
+       "version-parser-function-hooks": "Parser function hooks",
+       "version-hook-name": "Hook ke naam",
+       "version-hook-subscribedby": "Se subscribe karaa gais",
+       "version-no-ext-name": "[naam nai hae]",
+       "version-license": "MediaWiki License",
+       "version-ext-license": "License",
+       "version-ext-colheader-name": "Extension",
+       "version-skin-colheader-name": "Skin",
+       "version-ext-colheader-version": "Version",
+       "version-ext-colheader-license": "License",
+       "version-ext-colheader-description": "Baare me",
+       "version-ext-colheader-credits": "Likhe waale",
+       "version-license-title": "$1 ke licence",
+       "version-license-not-found": "Ii extension ke khatir koi detailed license jankari nai paawa gais hae.",
+       "version-credits-title": "$1 ke khatir credit",
+       "version-credits-not-found": "Ii extension ke khatir koi detailed license jankari nai paawa gais hae.",
+       "version-poweredby-credits": "Ii wiki <strong>[https://www.mediawiki.org/ MediaWiki]</strong> se powered hae, copyright © 2001-$1 $2.",
        "version-poweredby-others": "duusra waala",
+       "version-poweredby-translators": "translatewiki.net translators",
+       "version-credits-summary": "Ham log ii sab jan ke [[Special:Version|MediaWiki]] me yogdaan ke khatir recognize kartaa hae.",
+       "version-license-info": "Mediawiki free software hae; jiske aap GNU General Public License as published by the Free Software Foundation; ke niche redistribute aur badle saktaa hae. Ii chaahe version 2 of the License, nai to (at your option) koi baad ke version ke apply hoe hae.\n\nMediawiki ii asha se distribute karaa jaawe hae ki ii aap ke kaam me aai, BINA KOI WARRANTY KE. Iske koi implied warranty of MERCHANTABILITY, nai to, FITNESS FOR A PARTICULAR PURPOSE bhi nai hae. Aur jaankari ke khatir GNU General Public License ke dekho.\n\nAapke ii program ke saathe {{SERVER}}{{SCRIPTPATH}}/COPYING a copy of the GNU General Public License] mila hoi. Agar nai mila tab  Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, nai to, [//www.gnu.org/licenses/old-licenses/gpl-2.0.html read it online] ke lage likho.",
+       "version-software": "Installed software",
+       "version-software-product": "Product",
+       "version-software-version": "Version",
+       "version-entrypoints": "Entry point URLs",
+       "version-entrypoints-header-entrypoint": "Entry point",
+       "version-entrypoints-header-url": "URL",
+       "version-libraries": "Installed libraries",
+       "version-libraries-library": "Library",
+       "version-libraries-version": "Version",
+       "redirect": "File, sadasya, panna, nai to, revision ID se redirect",
+       "redirect-legend": "File nai to panna pe redirect karo",
+       "redirect-summary": "Ii khaas panna ek file (given the filename), panna (given a revision ID or page ID), nai to, sadasya ke panna (given a numeric user ID) pe redirect hoe hae.  Usage: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], or [[{{#Special:Redirect}}/user/101]].",
+       "redirect-submit": "Jaao",
+       "redirect-lookup": "Lookup:",
+       "redirect-value": "Value:",
+       "redirect-user": "Sadasya ke ID",
+       "redirect-page": "Sadasya ke ID",
+       "redirect-revision": "Panna ke revision",
+       "redirect-file": "Filename",
+       "redirect-not-exists": "Value ke nai paawa gais hae",
+       "fileduplicatesearch": "Duplicate files ke khojo",
+       "fileduplicatesearch-summary": "Duplicate files based on hash values ke khojo.",
+       "fileduplicatesearch-legend": "Ek duplicate ke khojo",
        "fileduplicatesearch-filename": "File ke naam:",
        "fileduplicatesearch-submit": "Khojo",
+       "fileduplicatesearch-info": "$1 × $2 pixel<br />File size: $3<br />MIME type: $4",
+       "fileduplicatesearch-result-1": "Ii file \"$1\" ke koi duplication nai hae.",
+       "fileduplicatesearch-result-n": "File \"$1\" me {{PLURAL:$2|1 identical duplication|$2 identical duplications}} hae.",
+       "fileduplicatesearch-noresults": "Koi file jiske naam \"$1\" ke nai paawa gais hae.",
        "specialpages": "Khaas panna",
+       "specialpages-note-top": "Legend",
+       "specialpages-note": "* Normal special panna.\n* <span class=\"mw-specialpagerestricted\">Restricted special panna.</span>",
+       "specialpages-group-maintenance": "Maintenance reports",
        "specialpages-group-other": "Duusra khaas panna",
        "specialpages-group-login": "Login karo/Nawaa account banao",
+       "specialpages-group-changes": "Abhi kuchh din ke badlao aur logs",
+       "specialpages-group-media": "Media reports aur uploads",
+       "specialpages-group-users": "Sadasyya aur rights",
        "specialpages-group-highuse": "Jaada kaam me laae waala panna",
        "specialpages-group-pages": "Panna ke suchi",
        "specialpages-group-pagetools": "Panna ke aujar",
+       "specialpages-group-wiki": "Data aur tools",
+       "specialpages-group-redirects": "Special panna ke redirect karaa jaawe hae",
+       "specialpages-group-spam": "Spam tools",
+       "specialpages-group-developer": "Developer tools",
        "blankpage": "Khaali panna",
        "intentionallyblankpage": "Ii panna ke jaan ke khaliya chhorraa gais hae.",
        "external_image_whitelist": "#Leave this line exactly as it is<pre>\n#Put regular expression fragments (just the part that goes between the //) below\n#These will be matched with the URLs of external (hotlinked) images\n#Those that match will be displayed as images, otherwise only a link to the image will be shown\n#Lines beginning with # are treated as comments\n#This is case-insensitive\n\n# Ii line ke yahii rakam chhorr do<pre>\n#Sab regular expression fragments (wahii hissa jon ki // ke biich me jaawe hae) ke niche rakkho\n#Iske bahaari URLs  (hotlinked) chapa se link karaa jaai",
+       "tags": "Valid change tags",
        "tag-filter": "[[Special:Tags|Tag]] filter karo:",
+       "tag-filter-submit": "Filter",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Tag|Tags}}]]: $2)",
+       "tags-title": "Tags",
+       "tags-intro": "Ii panna uu tag ke list kare hae jiske software edit with, aur their meaning se mark kare hae.",
+       "tags-tag": "Tag ke naam",
+       "tags-display-header": "Appearance on change lists",
+       "tags-description-header": "Meaning ke puura description",
+       "tags-source-header": "Source",
+       "tags-active-header": "Active?",
+       "tags-hitcount-header": "Tagged changes",
+       "tags-actions-header": "Actions",
+       "tags-active-yes": "Haan",
+       "tags-active-no": "Nai",
+       "tags-source-extension": "Ek extension se define hoe hae",
+       "tags-source-manual": "Sadasya aur bot se manually apply karaa jaawe hae",
+       "tags-source-none": "Ab iske kaam me nai lawa jaae hae",
        "tags-edit": "badlo",
+       "tags-delete": "mitao",
+       "tags-activate": "activate karo",
+       "tags-deactivate": "deactivate karo",
        "tags-hitcount": "$1 {{PLURAL:$1|badlao|badlao}}",
+       "tags-manage-no-permission": "Aap ke change tags ke manage kare ke ijaajat nai hae.",
+       "tags-create-heading": "Ek nawaa tag ke banao",
+       "tags-create-explanation": "Default se, jon nawaa tag banawa gais hae ke sadasya aur bots ke kaam me laae khatir dewa jaai.",
+       "tags-create-tag-name": "Tag ke naam:",
+       "tags-create-reason": "Kaaran:",
+       "tags-create-submit": "Banao",
+       "tags-create-no-name": "Aap ke ek tag ke naam ke batae ke parri.",
+       "tags-create-invalid-chars": "Tag ke naam me saait comma (<code>,</code>) nai to forward slashes (<code>/</code>) hoi.",
+       "tags-create-invalid-title-chars": "Tag ke naam me aisan characters nai hoe ke chaahi jiske panna ke title me nai kaam me lawa jaae sake hae.",
+       "tags-create-already-exists": "Tag \"$1\" abhi hae.",
+       "tags-create-warnings-above": "Niche ke {{PLURAL:$2|chetauni|chetauni}} you time mila jab tag \"$1\" ke banae ke kosis karaa jaawat rahaa:",
+       "tags-create-warnings-below": "Ka aap tag banate rahe mantaa hae?",
+       "tags-delete-title": "Tag ke delete karo",
+       "tags-delete-explanation-initial": "Aap tag \"$1\" ke database se mitae waala hae.",
+       "tags-delete-explanation-in-use": "Iske {{PLURAL:$2|$2 revision or log entry|all $2 revisions and/or log entries}} se hatae dewa jaai jahaan pe it is currently applied.",
+       "tags-delete-reason": "Kaaran:",
        "comparepages": "Panna ke biich me antar dekho",
        "compare-page1": "Panna 1",
        "compare-page2": "Panna 2",
        "compare-rev1": "Badlao 1",
        "compare-rev2": "Badlao 2",
        "compare-submit": "Antar dekho",
+       "compare-invalid-title": "Jon title ke aap specify karaa hae, valid nai hae",
+       "compare-title-not-exists": "Chuna gais title abhi nai banawa gais hai.",
+       "compare-revision-not-exists": "Chuna gais revision abhi nai banawa gais hai.",
+       "dberr-problems": "Maaf karna! Ii site technical difficulties experience kare hae.",
+       "dberr-again": "Thora deri wait kar ke fir se load kare ke try karo",
+       "dberr-info": "(Cannot access the database: $1)",
+       "dberr-info-hidden": "(Database ke nai access kare sakaa jaawe hae)",
+       "dberr-usegoogle": "Fir haal aap Google se khoje saktaa hae",
+       "dberr-outofdate": "Note karna ki you logan jon ham logan ke contents ke index Karin hae, saait out of date hoi.",
+       "dberr-cachederror": "Ii maaga gais panna ke ek cached copy hae, aur saait up to date nai hoi.",
+       "htmlform-invalid-input": "App ke kuchh input se problem hae.",
+       "htmlform-select-badoption": "Jon value ke aap specify karaa hae, ek valid option nai hae.",
+       "htmlform-int-invalid": "Jon value ke aap specify karaa hae, ek integer nai hae.",
+       "htmlform-float-invalid": "Jon value ke aap specify karaa hae, ek number nai hae.",
+       "htmlform-int-toolow": "Jon value kae aap specify karaa hae, minimum of $1 se kamti hae.",
+       "htmlform-int-toohigh": "Jon value ke aap specify karaa hae, maximum of $1 se jaada hae.",
+       "htmlform-required": "Ii value ke jaruri hae.",
+       "htmlform-submit": "Submit karo",
        "htmlform-reset": "Badlao ke pahile jaise karo",
        "htmlform-selectorother-other": "Duusra",
+       "htmlform-no": "Nai",
+       "htmlform-yes": "Haan",
+       "htmlform-chosen-placeholder": "Ek option ke select karo",
+       "htmlform-cloner-create": "Aur add karo",
+       "htmlform-cloner-delete": "Remove karo",
+       "htmlform-cloner-required": "Kamti se kamti ek value ke jaruri hae",
+       "sqlite-has-fts": "$1 with full-text search support",
+       "sqlite-no-fts": "$1 without full-text search support",
+       "logentry-delete-delete": "$1 {{GENDER:$2|deleted}} panna $3",
+       "logentry-delete-restore": "$1 {{GENDER:$2|restored}} panna $3",
+       "logentry-delete-event": "$1 {{GENDER:$2|changed}} visibility of {{PLURAL:$5|a log event|$5 log events}} on $3: $4",
+       "logentry-delete-revision": "$1 {{GENDER:$2|changed}} visibility of {{PLURAL:$5|a revision|$5 revisions}} panna $3: $4 pe",
+       "logentry-delete-event-legacy": "$1 {{GENDER:$2|badal dewa gais hae}} visibility of log events on $3",
+       "logentry-delete-revision-legacy": "$1 {{GENDER:$2|changed}} visibility of revisions on panna $3",
+       "logentry-suppress-delete": "$1 {{GENDER:$2|suppressed}} panna $3",
+       "logentry-suppress-event": "$1 secretly {{GENDER:$2|changed}} visibility of {{PLURAL:$5|a log event|$5 log events}} on $3: $4",
+       "logentry-suppress-revision": "$1 secretly {{GENDER:$2|changed}} visibility of {{PLURAL:$5|a revision|$5 revisions}} on page $3: $4",
+       "logentry-suppress-event-legacy": "$1 secretly {{GENDER:$2|changed}} visibility of log events on $3",
+       "logentry-suppress-revision-legacy": "$1 secretly {{GENDER:$2|changed}} visibility of revisions on page $3",
+       "revdelete-content-hid": "lokawa gais content",
+       "revdelete-summary-hid": "edit summary ke lukawa gais hae",
+       "revdelete-uname-hid": "username ke lukawa gais hae",
+       "revdelete-content-unhid": "content ke lukawa gais hae",
+       "revdelete-summary-unhid": "edit summary ke lukawa gais hae",
+       "revdelete-uname-unhid": "username ke lukawa gais hae",
        "revdelete-restricted": "sysops pe llabu restrictions",
        "revdelete-unrestricted": "sysops se hatawa gae rukawat",
-       "logentry-rights-rights": "$1 $3 ke group ke membership ke $4 se badal ke $5 kar dia hae",
-       "logentry-rights-rights-legacy": "$1 $3 ke group membership ke badal dia hae",
-       "logentry-rights-autopromote": "$1 ke apne se $2 se $3 ke promotion dewa gais",
+       "logentry-merge-merge": "$1 {{GENDER:$2|merged}} $3 into $4 (revisions up to $5)",
+       "logentry-move-move": "$1 {{GENDER:$2|moved}} panna $3 se $4",
+       "logentry-move-move-noredirect": "$1 {{GENDER:$2|moved}} panna $3 se $4 without leaving a redirect",
+       "logentry-move-move_redir": "$1 {{GENDER:$2|moved}} panna $3 se $4 over redirect",
+       "logentry-move-move_redir-noredirect": "$1 {{GENDER:$2|moved}} panna $3 se $4 over a redirect without leaving a redirect",
+       "logentry-patrol-patrol": "$1 {{GENDER:$2|marked}} revision $4 panna $3 ke patrol karaa gais hae",
+       "logentry-patrol-patrol-auto": "$1 automatically {{GENDER:$2|marked}} revision $4 panna $3 ke patrol karis hae",
+       "logentry-newusers-newusers": "Sadasya $1 ke account  {{GENDER:$2|created}} ke banawa gais hae",
+       "logentry-newusers-create": "Sadasya $1 ke account  {{GENDER:$2|created}} ke banawa gais hae",
+       "logentry-newusers-create2": "Sadasya $3 ke account  {{GENDER:$2|created}} ke $1 banais hae.",
+       "logentry-newusers-byemail": "Sadasya $3 ke account {{GENDER:$2|created}} ke $1 banais hae  aur password ke email se bheja gais hae",
+       "logentry-newusers-autocreate": "Sadasya $1 ke account {{GENDER:$2|created}} ke automatically banawa gais hae",
+       "logentry-rights-rights": "$1 {{GENDER:$2|changed}} group ke membership $3 ke khatir $4 se lai ke $5 talak",
+       "logentry-rights-rights-legacy": "$1 {{GENDER:$2|changed}} group ke membership $3 ke khatir",
+       "logentry-rights-autopromote": "$1 ke apne se $4 se $5 {{GENDER:$2|promoted karaa gais hae}}",
+       "logentry-upload-upload": "$1 {{GENDER:$2|upload karaa gais hae}} $3",
+       "logentry-upload-overwrite": "$1 {{GENDER:$2|uploaded}} a new version of $3",
+       "logentry-upload-revert": "$1 {{GENDER:$2|upload karaa gais hae}} $3",
        "rightsnone": "(koi nai hai)",
        "revdelete-summary": "summary ke badlo",
-       "searchsuggest-search": "Khojo"
+       "feedback-bugornote": "Agar aap ek technical problem ke detail me describe kare mangtaa hae tab meharbaani kar ke [$1 report a bug].\n\nNai to, aap niche ke sahaj form ke kaam me laae saktaa hae. Aap ke comment ke, aap ke naam ke saathe, panna \"[$3 $2]\" me jorra jaai.",
+       "feedback-subject": "Subject:",
+       "feedback-message": "Sandes:",
+       "feedback-cancel": "Cancel karo",
+       "feedback-submit": "Feedback do",
+       "feedback-adding": "Panna me subject jorra jaawe hae...",
+       "feedback-error1": "Error: Unrecognized result from API",
+       "feedback-error2": "Error: Edit fail hoi gais hae",
+       "feedback-error3": "Error: API se koi response nai mila",
+       "feedback-thanks": "Dhanyabaad! Aap ke feedback ke panna \"[$2 $1]\" me post karaa gais hae.",
+       "feedback-close": "Kar dewa gais hae",
+       "feedback-bugcheck": "Julum! Khaali ii check karna ki ii ek pahile se jaana waala bugs me se nai hae [$1 known bugs].",
+       "feedback-bugnew": "Ham karaa hae. Nawaa bug ke report karo",
+       "searchsuggest-search": "Khojo",
+       "searchsuggest-containing": "isme hae.....",
+       "api-error-badaccess-groups": "Aap ke ii wiki me file upload kare ke ijajat nai hae.",
+       "api-error-badtoken": "Internal error: Bad token.",
+       "api-error-copyuploaddisabled": "Uploading by URL ke ii server me disable kar dewa gais hae.",
+       "api-error-duplicate": "There {{PLURAL:$1|is [$2 another file]|are [$2 some other files]}} already on the site with the same content.",
+       "api-error-duplicate-archive": "There {{PLURAL:$1|was [$2 another file]|were [$2 some other files]}} already on the site with the same content, but {{PLURAL:$1|it was|they were}} deleted.",
+       "api-error-duplicate-archive-popup-title": "Duplicate {{PLURAL:$1|file that has|files that have}} already been deleted.",
+       "api-error-duplicate-popup-title": "Duplicate {{PLURAL:$1|file|files}}.",
+       "api-error-empty-file": "Jon file ke aap submit karaa rahaa, khaali hae.",
+       "api-error-emptypage": "Nawaa, khaali panna ke banae ke ijajat nai hae.",
+       "api-error-fetchfileerror": "Internal error: File khoje ke time kuch wrong hoe gais hae.",
+       "api-error-fileexists-forbidden": "Ek file, jiske naam \"$1\" hae abhi hae, aur iske overwrite nai karaa jaae sake hae.",
+       "api-error-fileexists-shared-forbidden": "Ek file, jiske naam \"$1\" hae abhi hae aur file repository me shared hae, aur iske overwrite nai karaa jaae sake hae.",
+       "api-error-file-too-large": "Jon file ke aap submit karaa hae bahut barraa hae.",
+       "api-error-filename-tooshort": "Filename bahut chhota hae.",
+       "api-error-filetype-banned": "Ii rakam ke file banned hae."
 }
index fec73cb..0280a02 100644 (file)
@@ -54,6 +54,7 @@
        "tog-watchdefault": "Az általam szerkesztett lapok és fájlok felvétele a figyelőlistámra",
        "tog-watchmoves": "Az általam átnevezett lapok és fájlok felvétele a figyelőlistámra",
        "tog-watchdeletion": "Az általam törölt lapok és fájlok felvétele a figyelőlistámra",
+       "tog-watchrollback": "Az általam visszaállított lapok felvétele a figyelőlistámra",
        "tog-minordefault": "Alapértelmezetten minden szerkesztésemet jelölje aprónak",
        "tog-previewontop": "Előnézet megjelenítése a szerkesztőablak előtt",
        "tog-previewonfirst": "Előnézet mutatása az első szerkesztésnél",
        "pool-timeout": "Letelt a zárolás feloldására szánt várakozási idő",
        "pool-queuefull": "A pool sor megtelt",
        "pool-errorunknown": "Ismeretlen hiba",
+       "pool-servererror": "A pool counter szolgáltatás nem elérhető ($1).",
+       "poolcounter-usage-error": "Használati hiba: $1",
        "aboutsite": "A {{SITENAME}} wikiről",
        "aboutpage": "Project:Rólunk",
        "copyright": "A tartalom további jelölés hiányában a(z) $1 feltételei szerint használható fel.",
        "filerenameerror": "Nem tudtam átnevezni a(z) „$1” fájlt „$2” névre.",
        "filedeleteerror": "Nem tudtam törölni a(z) „$1” fájlt.",
        "directorycreateerror": "Nem tudtam létrehozni a(z) „$1” könyvtárat.",
+       "directoryreadonlyerror": "A könyvtár ($1) csak olvasható.",
+       "directorynotreadableerror": "A könyvtár ($1) nem olvasható.",
        "filenotfound": "A(z) „$1” fájl nem található.",
        "unexpected": "Váratlan érték: „$1”=„$2”.",
        "formerror": "Hiba: nem tudom elküldeni az űrlapot",
        "viewyourtext": "Megtekintheted és kimásolhatod a '''saját szerkesztéseidet''' az alábbi lapra:",
        "protectedinterface": "Ez a lap a szoftver felületéhez szolgáltat szöveget, és a visszaélések elkerülése miatt le van zárva.",
        "editinginterface": "<strong>Vigyázat:</strong> egy olyan lapot szerkesztesz, ami a MediaWiki szoftver felületéhez tartozik. A lap megváltoztatása hatással lesz a kinézetre, ahogy más szerkesztők látják a lapot.",
+       "translateinterface": "Minden wikire kiterjedő fordítások hozzáadásához vagy szerkesztésére használd a [//translatewiki.net/ translatewiki.net]-et, a MédiaWiki lokalizációs projektjét.",
        "cascadeprotected": "Ez a lap szerkesztés elleni védelemmel lett ellátva, mert a következő {{PLURAL:$1|lapon|lapokon}} be van kapcsolva a „kaszkádolt” védelem:\n$2",
        "namespaceprotected": "Nincs jogosultságod a(z) '''$1''' névtérben található lapok szerkesztésére.",
        "customcssprotected": "Nem szerkesztheted ezt a CSS-lapot, mert egy másik felhasználó személyes beállításait tartalmazza.",
        "userlogin-resetpassword-link": "Elfelejtetted a jelszavad?",
        "userlogin-helplink2": "Segítség a bejelentkezéshez",
        "userlogin-loggedin": "Már be vagy jelentkezve mint {{GENDER:$1|$1}}. Ha más néven akarsz belépni, alább megteheted.",
-       "userlogin-createanother": "Felhasználói fiók létrehozása",
+       "userlogin-createanother": "Másik felhasználói fiók létrehozása",
        "createacct-emailrequired": "E-mail cím",
        "createacct-emailoptional": "E-mail cím (opcionális)",
        "createacct-email-ph": "Add meg e-mail címed",
        "changeemail-submit": "E-mail cím megváltoztatása",
        "changeemail-throttled": "Túl sok hibás bejelentkezés.\nVárj $1, mielőtt újra próbálkozol.",
        "resettokens": "Tokenek törlése",
+       "resettokens-text": "Újra generálhatod a tokeneket, amely a fiókodhoz rendelt bizonyos magánadatokhoz enged hozzáférést.\n\nEzt akkor érdemes használnod, hogy véletlenül megosztottad a tokeneket valakivel, vagy ha valaki feltörte a fiókodat.",
        "resettokens-no-tokens": "Nincs újragenerálható token.",
        "resettokens-legend": "Tokenek újragenerálása",
        "resettokens-tokens": "Tokenek:",
        "history-feed-empty": "A kért oldal nem létezik.\nLehet, hogy törölték a wikiből, vagy átnevezték.\nPróbálkozhatsz a témával kapcsolatos lapok [[Special:Search|keresésével]].",
        "rev-deleted-comment": "(szerkesztési összefoglaló eltávolítva)",
        "rev-deleted-user": "(szerkesztőnév eltávolítva)",
-       "rev-deleted-event": "(bejegyzés eltávolítva)",
+       "rev-deleted-event": "(naplóbejegyzés eltávolítva)",
        "rev-deleted-user-contribs": "[felhasználónév vagy IP-cím eltávolítva – szerkesztés elrejtve a közreműködések közül]",
        "rev-deleted-text-permission": "A lap ezen változatát '''törölték'''.\nTovábbi információkat a [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} törlési naplóban] találhatsz.",
        "rev-deleted-text-unhide": "A lap ezen változatát '''törölték'''.\nTovábbi részleteket a [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} törlési naplóban] találhatsz.\nMivel adminisztrátor vagy, még mindig [$1 megtekintheted a tartalmát], ha szeretnéd.",
        "revdelete-legend": "Korlátozások megadása:",
        "revdelete-hide-text": "Változat szövege",
        "revdelete-hide-image": "A fájl tartalmának elrejtése",
-       "revdelete-hide-name": "Művelet és cél elrejtése",
+       "revdelete-hide-name": "Cél és paraméterek elrejtése",
        "revdelete-hide-comment": "Szerkesztési összefoglaló",
        "revdelete-hide-user": "Szerkesztői név/IP cím",
        "revdelete-hide-restricted": "Adatok elrejtése az adminisztrátorok és mindenki más elől",
        "prefs-personal": "Felhasználói adatok",
        "prefs-rc": "Friss változtatások",
        "prefs-watchlist": "Figyelőlista",
+       "prefs-editwatchlist": "Figyelőlista szerkesztése",
+       "prefs-editwatchlist-label": "A figyelőlista szerkesztése:",
+       "prefs-editwatchlist-edit": "A figyelőlista megtekintése és szerkesztése",
+       "prefs-editwatchlist-raw": "A nyers figyelőlista szerkesztése",
+       "prefs-editwatchlist-clear": "A figyelőlista kiürítése",
        "prefs-watchlist-days": "A figyelőlistában mutatott napok száma:",
        "prefs-watchlist-days-max": "Legfeljebb $1 {{PLURAL:$1|nap|nap}}",
        "prefs-watchlist-edits": "A kiterjesztett figyelőlistán mutatott szerkesztések száma:",
        "gender-female": "Nő",
        "prefs-help-gender": "Nem kötelező: a szoftver használja a nemtől függő üzenetek megjelenítéséhez. Az információ mindenki számára látható.",
        "email": "E-mail",
-       "prefs-help-realname": "A valódi nevet nem kötelező megadni, de ha úgy döntesz, hogy megadod, azzal leszel feltüntetve a munkád szerzőjeként.",
+       "prefs-help-realname": "A valódi név nem kötelező.\nHa megadod, akkor leszel feltüntetve a munkád szerzőjeként.",
        "prefs-help-email": "Az e-mail cím megadása nem kötelező, de szükséges új jelszó kéréséhez, ha elfelejtenéd a meglévőt.",
        "prefs-help-email-others": "Úgy is dönthetsz, hogy lehetővé teszed mások számára, hogy kapcsolatba lépjenek veled a felhasználói vagy vitalapodon keresztül, anélkül, hogy fel kellene fedned a személyazonosságodat.",
        "prefs-help-email-required": "Meg kell adnod az e-mail címedet.",
        "uploaderror": "Feltöltési hiba",
        "upload-recreate-warning": "'''Figyelmeztetés: az ilyen nevű fájlt törölték vagy átnevezték.'''\n\nAz oldalhoz tartozó törlési és átnevezési naplóbejegyzések:",
        "uploadtext": "Az alábbi űrlap használatával tölthetsz fel fájlokat.\nA korábban feltöltött képek megtekintéséhez vagy a köztük való kereséshez menj a [[Special:FileList|feltöltött fájlok listájához]], a feltöltések, újrafeltöltések a [[Special:Log/upload|feltöltési naplóban]], a törlések a [[Special:Log/delete|törlési naplóban]] vannak jegyezve.\n\nKépet a következő módon illeszthetsz be egy oldalra: '''<nowiki>[[</nowiki>{{ns:file}}<nowiki>:Kép.jpg]]</nowiki>''',\n'''<nowiki>[[</nowiki>{{ns:file}}<nowiki>:Kép.png|alternatív szöveg]]</nowiki>''' vagy a közvetlen hivatkozáshoz használd a\n'''<nowiki>[[</nowiki>{{ns:media}}<nowiki>:Fájl.ogg]]</nowiki>''' formát.",
-       "upload-permitted": "Engedélyezett fájltípusok: $1.",
-       "upload-preferred": "Támogatott fájltípusok: $1.",
-       "upload-prohibited": "Tiltott fájltípusok: $1.",
+       "upload-permitted": "Engedélyezett {{PLURAL:$2|fájltípus|fájltípusok}}: $1.",
+       "upload-preferred": "Ajánlott {{PLURAL:$2|fájltípus|fájltípusok}}: $1.",
+       "upload-prohibited": "Tiltott {{PLURAL:$2|fájltípus|fájltípusok}}: $1.",
        "uploadlogpage": "Feltöltési napló",
        "uploadlogpagetext": "Lentebb látható a legutóbbi felküldések listája.\nLásd még az [[Special:NewFiles|új fáljlok galériáját]]",
        "filename": "Fájlnév",
        "listgrouprights-removegroup-self-all": "az összes csoporból eltávolíthatja a saját fiókját",
        "listgrouprights-namespaceprotection-header": "Névtér korlátozások",
        "listgrouprights-namespaceprotection-namespace": "Névtér",
+       "listgrouprights-namespaceprotection-restrictedto": "A szerkesztéshez szükséges jogosultság(ok)",
        "trackingcategories-name": "Üzenetnév",
        "trackingcategories-nodesc": "Nem található leírás.",
        "trackingcategories-disabled": "A kategória le van tiltva",
        "mywatchlist": "Figyelőlista",
        "watchlistfor2": "$1 részére $2",
        "nowatchlist": "Nincs lap a figyelőlistádon.",
-       "watchlistanontext": "A figyelőlistád megtekintéséhez és szerkesztéséhez $1.",
+       "watchlistanontext": "Jelentkezz be a figyelőlistád megtekintéséhez és szerkesztéséhez.",
        "watchnologin": "Nem vagy bejelentkezve",
        "addwatch": "Hozzáadás a figyelőlistához",
        "addedwatchtext": "A(z) „[[:$1]]” lapot hozzáadtam a [[Special:Watchlist|figyelőlistádhoz]].\nEzután minden, a lapon vagy annak vitalapján történő változást ott fogsz látni.",
        "movepagetalktext": "A laphoz tartozó vitalap automatikusan átneveződik, '''kivéve, ha:'''\n*már létezik egy nem üres vitalap az új helyen,\n*nem jelölöd be a lenti pipát.\n\nEzen esetekben a vitalapot külön, kézzel kell átnevezned a kívánságaid szerint.",
        "movearticle": "Lap átnevezése",
        "moveuserpage-warning": "'''Figyelem:''' Egy felhasználólapot készülsz átmozgatni. Csak a lap lesz átmozgatva, a szerkesztő ''nem'' lesz átnevezve.",
-       "movecategorypage-warning": "<string>Figyelmeztetés:</strong> Éppen egy kategórialapot készülsz átnevezni. Figyelj arra, hogy csak a lap lesz átnevezve, az idekategorizált lapok <em>nem</em> lesznek átkategorizálva.",
+       "movecategorypage-warning": "<strong>Figyelmeztetés:</strong> Éppen egy kategórialapot készülsz átnevezni. Figyelj arra, hogy csak a lap lesz átnevezve, az idekategorizált lapok <em>nem</em> lesznek átkategorizálva.",
        "movenologintext": "Ahhoz, hogy átnevezhess egy lapot, [[Special:UserLogin|be kell lépned]].",
        "movenotallowed": "Nincs jogod a lapok átnevezéséhez.",
        "movenotallowedfile": "Nincs megfelelő jogosultságod a fájlok átnevezéséhez.",
        "import": "Lapok importálása",
        "importinterwiki": "Transwiki importálása",
        "import-interwiki-text": "Válaszd ki az importálandó wikit és lapcímet.\nA változatok dátumai és a szerkesztők nevei megőrzésre kerülnek.\nValamennyi transwiki importálási művelet az [[Special:Log/import|importálási naplóban]] kerül naplózásra.",
+       "import-interwiki-sourcewiki": "Forráswiki:",
+       "import-interwiki-sourcepage": "Forráslap:",
        "import-interwiki-history": "A lap összes előzményváltozatainak másolása",
        "import-interwiki-templates": "Az összes sablon hozzáadása",
        "import-interwiki-submit": "Importálás",
        "tags-tag": "Címke neve",
        "tags-display-header": "Megjelenése a listákon",
        "tags-description-header": "Teljes leírás",
+       "tags-source-header": "Forrás",
        "tags-active-header": "Aktív?",
        "tags-hitcount-header": "Címkézett változtatások",
        "tags-active-yes": "Igen",
        "tags-active-no": "Nem",
+       "tags-source-extension": "Egy kiterjesztés határozza meg",
+       "tags-source-none": "Már nincs használatban",
        "tags-edit": "szerkesztés",
        "tags-hitcount": "{{PLURAL:$1|Egy|$1}} változtatás",
+       "tags-delete-not-allowed": "A kiterjesztés által létrehozott címkék nem törölhetők, ha a kiterjesztés nem engedélyezi kifejezetten azt.",
        "comparepages": "Lapok összehasonlítása",
        "compare-page1": "1. lap",
        "compare-page2": "2. lap",
index 03fc60e..814ce04 100644 (file)
@@ -17,7 +17,9 @@
                        "Համլետ",
                        "לערי ריינהארט",
                        "아라",
-                       "Lilitik22"
+                       "Lilitik22",
+                       "GrigorGB",
+                       "Աշոտ1997"
                ]
        },
        "tog-underline": "ընդգծել հղումները՝",
        "tog-usenewrc": "Խմբավորել փոփոխությունները վերջին փոփոխություններում և հսկացանկում (պահանջում է JavaScript)",
        "tog-numberheadings": "Ինքնաթվագրել վերնագրերը",
        "tog-showtoolbar": "Ցույց տալ խմբագրումների գործիքների վահանակը",
-       "tog-editondblclick": "Ô½Õ´Õ¢Õ¡Õ£Ö\80Õ¥Õ¬ Õ§Õ»Õ¥Ö\80Õ¨ Õ¯Ö\80Õ¯Õ¶Õ¡Õ¯Õ« Õ´Õ¡Õ¿Õ¶Õ¡Õ°Õ¡Ö\80մամբ",
-       "tog-editsectiononrightclick": "Ô½Õ´Õ¢Õ¡Õ£Ö\80Õ¥Õ¬ Õ¢Õ¡ÕªÕ«Õ¶Õ¶Õ¥Ö\80Õ¨ Õ¾Õ¥Ö\80Õ¶Õ¡Õ£Ö\80Õ« Õ¡Õ» Õ´Õ¡Õ¿Õ¶Õ¡Õ°Õ¡Ö\80մամբ",
-       "tog-watchcreations": "Ավելացնել իմ ստեղծած էջերը և բեռնած նիշքերը հսկացանկում",
-       "tog-watchdefault": "Ավելացնել իմ խմբագրած էջերը և նիշքերը հսկացանկում",
-       "tog-watchmoves": "Ավելացնել իմ վերնավանած էջերը և նիշքերը հսկացանկում",
-       "tog-watchdeletion": "Ավելացնել իմ ջնջած էջերը և նիշքերը հսկացանկում",
-       "tog-minordefault": "Ô½Õ´Õ¢Õ¡Õ£Ö\80Õ¸Ö\82Õ´Õ¶Õ¥Ö\80Õ¨ Õ¬Õ¼Õ¥Õ¬ÕµÕ¡ÕµÕ¶ նշել որպես չնչին",
+       "tog-editondblclick": "Ô½Õ´Õ¢Õ¡Õ£Ö\80Õ¥Õ¬ Õ§Õ»Õ¥Ö\80Õ¨ Õ¯Ö\80Õ¯Õ¶Õ¡Õ¯Õ« Õ½Õ¥Õ²մամբ",
+       "tog-editsectiononrightclick": "Ô½Õ´Õ¢Õ¡Õ£Ö\80Õ¥Õ¬ Õ¢Õ¡ÕªÕ«Õ¶Õ¶Õ¥Ö\80Õ¨ Õ¾Õ¥Ö\80Õ¶Õ¡Õ£Ö\80Õ« Õ¡Õ» Õ½Õ¥Õ²մամբ",
+       "tog-watchcreations": "Ô±Õ¾Õ¥Õ¬Õ¡Ö\81Õ¶Õ¥Õ¬ Õ«Õ´ Õ½Õ¿Õ¥Õ²Õ®Õ¡Õ® Õ§Õ»Õ¥Ö\80Õ¨ Ö\87 Õ¢Õ¥Õ¼Õ¶Õ¡Õ® Õ¶Õ«Õ·Ö\84Õ¥Ö\80Õ¨ Õ«Õ´ Õ°Õ½Õ¯Õ¡Ö\81Õ¡Õ¶Õ¯Õ¸Ö\82Õ´",
+       "tog-watchdefault": "Ô±Õ¾Õ¥Õ¬Õ¡Ö\81Õ¶Õ¥Õ¬ Õ«Õ´ Õ­Õ´Õ¢Õ¡Õ£Ö\80Õ¡Õ® Õ§Õ»Õ¥Ö\80Õ¨ Ö\87 Õ¶Õ«Õ·Ö\84Õ¥Ö\80Õ¨ Õ«Õ´ Õ°Õ½Õ¯Õ¡Ö\81Õ¡Õ¶Õ¯Õ¸Ö\82Õ´",
+       "tog-watchmoves": "Ô±Õ¾Õ¥Õ¬Õ¡Ö\81Õ¶Õ¥Õ¬ Õ«Õ´ Õ¾Õ¥Ö\80Õ¶Õ¡Õ¾Õ¡Õ¶Õ¡Õ® Õ§Õ»Õ¥Ö\80Õ¨ Ö\87 Õ¶Õ«Õ·Ö\84Õ¥Ö\80Õ¨ Õ«Õ´ Õ°Õ½Õ¯Õ¡Ö\81Õ¡Õ¶Õ¯Õ¸Ö\82Õ´",
+       "tog-watchdeletion": "Ô±Õ¾Õ¥Õ¬Õ¡Ö\81Õ¶Õ¥Õ¬ Õ«Õ´ Õ»Õ¶Õ»Õ¡Õ® Õ§Õ»Õ¥Ö\80Õ¨ Ö\87 Õ¶Õ«Õ·Ö\84Õ¥Ö\80Õ¨ Õ«Õ´ Õ°Õ½Õ¯Õ¡Ö\81Õ¡Õ¶Õ¯Õ¸Ö\82Õ´",
+       "tog-minordefault": "Ô²Õ¸Õ¬Õ¸Ö\80 Õ­Õ´Õ¢Õ¡Õ£Ö\80Õ¸Ö\82Õ´Õ¶Õ¥Ö\80Õ¨ Õ¬Õ¼Õ¥Õ¬ÕµÕ¡ÕµÕ¶ Õ¯Õ¥Ö\80ÕºÕ¸Õ¾ նշել որպես չնչին",
        "tog-previewontop": "Ցույց տալ նախադիտումը խմբագրման դաշտից առաջ",
-       "tog-previewonfirst": "Õ\86Õ¡Õ­Õ¡Õ¤Õ«Õ¿Õ¥Õ¬ Õ´Õ«Õ¶Õ¹Ö\87 Õ¡Õ¼Õ¡Õ»Õ«Õ¶ Õ­Õ´Õ¢Õ¡Õ£Ö\80Õ¸Ö\82Õ©ÕµÕ¸Ö\82Õ¶ը",
+       "tog-previewonfirst": "Õ\91Õ¸Ö\82Ö\81Õ¡Õ¤Ö\80Õ¥Õ¬ Õ¶Õ¡Õ­Õ¡Õ¤Õ«Õ¿Õ¸Ö\82Õ´Õ¨ Õ´Õ«Õ¶Õ¹Ö\87 Õ¡Õ¼Õ¡Õ»Õ«Õ¶ Õ­Õ´Õ¢Õ¡Õ£Ö\80Õ¸Ö\82Õ´ը",
        "tog-enotifwatchlistpages": "էլ-փոստով տեղեկացնել հսկվող էջերում փոփոխությունների մասին",
        "tog-enotifusertalkpages": "էլ-փոստով տեղեկացնել իմ քննարկման էջի փոփոխության մասին",
-       "tog-enotifminoredits": "Õ§Õ¬-Ö\83Õ¸Õ½Õ¿Õ¸Õ¾ Õ¿Õ¥Õ²Õ¥Õ¯Õ¡Ö\81Õ¶Õ¥Õ¬ Õ§Õ»Õ¥Ö\80Õ« Õ¶Õ¡Ö\87 չնչին խմբագրումների մասին",
+       "tog-enotifminoredits": "Õ§Õ¬-Ö\83Õ¸Õ½Õ¿Õ¸Õ¾ Õ¿Õ¥Õ²Õ¥Õ¯Õ¡Ö\81Õ¶Õ¥Õ¬ Õ¶Õ¡Ö\87 Õ§Õ»Õ¥Ö\80Õ« չնչին խմբագրումների մասին",
        "tog-enotifrevealaddr": "Ցույց տալ իմ էլ-փոստի հասցեն ծանուցման նամակներում",
-       "tog-shownumberswatching": "Õ\91Õ¸Ö\82ÕµÖ\81 Õ¿Õ¡Õ¬ Õ§Õ» Õ°Õ½Õ¯Õ¸Õ² Õ´Õ¡Õ½Õ¶Õ¡Õ¯Õ«Ö\81Õ¶Õ¥Ö\80Õ« Õ©Õ«Õ¾Õ¨",
-       "tog-oldsig": "Ներկայիս ստորագրությունն է․",
+       "tog-shownumberswatching": "Ցույց տալ հսկող մասնակիցների թիվը",
+       "tog-oldsig": "Ընթացիկ ստորագրությունը՝",
        "tog-fancysig": "Ստորագրությունը վիքիտեքստի տեսքով (առանց ավտոմատ հղման)",
        "tog-uselivepreview": "Օգտագործել անմիջական նախադիտում, առանց էջը վերբեռնելու (փորձնական)",
        "tog-forceeditsummary": "Նախազգուշացնել խմբագրման ամփոփումը դատարկ թողնելու դեպքում",
-       "tog-watchlisthideown": "Թաքցնել իմ խմբագրումները հսկացանկից",
+       "tog-watchlisthideown": "Հսկացանկից թաքցնել իմ խմբագրումները",
        "tog-watchlisthidebots": "Թաքցնել բոտերի խմբագրումները հսկացանկից",
        "tog-watchlisthideminor": "Թաքցնել չնչին խմբագրումները հսկացանկից",
        "tog-watchlisthideliu": "Թաքցնել մուտք գործած մասնակիցների խմբագրումները հսկացանկից",
        "createacct-captcha": "Անվտանգության ստուգում",
        "createacct-imgcaptcha-ph": "Մուտքագրեք վերը բերված գրվածքը",
        "createacct-submit": "Ստեղծել ձեր հաշիվը",
+       "createacct-another-submit": "Ստեղծել այլ հաշիվ",
        "createacct-benefit-heading": "{{SITENAME}}՝ ստեղծվում է ձեր պես մարդկանց կողմից։",
        "createacct-benefit-body1": "{{PLURAL:$1|խմբագրում}}",
        "createacct-benefit-body2": "{{PLURAL:$1|էջ}}",
        "prefs-personal": "Անձնական",
        "prefs-rc": "Վերջին փոփոխություններ",
        "prefs-watchlist": "Հսկացանկ",
+       "prefs-editwatchlist": "Խմբագրել հսկացանկը",
        "prefs-watchlist-days": "Հսկացանկում ցուցադրվող օրերի թիվը՝",
        "prefs-watchlist-days-max": "Առավելագույնը $1 {{PLURAL:$1|օր}}",
        "prefs-watchlist-edits": "Ընդարձակված հսկացանկում ցուցադրվող օրերի թիվը՝",
        "deletereason-dropdown": "*Ջնջման տարածված պատճառներ\n** Հեղինակի խնդրանքով\n** Հեղինակային իրավունքների խախտում\n** Վանդալություն",
        "delete-edit-reasonlist": "Խմբագրել ջնջման պատճառները",
        "rollback": "Հետ գլորել խմբագրումները",
-       "rollback_short": "Հետ գլորել",
        "rollbacklink": "հետ գլորել",
        "rollbacklinkcount": "հետ գլորել $1 {{PLURAL:$1|խմբագրում}}",
        "rollbackfailed": "Հետ գլորումը ձախողվեց",
        "blankpage": "Դատարկ էջ",
        "intentionallyblankpage": "Այս էջը միտումնավոր դատարկ է թողված։",
        "tag-filter-submit": "Ֆիլտրել",
+       "tags-source-header": "Աղբյուր",
+       "tags-actions-header": "Գործողություններ",
        "tags-edit": "խմբագրել",
+       "tags-delete": "ջնջել",
+       "tags-deactivate": "Ապաակտիվացնել",
+       "tags-create-reason": "Պատճառ՝",
+       "tags-create-submit": "Ստեղծել",
+       "tags-delete-reason": "Պատճառ՝",
+       "tags-activate-reason": "Պատճառ՝",
+       "tags-activate-submit": "Ակտիվացնել",
+       "tags-deactivate-reason": "Պատճառ՝",
+       "tags-deactivate-submit": "Ապաակտիվացնել",
        "comparepages": "Համեմատել էջեր",
        "compare-page1": "Էջ 1",
        "compare-page2": "Էջ 2",
index d6dc939..4fb7f1e 100644 (file)
        "prefs-personal": "Profilo del usator",
        "prefs-rc": "Modificationes recente",
        "prefs-watchlist": "Observatorio",
+       "prefs-editwatchlist": "Modificar observatorio",
+       "prefs-editwatchlist-label": "Modificar entratas in tu observatorio:",
+       "prefs-editwatchlist-edit": "Vider e remover titulos in tu observatorio",
+       "prefs-editwatchlist-raw": "Modificar observatorio crude",
+       "prefs-editwatchlist-clear": "Rader tu observatorio",
        "prefs-watchlist-days": "Numero de dies a monstrar in le observatorio:",
        "prefs-watchlist-days-max": "Maximo $1 {{PLURAL:$1|die|dies}}",
        "prefs-watchlist-edits": "Numero maxime de modificationes a monstrar in le observatorio expandite:",
        "uploaderror": "Error de incargamento",
        "upload-recreate-warning": "'''Attention: Un file con iste nomine ha ja essite delite o renominate.'''\n\nLe registro de deletiones e renominationes pro iste pagina es fornite hic pro major commoditate:",
        "uploadtext": "Con le formulario sequente tu pote incargar un nove file in le wiki.\nPro vider o cercar files ja incargate, visita le [[Special:FileList|lista de files incargate]]. In ultra, le (re)incargamentos es registrate in le [[Special:Log/upload|registro de incargamentos]], le deletiones in le [[Special:Log/delete|registro de deletiones]].\n\nPro includer un file in un pagina, usa un ligamine in un del sequente formas:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' pro usar le version complete del file\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|texto alternative]]</nowiki></code>''' pro usar un rendition a latitude de 200 pixel in un quadro in le margine sinistre con 'texto alternative' qua description\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' pro facer un ligamine directe al file sin monstrar le file",
-       "upload-permitted": "Typos de file permittite: $1.",
-       "upload-preferred": "Typos de file preferite: $1.",
-       "upload-prohibited": "Typos de file prohibite: $1.",
+       "upload-permitted": "{{PLURAL:$2|Typo|Typos}} de file permittite: $1.",
+       "upload-preferred": "{{PLURAL:$2|Typo|Typos}} de file preferite: $1.",
+       "upload-prohibited": "{{PLURAL:$2|Typo|Typos}} de file prohibite: $1.",
        "uploadlogpage": "Registro de incargamentos",
        "uploadlogpagetext": "Infra es un lista de files recentemente incargate.\nVide le [[Special:NewFiles|galeria de nove files]] pro un presentation plus visual.",
        "filename": "Nomine del file",
index 1cae38c..b3e3d0f 100644 (file)
        "otherlanguages": "Bahasa lain",
        "redirectedfrom": "(Dialihkan dari $1)",
        "redirectpagesub": "Halaman pengalihan",
+       "redirectto": "Mengalihkan ke:",
        "lastmodifiedat": "Halaman ini terakhir diubah pada $2, $1.",
        "viewcount": "Halaman ini telah diakses sebanyak {{PLURAL:$1|$1 kali}}.<br />",
        "protectedpage": "Halaman yang dilindungi",
        "pool-queuefull": "Kumpulan antrean penuh",
        "pool-errorunknown": "Kesalahan yang tidak diketahui",
        "pool-servererror": "Layanan penghitung pool ini tidak tersedia ($1).",
+       "poolcounter-usage-error": "Galat penggunaan: $1",
        "aboutsite": "Tentang {{SITENAME}}",
        "aboutpage": "Project:Perihal",
        "copyright": "Konten tersedia sesuai di bawah $1.",
        "hidetoc": "sembunyikan",
        "collapsible-collapse": "Ciutkan",
        "collapsible-expand": "Kembangkan",
+       "confirmable-confirm": "Apakah {{GENDER:$1|Anda}} yakin?",
+       "confirmable-yes": "Ya",
+       "confirmable-no": "Tidak",
        "thisisdeleted": "Lihat atau kembalikan $1?",
        "viewdeleted": "Lihat $1?",
        "restorelink": "{{PLURAL:$1|$1 suntingan}} yang telah dihapus",
        "filerenameerror": "Tidak dapat mengubah nama berkas \"$1\" menjadi \"$2\".",
        "filedeleteerror": "Tidak dapat menghapus berkas \"$1\".",
        "directorycreateerror": "Tidak dapat membuat direktori \"$1\".",
+       "directoryreadonlyerror": "Direktori \"$1\" hanya-baca.",
+       "directorynotreadableerror": "Direktori \"$1\" tidak bisa dibaca.",
        "filenotfound": "Tidak dapat menemukan berkas \"$1\".",
        "unexpected": "Nilai di luar jangkauan: \"$1\"=\"$2\".",
        "formerror": "Kesalahan: Tidak dapat mengirimkan formulir",
        "no-null-revision": "Tidak dapat membuat revisi null baru untuk halaman \"$1\"",
        "badtitle": "Judul tidak sah",
        "badtitletext": "Judul halaman yang diminta tidak sah, kosong, atau judul antarbahasa atau antarwiki yang salah sambung.",
-       "perfcached": "Data berikut ini diambil dari singgahan dan mungkin bukan data mutakhir. {{PLURAL:$1||}}$1 hasil maksimal tersedia di tembolok.",
-       "perfcachedts": "Data berikut ini diambil dari singgahan dan terakhir diperbarui pada $1. {{PLURAL:$1||}}$1 hasil maksimal tersedia di tembolok.",
+       "perfcached": "Data berikut ini diambil dari singgahan dan mungkin bukan data mutakhir. {{PLURAL:$1|Hasil}} maksimal ada di singgahan.",
+       "perfcachedts": "Data berikut ini diambil dari singgahan dan terakhir diperbarui pada $1. {{PLURAL:$4|Hasil}} maksimal ada di singgahan.",
        "querypage-no-updates": "Pemutakhiran dari halaman ini sedang dimatikan. Data yang ada di sini saat ini tidak akan dimuat ulang.",
        "viewsource": "Lihat sumber",
        "viewsource-title": "Lihat sumber untuk $1",
        "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": "<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.",
+       "translateinterface": "Untuk menambah atau mengubah terjemahan semua wiki, mohon gunakan [//translatewiki.net/ translatewiki.net], Proyek pelokalan MediaWiki.",
        "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.",
        "createaccount-text": "Seseorang telah membuat sebuah akun untuk alamat surel Anda di {{SITENAME}} ($4) dengan nama \"$2\" dan kata sandi \"$3\". Anda dianjurkan untuk masuk log dan mengganti kata sandi Anda sekarang.\n\nAnda dapat mengabaikan pesan ini jika akun ini dibuat karena suatu kesalahan.",
        "login-throttled": "Anda sudah terlalu sering mencoba masuk log.\nSilakan menunggu $1 sebelum mencoba lagi.",
        "login-abort-generic": "Proses masuk Anda tidak berhasil - Dibatalkan",
+       "login-migrated-generic": "Akun Anda telah dimigrasi, dan nama pengguna Anda tidak lagi terdaftar di wiki ini.",
        "loginlanguagelabel": "Bahasa: $1",
        "suspicious-userlogout": "Permintaan Anda untuk keluar log ditolak karena tampaknya dikirim oleh penjelajah yang rusak atau proksi penyinggah.",
        "createacct-another-realname-tip": "Nama asli bersifat opsional.\nJika Anda memberikannya, nama asli Anda akan digunakan untuk memberi pengenalan atas hasil kerja Anda.",
        "preview": "Pratayang",
        "showpreview": "Lihat pratayang",
        "showdiff": "Lihat perubahan",
+       "blankarticle": "<strong>Peringatan:</strong> Halaman yang akan Anda buat tidak berisi apa-apa.\nJika Anda mengeklik \"{{int:savearticle}}\" sekali lagi, halaman ini akan dibuat tanpa adanya isi.",
        "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.",
+       "selfredirect": "<strong>Peringatan:</strong> Anda akan mengalihkan halaman ini balik ke halaman ini.\nAnda bisa jadi telah menuliskan tujuan pengalihan yang salah, atau telah menyunting halaman yang salah.\nJika Anda mengeklik \"{{int:savearticle}}\" sekali lagi, halaman pengalihan akan dibuat.",
        "missingcommenttext": "Harap masukkan komentar di bawah ini.",
        "missingcommentheader": "''Peringatan:''' Anda belum memberikan subjek atau judul untuk komentar Anda. Jika Anda kembali menekan \"{{int:savearticle}}\", suntingan Anda akan disimpan tanpa komentar tersebut.",
        "summary-preview": "Pratayang ringkasan:",
        "content-model-text": "teks polos",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "Objek kosong",
+       "content-json-empty-array": "Larik kosong",
+       "duplicate-args-category": "Halaman dengan argumen ganda di pemanggilan templat",
+       "duplicate-args-category-desc": "Halaman ini berisi pemanggilan templat yang menggunakan argumen ganda, seperti <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> atau <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "Peringatan: Halaman ini mengandung terlalu banyak panggilan fungsi parser.\n\nSaat ini terdapat {{PLURAL:$1|$1 panggilan|$1 panggilan}}, seharusnya kurang dari $2 {{PLURAL:$2|panggilan|panggilan}}.",
        "expensive-parserfunction-category": "Halaman dengan terlalu banyak panggilan fungsi parser",
        "post-expand-template-inclusion-warning": "Peringatan: Ukuran templat yang digunakan terlalu besar.\nBeberapa templat akan diabaikan.",
        "search-result-category-size": "{{PLURAL:$1|1 anggota|$1 anggota}} ({{PLURAL:$2|1 subkategori|$2 subkategori}}, {{PLURAL:$3|1 berkas|$3 berkas}})",
        "search-redirect": "(pengalihan $1)",
        "search-section": "(bagian $1)",
+       "search-category": "(kategori $1)",
        "search-file-match": "(cocok dengan isi berkas)",
        "search-suggest": "Mungkin maksud Anda adalah: $1",
        "search-interwiki-caption": "Proyek lain",
        "searchrelated": "berkaitan",
        "searchall": "semua",
        "showingresults": "Di bawah ini ditampilkan hingga {{PLURAL:$1|'''1''' hasil|'''$1''' hasil}}, dimulai dari #'''$2'''.",
-       "showingresultsinrange": "Menampilkan sampai dengan {{PLURAL:$1|<strong>1</strong> hasil|<strong>$1</strong> hasil}} dalam jangkauan #<strong>$2</strong> sampai #<strong>$3</strong>.",
+       "showingresultsinrange": "Menampilkan sampai dengan {{PLURAL:$1|<strong>1</strong> hasil|<strong>$1</strong> hasil}} dalam rentang #<strong>$2</strong> sampai #<strong>$3</strong>.",
+       "search-showingresults": "{{PLURAL:$4|Hasil <strong>$1</strong> dari <strong>$3</strong>|Hasil <strong>$1 - $2</strong> dari <strong>$3</strong>}}",
        "search-nonefound": "Tidak ada hasil yang sesuai dengan kriteria.",
        "powersearch-legend": "Pencarian lanjut",
        "powersearch-ns": "Mencari di ruang nama:",
        "prefs-personal": "Profil",
        "prefs-rc": "Perubahan terbaru",
        "prefs-watchlist": "Pemantauan",
+       "prefs-editwatchlist": "Sunting daftar pantauan",
+       "prefs-editwatchlist-label": "Sunting entri di daftar pantuan:",
+       "prefs-editwatchlist-edit": "Lihat dan hapus judul di daftar pantauan Anda",
+       "prefs-editwatchlist-raw": "Sunting daftar pantauan mentah",
+       "prefs-editwatchlist-clear": "Kosongkan daftar pantauan",
        "prefs-watchlist-days": "Jumlah hari maksimum yang ditampilkan di daftar pantauan:",
-       "prefs-watchlist-days-max": "Maksimum $1 {{PLURAL:$1|hari|hari}}",
+       "prefs-watchlist-days-max": "Maksimum $1 {{PLURAL:$1|hari}}",
        "prefs-watchlist-edits": "Jumlah suntingan maksimum yang ditampilkan di daftar pantauan yang lebih lengkap:",
        "prefs-watchlist-edits-max": "Nilai maksimum: 1000",
        "prefs-watchlist-token": "Token pantauan:",
        "gender-unknown": "Tak dinyatakan",
        "gender-male": "Laki-laki",
        "gender-female": "Perempuan",
-       "prefs-help-gender": "Opsional: digunakan untuk perbaikan penyebutan jender oleh perangkat lunak. \nInformasi ini akan terbuka untuk umum.",
+       "prefs-help-gender": "Opsional: digunakan untuk perbaikan penyebutan jenis kelamin oleh perangkat lunak. \nInformasi ini akan terbuka untuk umum.",
        "email": "Surel",
        "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.",
        "right-browsearchive": "Mencari halaman yang telah dihapus",
        "right-undelete": "Mengembalikan halaman yang telah dihapus",
        "right-suppressrevision": "Menampilkan, menyembunyikan dan membatalkan penyembunyian revisi tertentu atas suatu halaman dari pengguna",
+       "right-viewsuppressed": "Lihat revisi yang disembunyikan dari semua pengguna",
        "right-suppressionlog": "Melihat log privat",
        "right-block": "Memblokir penyuntingan oleh pengguna lain",
        "right-blockemail": "Memblokir pengiriman surel oleh pengguna",
        "recentchanges-label-plusminus": "Perubahan ukuran halaman dalam bita",
        "recentchanges-legend-heading": "'''Legenda:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (lihat pula [[Special:NewPages|daftar halaman baru]])",
-       "rcnotefrom": "Di bawah ini adalah perubahan sejak <strong>$2</strong> (ditampilkan sampai <strong>$1</strong> perubahan).",
+       "rcnotefrom": "Di bawah ini adalah {{PLURAL:$5|perubahan}} sejak <strong>$3, $4</strong> (ditampilkan sampai <strong>$1</strong> perubahan).",
        "rclistfrom": "Perlihatkan perubahan terbaru sejak $3 $2",
        "rcshowhideminor": "$1 suntingan kecil",
        "rcshowhideminor-show": "Tampilkan",
        "uploaderror": "Kesalahan pemuatan",
        "upload-recreate-warning": "'''Peringatan: Berkas dengan nama itu telah dihapus atau dipindahkan.'''\n\nLog penghapusan dan pemindahan laman ini adalah sebagai berikut:",
        "uploadtext": "Gunakan formulir di bawah untuk mengunggah berkas.\nUntuk menampilkan atau mencari berkas yang sebelumnya dimuat, gunakan [[Special:FileList|daftar berkas]]. Pengunggahan (ulang) juga tercatat dalam [[Special:Log/upload|log pengunggahan]], sementara penghapusan tercatat dalam [[Special:Log/delete|log penghapusan]].\n\nUntuk menampilkan atau menyertakan berkas di dalam suatu halaman, gunakan pranala dengan salah satu format di bawah ini:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Berkas.jpg]]</nowiki></code>''' untuk menampilkan berkas dalam ukuran aslinya\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Berkas.png|200px|thumb|left|teks alternatif]]</nowiki></code>''' untuk menampilkan berkas dengan lebar 200px dalam sebuah kotak di kiri halaman dengan 'teks alternatif' sebagai keterangan gambar\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Berkas.ogg]]</nowiki></code>''' sebagai pranala langsung ke berkas yang dimaksud tanpa menampilkan berkas tersebut melalui wiki",
-       "upload-permitted": "Jenis berkas yang diperbolehkan: $1.",
-       "upload-preferred": "Jenis berkas yang disarankan: $1.",
-       "upload-prohibited": "Jenis berkas yang dilarang: $1.",
+       "upload-permitted": "{{PLURAL:$2|Jenis}} berkas yang diperbolehkan: $1.",
+       "upload-preferred": "{{PLURAL:$2|Jenis}} berkas yang disarankan: $1.",
+       "upload-prohibited": "{{PLURAL:$2|Jenis}} berkas yang dilarang: $1.",
        "uploadlogpage": "Log pengunggahan",
        "uploadlogpagetext": "Berikut adalah daftar unggahan berkas terbaru. \nLihat [[Special:NewFiles|galeri berkas baru]] untuk tampilan visual.",
        "filename": "Nama berkas",
        "license": "Jenis lisensi:",
        "license-header": "Jenis lisensi",
        "nolicense": "Tidak ada yang dipilih",
+       "licenses-edit": "Sunting opsi lisensi",
        "license-nopreview": "(Pratayang tak tersedia)",
-       "upload_source_url": " (suatu URL valid yang dapat diakses publik)",
-       "upload_source_file": " (suatu berkas di komputer Anda)",
+       "upload_source_url": "(Anda pilih berkas dari URL valid yang dapat diakses publik)",
+       "upload_source_file": "(Anda pilih berkas dari komputer Anda)",
        "listfiles-delete": "hapus",
        "listfiles-summary": "Halaman istimewa ini menampilkan semua berkas yang telah diunggah.\nKetika disaring oleh pengguna, hanya versi berkas terbaru dari berkas yang diunggah oleh pengguna tersebut yang ditampilkan.",
        "listfiles_search_for": "Cari nama berkas:",
        "download": "unduh",
        "unwatchedpages": "Halaman yang tak dipantau",
        "listredirects": "Daftar pengalihan",
-       "listduplicatedfiles": "Daftar berkas yang berduplikat",
+       "listduplicatedfiles": "Daftar berkas duplikat",
        "listduplicatedfiles-summary": "Ini adalah daftar berkas di mana versi terbaru dari berkas tersebut merupakan duplikat dari versi terbaru dari beberapa berkas lain. Hanya berkas lokal yang dianggap.",
        "listduplicatedfiles-entry": "[[:File:$1|$1]] memiliki [[$3|{{PLURAL:$2|sebuah duplikat|$2 duplikat}}]].",
        "unusedtemplates": "Templat yang tak digunakan",
        "randomincategory": "Halaman acak dalam kategori",
        "randomincategory-invalidcategory": "\"$1\" bukanlah nama kategori yang berlaku.",
        "randomincategory-nopages": "Tidak ada halaman dalam [[:Category:$1]].",
+       "randomincategory-category": "Kategori:",
+       "randomincategory-legend": "Halaman sembarang di kategori",
        "randomredirect": "Pengalihan sembarang",
        "randomredirect-nopages": "Tak terdapat pengalihan pada ruang nama \"$1\".",
        "statistics": "Statistik",
        "pager-older-n": "{{PLURAL:$1|1 lebih lama|$1 lebih lama}}",
        "suppress": "Pengawas",
        "querypage-disabled": "Halaman istimewa ini dinonaktifkan demi alasan kinerja.",
+       "apihelp": "Bantuan API",
+       "apihelp-no-such-module": "Modul \"$1\" tidak ditemukan.",
        "booksources": "Sumber buku",
        "booksources-search-legend": "Cari di sumber buku",
        "booksources-isbn": "ISBN:",
        "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|halaman|halaman}}",
        "file-info": "ukuran berkas: $1, tipe MIME: $2",
        "file-info-size": "$1 × $2 piksel, ukuran berkas: $3, tipe MIME: $4",
-       "file-info-size-pages": "$1 × $2 piksel, ukuran berkas: $3, jenis MIME: $4, $5 {{PLURAL:$5|halaman|halaman}}",
+       "file-info-size-pages": "$1 × $2 piksel, ukuran berkas: $3, tipe MIME: $4, $5 {{PLURAL:$5|halaman}}",
        "file-nohires": "Tak tersedia resolusi yang lebih tinggi.",
        "svg-long-desc": "Berkas SVG, nominal $1 × $2 piksel, besar berkas: $3",
        "svg-long-desc-animated": "Berkas SVG animasi, biasanya $1 x $2 piksel, ukuran gambar: $3",
        "pipe-separator": "&#32;|&#32;",
        "word-separator": "&#32;",
        "ellipsis": "...",
+       "quotation-marks": "\"$1\"",
        "imgmultipageprev": "&larr; halaman sebelumnya",
        "imgmultipagenext": "halaman selanjutnya &rarr;",
        "imgmultigo": "Cari!",
        "tags-active-yes": "Ya",
        "tags-active-no": "Tidak",
        "tags-edit": "sunting",
-       "tags-hitcount": "$1 {{PLURAL:$1|perubahan|perubahan}}",
+       "tags-delete": "hapus",
+       "tags-activate": "aktifkan",
+       "tags-deactivate": "nonaktifkan",
+       "tags-hitcount": "$1 {{PLURAL:$1|perubahan}}",
        "comparepages": "Bandingkan halaman",
        "compare-page1": "Halaman 1",
        "compare-page2": "Halaman 2",
        "compare-revision-not-exists": "Revisi yang Anda minta tidak ada.",
        "dberr-problems": "Maaf! Situs ini mengalami masalah teknis.",
        "dberr-again": "Cobalah menunggu beberapa menit dan muat ulang.",
-       "dberr-info": "(Tak dapat tersambung dengan server basis data: $1)",
-       "dberr-info-hidden": "(Tidak dapat menghubungi peladen basis data)",
+       "dberr-info": "(Tak dapat mengakses basis data: $1)",
+       "dberr-info-hidden": "(Tak dapat mengakses basis data)",
        "dberr-usegoogle": "Anda dapat mencoba pencarian melalui Google untuk sementara waktu.",
        "dberr-outofdate": "Harap diperhatikan bahwa indeks mereka terhadap isi kami mungkin sudah kedaluwarsa.",
        "dberr-cachederror": "Berikut adalah salinan tersimpan halaman yang diminta, dan mungkin bukan yang terbaru.",
        "revdelete-uname-unhid": "nama pengguna tidak disembunyikan",
        "revdelete-restricted": "akses telah dibatasi untuk opsis",
        "revdelete-unrestricted": "pembatasan akses opsis dihapuskan",
+       "logentry-merge-merge": "$1 {{GENDER:$2|menggabungkan}} $3 dengan $4 (revisi lebih dari $5)",
        "logentry-move-move": "$1 {{GENDER:$2|memindahkan}} halaman $3 ke $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|memindahkan}} halaman $3 ke $4 tanpa membuat pengalihan",
        "logentry-move-move_redir": "$1 {{GENDER:$2|memindahkan}} halaman $3 ke $4 menimpa pengalihan lama",
        "logentry-rights-rights": "$1 {{GENDER:$2|mengubah}} keanggotaan grup $3 dari $4 menjadi $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|mengubah}} keanggotaan grup $3",
        "logentry-rights-autopromote": "$1 secara otomatis {{GENDER:$2|dipromosikan}} dari $4 menjadi $5",
+       "logentry-upload-upload": "$1 {{GENDER:$2|mengunggah}} $3",
+       "logentry-upload-overwrite": "$1 {{GENDER:$2|mengunggah}} versi baru dari $3",
+       "logentry-upload-revert": "$1 {{GENDER:$2|mengunggah}} $3",
+       "log-name-managetags": "Log pengelolaan tag",
+       "logentry-managetags-create": "$1 {{GENDER:$2|membuat}} tag \"$4\"",
        "rightsnone": "(tidak ada)",
        "revdelete-summary": "ringkasan",
        "feedback-bugornote": "Jika Anda sudah siap untuk mendeskripsikan masalah teknis secara rinci silakan [$1 melaporkan bug].\nJika tidak, Anda dapat menggunakan formulir mudah di bawah ini. Komentar Anda akan ditambahkan ke halaman \"[$3 $2]\", bersama dengan nama pengguna Anda dan apa browser yang Anda gunakan.",
        "feedback-bugcheck": "Hebat! Hanya periksa bahwa itu bukan satu di antara [$1 bug yang telah dikenal].",
        "feedback-bugnew": "Saya telah memeriksa. Laporkan bug baru",
        "searchsuggest-search": "Cari",
-       "searchsuggest-containing": "isian ...",
+       "searchsuggest-containing": "berisi...",
        "api-error-badaccess-groups": "Anda tidak diizinkan mengunggah berkas ke wiki ini.",
        "api-error-badtoken": "Kesalahan internal: token buruk.",
        "api-error-copyuploaddisabled": "Mengunggah melalui URL dilarang pada peladen ini.",
-       "api-error-duplicate": "Sudah ada {{PLURAL:$1|[$2 berkas lain]|[$2 berkas lain]}} dengan konten yang sama di situs ini",
-       "api-error-duplicate-archive": "Ada {{PLURAL:$1|[$2 berkas]|[$2 berkas]}} lain di situs dengan konten yang sama, namun {{PLURAL:$1|berkas|berkas-berkas}} itu telah dihapus.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|Berkas|Berkas-berkas}} duplikat yang telah dihapus",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Berkas|Berkas}} duplikat",
+       "api-error-duplicate": "Sudah ada {{PLURAL:$1|[$2 berkas lain]}} dengan konten yang sama di situs ini.",
+       "api-error-duplicate-archive": "Ada {{PLURAL:$1|[$2 berkas]}} lain di situs dengan konten yang sama, namun {{PLURAL:$1|berkas|berkas-berkas}} itu telah dihapus.",
+       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|Berkas|Berkas-berkas}} duplikat yang telah dihapus.",
+       "api-error-duplicate-popup-title": "{{PLURAL:$1|Berkas}} duplikat.",
        "api-error-empty-file": "Berkas yang Anda kirim kosong.",
        "api-error-emptypage": "Pembuatan halaman baru yang kosong tidak diizinkan.",
        "api-error-fetchfileerror": "Kesalahan internal: terjadi kesalahan saat memperoleh berkas ini.",
        "api-error-unknownerror": "Kesalahan tidak dikenal: \"$1\"",
        "api-error-uploaddisabled": "Pengunggahan dinonaktifkan di wiki ini.",
        "api-error-verification-error": "Berkas ini mungkin rusak atau memiliki ekstensi yang salah.",
-       "duration-seconds": "{{PLURAL:$1||}}$1 detik",
-       "duration-minutes": "{{PLURAL:$1||}}$1 menit",
-       "duration-hours": "{{PLURAL:$1||}}$1 jam",
-       "duration-days": "{{PLURAL:$1||}}$1 hari",
-       "duration-weeks": "{{PLURAL:$1||}}$1 minggu",
-       "duration-years": "{{PLURAL:$1||}}$1 tahun",
-       "duration-decades": "{{PLURAL:$1||}}$1 dekade",
-       "duration-centuries": "{{PLURAL:$1||}}$1 abad",
-       "duration-millennia": "{{PLURAL:$1||}}$1 milenium",
+       "duration-seconds": "$1 {{PLURAL:$1|detik}}",
+       "duration-minutes": "$1 {{PLURAL:$1|menit}}",
+       "duration-hours": "$1 {{PLURAL:$1|jam}}",
+       "duration-days": "$1 {{PLURAL:$1|hari}}",
+       "duration-weeks": "$1 {{PLURAL:$1|minggu}}",
+       "duration-years": "$1 {{PLURAL:$1|tahun}}",
+       "duration-decades": "$1 {{PLURAL:$1|dekade}}",
+       "duration-centuries": "$1 {{PLURAL:$1|abad}}",
+       "duration-millennia": "$1 {{PLURAL:$1|milenium}}",
        "rotate-comment": "Gambar diputar $1 {{PLURAL:$1|derajat}} searah jarum jam",
        "limitreport-title": "Parser profil data:",
        "limitreport-cputime": "Penggunaan waktu CPU",
-       "limitreport-cputime-value": "$1 {{PLURAL:$1|detik|detik}}",
+       "limitreport-cputime-value": "$1 {{PLURAL:$1|detik}}",
        "limitreport-walltime": "Penggunaan waktu riil",
-       "limitreport-walltime-value": "$1 {{PLURAL:$1|detik|detik}}",
+       "limitreport-walltime-value": "$1 {{PLURAL:$1|detik}}",
        "limitreport-ppvisitednodes": "Preprosesor mengunjungi hitungan node",
        "limitreport-ppgeneratednodes": "Preprosesor menghasilkan hitungan node",
        "limitreport-postexpandincludesize": "Pasca memperluas mencakup ukuran",
-       "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|bita|bita}}",
+       "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|bita}}",
        "limitreport-templateargumentsize": "Ukuran argumen temlat",
-       "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|bita|bita}}",
+       "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|bita}}",
        "limitreport-expansiondepth": "Kedalaman ekspansi tertinggi",
        "limitreport-expensivefunctioncount": "Perhitungan fungsi parser yang mahal",
        "expandtemplates": "Pengembangan templat",
        "expand_templates_input": "Teks masukan:",
        "expand_templates_output": "Hasil",
        "expand_templates_xml_output": "Hasil XML",
-       "expand_templates_html_output": "Keliaran HTML mentah",
+       "expand_templates_html_output": "Keluaran HTML mentah",
        "expand_templates_ok": "OK",
        "expand_templates_remove_comments": "Buang komentar",
        "expand_templates_remove_nowiki": "Tidak menampilkan tag <nowiki> pada hasilnya",
        "pagelanguage": "Pemilih bahasa halaman",
        "pagelang-name": "Halaman",
        "pagelang-language": "Bahasa",
-       "pagelang-use-default": "Gunakan bahasa default",
+       "pagelang-use-default": "Gunakan bahasa baku",
        "pagelang-select-lang": "Pilih bahasa",
        "right-pagelang": "Ubah bahasa halaman",
        "action-pagelang": "mengubah bahasa halaman",
        "log-name-pagelang": "Ubah bahasa log",
        "log-description-pagelang": "Ini adalah log perubahan dalam bahasa halaman.",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2|mengubah}} bahasa halaman $3 dari $4 menjadi $5.",
-       "mediastatistics-summary": "Statistik tentang jenis file yang terunggah. Ini hanya mencakup versi terbaru dari sebuah file. Terkecuali file lama dan file yang sudah dihapus",
+       "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (aktif)",
+       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''nonaktif''')",
+       "mediastatistics": "Statistik media",
+       "mediastatistics-summary": "Statistik mengenai jenis berkas yang diunggah. Hanya mencakup versi terbaru dari berkas. Berkas lama dan berkas yang sudah dihapus tidak termasuk.",
+       "mediastatistics-nbytes": "{{PLURAL:$1|$1 bita}} ($2; $3%)",
+       "mediastatistics-table-mimetype": "Tipe MIME",
+       "mediastatistics-table-extensions": "Ekstensi",
        "mediastatistics-table-count": "Jumlah file",
        "mediastatistics-table-totalbytes": "Ukuran gabungan",
        "mediastatistics-header-unknown": "Tidak diketahui",
        "mediastatistics-header-bitmap": "Gambar bitmap",
+       "mediastatistics-header-drawing": "Gambar vektor",
        "mediastatistics-header-audio": "Audio",
        "mediastatistics-header-video": "Video",
-       "mediastatistics-header-office": "Office",
+       "mediastatistics-header-office": "Aplikasi Office",
        "mediastatistics-header-text": "Tekstual",
-       "mediastatistics-header-executable": "Executable",
+       "mediastatistics-header-executable": "Program",
        "mediastatistics-header-archive": "Format terkompresi",
        "json-error-depth": "Kedalaman tumpukan maksimal telah terlewati",
        "json-error-syntax": "Kesalahan sintaks"
index d1db2de..04acf10 100644 (file)
                        "Shirayuki"
                ]
        },
-       "tog-underline": "Ӏинкаш белгалде:",
-       "tog-hideminor": "Ð\97Ó\80амига Ñ\85Ñ\83вÑ\86амаÑ\88 ÐºÐµÑ\80да Ñ\85Ñ\83вÑ\86аман Ð´Ð°Ð³Ð°Ñ\80ленаÑ\88каÑ\85 ÐºÑ\8aайлаÑ\8fккха",
-       "tog-hidepatrolled": "Ð\9aеÑ\80да Ñ\85Ñ\83вÑ\86аман Ð´Ð°Ð³Ð°Ñ\80ленаÑ\87 Ð´Ó\80анийÑ\81аÑ\8fÑ\8c хувцамаш къайладаккха",
-       "tog-newpageshidepatrolled": "Ð\9aеÑ\80да Ð¾Ð°Ð³Ó\80Ñ\83вна Ð´Ð°Ð³Ð°Ñ\80ленаÑ\87 Ð´Ó\80анийÑ\81аÑ\8fÑ\8c Ñ\85Ñ\83вÑ\86амаÑ\88 ÐºÑ\8aайладаккха",
-       "tog-extendwatchlist": "Шераяь теркама дагарле, массадола хувцамаш чулоацаш",
-       "tog-usenewrc": "Ð\9aеÑ\80да Ñ\85Ñ\83вÑ\86ами Ñ\82еÑ\80кама Ð´Ð°Ð³Ð°Ñ\80леи Ñ\85Ñ\83вÑ\86амаÑ\88 Ñ\82оабÑ\8aе (JavaScript)",
-       "tog-numberheadings": "Ð\9aоÑ\80Ñ\82аленаÑ\88Ñ\82 Ð°Ð»Ð°Ð½Ð·Ð° Ñ\82аÑ\8cÑ\80аÑ\85Ñ\8cал Ð´Ðµ",
-       "tog-showtoolbar": "ГӀалатнийcдара юкъе лакхера гӀорсан гартакх хьахьокха (JavaScript)",
-       "tog-editondblclick": "Шозза цлицакацa oагӀув хувца (JavaScript)",
-       "tog-editsectiononrightclick": "Ð\94екÑ\8aам Ñ\85Ñ\83вÑ\86а ÐºÐµÑ\80Ñ\82мÑ\83гÓ\80а Ð°Ñ\8cÑ\82Ñ\82а Ñ\86лиÑ\86ака Ñ\8f (JavaScript)",
-       "tog-watchcreations": "Аз яь йола оагӀувнаш теркама дагарле йолач чуяьккха",
-       "tog-watchdefault": "Аз хийца йола оагӀувнаш теркама дагарле йолач чуяьккха",
-       "tog-watchmoves": "Аз цӀи хийца йола оагӀувнаш теркама дагарле йолач чуяьккха",
-       "tog-watchdeletion": "Аз дӀаяьккха йола оагӀувнаш теркама дагарле йолач чуяьккха",
-       "tog-minordefault": "Теркамза хувцамаш лоархӀамза белгалде",
+       "tog-underline": "Хьожадерга |ок|алтакадар:",
+       "tog-hideminor": "Ð¥Ñ\8cаÑ\82|аÑ\8fздаÑ\80а Ñ\87Ñ\83 ÐºÐµÑ\80даÑ\87а Ñ\85Ñ\83вÑ\86амаÑ\88a Ð·|амига Ð´Ð¾Ð»Ð° Ñ\85Ñ\83вÑ\86амаÑ\88 ÐºÑ\8aайладаккха",
+       "tog-hidepatrolled": "Ð¥Ñ\8cаÑ\82|аÑ\8fздаÑ\80а Ñ\87Ñ\83 ÐºÐµÑ\80даÑ\87а Ñ\85Ñ\83вÑ\86амаÑ\88a Ð´|анийÑ\81адаÑ\8c Ð´Ð¾Ð»Ð° хувцамаш къайладаккха",
+       "tog-newpageshidepatrolled": "Ð¥Ñ\8cаÑ\82|аÑ\8fздаÑ\80а Ñ\87Ñ\83 ÐºÐµÑ\80даÑ\87а Ñ\85Ñ\83вÑ\86амаÑ\88a Ñ\85Ñ\8cанийÑ\81адаÑ\8c Ð´Ð¾Ð»Ð° Ð¾Ð°Ð³|онаÑ\88 ÐºÑ\8aайлаÑ\8fккха",
+       "tog-extendwatchlist": "Шерадаь теркама хьат|аяздар, массадола хувцамаш чулоацаш дола, алхха т|ехьара даьраш мара а доацаш",
+       "tog-usenewrc": "Ð\9aеÑ\80да Ñ\85Ñ\83вÑ\86амаÑ\88ка Ð° Ñ\85Ñ\8cаÑ\82|аÑ\8fздаÑ\80а Ð·ÐµÐ¼Ð±Ð°ÐºÐºÑ\85аÑ\80га Ð° Ñ\8dÑ\80гадаккÑ\85аÑ\80аÑ\88 Ñ\82оабаде (JavaScript Ñ\8dÑ\88а)",
+       "tog-numberheadings": "Ð\9aеÑ\80Ñ\82аÑ\88каÑ\88Ñ\82а Ð°Ð»Ð°Ð½Ð·Ð° Ñ\82аÑ\8cÑ\80аÑ\85Ñ\8cа Ñ\85оÑ\82Ñ\82а",
+       "tog-showtoolbar": "Г|алатнийcдара г|ирсагартакх хьахьокха (JavaScript)",
+       "tog-editondblclick": "Шозза д|ато|амцa oаг|ув хувца (JavaScript)",
+       "tog-editsectiononrightclick": "РалÑ\81декÑ\8aаÑ\80аÑ\88 Ñ\85Ñ\83вÑ\86а Ð´Ð°Ñ\85каÑ\86а Ð°Ñ\8cÑ\82Ñ\82а Ð´|аÑ\82о|амÑ\86а  ÐºÐµÑ\80Ñ\82аÑ\88ка Ñ\82|а (JavaScript)",
+       "tog-watchcreations": "Tеркама хьат|аяздар т|а аз яь оаг|онаши чуяьккха паьлаши т|атоха",
+       "tog-watchdefault": "Tеркама хьат|аяздар т|а аз хийца оаг|онаши паьлаша кустяздараши т|атоха",
+       "tog-watchmoves": "Tеркама хьат|аяздар т|а аз ц|ихийца оагӀонаши паьлаши т|атоха",
+       "tog-watchdeletion": "Tеркама хьат|аяздар т|а аз д|аяьккха оагӀонаши паьлаши т|атоха",
+       "tog-minordefault": "Теркамза хувцамашта лоархӀамза мо белгало хотта",
        "tog-previewontop": "ГӀалатнийсдара кора хьалхе бӀаргтассам оттае",
-       "tog-previewonfirst": "ГӀалатнийсдаре дехьавоалаш/йоалаш бӀаргтассам хьахьокха",
-       "tog-enotifwatchlistpages": "ОагӀувний хувцамахи теркама дагарленахи лаьца, д-хоамнец хоам бе",
-       "tog-enotifusertalkpages": "Са дувцама оагӀув тӀа хувцамаш хилача, д-хоамнец хоам бе",
-       "tog-enotifminoredits": "Геттара зӀамига хувцамаш хилача, д-хоамнец хоам бе",
-       "tog-enotifrevealaddr": "ЗӀы хоамаш тӀа са хоамни моттиг хьахьокха",
-       "tog-shownumberswatching": "Ший Ñ\82еÑ\80кама Ð´Ð°Ð³Ð°Ñ\80ленгаÑ\85 Ð¾Ð°Ð³Ó\80Ñ\83в Ñ\87Ñ\83лаÑ\8cÑ\86а Ð±Ð¾Ð»Ð° Ð´Ð°ÐºÑ\8aалаÑ\8cÑ\86аÑ\80Ñ\85ой Ñ\82аÑ\8cÑ\80аÑ\85 Ñ\85Ñ\8cаÑ\85Ñ\8cокÑ\85а",
+       "tog-previewonfirst": "ГӀалатнийсдаре дехьавоалаш/йоалаш бӀаргтассам гойта",
+       "tog-enotifwatchlistpages": "Tеркама хьат|аяздар чура оаг|онаши паьлаши хувцамаех лаьца д-хоамне т|а дайта хьа",
+       "tog-enotifusertalkpages": "Са дувцама оаг|он т|а хувцамаш хилча, д-хоамнец хьахоам бе",
+       "tog-enotifminoredits": "Геттара з|амига хувцамаш хилча а, д-хоамнец хьахоам бе",
+       "tog-enotifrevealaddr": "З|ы хоамаш т|а са д-хоамни ц|ей-меттиг гойта",
+       "tog-shownumberswatching": "Шоай Ñ\82еÑ\80кама Ñ\85Ñ\8cаÑ\82|аÑ\8fздаÑ\80 Ñ\87Ñ\83 Ð¾Ð°Ð³|Ñ\83в Ñ\87Ñ\83Ñ\8fÑ\8cккÑ\85а Ð´Ð¾Ð°ÐºÑ\8cоÑ\88Ñ\85оÑ\88а Ñ\82аÑ\8cÑ\80аÑ\85Ñ\8c Ð³Ð¾Ð¹Ñ\82а",
        "tog-oldsig": "Дола кулгайоазув:",
-       "tog-fancysig": "Ший кулга яздара массахоамбаккхам (ший лоӀаме Ӏинка йоацаш)",
-       "tog-uselivepreview": "Сиха бӀарахьажар (JavaScript) (Экспериментально)",
-       "tog-forceeditsummary": "Хоам бе, хувцамий лоацам белгал даь деце",
-       "tog-watchlisthideown": "Са хувцамаш теркама дагарчера къайладаккха",
-       "tog-watchlisthidebots": "БӀатий хувцамаш теркама дагарчера къайладаккха",
-       "tog-watchlisthideminor": "Са зӀамига хувцамаш теркама дагарчера къайладаккха",
-       "tog-watchlisthideliu": "Чубаьнна дакъалаьцархой хувцамаш теркама дагaрчеча къайлаяьккха",
-       "tog-watchlisthideanons": "ЦӀи йоаца дакъалаьцархой хувцамаш теркама дагрчеча къайлаяьккха",
-       "tog-watchlisthidepatrolled": "Теркама дагарчера дӀанийсъя хувцамаш къайлаяьккха",
-       "tog-ccmeonemails": "Аз дакъалаьцархошоа дахта каьхаташ са д-хоамни тӀа хьатӀадайта",
-       "tog-diffonly": "Диста кIал йоалаж йола оагӀувна дакъа ма хьокха",
-       "tog-showhiddencats": "Къайла катагаш хьахьокха",
-       "underline-always": "Массаза",
-       "underline-never": "ЦӀаккха",
-       "underline-default": "МазабӀарглокхарий оттамаш хайрамбе",
-       "editfont-style": "ТIеракуц хувца",
-       "sunday": "КӀиранди",
+       "tog-fancysig": "Ший кулгаяздара массахоамбаккхар (ший ло|ама хьожадерг йоацаш)",
+       "tog-uselivepreview": "Сиха б|арахьажар (JavaScript)",
+       "tog-forceeditsummary": "Хьахоам бе, наггахь санна хувцама кустяздара меттига хьалайиза еце",
+       "tog-watchlisthideown": "Са теркама xьат|аяздара хувцамаш къайладаха",
+       "tog-watchlisthidebots": "Теркама xьат|аяздар чура б|ата хувцамаш къайладаха",
+       "tog-watchlisthideminor": "Са теркама xьат|аяздара з|амига хувцамаш къайладаха",
+       "tog-watchlisthideliu": "Теркама xьат|аяздар чура хьабайза доакъошхоша хувцамаш къайладаха",
+       "tog-watchlisthideanons": "Теркама xьат|аяздар чура ц|ийоацача доакъошхоша хувцамаш къайладаха",
+       "tog-watchlisthidepatrolled": "Теркама xьат|аяздар чура д|анийсдаь хувцамаш къайладаха",
+       "tog-ccmeonemails": "Аз д|ахийташ дола доакъошхошоа каьхаташ са д-хоамни т|а дайта хьа",
+       "tog-diffonly": "Шин нийсхьале в|ашинийсдара к|ала бола оаг|он чулоацам ма гойта",
+       "tog-showhiddencats": "Къайла катагаш гойта",
+       "underline-always": "Даиман",
+       "underline-never": "Ц|аккха",
+       "underline-default": "Мазаб|арглокхарa оттамаш хайраде",
+       "editfont-style": "Нийсдара меттига чу йола зарба б|армат:",
+       "editfont-monospace": "Башхалон зарба",
+       "sunday": "К|иранди",
        "monday": "Оршот",
        "tuesday": "Шинара",
        "wednesday": "Кхаьра",
        "thursday": "Ера",
        "friday": "ПӀаьраска",
        "saturday": "Шоатта",
-       "sun": "КӀи",
+       "sun": "К|и",
        "mon": "Ор",
        "tue": "Ши",
        "wed": "Кха",
        "thu": "Ер",
-       "fri": "ПӀаь",
+       "fri": "П|аь",
        "sat": "Шоа",
        "january": "Нажгамсхой",
        "february": "Саькур",
-       "march": "Мутхьол",
+       "march": "Ð\9cÑ\83Ñ\82Ñ\82Ñ\85Ñ\8cол",
        "april": "Тушоли",
        "may_long": "Бекарг",
        "june": "Аьтинг",
-       "july": "КӀимарс",
+       "july": "К|имарс",
        "august": "Мангал",
        "september": "Моажол",
        "october": "Тов",
        "december": "Чантар",
        "january-gen": "Нажгамсхой бетт",
        "february-gen": "Саькур бетт",
-       "march-gen": "Мутхьол бетт",
+       "march-gen": "Ð\9cÑ\83Ñ\82Ñ\82Ñ\85Ñ\8cол Ð±ÐµÑ\82Ñ\82",
        "april-gen": "Тушоли бетт",
        "may-gen": "Бекарг бетт",
        "june-gen": "Аьтинг бетт",
-       "july-gen": "КӀимарс бетт",
+       "july-gen": "К|имарс бетт",
        "august-gen": "Мангал бетт",
        "september-gen": "Моажол бетт",
        "october-gen": "Тов бетт",
        "december-gen": "Чантар бетт",
        "jan": "Нажг.",
        "feb": "Саьк.",
-       "mar": "Ð\9cÑ\83Ñ\82Ñ\85Ñ\8c.",
+       "mar": "Ð\9cÑ\83Ñ\82Ñ\82.",
        "apr": "Tуш.",
        "may": "Бек.",
        "jun": "Аьт.",
-       "jul": "КӀим.",
+       "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|1=Катаг|Катагаш}}",
-       "category_header": "\"$1\" Катагачар оагӀувнаш",
+       "category_header": "\"$1\" Катага чура оаг|онаш",
        "subcategories": "Чуракатагаш",
-       "category-media-header": "\"$1\" Катагачар паьлаш",
-       "category-empty": "''Укх катагчоа цхьаккха оагӀувнаш е паьлаш яц.''",
+       "category-media-header": "\"$1\" Катага чура паьлаш",
+       "category-empty": "''Укх катага чу цхьаккха оаг|онаш е паьлаш яц.''",
        "hidden-categories": "{{PLURAL:$1|1=Къайла катаг|Къайла катагаш}}",
        "hidden-category-category": "Къайла катагаш",
-       "category-subcat-count": "{{PLURAL:$2|Ð\99ола ÐºÐ°Ñ\82аг Ñ\82Ó\80еÑ\85Ñ\8cаÑ\80а Ð±Ñ\83Ñ\85каÑ\82аг Ñ\87Ñ\83лоаÑ\86а.|{{PLURAL:$1|1=$1 Ð±Ñ\83Ñ\85каÑ\82аг Ñ\85Ñ\8cаÑ\85Ñ\8cекÑ\85а Ñ\8f|$1 Ð±Ñ\83Ñ\85каÑ\82агаÑ\88 Ñ\85Ñ\8cаÑ\85Ñ\8cекÑ\85а Ñ\8f}} $2 Ð¹Ð¾Ð»Ð°Ñ\87аÑ\80а.}}",
-       "category-subcat-count-limited": "Укх катагий {{PLURAL:$1|1=$1 кӀалкатаг|$1 кӀалкатагаш}}.",
-       "category-article-count": "{{PLURAL:$2|Ð\99ола Ñ\86аÑ\82ег Ñ\86Ñ\85Ñ\8cа Ð¾Ð°Ð³Ó\80Ñ\83в Ð¼Ð°Ñ\80а Ñ\87Ñ\83лоаÑ\86аÑ\86.|{{PLURAL:$1|1=$1 Ð¾Ð°Ð³Ó\80Ñ\83в Ñ\85Ñ\8cаÑ\85екÑ\85а Ñ\8f|$1 Ð¾Ð°Ð³Ó\80Ñ\83внаÑ\88 Ñ\85Ñ\8cаÑ\85екÑ\85а Ñ\8f}} Ñ\83кÑ\85 Ñ\86аÑ\82ега $2 Ð¹Ð¾Ð»Ð°Ñ\87аÑ\80ах.}}",
-       "category-article-count-limited": "Укх катагач {{PLURAL:$1|1=$1 оагӀув|$1 оагӀувнаш}}.",
-       "category-file-count": "{{PLURAL:$2|Укх цатего ца паьла мара чулоацац.|{{PLURAL:$1|1=$1 паьла хьахьекха я|$1 паьлаш хьахьекха я}} укх цатегий $2 долачаьрахь.}}",
-       "category-file-count-limited": "Укх катагач {{PLURAL:$1|1=$1 паьл|$1 паьлаш}}.",
-       "listingcontinuesabbrev": "дӀахо",
-       "index-category": "ДIахьожаман оагӀувнаш",
-       "noindex-category": "ДIахьожаманза оагӀувнаш",
-       "broken-file-category": "Ð\91олÑ\85беÑ\88 Ð¹Ð¾Ð°Ñ\86а Ð¿Ð°Ñ\8cла Ó\80инкаÑ\88Ñ\86а Ð¾Ð°Ð³Ó\80Ñ\83внаш",
+       "category-subcat-count": "{{PLURAL:$2|УкÑ\85 ÐºÐ°Ñ\82агa Ñ\82|еÑ\85Ñ\8cаÑ\80а Ð±Ñ\83Ñ\85каÑ\82аг Ñ\87Ñ\83лоаÑ\86.|{{PLURAL:$1|1=$1 Ð±Ñ\83Ñ\85каÑ\82аг Ñ\85Ñ\8cаÑ\85Ñ\8cекÑ\85а Ñ\8f|$1 Ð±Ñ\83Ñ\85каÑ\82агаÑ\88 Ñ\85Ñ\8cаÑ\85Ñ\8cекÑ\85а Ñ\8f}} $2 Ð¹Ð¾Ð»Ð°Ñ\87аÑ\80ex.}}",
+       "category-subcat-count-limited": "Укх катагa чу {{PLURAL:$1|1=$1 к|алкатаг|$1 к|алкатагаш}}.",
+       "category-article-count": "{{PLURAL:$2|УкÑ\85 ÐºÐ°Ñ\82ага Ñ\86Ñ\85Ñ\8cа Ð¾Ð°Ð³|Ñ\83в Ð¼Ð°Ñ\80а Ñ\87Ñ\83лоаÑ\86аÑ\86.|{{PLURAL:$1|1=$1 Ð¾Ð°Ð³|Ñ\83в Ñ\85Ñ\8cаÑ\85екÑ\85а Ñ\8f|$1 Ð¾Ð°Ð³|oнаÑ\88 Ñ\85Ñ\8cаÑ\85екÑ\85а Ñ\8f}} Ñ\83кÑ\85 ÐºÐ°Ñ\82ага $2 Ð¹Ð¾Ð»Ð°Ñ\87аÑ\80eх.}}",
+       "category-article-count-limited": "Укх катага чу {{PLURAL:$1|1=$1 оаг|ув|$1 оаг|oнаш}}.",
+       "category-file-count": "{{PLURAL:$2|Укх катаг чу цхьа лурдар мара дац.|{{PLURAL:$1|1=$1 лурдар хьахьекха я|$1 лурдараш хьахьекха я}} укх катагa $2 долачаьрeх.}}",
+       "category-file-count-limited": "Укх катага чу {{PLURAL:$1|1=$1 лурдар|$1 лурдараш}}.",
+       "listingcontinuesabbrev": "д|ахо",
+       "index-category": "Д|ахьожама оаг|онаш",
+       "noindex-category": "Д|ахьожаманза оаг|онаш",
+       "broken-file-category": "Ð\9fаÑ\8cла Ñ\85Ñ\8cожадеÑ\80гаÑ\88Ñ\86а Ð±Ð¾Ð»Ñ\85беÑ\88 Ð¹Ð¾Ð°Ñ\86а Ð¾Ð°Ð³|онаш",
        "about": "Лоацам",
        "article": "Йоазув",
-       "newwindow": "(керда кора)",
-       "cancel": "Юхавалa/ялa",
-       "moredotdotdot": "ДӀахо",
-       "mypage": "Са оагӀув",
-       "mytalk": "Са дувцама оагӀув",
-       "anontalk": "Укх IP-моттига дувцам",
-       "navigation": "Никътохкарг",
+       "newwindow": "(кердача коре)",
+       "cancel": "Эшац",
+       "moredotdotdot": "Д|ахо",
+       "morenotlisted": "Ер |ояздар хьалдиззанз да.",
+       "mypage": "Oаг|ув",
+       "mytalk": "Дувцам",
+       "anontalk": "Укх IP-меттига дувцам",
+       "navigation": "Наькъатохкарг",
        "and": "&#32;кхы",
        "qbfind": "Лахар",
-       "qbbrowse": "БӀаргтасса",
+       "qbbrowse": "Б|аргтасса",
        "qbedit": "Хувца",
-       "qbpageoptions": "ОагӀува оттамаш",
+       "qbpageoptions": "Оаг|он оттамаш",
        "qbmyoptions": "Са оттамаш",
-       "faq": "Каст-каста хаттараш",
-       "faqpage": "Project:Каст-каста хаттараш",
-       "actions": "ДулархIамаш",
-       "namespaces": "ЦӀерий аренаш",
-       "variants": "Доштайпарленаш",
-       "errorpagetitle": "ГӀалат",
-       "returnto": "$1 оагӀув тӀа юхавалар/ялар",
+       "faq": "КТХ",
+       "faqpage": "Project:КТХ",
+       "actions": "Х|амдараш",
+       "namespaces": "Ц|ерий аренаш",
+       "variants": "Дешкепаш",
+       "navigation-heading": "Наькъагойтара хоржаг|ирс",
+       "errorpagetitle": "Г|алат",
+       "returnto": "цу $1 оаг|он т|а юхаг|о",
        "tagline": "Кечал укхазара я {{SITENAME}}",
        "help": "Куцтохкам",
        "search": "Лахаp",
-       "searchbutton": "Ð¥Ñ\8cалаÑ\85а",
-       "go": "Дехьа гӀо",
-       "searcharticle": "Дехьа гӀо",
-       "history": "искар",
-       "history_short": "Ð\98Ñ\81кар",
+       "searchbutton": "Ð\9bаÑ\85аÑ\80",
+       "go": "Дехьа г|о",
+       "searcharticle": "Дехьа г|о",
+       "history": "тархьар",
+       "history_short": "ТаÑ\80Ñ\85Ñ\8cар",
        "updatedmarker": "Со ханача денца хувцамаш хиннaд",
-       "printableversion": "Каьхатзарбане доржам",
-       "permalink": "Даим латта Ӏинк",
-       "print": "Каьхат арадаккха",
-       "view": "БӀаргтассам",
+       "printableversion": "Кепатохара нийсхьал",
+       "permalink": "Даиман латташ йола хьожадерг",
+       "print": "Кепатохар",
+       "view": "Б|аргтассам",
+       "view-foreign": "Мазаоаг|он чу $1 хьажа",
        "edit": "Хувца",
        "create": "Хьаде",
-       "editthispage": "Ер оагӀув хувца",
-       "create-this-page": "Ep oагӀув хьае",
-       "delete": "ДӀадаккха",
-       "deletethispage": "Ер оагӀув дӀаяьккха",
+       "editthispage": "Ер оаг|ув хувца",
+       "create-this-page": "Ep oаг|ув хьае",
+       "delete": "Д|аяккха",
+       "deletethispage": "Ер оаг|ув д|аяьккха",
+       "undeletethispage": "Ер оаг|ув д|аяккханз йита",
        "undelete_short": "Меттаоттае {{PLURAL:$1|1=хувцам|$1 хувцамаш}}",
-       "viewdeleted_short": "БӀаргтасса {{PLURAL:$1|1=дӀадаьккха хувцам тӀа|$1 дӀадаьккха хувцамаш тӀа}}",
+       "viewdeleted_short": "Б|аргтасса {{PLURAL:$1|1=д|адаьккха хувцам|$1 д|адаьккха хувцамаш}}",
        "protect": "Лораде",
        "protect_change": "хувца",
-       "protectthispage": "Лорае ер оагӀув",
+       "protectthispage": "Лорае ер оаг|ув",
        "unprotect": "Лорам хувца",
        "unprotectthispage": "Лорам хувца",
        "newpage": "Керда оагӀув",
-       "talkpage": "Укх оагӀув тӀа дувцам бе",
+       "talkpage": "Укх оаг|он т|а дувцам бе",
        "talkpagelinktext": "дувцам",
-       "specialpage": "ГӀулакха оагӀув",
-       "personaltools": "Са гӀорсаш",
-       "articlepage": "Йоазув тӀа бӀаргтасса",
+       "specialpage": "Г|улакхадара оаг|ув",
+       "personaltools": "Са грсаш",
+       "articlepage": "Йоазон т|а б|аргтасса",
        "talk": "Дувцам",
        "views": "БӀаргтассамаш",
        "toolbox": "ГӀирсаш",
-       "userpage": "Ð\94акÑ\8aалаÑ\8cÑ\86аÑ\87Ñ\83нна Ð¾Ð°Ð³Ó\80Ñ\83ве Ð±Ó\80аргтасса",
-       "projectpage": "Хьахьоадайтама оагӀуве бӀаргтасса",
-       "imagepage": "Ð\9fаÑ\8cла Ð¾Ð°Ð³Ó\80Ñ\83в Ñ\82Ó\80а Ð±Ó\80аргтасса",
-       "mediawikipage": "Xоаман оагӀув хьахьокха",
-       "templatepage": "ЧӀабала оагӀув тӀа бӀаргтасса",
+       "userpage": "Ð\94оакÑ\8aоÑ\88Ñ\85оÑ\87Ñ\83н Ð¾Ð°Ð³|он Ñ\82|а Ð±|аргтасса",
+       "projectpage": "Хьахьоадайтама оаг|oн т|а б|аргтасса",
+       "imagepage": "Ð\9bÑ\83Ñ\80даÑ\80а Ð¾Ð°Ð³|oн Ñ\82|а Ð±|аргтасса",
+       "mediawikipage": "Xоаман оаг|ув хьахьокха",
+       "templatepage": "Ч|абала оаг|oн т|а б|аргтасса",
        "viewhelppage": "Куцтохкам беха",
-       "categorypage": "Катага оагӀув тӀа бӀаргтасса",
-       "viewtalkpage": "Дувцамага бӀаргтасса",
-       "otherlanguages": "Кхыча меттал",
-       "redirectedfrom": "($1 тӀера хьадейта да)",
-       "redirectpagesub": "ДӀа-хьа дайта оагӀув",
-       "lastmodifiedat": "Укх оагӀув тӀехьара  хувцам: $2, $1.",
-       "viewcount": "Укх оагӀув тӀа бӀаргтасса хиннад {{PLURAL:$1|1=цхьазза|$1 шозза}}.",
-       "protectedpage": "Лорама оагӀув",
-       "jumpto": "Укхаза дехьа гӀо:",
-       "jumptonavigation": "никътохкарг",
-       "jumptosearch": "леха",
+       "categorypage": "Катага оаг|oн т|а б|аргтасса",
+       "viewtalkpage": "Дувцамага б|аргтасса",
+       "otherlanguages": "Кхыча меттаех",
+       "redirectedfrom": "($1 т|aра хьадейта да)",
+       "redirectpagesub": "Д|а-хьа дайта оаг|ув",
+       "redirectto": "Д|ахьожаде укх т|а:",
+       "lastmodifiedat": "Укх оаг|oн т|ехьара  хувцам: $2, $1.",
+       "viewcount": "Укх оаг|oн т|а б|аргтассаб {{PLURAL:$1|цхьааца\n|$1 times}}. {{PLURAL:$1|1=цхьазза|$1за}}.",
+       "protectedpage": "Лорама оаг|ув",
+       "jumpto": "Укхаза дехьаг|о:",
+       "jumptonavigation": "наькъатоxкар",
+       "jumptosearch": "лaхаp",
        "pool-timeout": "ЧIегатохара сабаран ха чакхаяьннай",
        "pool-queuefull": "Хаттарий цӀа хьалдизад",
        "pool-errorunknown": "Довзаш доаца гӀалат",
+       "poolcounter-usage-error": "Лелдара г|алат: $1",
        "aboutsite": "Лоацам {{SITENAME}}",
        "aboutpage": "Project:Лоацам",
        "copyright": "$1 чулоацамаца тIакхоачаш да.",
        "hidetoc": "къайладаккха",
        "collapsible-collapse": "чудерзаде",
        "collapsible-expand": "хьадоаржаде",
+       "confirmable-yes": "X|аа",
+       "confirmable-no": "A",
        "thisisdeleted": "$1 бӀаргтасса е юхаметтаоттаде?",
        "viewdeleted": "$1 бӀаргтасса?",
-       "restorelink": "{{PLURAL:$1|1=дӀаяьккха хувцам|$1 дӀаяьккха хувцамаш}}",
+       "restorelink": "{{PLURAL:$1|1=д|адaьккха хувцам|$1 д|адaьккха хувцамаш}}",
        "feedlinks": "Цу тайпара:",
        "site-rss-feed": "$1 RSS мугӀ",
        "site-atom-feed": "$1 Atom мугӀ",
        "nosuchaction": "Цу тайпара дулархIам бац",
        "nosuchspecialpage": "Изза мо гӀон оагӀув яц",
        "error": "ГӀалат",
+       "databaseerror-query": "Дехар: $1",
+       "databaseerror-function": "Белхма|ан: $1",
+       "databaseerror-error": "Г|алат: $1",
        "missing-article": "Кораде дезаш хинна оагӀувни яздам корадаьдац «$1» $2.\n\nИз мо гӀалат нийсалуш хула, саг тишъенна Ӏинкаца, д|адаьккха дола оагӀувни хувца искара тӀа чувала гӀертача.\n\nНаггахь санна из иштта децe, шоана гӀорса Ӏалаш деча гӀалат кораяь хила мега.\nДехар да, [[Special:ListUsers/sysop|мазакулгалхочоа]] хоам бе, URL хьахьокхаш.",
        "missingarticle-rev": "(бӀаргоагӀув № $1)",
+       "missingarticle-diff": "(башх: $1, $2)",
        "internalerror": "Чура гӀалат",
        "internalerror_info": "Чура гӀалат: $1",
        "cannotdelete-title": "ОагIув дIаяккха йиш яц \"$1\"",
        "badtitletext": "Дехаш дола оагӀувни цӀи, нийса яц, яьсса я е меттаюкъара е массаюкъара цӀи харцахь я. ЦӀера юкъе мегаш доаца харакъаш нийсаденна хила мегаш да.",
        "viewsource": "БIаргтассам",
        "actionthrottled": "Сихален овзамал",
-       "protectedpagetext": "Ð¥Ñ\83вÑ\86аман Ð±ÐµÐ»Ñ\85аÑ\88 Ð´Ð¾Ð»Ð°Ñ\88 ÐµÑ\80 Ð¾Ð°Ð³IÑ\83в ÐºÑ\8aайла Ñ\8f.",
+       "protectedpagetext": "Ð\95Ñ\80 Ð¾Ð°Ð³|Ñ\83в ÐºÑ\8aайла Ñ\8f Ñ\85Ñ\83вÑ\86амаÑ\88 Ð´ÐµÑ\80гдоаÑ\86аÑ\88 Ðµ ÐºÑ\85Ñ\8b Ð´Ð¾Ð»Ð° Ñ\85|амдаÑ\80аÑ\88.",
        "virus-unknownscanner": "довзашдоаца мазаундохьалург:",
+       "welcomeuser": "Маьрша доаг|алд, $1!",
        "yourname": "Дакъалаьцархочунна цӀи:",
        "yourpassword": "КъайладIоагӀа:",
        "yourpasswordagain": "КъайладIоагӀа юха Ӏоязаде:",
        "userlogin-resetlink": "Чувала/яла цӀии дIоагӀаи дийцаденнадий?",
        "createaccountmail": "КъайладIоагIа д-хоамнец хьадайта",
        "createaccountreason": "Бахьан:",
+       "createacct-reason": "Бахьан",
        "badretype": "Оаша яьккха дIоагIий цIераш шоайл таралуш яц.",
        "loginerror": "Дакъалаьцархочун цIи нийса яц",
-       "mailmypassword": "Керда къайладIоагӀа хьаэца",
+       "mailmypassword": "Керда къайлад|оаг|а эца",
        "mailerror": "Хоам дIабохьийташ гIалат даьннад: $1",
        "emailconfirmlink": "Доаржален хоамни хьожадорг дIачIоагIаде",
        "loginlanguagelabel": "Мотт: $1",
        "rev-delundel": "хьахьокха/къайлаяьккха",
        "rev-showdeleted": "хьахьокха",
        "revdelete-show-file-submit": "XӀаа",
-       "revdelete-radio-set": "XӀаа",
-       "revdelete-radio-unset": "A",
+       "revdelete-radio-set": "Къайла",
+       "revdelete-radio-unset": "Гуш йола",
        "revdelete-log": "Бахьан",
        "revdel-restore": "Кустгойтам хувца",
        "pagehist": "ОагӀува искар",
        "search-section": " (дакъа $1)",
        "search-suggest": "Iа лохар из хила мега: $1",
        "search-interwiki-caption": "Гаргалон хьахьоадайтамаш",
-       "search-interwiki-default": "$1 Ñ\82оламÑ\87аш:",
+       "search-interwiki-default": "$1 Ñ\85Ñ\8cаÑ\85иннаÑ\80аш:",
        "search-interwiki-more": "(кха)",
        "search-relatedarticle": "шоайл дола",
        "searchrelated": "гаргара",
        "timezoneregion-europe": "Аьроп",
        "timezoneregion-indian": "ХIинда форд",
        "timezoneregion-pacific": "Тийна форд",
-       "prefs-searchoptions": "ТоÑ\85кама Ð¾Ñ\82Ñ\82амаÑ\88",
+       "prefs-searchoptions": "Ð\9bаÑ\85аÑ\80",
        "prefs-files": "Паьлаш",
        "youremail": "Д-хоамни:",
-       "username": "Дакъалаьцархочунна цIи:",
+       "username": "{{GENDER:$1|Доакъошхочун ц|и}}:",
        "yourrealname": "Шун цIи:",
        "yourlanguage": "Мотт:",
-       "gender-male": "Ма",
-       "gender-female": "Ð\9aÑ\85ал",
+       "gender-male": "Массаоаг|онаш нийсaеш ва из",
+       "gender-female": "Ð\9cаÑ\81Ñ\81аоаг|онаÑ\88 Ð½Ð¸Ð¹Ñ\81аеÑ\88 Ñ\8f Ð¸Ð·",
        "email": "Д-хоамни",
        "prefs-help-email": "Д-хоамни моттиг ала эшаш дац, амма новкъа даца, наггахь санна къайладIоагIа шоана дийцалой, цу тIа хьатIадайтаргда.",
        "prefs-help-email-others": "Кхыбола дакъалаьцархоша шоаца бувзам я йийшхургья шун оагIува тIа гIолла, д-хоамни хьаела ца езаш.",
        "whatlinkshere-hidelinks": "$1 Iинкаш",
        "whatlinkshere-hideimages": "$1 суртIинкаш",
        "whatlinkshere-filters": "ЦIенъераш",
-       "blockip": "Ð\94акÑ\8aалаÑ\8cÑ\86аÑ\80Ñ\85оÑ\87Ñ\83нна Ñ\87Iега бола",
+       "blockip": "УкÑ\85 {{GENDER:$1|доакÑ\8aоÑ\88Ñ\85оÑ\87оа}} Ñ\87|ега бола",
        "ipboptions": "2 сахьат:2 hours,1 ди:1 day,3 ди:3 days,1 кIира:1 week,2 кIира:2 weeks,1 бутт:1 month,3 бутт:3 months,6 бутт:6 months,1 шу:1 year,сиха ца луш:infinite",
        "ipblocklist": "ЧIега бела дакъалаьцархой",
        "blocklink": "чIегa тоха",
index 0696ba7..10e2d8f 100644 (file)
@@ -78,7 +78,8 @@
                        "Elitre",
                        "Laurentius",
                        "Macofe",
-                       "Ricordisamoa"
+                       "Ricordisamoa",
+                       "Horcrux92"
                ]
        },
        "tog-underline": "Sottolinea i collegamenti:",
        "prefs-personal": "Profilo utente",
        "prefs-rc": "Ultime modifiche",
        "prefs-watchlist": "Osservati speciali",
+       "prefs-editwatchlist": "Modifica osservati speciali",
+       "prefs-editwatchlist-label": "Modifica le pagine della tua watchlist:",
+       "prefs-editwatchlist-edit": "Visualizza e rimuovi titoli sulla tua watchlist",
+       "prefs-editwatchlist-raw": "Modifica la lista in formato testo",
+       "prefs-editwatchlist-clear": "Cancella la tua watchlist",
        "prefs-watchlist-days": "Numero di giorni da mostrare negli osservati speciali:",
        "prefs-watchlist-days-max": "Massimo $1 {{PLURAL:$1|giorno|giorni}}",
        "prefs-watchlist-edits": "Numero di modifiche da mostrare con le funzioni avanzate:",
        "right-override-export-depth": "Esporta le pagine includendo le pagine collegate fino ad una profondità di 5",
        "right-sendemail": "Invia email ad altri utenti",
        "right-passwordreset": "Vede i messaggi di reimpostazione della password",
+       "right-managechangetags": "Crea ed elimina dal database i [[Special:Tags|tag]]",
        "newuserlogpage": "Nuovi utenti",
        "newuserlogpagetext": "Di seguito sono elencate le utenze di nuova creazione.",
        "rightslog": "Diritti degli utenti",
        "action-viewmyprivateinfo": "vedere i propri dati personali",
        "action-editmyprivateinfo": "modificare i propri dati personali",
        "action-editcontentmodel": "modificare il modello di contenuto di una pagina",
+       "action-managechangetags": "crea ed elimina i tag dal database",
        "nchanges": "$1 {{PLURAL:$1|modifica|modifiche}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|dall'ultima visita}}",
        "enhancedrc-history": "cronologia",
        "tooltip-pt-mycontris": "Elenco dei tuoi contributi",
        "tooltip-pt-login": "La registrazione è consigliata, anche se non obbligatoria",
        "tooltip-pt-logout": "Uscita (logout)",
-       "tooltip-pt-createaccount": "Siete incoraggiati a creare un'utenza ed accedere; tuttavia, non è obbligatorio",
+       "tooltip-pt-createaccount": "Si consiglia di registrarsi e di effettuare l'accesso, anche se non è obbligatorio",
        "tooltip-ca-talk": "Vedi le discussioni relative a questa pagina",
        "tooltip-ca-edit": "Puoi modificare questa pagina. Per favore usa il pulsante di anteprima prima di salvare",
        "tooltip-ca-addsection": "Inizia una nuova sezione",
        "tooltip-t-recentchangeslinked": "Elenco delle ultime modifiche alle pagine collegate a questa",
        "tooltip-feed-rss": "Feed RSS per questa pagina",
        "tooltip-feed-atom": "Feed Atom per questa pagina",
-       "tooltip-t-contributions": "Lista dei contributi di questo utente",
+       "tooltip-t-contributions": "Elenco dei contributi di questo utente",
        "tooltip-t-emailuser": "Invia un messaggio email a questo utente",
        "tooltip-t-info": "Ulteriori informazioni su questa pagina",
        "tooltip-t-upload": "Carica file multimediali",
-       "tooltip-t-specialpages": "Lista di tutte le pagine speciali",
+       "tooltip-t-specialpages": "Elenco di tutte le pagine speciali",
        "tooltip-t-print": "Versione stampabile di questa pagina",
        "tooltip-t-permalink": "Collegamento permanente a questa versione della pagina",
        "tooltip-ca-nstab-main": "Vedi la voce",
        "spam_reverting": "Ripristinata l'ultima versione priva di collegamenti a $1",
        "spam_blanking": "Pagina svuotata, tutte le versioni contenevano collegamenti a $1",
        "spam_deleting": "Pagina cancellata, tutte le versioni contenevano collegamenti a $1",
-       "simpleantispam-label": "Controllo anti-spam.\n'''NON''' riempire!",
+       "simpleantispam-label": "Controllo anti-spam.\n<strong>NON</strong> compilare!",
        "pageinfo-title": "Informazioni per \"$1\"",
        "pageinfo-not-current": "Spiacente, ma è impossibile fornire quest'informazione per vecchie versioni.",
        "pageinfo-header-basic": "Informazioni di base",
        "tags-tag": "Nome dell'etichetta",
        "tags-display-header": "Aspetto nella lista delle modifiche",
        "tags-description-header": "Descrizione completa del significato",
+       "tags-source-header": "Sorgente",
        "tags-active-header": "Attivo?",
        "tags-hitcount-header": "Modifiche che hanno etichetta",
+       "tags-actions-header": "Azioni",
        "tags-active-yes": "Sì",
        "tags-active-no": "No",
+       "tags-source-extension": "Definito da un'estensione",
+       "tags-source-manual": "Applicato manualmente da utenti e bot",
+       "tags-source-none": "Non più in uso",
        "tags-edit": "modifica",
+       "tags-delete": "cancella",
+       "tags-activate": "attiva",
+       "tags-deactivate": "disattiva",
        "tags-hitcount": "$1 {{PLURAL:$1|modifica|modifiche}}",
+       "tags-manage-no-permission": "Non hai il permesso di gestire il cambiamento tag.",
+       "tags-create-heading": "Crea un nuovo tag",
+       "tags-create-explanation": "Per impostazione predefinita, i tag appena creati saranno disponibili per l'utilizzo di utenti e bot.",
+       "tags-create-tag-name": "Nome del tag:",
+       "tags-create-reason": "Motivo:",
+       "tags-create-submit": "Crea",
+       "tags-create-no-name": "È necessario specificare un nome di tag.",
+       "tags-create-invalid-chars": "I nomi dei tag non devono contenere virgole (<code>,</code>) o barre (<code>/</code>).",
+       "tags-create-invalid-title-chars": "I nomi dei tag non devono contenere caratteri che non possono essere utilizzati nei titoli delle pagine.",
+       "tags-create-already-exists": "Il tag \"$1\" esiste già.",
+       "tags-create-warnings-below": "Desideri continuare a creare il tag?",
+       "tags-delete-title": "Elimina tag",
+       "tags-delete-explanation-initial": "Stai per eliminare il tag \"$1\" dal database.",
+       "tags-delete-explanation-warning": "Questa azione è <strong>irreversibile</strong> e <strong>non può essere annullata</strong>, nemmeno da amministratori di database. Accertati che questo sia davvero il tag che intendi eliminare.",
+       "tags-delete-reason": "Motivo:",
+       "tags-delete-submit": "Elimina irreversibilmente questo tag",
+       "tags-delete-not-allowed": "I tag definiti da un'estensione non possono essere eliminati a meno che ciò non sia specificamente permesso dall'estensione.",
+       "tags-delete-not-found": "Il tag \"$1\" non esiste.",
+       "tags-delete-too-many-uses": "Il tag \"$1\" è applicato a più di $2 {{PLURAL:$2|revisione|revisioni}}, il che significa che non può essere eliminato.",
+       "tags-delete-warnings-after-delete": "Il tag \"$1\" è stato eliminato con successo, ma fai attenzione {{PLURAL:$2|al seguente avviso|ai seguenti avvisi}}:",
+       "tags-activate-title": "Attiva tag",
+       "tags-activate-question": "Stai per attivare il tag \"$1\".",
+       "tags-activate-reason": "Motivo:",
+       "tags-activate-not-allowed": "Non è possibile attivare il tag \"$1\".",
+       "tags-activate-not-found": "Il tag \"$1\" non esiste.",
+       "tags-activate-submit": "Attiva",
+       "tags-deactivate-title": "Disattiva il tag",
+       "tags-deactivate-question": "Stai per disattivare il tag \"$1\".",
+       "tags-deactivate-reason": "Motivo:",
+       "tags-deactivate-not-allowed": "Non è possibile disattivare il tag \"$1\".",
+       "tags-deactivate-submit": "Disattiva",
        "comparepages": "Confronta le pagine",
        "compare-page1": "Pagina 1",
        "compare-page2": "Pagina 2",
        "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.",
-       "htmlform-invalid-input": "Ci sono problemi con l'input inserito",
+       "htmlform-invalid-input": "Ci sono problemi con i dati inseriti",
        "htmlform-select-badoption": "Il valore specificato non è un'opzione valida.",
        "htmlform-int-invalid": "Il valore specificato non è un intero.",
        "htmlform-float-invalid": "Il valore specificato non è un numero.",
        "logentry-upload-upload": "$1 {{GENDER:$2|ha caricato}} $3",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|ha caricato}} una nuova versione di $3.",
        "logentry-upload-revert": "$1 {{GENDER:$2|ha caricato}} $3",
+       "log-name-managetags": "Registro gestione tag",
+       "logentry-managetags-create": "$1 {{GENERE:$2|ha creato}} il tag \"$4\"",
        "rightsnone": "(nessuno)",
        "revdelete-summary": "oggetto della modifica",
        "feedback-bugornote": "Se si è in grado di descrivere il problema tecnico riscontrato in maniera precisa, [$1 segnalate il bug]. In alternativa, si può usare il modulo semplificato sottostante. Il commento inserito sarà aggiunto alla pagina \"[$3 $2]\", insieme al proprio nome utente e al browser in uso.",
index b290c1d..293ce5d 100644 (file)
@@ -62,7 +62,9 @@
                        "Mfuji",
                        "Takot",
                        "SkyDaisy9",
-                       "Los688"
+                       "Los688",
+                       "朝彦",
+                       "Otokoume"
                ]
        },
        "tog-underline": "リンクの下線:",
        "category-empty": "<em>このカテゴリには現在、ページやメディアが何もありません。</em>",
        "hidden-categories": "{{PLURAL:$1|隠しカテゴリ}}",
        "hidden-category-category": "隠しカテゴリ",
-       "category-subcat-count": "{{PLURAL:$2|このカテゴリには以下の下位カテゴリのみが含まれています。|このカテゴリには $2 下位カテゴリが含まれており、そのうち以下の {{PLURAL:$1|$1 下位カテゴリ}}を表示しています。}}",
-       "category-subcat-count-limited": "このカテゴリには以下の{{PLURAL:$1|下位カテゴリ|​&#32;$1 下位カテゴリ}}が含まれています。",
+       "category-subcat-count": "{{PLURAL:$2|このカテゴリには以下の下位カテゴリのみが含まれています。|このカテゴリには$2件の下位カテゴリが含まれており、そのうち以下の{{PLURAL:$1|下位カテゴリ$1件}}を表示しています。}}",
+       "category-subcat-count-limited": "このカテゴリには以下の{{PLURAL:$1|下位カテゴリ|​&#32;$1件の下位カテゴリ}}が含まれています。",
        "category-article-count": "{{PLURAL:$2|このカテゴリには以下のページのみが含まれています。|このカテゴリには $2 ページが含まれており、そのうち以下の $1 ページを表示しています。}}",
        "category-article-count-limited": "現在のカテゴリには以下の{{PLURAL:$1|ページ|​&#32;$1 ページ}}が含まれています。",
        "category-file-count": "{{PLURAL:$2|このカテゴリには以下のファイルのみが含まれています。|このカテゴリには $2 ファイルが含まれており、そのうち以下の {{PLURAL:$1|$1 ファイル}}を表示しています。}}",
        "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-result-category-size": "{{PLURAL:$1|$1件}} ({{PLURAL:$2|下位カテゴリ$2件}}、{{PLURAL:$3|ファイル$3件}})",
        "search-redirect": "($1からのリダイレクト)",
        "search-section": "($1の節)",
        "search-category": "(カテゴリ $1)",
        "prefs-personal": "利用者情報",
        "prefs-rc": "最近の更新",
        "prefs-watchlist": "ウォッチリスト",
+       "prefs-editwatchlist": "ウォッチリストの編集",
+       "prefs-editwatchlist-edit": "ウォッチリストの表示と除去",
+       "prefs-editwatchlist-clear": "ウォッチリストの全消去",
        "prefs-watchlist-days": "ウォッチリストの表示日数:",
        "prefs-watchlist-days-max": "最大 $1 {{PLURAL:$1|日間}}",
        "prefs-watchlist-edits": "ウォッチリストの展開時の最大表示件数:",
        "action-viewmywatchlist": "自身のウォッチリストの閲覧",
        "action-viewmyprivateinfo": "自分の非公開情報の閲覧",
        "action-editmyprivateinfo": "自分の非公開情報の編集",
+       "action-editcontentmodel": "ページのコンテンツモデルを編集",
        "nchanges": "$1 {{PLURAL:$1|回の変更}}",
        "enhancedrc-since-last-visit": "最終閲覧以降 $1 {{PLURAL:$1|件}}",
        "enhancedrc-history": "履歴",
        "thumbnail-temp-create": "一時的なサムネイルファイルを作成できません",
        "thumbnail-dest-create": "サムネイルを保存先に保存できません",
        "thumbnail_invalid_params": "サムネイル引数が無効です",
+       "thumbnail_toobigimagearea": "$1よりも大きな寸法のファイル",
        "thumbnail_dest_directory": "出力ディレクトリを作成できません",
        "thumbnail_image-type": "対応していない画像形式です",
        "thumbnail_gd-library": "GDライブラリの構成が不完全です: 関数$1が不足",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$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": "インストール済み外装",
        "tags-active-yes": "はい",
        "tags-active-no": "いいえ",
        "tags-edit": "編集",
+       "tags-delete": "削除",
        "tags-hitcount": "$1 {{PLURAL:$1|回の変更}}",
+       "tags-create-heading": "新しいタグを作成",
+       "tags-create-reason": "理由:",
+       "tags-create-submit": "作成",
+       "tags-delete-title": "タグを削除",
+       "tags-delete-reason": "理由:",
+       "tags-activate-reason": "理由:",
+       "tags-deactivate-reason": "理由:",
        "comparepages": "ページの比較",
        "compare-page1": "ページ 1",
        "compare-page2": "ページ 2",
index ea98632..c27d17c 100644 (file)
        "tags-tag": "ტეგის სახელი",
        "tags-display-header": "რედაქტირებების სიაში ცვლილებების წარმოდგენა",
        "tags-description-header": "მნიშვნელობის სრული აღწერა",
+       "tags-source-header": "წყარო",
        "tags-active-header": "აქტიურია?",
        "tags-hitcount-header": "აღნიშნული ცვლილებები",
+       "tags-actions-header": "ქმედებები",
        "tags-active-yes": "დიახ",
        "tags-active-no": "არა",
+       "tags-source-none": "აღარ გამოიყენება",
        "tags-edit": "რედაქტირება",
+       "tags-delete": "წაშლა",
+       "tags-activate": "გააქტიურება",
+       "tags-deactivate": "დეაქტივაცია",
        "tags-hitcount": "$1 ცვლილება",
+       "tags-create-heading": "ახალი ტეგის შექმნა",
+       "tags-create-tag-name": "ტეგის სახელი:",
+       "tags-create-reason": "მიზეზი",
+       "tags-create-submit": "შექმნა",
+       "tags-delete-title": "ტეგის წაშლა",
+       "tags-delete-reason": "მიზეზი:",
+       "tags-activate-title": "ტეგის გააქტიურება",
+       "tags-activate-reason": "მიზეზი:",
+       "tags-activate-submit": "გააქტიურება",
+       "tags-deactivate-title": "ტეგის დეაქტივაცია",
+       "tags-deactivate-reason": "მიზეზი:",
+       "tags-deactivate-submit": "დეაქტივაცია",
        "comparepages": "გვერდების შედარება",
        "compare-page1": "1 გვერდი",
        "compare-page2": "2 გვერდი",
index 8c8088e..f885ba1 100644 (file)
@@ -26,6 +26,7 @@
        "tog-watchdefault": "Мен өңдеген беттерді және файлдарды бақылау тізіміне қосу",
        "tog-watchmoves": "Мен жылжытқан беттерді және файлдарды бақылау тізіміне қосу",
        "tog-watchdeletion": "Мен жойған беттерді және файлдарды бақылау тізіміне қосу",
+       "tog-watchrollback": "Мен шегіндіруін орындаған беттерді бақылау тізіміме қосу",
        "tog-minordefault": "Әдепкі бойынша барлық өңдемелерді шағын деп белгілеу",
        "tog-previewontop": "Қарап шығу аумағын өңдеу терезесінің жоғарғы жағында көрсету",
        "tog-previewonfirst": "Бірінші өңдегенде алдын-ала қарап шығу",
@@ -52,7 +53,7 @@
        "tog-prefershttps": "Кірген кезде қауіпсіз байланысуды әрқашан қолдану",
        "underline-always": "Әрқашан",
        "underline-never": "Ешқашан",
-       "underline-default": "Ó\98депкÑ\96 Ð¼Ó\99неÑ\80 Ð½Ðµ Ð±Ñ\80оÑ\83зер",
+       "underline-default": "Ó\98депкÑ\96 Ð±Ñ\80оÑ\83зеÑ\80 Ð½Ðµ Ð¼Ó\99нер",
        "editfont-style": "Өңдеу аумағындағы қаріп мәнері",
        "editfont-default": "Негізгі браузер",
        "editfont-monospace": "Бірдей енді қаріп",
        "virus-badscanner": "Дұрыс емес ішқұрылым. Белгісіз вирус скайнері: <em>$1</em>",
        "virus-scanfailed": "скайнерлеу орындалмады (коды: $1)",
        "virus-unknownscanner": "белгісіз антивирус:",
-       "logouttext": "<strong>Ð\96үйеден Ñ\88Ñ\8bÒ\9bÑ\82Ñ\8bÒ£Ñ\8bз.</strong>\n\nÐ\9aейбÑ\96Ñ\80 Ð±ÐµÑ\82Ñ\82еÑ\80 Ð±Ñ\80оузеріңіздің кэшін тазартқанша әлі де жүйеге кіріп отырғаныңыздай көрінуі мүмкіндігін ескеріңіз.",
+       "logouttext": "<strong>Ð\96үйеден Ñ\88Ñ\8bÒ\9bÑ\82Ñ\8bÒ£Ñ\8bз.</strong>\n\nÐ\9aейбÑ\96Ñ\80 Ð±ÐµÑ\82Ñ\82еÑ\80 Ð±Ñ\80аузеріңіздің кэшін тазартқанша әлі де жүйеге кіріп отырғаныңыздай көрінуі мүмкіндігін ескеріңіз.",
        "welcomeuser": "Қош келдіңіз, $1!",
        "welcomecreation-msg": "Сіз тіркелдіңіз.\n{{SITENAME}} [[Special:Preferences|баптауларыңызды]] өзіңіз қалауыңыз бойынша өзгерте аласыз.",
        "yourname": "Қатысушы аты:",
        "protectlogtext": "Төменде беттердің қорғау/қорғамау тізімі берілген.\nАғымдағы қорғау әректтер бар беттер үшін [[Special:ProtectedPages|қорғалған беттер тізімін]] қараңыз.",
        "protectedarticle": "«[[$1]]» бетін қорғады",
        "modifiedarticleprotection": "«[[$1]]» бетінің қорғалу деңгейін өзгертті",
-       "unprotectedarticle": "«[[$1]]» Ð´ÐµÐ³ÐµÐ½Ð½ÐµÐ½ Ò\9bоÑ\80Ò\93алÑ\83Ñ\8bн Ð¶Ñ\8bлжÑ\8bÑ\82Ñ\82ы",
+       "unprotectedarticle": "«[[$1]]» Ð±ÐµÑ\82Ñ\96нÑ\96Ò£ Ò\9bоÑ\80Ò\93алÑ\83Ñ\8bн Ð°Ð»Ð°Ñ\81Ñ\82ады",
        "movedarticleprotection": "қорғалу баптауларын «[[$2]]» дегеннен «[[$1]]» дегенге жылжытты",
        "protect-title": "«$1» қорғау деңгейін өзгерту",
        "protect-title-notallowed": "«$1» қорғалу деңгейін қарау",
        "fileduplicatesearch-result-n": "«$1» файлына тең $2 телнұсқасы бар.",
        "fileduplicatesearch-noresults": "\"$1\" атауымен файл табылмады.",
        "specialpages": "Арнайы беттер",
-       "specialpages-note": "* Қалпты арнайы беттер.\n* <span class==\"mw-specialpagerestricted\">Шектелген арнайы беттер.</span>",
+       "specialpages-note": "* Қалыпты арнайы беттер. \n* <span class==\"mw-specialpagerestricted\">Шектелген арнайы беттер.</span>",
        "specialpages-group-maintenance": "Техникалық талқылау есептері",
        "specialpages-group-other": "Тағы басқа арнайы беттер",
        "specialpages-group-login": "Кіру / тіркелу",
index 840219b..6444df3 100644 (file)
@@ -42,7 +42,9 @@
                        "Bluemersen",
                        "Revi",
                        "Namoroka",
-                       "양념파닭"
+                       "양념파닭",
+                       "콩가루",
+                       "Twotwo2019"
                ]
        },
        "tog-underline": "링크에 밑줄:",
        "pool-queuefull": "풀 대기열이 가득 찼습니다",
        "pool-errorunknown": "알 수 없는 오류",
        "pool-servererror": "풀 카운터 서비스는 사용할 수 없습니다 ($1).",
+       "poolcounter-usage-error": "어법 에러: $1",
        "aboutsite": "{{SITENAME}} 소개",
        "aboutpage": "Project:소개",
        "copyright": "내용은 별도로 명시하지 않을 경우 $1에 따라 사용할 수 있습니다.",
        "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'''아직 저장하지 않았습니다!'''",
        "prefs-personal": "사용자 정보",
        "prefs-rc": "최근 바뀜",
        "prefs-watchlist": "주시문서 목록",
+       "prefs-editwatchlist": "주시목록 편집",
+       "prefs-editwatchlist-clear": "주시문서 목록 지우기",
        "prefs-watchlist-days": "주시문서 목록에서 볼 날짜 수:",
        "prefs-watchlist-days-max": "최대 $1{{PLURAL:$1|일}}",
        "prefs-watchlist-edits": "주시문서 목록에서 볼 편집 수:",
        "right-purge": "확인 없이 문서의 캐시를 새로 고침",
        "right-autoconfirmed": "IP 기반의 속도 제한에 영향을 받지 않음",
        "right-bot": "봇의 편집으로 취급",
-       "right-nominornewtalk": "토론 문서에 사소한 편집으로 새 메시지를 보낼 수 없음",
+       "right-nominornewtalk": "토론 문서에서 사소한 편집으로 새 메시지 알림을 보내지 않기",
        "right-apihighlimits": "API 상한 상승",
        "right-writeapi": "쓰기 API 사용",
        "right-delete": "문서 삭제",
        "right-editmyuserjs": "자신의 사용자 자바스크립트 파일 편집하기",
        "right-viewmywatchlist": "자신의 주시문서 목록 보기",
        "right-editmywatchlist": "자신의 주시문서 목록을 편집합니다. 이 권한이 없어도 문서를 추가할 수 있는 권한이 이외에도 있음을 참고하세요.",
-       "right-viewmyprivateinfo": "자신의 개인 데이터 보기 (예를 들어 이메일 주소, 실명)",
-       "right-editmyprivateinfo": "자신의 개인 데이터 편집 (예를 들어 이메일 주소, 실명)",
+       "right-viewmyprivateinfo": "자신의 개인정보 보기 (이메일 주소, 실명 등)",
+       "right-editmyprivateinfo": "자신의 개인정보 편집 (이메일 주소, 실명 등)",
        "right-editmyoptions": "자신의 환경 설정 편집",
        "right-rollback": "특정 문서를 편집한 마지막 사용자의 편집을 신속하게 되돌리기",
        "right-markbotedits": "되돌리기를 봇의 편집으로 취급 가능",
        "right-override-export-depth": "5단계로 링크된 문서를 포함하여 문서를 내보내기",
        "right-sendemail": "다른 사용자에게 이메일 보내기",
        "right-passwordreset": "비밀번호 재설정 이메일을 보기",
+       "right-managechangetags": "데이터베이스에서 [[Special:Tags|태그]]를 만들거나 지우기",
        "newuserlogpage": "사용자 만들기 기록",
        "newuserlogpagetext": "사용자가 만들어진 기록입니다.",
        "rightslog": "사용자 권한 기록",
        "action-sendemail": "이메일 보내기",
        "action-editmywatchlist": "내 주시문서 목록 편집",
        "action-viewmywatchlist": "내 주시문서 목록 보기",
-       "action-viewmyprivateinfo": "내 개인 정보 보기",
-       "action-editmyprivateinfo": "내 개인 정보 편집",
+       "action-viewmyprivateinfo": "자신의 개인정보 보기",
+       "action-editmyprivateinfo": "자신의 개인정보 편집",
        "action-editcontentmodel": "문서의 콘텐츠 모델을 편집",
+       "action-managechangetags": "데이터베이스에서 태그를 만들거나 지울",
        "nchanges": "$1개 {{PLURAL:$1|바뀜}}",
        "enhancedrc-since-last-visit": "{{PLURAL:$1|마지막 방문 이후}} $1개",
        "enhancedrc-history": "역사",
        "uploaderror": "올리기 오류",
        "upload-recreate-warning": "<strong>경고: 해당 이름으로 된 파일이 삭제되었거나 옮겨졌습니다.</strong>\n\n편의를 위해 이 문서에 대한 삭제와 옮기기 기록을 다음과 같이 제공합니다:",
        "uploadtext": "파일을 올리기 위해서는 아래의 양식을 채워주세요.\n[[Special:FileList|파일 목록]]에서 이전에 올라온 파일을 검색할 수 있습니다. [[Special:Log/upload|올리기 기록]]에는 파일이 올라온 기록이 남습니다. 삭제 기록은 [[Special:Log/delete|삭제 기록]]에서 볼 수 있습니다.\n\n문서에 파일을 넣으려면 아래 방법 중 하나를 사용하세요.\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' 파일의 온전한 모양을 사용하고자 할 때\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200픽셀|섬네일|왼쪽|설명]]</nowiki></code>''' 파일의 너비를 200픽셀로 하고 왼쪽 정렬하며 '설명' 이라는 주석을 파일 밑에 달 때\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' 파일을 직접 보여주지 않고 파일로 바로 링크할 때",
-       "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": "파일 이름",
        "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\" 등)가 없습니다.",
        "javascripttest": "자바스크립트 테스트",
        "javascripttest-pagetext-noframework": "이 문서는 자바스크립트 테스트를 실행하기 위한 용도로 할당되어 있습니다.",
        "javascripttest-pagetext-unknownframework": "실험용 프레임워크 \"$1\"를 알 수 없습니다.",
+       "javascripttest-pagetext-unknownaction": "알 수 없는 동작 \"$1\".",
        "javascripttest-pagetext-frameworks": "다음 실험용 프레임워크 중 하나를 선택하세요: $1",
        "javascripttest-pagetext-skins": "실험할 스킨을 선택하세요:",
        "javascripttest-qunit-intro": "mediawiki.org의 [$1 테스트 설명서]를 참고하세요.",
        "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]].",
        "tags-title": "태그",
        "tags-intro": "이 문서는 소프트웨어에서 편집에 대해 표시하는 태그와 그 의미를 설명하는 목록입니다.",
        "tags-tag": "태그 이름",
-       "tags-display-header": "바뀜 목록의 모양",
+       "tags-display-header": "ë°\94ë\80\9c ëª©ë¡\9dì\97\90ì\84\9cì\9d\98 ëª¨ì\96\91",
        "tags-description-header": "태그에 대한 설명",
        "tags-active-header": "활성화 여부",
        "tags-hitcount-header": "태그된 바뀜",
        "tags-active-no": "아니오",
        "tags-edit": "편집",
        "tags-hitcount": "$1개 {{PLURAL:$1|바뀜}}",
+       "tags-create-reason": "이유:",
+       "tags-create-submit": "만들기",
        "comparepages": "문서 비교",
        "compare-page1": "첫 번째 문서",
        "compare-page2": "두 번째 문서",
index 079d75c..c3ab823 100644 (file)
@@ -34,7 +34,7 @@
        "tog-shownumberswatching": "Zeich de Aanzahl Metmaacher, die op die Sigg am oppasse sin",
        "tog-oldsig": "Esu&nbsp;süht&nbsp;Ding „Ongerschreff“&nbsp;us:",
        "tog-fancysig": "Donn de „Ungerschreff“ als Wiki-Tex behandelle (ohne enne automattesche Lengk)",
-       "tog-uselivepreview": "Vör-Aansesch övver AJAX zeije (noch zem Ußprobeere)",
+       "tog-uselivepreview": "Vör-Aansesch övver AJAX zeije",
        "tog-forceeditsummary": "Froch noh, wann en däm Feld „Koot zosammejefass, Quell“ beim Avspeichere nix dren steiht",
        "tog-watchlisthideown": "Dun ming eije Änderunge <strong>nit</strong> en minger Oppassliss aanzeije",
        "tog-watchlisthidebots": "Dun jedes Mol dä Bots ehr Änderunge <strong>nit</strong> en minger Oppassliss zeije",
        "category-media-header": "Dateije en dä Saachjropp „$1“",
        "category-empty": "''En dä Saachjrupp heh sin kein Sigge un kein Dateie.''",
        "hidden-categories": "Verstoche Saachjrupp{{PLURAL:$1||e|e}}",
-       "hidden-category-category": "Verstoche Saachjruppe",
+       "hidden-category-category": "Verstoche Saachjroppe",
        "category-subcat-count": "En dä Saachrupp heh {{PLURAL:$2|es ein Ungerjrupp dren:|sin $2 Ungerjruppe dren, {{PLURAL:$1|un dovun weed heh nur ein|un dovun weede $1 heh|ävver dovun weed heh keine}} aanjezeich:|sinn_er kein Ungerjruppe dren.}}",
        "category-subcat-count-limited": "En dä Saachrupp heh {{PLURAL:$1|es ein Ungerjrupp dren:|sin $1 Ungerjruppe dren:|sin kein Ungerjruppe dren.}}",
        "category-article-count": "En dä Saachjrupp heh {{PLURAL:$2|es ein Sigg dren:|sin $2 Sigge dren, {{PLURAL:$1|un dovun weed heh nur ein|un dovun weede $1 heh|ävver dovun weed heh keine}} aanjezeich:|sin kein Sigge dren.}}",
        "category-file-count": "En dä Saachrupp heh {{PLURAL:$2|es ein Datei dren:|sin $2 Dateie dren, {{PLURAL:$1|un dovun weed heh nur ein|un dovun weede $1 heh|ävver dovun weed heh kein}} aanjezeich:|es kein Datei dren.}}",
        "category-file-count-limited": "En dä Saachrupp heh {{PLURAL:$1|es ein Datei dren:|sin $1 Dateie dren:|es kein Datei dren.}}",
        "listingcontinuesabbrev": "… (wigger)",
-       "index-category": "Sigge, di de Söhkmaschine opnämme sulle",
-       "noindex-category": "Sigge, di de Söhkmaschine nit opnämme sulle",
+       "index-category": "Sigge, di de Söhkmaschihne opnämme sulle",
+       "noindex-category": "Sigge, di de Söhkmaschihne nit opnämme sulle",
        "broken-file-category": "Sigge met kappodde Lengks op Datteije",
        "about": "Övver",
        "article": "Atikkel",
        "view": "Beloore",
        "view-foreign": "Op $1 beloohre",
        "edit": "Ändere",
+       "edit-local": "Aanmärkonge heh em Wikki beärbeide",
        "create": "Aanlääje",
+       "create-local": "Aanmärkonge heh em Wikki derbei donn",
        "editthispage": "De Sigg ändere",
        "create-this-page": "Neu aanläje",
        "delete": "Fottschmieße",
        "pool-timeout": "Zick zem Waade affjeloufe, diweil mer op en Sperr am Waade wohre",
        "pool-queuefull": "De Schlang zom Waade op ene freie Prozäß zom Beärbeide es vull",
        "pool-errorunknown": "Dä Fähler kenne mer nit",
+       "poolcounter-usage-error": "Fähler beim Aanwände: $1",
        "aboutsite": "Övver {{GRAMMAR:Akkusativ|{{ucfirst:{{SITENAME}}}}}}",
        "aboutpage": "Project:Övver {{GRAMMAR:Akkusativ|{{ucfirst:{{SITENAME}}}}}}",
        "copyright": "Dä Enhald steiht unger dä Lezänz $1, ußer wann ußdröklesch jäd anders jesaad es.",
        "filerenameerror": "Kunnt de Datei „$1“ nit op „$2“ ömdäufe.",
        "filedeleteerror": "Kunnt de Datei „$1“ nit fottschmieße.",
        "directorycreateerror": "Dat Verzeichnis „$1“ kunnte mer nit aanläje.",
+       "directoryreadonlyerror": "En dat Verzeischnes „$1“ darf mer nid eren schriive.",
+       "directorynotreadableerror": "En däm Verzeischnes „$1“ kam_mer nix lässe.",
        "filenotfound": "Kunnt de Datei „$1“ nit finge.",
        "unexpected": "Domet hät keiner jerechnet: „$1“=„$2“",
        "formerror": "Dat es donevve jejange: Wor nix, met däm Fomular.",
        "viewsourcetext": "Heh es dä Sigg ier Wikitex zom Belooere un Koppeere:",
        "viewyourtext": "Do kanns Ding Änderonge aan heh dä Sigg beloore un kopeere:",
        "protectedinterface": "Op dä Sigg heh steiht Tex usem Interface vun de Wiki-Soffwär. Dröm es die jäje Änderunge jeschötz, domet keine Mess domet aanjestallt weed.",
-       "editinginterface": "<strong>Opjepass:</strong>\nOp dä Sigg heh schteiht Täx uß de Beehnbovverfläsch vum Wiki. Dröm es\ndi jähje et Ändere jeschöz, domet keine Meß domet jemaat weed.\nNor de Wiki-Köhbeße künne se ändere. Denk dran, heh Ändere deit et\nUssinn un de Wöht ändere, met dänne et Wiki op de Metmaacher un de\nBesöhker drop aankütt!\n\nWann De di en Ding Schprohch övversäze wellß, do jangk op\n<code lang=\"en\" xml:lang=\"en\">[//translatewiki.net/wiki/Main_Page?setlang=ksh translatewiki.net]</code>,\nwoh et MediaWiki en alle Schprohche översaz weedt.\n\nWann De weße wells, wat dä Täx heh bedügg, do häß De en Schangß, dat De op\n<code lang=\"en\" xml:lang=\"en\">//www.mediawiki.org/wiki/Manual:Interface/{{BASEPAGENAMEE}}?setlang=ksh</code>\njet doh drövver fenge kanns, udder op\n<code lang=\"en\" xml:lang=\"en\">//translatewiki.net/wiki/MediaWiki:{{BASEPAGENAMEE}}/qqq?setlang=ksh</code>",
+       "editinginterface": "<strong>Opjepass:</strong>\nOp dä Sigg heh schteiht Täx uß de Beehnbovverfläsch vum Wikki.\nDenk dran, heh Ändere deit et\nUssinn un de Wöht ändere, met dänne et Wiki op de Metmaacher un de\nBesöhker aankütt!",
        "translateinterface": "Övversäzonge för <stron>alle</strong> Wikis jonn blohß op [//translatewiki.net/ translatewiki.net], woh mer MedijaWiki övversaz weed.",
        "cascadeprotected": "Die Sigg es jeschöz, un mer kann se nit ändere. Se es en en Schotz-Kaskad enjebonge, zosamme met dä {{PLURAL:$1|Sigg|Sigge}}:\n$2",
        "namespaceprotected": "Do darfs Sigge em Appachtemang „$1“ nit ändere.",
        "media_tip": "Ene Link op en Tondatei, e Filmche, oder esu jet",
        "sig_tip": "Dinge Naame, med de Uhrzigk unn_em Dattum",
        "hr_tip": "En Querlinnich",
-       "summary": "Koot Zosammejefass, Quell:",
+       "summary": "Koot zosammejefaß, Quäll:",
        "subject": "Üvverschreff - wodröm jeiht et?",
        "minoredit": "Dat es en klein Änderung (mini)",
        "watchthis": "Op die Sigg heh oppasse",
        "preview": "Vör-Ansich",
        "showpreview": "Vör-Aansich zeije",
        "showdiff": "De Ungerscheide zeije",
-       "anoneditwarning": "'''Opjepaß:''' Weil De nit enjelogg bes, weed Ding <i lang=\"en\">IP</i>-Adräß en dä Sigg ier Leß met de Versione faßjehallde wääde.",
+       "anoneditwarning": "'''Opjepaß:''' Weil De nit enjelogg bes, weed Ding <i lang=\"en\" xml:lang=\"en\">IP</i>-Adräß en heh dä Sigg ier Leß met de Väsiohne faßjehallde wääde.\nWann De [$1 enlogge deihs] udder [$2 desch aanmällds], dann wääde Ding Änderonge met dingem Nahme als Metmaacher opjevöhrt.",
        "anonpreviewwarning": "''Weil De nit enjlogg bes, weed Ding <code lang=\"en\">IP</code>-Addräß zoamme met dä neue Version faßjehallde, wann de heh di Sigg avspeichere deihß.''",
        "missingsummary": "<strong>Opjepass:</strong> Do häs nix bei „{{int:summary}}“ enjejovve. Dun noch ens op „{{int:savearticle}}“ klicke, öm Ding Änderunge ohne de Zosammefassung ze Speichere. Ävver besser jiss De do jetz tirek ens jet en!",
+       "selfredirect": "<strong>Opjepaß:</strong> Do wells heh di Sigg op sesch sällver ömleide lohße.\nDat hät zwa keine rääschte Senn, ävver wann De jäz norr_enz op „{{int:savearticle}}“ klecks, weed dat esu jemaat.",
        "missingcommenttext": "Jevv en „Koot Zosammejefass, Quell“ aan!",
        "missingcommentheader": "'''Opjepass:''' Do häs kein Üvverschreff för Dinge Beidrach enjejovve. Wann De noch ens op „{{int:savearticle}}“ dröcks, weed Dinge Beidrach der ohne avjespeichert.",
        "summary-preview": "Vör-Aansich vun „Koot Zosammejefass, Quell“:",
        "content-model-text": "Eijnfache Tex",
        "content-model-javascript": "JavaSkrepp",
        "content-model-css": "CSS",
+       "duplicate-args-category": "Sigge met dubbelt aanjejovve Parramehtere för Schablohne.",
+       "duplicate-args-category-desc": "Sigge met Oprohve vun Schablohne met dubbelt aanjejovve Parramehtere dren, alsu esu jät wi <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> un <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "'''Opjepaß:''' Die Sigg heh määt zovill Opwand met Paaser-Funkßjohne.\n\n{{PLURAL:$2|Eine Oproof|Beß $2 Oproofe|Keine Oproof}} es älaup, {{PLURAL:$1|un eine Oproof|ävver $1 Oproofe|un keine Oproof}} määt di Sigg em Momang.",
        "expensive-parserfunction-category": "Sigge met zovill Opwand en Paaser-Funkßjohne",
        "post-expand-template-inclusion-warning": "Warnung: Heh in di Sigg wääde zo fill Bytes övver Schablone erin jebraat. Nit all di Schablone künne enjbonge wäde.",
        "parser-template-recursion-depth-warning": "Schablone refe sesch zo öff sellver op ($1)",
        "language-converter-depth-warning": "Zoh vill Verschachtelonge (övver $1) beim Täx-Ömwandelle vun eine Schprohch udder Schrevv en en anndere.",
        "node-count-exceeded-category": "Sigge, woh dä <i lang=\"en\" xml:lang=\"en\">node-count</i> övverschredde es",
+       "node-count-exceeded-category-desc": "Di Sigg hät dä <i lang=\"en\" xml:lang=\"en\">node-count</i> övverschredde.",
        "node-count-exceeded-warning": "Heh di Sigg hät dä <i lang=\"en\" xml:lang=\"en\">node-count</i> övverschredde",
        "expansion-depth-exceeded-category": "Sigge, woh de <i lang=\"en\" xml:lang=\"en\">expansion depth</i> övverschredde es",
        "expansion-depth-exceeded-category-desc": "Dat heh es de Saachjropp för Sigge, woh de <i lang=\"en\" xml:lang=\"en\">expansion depth</i> övverschreddde es.",
        "currentrev": "Neuste Version",
        "currentrev-asof": "De neuste Version fum $2 öm $3 Uhr",
        "revisionasof": "De Version vum $2 öm $3 Uhr",
-       "revision-info": "Dat heh es de övverhollte Version $3, {{GENDER:$2|vum|vum|vum Metmaacher|vun dä|vum}} $2 aam $4 öm $5 Uhr afjeshpeichert.",
+       "revision-info": "Väsjohn $3 vum $4 öm $5 Uhr vum {{GENDER:$6|vum|vum|vum Metmaacher|vun dä|vum}} $2.$7",
        "previousrevision": "← De Version dovör zeije",
        "nextrevision": "De Version donoh zeije →",
        "currentrevisionlink": "De neuste Version",
        "history-feed-empty": "De aanjefrochte Sigg jitt et nit. Künnt sin, dat se enzwesche fottjeschmesse udder ömjenannt woode es. Kanns jo ens [[Special:Search|em Wiki söke looße]], öm de zopass, neu Sigge ze finge.",
        "rev-deleted-comment": "(„Koot Zosammejefass, Quell“ usjeblendt)",
        "rev-deleted-user": "(Metmaacher Name usjeblendt)",
-       "rev-deleted-event": "(Logboch-Enndraach fottjenomme)",
+       "rev-deleted-event": "(Eijnzelheijte vom Logboch-Enndraach fottjenomme)",
        "rev-deleted-user-contribs": "[Däm Metmaacher singe Name udder sing <i lang=\"en\">IP</i>-Addräß wood veschtoche, un heh di Änderung douch nit mieh en de Leß met de Beidrääsch op]",
        "rev-deleted-text-permission": "Die Version fun dä Sigg es '''fottjeschmeße'''.\nWann Ehr en [{{FULLURL:{{#spezial:Log}}/delete|page={{FULLPAGENAMEE}}}} {{lcfirst:{{int:deletionlog}}}}] loore doht, künnt Ehr velleisch mieh do drövver lesse.",
+       "rev-suppressed-text-permission": "Di Väsjohn vun dä Sigg es <strong>verschtoche</strong> woode.\nEinzelheite fengk mer en däm [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} Logbohch vum Sigge verschteische].",
        "rev-deleted-text-unhide": "{{int:rev-deleted-text-permission}} Als ene Wiki-Köbes kanns De [$1 se ävver doch bekike], wann De wells.",
        "rev-suppressed-text-unhide": "Die Version fun dä Sigg es '''verschtoche'''.\nWann Ehr en [{{FULLURL:{{#spezial:Log}}/suppress|page={{FULLPAGENAMEE}}}} {{lcfirst:{{int:suppressionlog}}}}] loore doht, künnt Ehr velleisch mieh do drövver lesse.\nAls ene Wiki-Köbes kanns De [$1 se ävver doch bekike], wann De wells.",
        "rev-deleted-text-view": "{{int:rev-deleted-text-permission}} Als ene Wiki-Köbes kanns De se ävver bekike.",
        "revdelete-text-text": "Fottjeschmeße Väsjohne blieve en dä Leß met de vörrije Väsjohne, ävver zom Deil kann de Öffentleschkeit nit mieh drop zohjriehfe.",
        "revdelete-text-file": "Fottjeschmeße Väsjohne vun Datteije blieve en dä Leß met de vörrije Väsjohne, ävver zom Deil kann de Öffentleschkeit nit mieh drop zohjriehfe.",
        "logdelete-text": "Fottjeschmeße Endrääsch en de Logbööscher blieve en dä Leß met de vörrije Väsjohne, ävver zom Deil kann de Öffentleschkeit nit mieh drop zohjriehfe.",
-       "revdelete-text-others": "De Wiki_Kööbeße künne emmer noch drop zohjriefe un künne och wider för alle seeschbaa maache, wat jäz verschtoche es, esu lang kein äxtra Beschränkonge jemaat woodte.",
+       "revdelete-text-others": "De Wiki_Kööbeße künne emmer noch drop zohjriefe un künne och wider för alle seeschbaa maache, wat jäz verschtoche es, esu lang wi kein äxtra Beschränkonge jemaat woodte.",
        "revdelete-confirm": "Bes esu joot un doon dat beschtääteje, un donn domet ongerschriive, dat De dat donn wells, dat De weiß, wat dobei eruß kütt, un dat De dat och noh de [[{{MediaWiki:Policy-url}}|Rääjelle]] deihß.",
        "revdelete-suppress-text": "Dat sullt '''blooß''' jedonn wäde för:\n* onjesäzlesche Aanjaabe\n* unjenehmesch persöhnlesch Daate\n*: ''Aanschreffte, Tellefoon- un ander Nummere, <span lang=\"en\" xml:lang=\"en\">e-mail</span> Adräß, uew.''",
        "revdelete-legend": "Dä öffentlije Zojang enschränke",
        "revdelete-hide-text": "dä Täx vun dä Väsjohn",
        "revdelete-hide-image": "De Enhallt vun däm Beld versteiche",
-       "revdelete-hide-name": "Der Förjang, un och der Enndraach uss_em Logboch, versteiche",
-       "revdelete-hide-comment": "dä Enhald vun „Koot Zosammejefass, Quell“",
+       "revdelete-hide-name": "Der Förjang un sing Parramehtere uss_em Enndraach em Logboch versteiche",
+       "revdelete-hide-comment": "dä Enhald vun „{{int:Summary}}“",
        "revdelete-hide-user": "däm Bearbeider sing <i lang=\"en\" xml:lang=\"en\"IP</i>-Adress oder Metmaacher-Name",
        "revdelete-hide-restricted": "Dun dat och för de Wiki-Köbesse esu maache wie för jede Andere",
        "revdelete-radio-same": "(lohß wi_t eß)",
        "mergehistory-empty": "Mer han kei Versione för zesammezeläje",
        "mergehistory-success": "{{PLURAL:$3|Ein Version es|$3 Versione sen|Kei Version wood}} fun „[[:$1]]“ noh „[[:$2]]“ övverdraare un domet zosamme jelaat.",
        "mergehistory-fail": "Dat Versione zesamme läje is nit müjjelisch. Don ens di Sigge un de Zigge pröfe!",
+       "mergehistory-fail-toobig": "Mieh wi {{PLURAL:$1|ein Väsjohn|$1 Väsjohne|kein Väsjohne}} wöödte zesamme jelaat. Esu vill künne mer nit, un maache mer nit.",
        "mergehistory-no-source": "En Ursprungssigg „$1“ jidd_et nit.",
        "mergehistory-no-destination": "En Zielsigg „$1“ jidd_et nit.",
        "mergehistory-invalid-source": "De Ursprungssigg ier Name moß och ene reschtijje Siggetittel sin.",
        "search-result-category-size": "{{PLURAL:$1|1 Saach|$1 Saache|0 Saache}} ({{PLURAL:$2|1 Ongerjropp|$2 Ongerjroppe|0 Ongerjroppe}}, {{PLURAL:$3|1 Datei|$3 Dateie|0 Dateie}})",
        "search-redirect": "(Ömleitung $1)",
        "search-section": "(Avschnett $1)",
+       "search-category": "({{int:Category}} $1)",
        "search-file-match": "(en dä Dattei dren)",
        "search-suggest": "Häß De „$1“ jemeint?",
        "search-interwiki-caption": "Schwesterprojekte",
        "prefs-personal": "De Enstellunge",
        "prefs-rc": "Neuste Änderonge",
        "prefs-watchlist": "De Oppassliss",
+       "prefs-editwatchlist": "De Oppaßleß beärbeijde",
+       "prefs-editwatchlist-label": "Endrähsch en Dinge Oppaßleß beärbeijde:",
+       "prefs-editwatchlist-edit": "Siggeövverschreffte en Dinge Oppaßleß belohre un eruß schmiiße:",
+       "prefs-editwatchlist-raw": "De Oppaßleß en rüh beärbeijde:",
+       "prefs-editwatchlist-clear": "Donn Ding Oppaßleß läddesch maache",
        "prefs-watchlist-days": "Aanzahl Daare för en ming Oppassliss aanzezeije:",
        "prefs-watchlist-days-max": "Nit mieh wie {{PLURAL:$1|eine Daach|$1 Dääch|keine Daach}}",
        "prefs-watchlist-edits": "Aanzahl Änderunge för en ming verjrößerte Oppassliss aanzezeije:",
        "prefs-tokenwatchlist": "Schlößel",
        "prefs-diffs": "Ongerscheide un Verjliische",
        "prefs-help-prefershttps": "Di Enschtällong kütt eets zom drahre, wann De nähksde Mohl enloggs.",
+       "prefswarning-warning": "Do häs Ding Ennschtällonge verändert, ävver dat noch nit faßjehallde. De moß heh di Sigg met däm Knopp „$1“ verlohße, söns sin Ding Änderonge fott.",
        "prefs-tabs-navigation-hint": "Opjepaß: Met dä Piel-Knöppe kanns de noh rääds un lenks op de Rigger jonn un se ußsöhke.",
        "email-address-validity-valid": "De Addräß fö de <i lang=\"en\">e-mail</i> schingk en Odenung",
        "email-address-validity-invalid": "Jivv en jöltijje Addräß fö de <i lang=\"en\">e-mail</i> en",
        "uploaderror": "Fähler beim Huhlade",
        "upload-recreate-warning": "'''Opjepaß: En Dattei met dämm Name es ömjenannt udder fottjeschmeße woode.'''\n\nDe Logböösher vum Datteie Ömnänne un Fottschmieße saare doh drövver:",
        "uploadtext": "Met däm Formular unge kanns de Belder oder ander Daate huhlade.\nJangk op de [[Special:FileList|Less met de huhjelaade Datteie]], öm esu en Datteie ze beloore udder noh inne ze söhke. De Logbööscher vum [[Special:Log/upload|Huhlaade]] un vum [[Special:Log/delete|Sigge fottschmiiße]] künnte Der och hellefe.\n\nDo kanns dann Ding Werk en Sigge enbinge, met Lengks en dä Aate:\n* <code>'''<nowiki>[[</nowiki>{{ns:file}}:'''''Beldche'''''.jpg]]'''</code> — för di janze Dattei ze zeije, wi se eß,\n* <code>'''<nowiki>[[</nowiki>{{ns:file}}:'''''Beld'''''.svg | '''''200''''' px]]'''</code> — för e Mini-Beldsche met 200&nbsp;Pixelle Breedt ze zeije,\n* <code>'''<nowiki>[[</nowiki>{{ns:file}}:'''''Su süht dat us'''''.png | left | thumb | '''''ene Tex''''' ]]'''</code> — deiht e 200-Pixel-Mini-Beldsche en ene Kaßte aan der lenke (<i lang=\"en\">left</i>) Rand vun dä Sigg un „ene Tex“ onger däm Beldsche,\n* <code>'''<nowiki>[[</nowiki>{{ns:media}}:'''''Esu hürt sich dat aan'''''.ogg]]'''</code> — öm tiräk op en Dattei ze Lenke, ohne se aanzzeije.\nUsführlich met alle Müjjelichkeite fings de dat bei de Hölp.",
-       "upload-permitted": "Nor de Dateitüpe <code>$1</code> sin zojelohße.",
-       "upload-preferred": "De bevörzochte Zoote Dateie: $1.",
-       "upload-prohibited": "Verbodde Zoote Dateie: $1.",
+       "upload-permitted": "{{PLURAL:$2|Bloß dä Datteitüp <code>$1</code> es zohjelohße.|Nor heh di Dateitüpe sin zohjelohße: <code>$1</code>.|Keine Dateitüp es zohjelohße.}}",
+       "upload-preferred": "De bevörzochte Zoot{{PLURAL:$2||e|}} Datei{{PLURAL:$2||je|}}: $1.",
+       "upload-prohibited": "Verbodde Zoot{{PLURAL:$2||e|} Datei{{PLURAL:$2||je|}: $1.",
        "uploadlogpage": "Logboch met de huhjelade Dateie",
        "uploadlogpagetext": "Hee sin de Neuste huhjelade Dateie opjeliss un wä dat jedon hät.\n(En de [[Special:NewFiles|Jalleri met neu Dateie]] kriß De ene Övverbleck med Belldsche)",
        "filename": "Dä Name vun dä Datei",
        "largefileserver": "De Datei es ze jroß. Jrößer wie däm ẞööver sing Enstellung erlaub.",
        "emptyfile": "Wat De hee jetz huhjelade häs, hät kein Daate dren jehatt. Künnt sin, dat De Dich verdon häs, un dä Name wo verkihrt jeschrevve. Luur ens ov De wirklich <strong>die</strong> Datei hee huhlade wells.",
        "windows-nonascii-filename": "Heh dat Wiki löht kein Datteiname met Sönderzeische zoh.",
-       "fileexists": "Et jitt ald en Datei met däm Name.\nWann De op „Datei avspeichere“ klicks, weed se ersetz.\nBes esu jod  un luur Der <strong>[[:$1]]</strong> aan, wann De nit 100% secher bes.\n[[$1|thumb]]",
+       "fileexists": "Et jitt ald en Dattei met däm Nahme. Bes esu johd un lohr Der <strong>[[:$1]]</strong> aan, wann De nit secher bes, da De se ändere wells.\n[[$1|thumb]]",
        "filepageexists": "En Sigg övver di Datei met däm Tittel <strong>[[:$1]]</strong> es ald doh, ävver en Datei met däm Name ham_mer nit. Dinge Tex kütt nit automattesch op di Sigg övver di Dattei. Di Sigg moß De wann nüüdesch noch ens extra ändere.\n[[$1|thumb]]",
        "fileexists-extension": "Mer han ald en Dattei, di bahl jenou esu heijß: [[$2|thumb]]\n* Huh am laade sim_mer: <strong>[[:$1]]</strong>\n* Ald om ßörve eß: <strong>[[:$2]]</strong>\nWels De nit leever ene andere Nahme fö di Datei ußsöhke?",
        "fileexists-thumbnail-yes": "Dat süühd uß, wi wann dat hee en Minni-Beldsche em Breefmarrke-Fommaat (''<span lang=\"en\">thumbnail</span>'') wöhr. [[$1|thumb]]\nDon ens di Dattei <strong>[[:$1]]</strong> prööfe.\nWann dat de Orjinaaljrüß es, do moß keij för dat Beld keij extra Vör-Aansich huhjelade wäde.",
        "license": "Lizenz:",
        "license-header": "Lizänz",
        "nolicense": "Nix usjesöhk",
+       "licenses-edit": "Donn de Lezänzbedengonge verändere udder beärbeide.",
        "license-nopreview": "(Kein Vör-Aansich ze hann)",
-       "upload_source_url": " (richtije öffentlije URL)",
-       "upload_source_file": " (en Datei op Dingem Kompjuter)",
+       "upload_source_url": "(en Dattei med ene öffentlesch zohjänglesche URL)",
+       "upload_source_file": "(en Datei op Dingem Kompjuter)",
        "listfiles-delete": "fottschmieße",
        "listfiles-summary": "Heh sin de huhjelade Dateije opjeleß.",
        "listfiles_search_for": "Sök noh däm Name vun dä Datei:",
        "filedelete-maintenance": "Datteie Fottschmiiße un widder zerök Holle jeiht jez jrad nit, mer hann Waadong.",
        "filedelete-maintenance-title": "Di Dattei künne mer nit fottschmiiße",
        "mimesearch": "Dateije övver dänne ehre <span lang=\"en\">MIME</span>-Tüp söhke",
-       "mimesearch-summary": "Op hee dä {{int:nstab-special}} könne de Dateie noh em <i lang=\"en\">MIME</i>-Tüpp ußjesöök wäde.\nMer moß immer der Medietüp un der Ongertüp aanjevve.\nZem Beispell: <code lang=\"en\">image/jpeg</code>\n— kannß donoh op dä Beschrievungssigge von de Dateie loore.",
+       "mimesearch-summary": "Op hee dä {{int:nstab-special}} könne de Dateie noh em <i lang=\"en\" xml:lang=\"en\" title=\"Multi-Purpose Internet Mail Extensions\">MIME</i>-Tüpp ußjesöhk wähde.\nMer moß der Medijetüp un der Ongertüp aanjevve mem scheive Schtresch derzwesche, zem Bejschpell: <code xml:lang=\"en\" lang=\"en\">image/jpeg</code> udder <code xml:lang=\"en\" lang=\"en\">text/*</code> udder esu.",
        "mimetype": "MIME-Typ:",
        "download": "eronger laade",
        "unwatchedpages": "Sigge, wo keiner drop oppass",
        "statistics-users-active-desc": "Aktiv sin Metmaacher, di {{PLURAL:$1|hück un jesterre|en de läzte $1 Dääsch|hück}} jät jemaat han.",
        "pageswithprop": "Sigge med en beschtemmpte Eijeschaff",
        "pageswithprop-legend": "Sigge med en Eijeschaff",
-       "pageswithprop-text": "Heh di Sigg zeisch Sigge, di en beschtemmpte Eijeschaf han",
+       "pageswithprop-text": "Heh di Sigg zeisch Sigge, di en beschtemmpte Eijeschaff han.",
        "pageswithprop-prop": "Dä name vun dä Eijeschaff:",
        "pageswithprop-submit": "Lohß Jonn!",
        "doubleredirects": "Ömleitunge op Ömleitunge",
        "nviews": "{{PLURAL:$1|Eine Avrof|$1 Avrofe|Keine Avrof}}",
        "nimagelinks": "Weed op {{PLURAL:$1|eine Sigg|$1 Sigge|keine Sigg}} jebruch",
        "ntransclusions": "weed op {{PLURAL:$1|eine Sigg|$1 Sigge|keine Sigg}} jebruch",
-       "specialpage-empty": "Hee en dä Liss es nix dren.",
+       "specialpage-empty": "Heh en dä Leß es nix dren.",
        "lonelypages": "Atikele, wo nix drop link",
        "lonelypagestext": "De Sigge hee noh sin nörjenzwoh ennjebonge un et jonn och kein Linkß drop.",
        "uncategorizedpages": "Atikele, die en kein Saachjrupp sin",
        "wantedpages-badtitle": "Ene onjöltijje Tittel för en Sigg: $1",
        "wantedfiles": "Dateie, di onß noch fähle",
        "wantedfiletext-cat": "Heh di Datteije sin nit doh. Se wääde ävver jebruch, wi wann se doh wööre.\nDatteije uß frembde Sammlonge künne heh opjeleß sin, och wann et se jitt.\nDi sin dann <del>dorschjeschtresche</del>. \nSigge, woh Datteije jebruch wääde sulle, die mer jaa nit han, fengk mer och en dä [[:$1]].",
+       "wantedfiletext-cat-noforeign": "Heh di Datteije sulle jebruch wääde, et jitt se ävver jaa nit.\nSigge, di Datteije oprohfe, di et nit jitt, fengk mer op dä Sigg [[:$1]] opjeleß.",
        "wantedfiletext-nocat": "Heh di Datteije sin nit doh. Se wääde ävver jebruch, wi wann se doh wööre.\nDatteije uß frembde Sammlonge künne heh opjeleß sin, och wann et se jitt.\nDi sin dann <del>dorschjeschtresche</del>.",
+       "wantedfiletext-nocat-noforeign": "Heh di Datteije sulle jebruch wääde, et jitt se ävver jaa nit.",
        "wantedtemplates": "Schablone, die mer noch nit han, die noch jebruch wääde",
-       "mostlinked": "Atikele met de miehste Links drop",
-       "mostlinkedcategories": "Saachjruppe met de miehste Links drop",
-       "mostlinkedtemplates": "Schablone met de miehßte Lenks drop",
+       "mostlinked": "Atikele met de miehste Lenks drop",
+       "mostlinkedcategories": "Saachjroppe met de miehste Lenks drop",
+       "mostlinkedtemplates": "Sigge met de miehßte Oprohfe, di wohanders enjeföhsch wähde",
        "mostcategories": "Atikkele met de miehste Saachjruppe",
-       "mostimages": "Dateie met de miehste Links drop",
+       "mostimages": "Dateije met de miehste Lenks drop",
        "mostinterwikis": "Atikkele met de miehste Engerwikilengks",
        "mostrevisions": "Atikkele met de miehste Änderunge",
        "prefixindex": "All Sigge, dänne ehr Name met enem bestemmte Wood oder Tex aanfängk",
        "pager-older-n": "{{PLURAL:$1|vörrije|vörrije $1}}",
        "suppress": "Versteiche",
        "querypage-disabled": "Heh di Extrasigg es ußjeschalldt, domet dä Server jet winnijer ze brassele hät.",
+       "apihelp": "Hölp för de <i lang=\"en\" xml:lang=\"en\" title=\"Application Programmers Interface\">API</i>",
        "apihelp-no-such-module": "Et Moduhl „$1“ wood nit jefonge.",
        "booksources": "Böcher",
        "booksources-search-legend": "Söök noh Bezochsquelle för Bööcher",
        "speciallogtitlelabel": "Betroffe wohr: (dä Tittel vun ener Sigg udder enem Metmaacher singe Name)",
        "log": "Logböcher ehr Opzeichnunge (all)",
        "all-logs-page": "All de öffentlich Logböcher",
-       "alllogstext": "Dat hee es en jesamte Liss us all dä Logböcher {{GRAMMAR:en|{{SITENAME}}}}.\nDä Logböcher ehre Enhald ka'mer all noh de Aat, de Metmaacher,\noder de Sigge ehr Name, un esu, einzel zoteet aanluure.\nBei de Name moß mer op Jruß- un Kleinschreff aachjävve.",
+       "alllogstext": "Dat heh es en jesampte Less us all dä Logböhscher {{GRAMMAR:en|{{SITENAME}}}}.\nDä Logböhscher ehre Enhald kam_mer all noh de Aat, de Metmaacher,\noder de Sigge ehr Name, un esu, einzel zoteht aanluhre.\nBei dä Name moß mer op Jruß- un Kleinschreff aachjävve.",
        "logempty": "Mer han kein zopaß Endrähsch en däm Logbooch.",
        "log-title-wildcard": "Sök noh Titelle, di aanfange met …",
        "showhideselectedlogentries": "Ußjesöhk Endrääsch verschteische udder zeije",
        "listgrouprights-removegroup-self-all": "Kann sesch sällver uß alle Metmaacherjroppe eruß nämme",
        "listgrouprights-namespaceprotection-header": "Beschrängkonge för Appachtemangs",
        "listgrouprights-namespaceprotection-namespace": "Appachtemang",
+       "trackingcategories": "Saachjroppe för täschnsche Saache ze verfollje.",
+       "trackingcategories-summary": "Op hee dä {{int:nstab-special}} sin Saachjroppe opjeleß, di automattesch vum Wikki jevöllt wähde. Dä iehr Nahme künne övver Veränderonge aan beschtemmpte Täxte em Appachtemang {{ns:8}} faßjelaat wäde.",
+       "trackingcategories-msg": "Saachjropp för täschnsche Saache ze verfollje.",
        "trackingcategories-name": "Dä Nohreesch udder däm Täxschtöck singe Nahme",
        "trackingcategories-desc": "Bedengonge för enjeschloße ze sin",
-       "broken-file-category-desc": "En heh dä Sigg es ene Lengk obb en Dattei, di mer nit han.",
+       "noindex-category-desc": "Di Sigg sull vun de Wäbkrauler Robots un de Söhkmaschihne nit opjenumme wähde, weil dat Zauberwoot <code><nowiki>__NOINDEX__</nowiki></code> dren schteiht un se en enem Appachemang es, woh dat zohjelohße es.",
+       "index-category-desc": "Di Sigg sull vun de Wäbkrauler Robots un de Söhkmaschihne opjenumme wähde, weil dat Zauberwoot <code><nowiki>__INDEX__</nowiki></code> dren schteiht un se en enem Appachemang es, woh dat zohjelohße es, un wat nommahlerwies nit vun de Robots dorschsöhk weed.",
+       "post-expand-template-inclusion-category-desc": "Nohdämm a paa Schablohne enjesaz woode sen, hät di Sigg mieh Dahte wi <code xml:lang=\"en\" lang=\"en\">$wgMaxArticleSize</code> zohlöhß. Et sin nit alle Oprohve vun Schablohne opjelöhß.",
+       "post-expand-template-argument-category-desc": "Di Sigg hät mieh Dahte wi <code xml:lang=\"en\" lang=\"en\">$wgMaxArticleSize</code> zohlöhß, nohdämm dä Wäät för ene Parramehter — jät met drei jeschweifte Klammere drömeröm, wi <code>{{{Dengenskersche}}}</code> — enjesaz woode es.",
+       "expensive-parserfunction-category-desc": "Di Sigg hät zoh vill düüre Befähle met Pahserfonxjuhne, för e Beijschpell esu jät, wi <code xml:lang=\"en\" lang=\"en\">#ifexist</code>. Mih doh drövver schteihd em [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Handbohch].",
+       "broken-file-category-desc": "En dä Sigge sin Lengks dren op Datteje, di mer nit han.",
+       "hidden-category-category-desc": "Di Saachjropp hät dä Befähl <code><nowiki>__HIDDENCAT__</nowiki></code> op ier Saachjroppe_Sigg schtonn. Dröm weed se schtandattmääßesch verschtoche, un nit en dä Leß met de Saachjroppe von dä Sigge aanjezeich, di dren sin.",
+       "trackingcategories-nodesc": "Heh weße mer nix drövver.",
        "trackingcategories-disabled": "Di Saachjrobb es afjeschalldt.",
        "mailnologin": "Keij E-Mail Adress",
        "mailnologintext": "Do mööts ald aanjemeldt un [[Special:UserLogin|enjelogg]] sin, un en jode E-Mail\nAdress en Dinge [[Special:Preferences|ming Enstellunge]] stonn han, öm en E-Mail aan andere Metmaacher ze\nschecke.",
        "wlheader-enotif": "Et <i lang=\"en\">e-mail</i> Schecke es enjeschalt.",
        "wlheader-showupdated": "Wann se Einer jeändert hätt, zickdäm De se et letzte Mol aanjeluurt häs, sin die Sigge <strong>extra markeet</strong>.",
        "wlnote": "{{PLURAL:$1|Hee es de läzde Änderong uß|Hee sin de läzde <strong>$1</strong> Änderonge uß|Mer han kein Änderonge en}} de läzde {{PLURAL:$2|Stund|<strong>$2</strong> Stunde|<strong>noll</strong> Stunde}} zigg em $3 öm $4 Uhr.",
-       "wlshowlast": "Zeich de letzte | $1 | Stunde | $2 | Dage |  | aan, dun",
+       "wlshowlast": "Zeisch de läzde $1 Schtunde, $2 Dähsch aan.",
        "watchlist-options": "Eijeschaffte fun de Oppassless",
        "watching": "Drop oppasse…",
        "unwatching": "Nimmieh drop oppasse",
        "deleteprotected": "Di Sigg es jeschöz, un dröm kam_mer se nit fott schmiiße.",
        "deleting-backlinks-warning": "<strong>Opjepaß:</strong> Es jitt Sigge met Lengks noh heh, udder Sigge, di heh di Sigg enbenge!",
        "rollback": "Em Letzte sing Änderunge zeröcknemme",
-       "rollback_short": "Zeröcknemme",
        "rollbacklink": "All dem Letzte sing Änderunge zeröckdriehe",
        "rollbacklinkcount": "{{PLURAL:$1|Ein Änderong|$1 Änderonge|Kein Änderonge}} schtantepee retuur nämme",
        "rollbacklinkcount-morethan": "{{PLURAL:$1|Mieh wi ein Änderong|Övver $1 Änderonge|Kein Änderonge}} schtantepee retuur nämme",
        "import-logentry-interwiki": "hät tirek vum ander Wiki emporteet: „$1“",
        "import-logentry-interwiki-detail": "{{PLURAL:$1|ein Väsjohn|$1 Väsjohne|kein VVäsjohnersion}} woodt empottehrt vun „$2“",
        "javascripttest": " JavaSkrepte ußprobeere.",
-       "javascripttest-title": "De Prööfunge „$1“ loufe.",
        "javascripttest-pagetext-noframework": "Heh di Sigg es för JavaSkrepte ußzeprobeere.",
        "javascripttest-pagetext-unknownframework": "Dä Prööfrahme „$1“ es onbikannt.",
        "javascripttest-pagetext-frameworks": "Bes esu jood un söök eine vun dä Prööfömjävvonge us: $1",
        "javascripttest-pagetext-skins": "Sööke en Bovverfläsch udder et Ußsinn uß, öm di Prööfonge domet ze maache:",
        "javascripttest-qunit-intro": "Loor noh dä [$1 Dokemäntation övver et Prööfe] op mediawiki.org.",
-       "javascripttest-qunit-heading": "De Sammlong vum MediaWiki sing JavaSkrep-<i lang=\"en\">QUnit</i>-Pröövunge",
        "tooltip-pt-userpage": "Don Ding eije Metmaachersigg aanzeije",
        "tooltip-pt-anonuserpage": "Metmaachersigg för die IP-Adress, vun wo uß De jraad Ding Änderunge un Äjänzunge aam Wiki am maache bes",
        "tooltip-pt-mytalk": "Dun Ding eije Klaafsigg aanzeije",
        "tooltip-pt-mycontris": "en Liss met Dinge eije Beidräch",
        "tooltip-pt-login": "Do moß Desch nit Enlogge, kannz_E ävver jähn maache!",
        "tooltip-pt-logout": "Ußlogge",
+       "tooltip-pt-createaccount": "mer schlonn vör, dat De Desch aanmällde deihs un ennloggs, ävver müüdesch es et nit.",
        "tooltip-ca-talk": "Dun die Sigg met däm Klaaf övver heh de Sigg aanzeije",
        "tooltip-ca-edit": "De kanns die Sigg heh ändere — für em Avspeichere, donn eetß ens enen Bleck op de Vör-Aansich",
        "tooltip-ca-addsection": "Donn heh enne neue Afschnett opmaache.",
        "version-entrypoints-header-url": "<i lang=\"en\">URL</i>",
        "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath Der Pad noh de Atikele]",
        "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath Der Pad noh de Skrepte]",
+       "version-libraries-version": "Väsjohn",
        "redirect": "Ömleide op en Dattei, ene Metmaacher udder de Väsjohn vun ener Sigg",
        "redirect-legend": "Ömleide ob_en Dattei udder Sigg",
        "redirect-summary": "Heh di {{int:specialpage}} leidt öm ob_en Dattei — doh mößd_Er ene Nahme aanjävve, för e Beischpell:[[{{#Special:Redirect}}/file/Example.jpg]] — udder en Sigg — doh mößd_Er en Kännong för, udder en Väsjuhn aanjävve, för e Beischpell esu: [[{{#Special:Redirect}}/page/64308]] udder [[{{#Special:Redirect}}/revision/328429]] — udder en Metmaachersigg — doh mößd_Er enem Metmaacher sing Kännong aanjävve, för e Beischpell: [[{{#Special:Redirect}}/user/101]].",
        "tags-hitcount-header": "Makeete Änderunge",
        "tags-active-yes": "Joh",
        "tags-active-no": "Näh",
+       "tags-source-none": "Weed nit mih jebruch",
        "tags-edit": "ändere",
+       "tags-delete": "fottschmieße",
+       "tags-activate": "aanschallde",
+       "tags-deactivate": "ußschallde",
        "tags-hitcount": "{{PLURAL:$1|Ein Änderong|$1 Änderonge|Kein Änderonge}}",
+       "tags-create-reason": "Jrond:",
+       "tags-create-submit": "Lohß Jonn!",
+       "tags-delete-explanation-in-use": "It will vun {{PLURAL:$2|eine Väsjohn udder einem Enndrahch|alle $2 Väsjohn udder Endrähsch|keine Väsjohn udder keinem Endrahsch}} em Logbohch, woh dat to which it is currently applied.",
+       "tags-delete-reason": "Jrond:",
+       "tags-activate-reason": "Jrond:",
+       "tags-activate-submit": "Aktivehre",
+       "tags-deactivate-reason": "Jrond:",
+       "tags-deactivate-submit": "Ußschallde",
        "comparepages": "Sigge verjliesche",
        "compare-page1": "De ein Sigg",
        "compare-page2": "De ander Sigg",
        "compare-revision-not-exists": "Dä aanjejovve Version jidd_et jaa nit.",
        "dberr-problems": "Deit uns leid, die Sigg heh häd för der Momang e teschnisch Problem.",
        "dberr-again": "Versök eijfach en e paa Menutte, norr_ens die Sigg afzeroofe.",
-       "dberr-info": "(Mer han kei Verbindung noh_m Datebank-ẞööver krijje künne: $1)",
-       "dberr-info-hidden": "(Mer han kei Verbindung noh_m Datebank-ẞööver krijje künne)",
+       "dberr-info": "(Mer han kein Verbendong noh_m Dahtebangk-ẞööver krijje künne för: $1)",
+       "dberr-info-hidden": "(Mer han kein Verbendong noh_m Dahtebangk-ẞööver krijje künne)",
        "dberr-usegoogle": "De künnß zweschedorsch ad met <i lang=\"en\">Google</i> söke.",
        "dberr-outofdate": "Müjjelesch, dat dat Verzeichnes vun uns Sigge do nit janß om neuste Shtannd es.",
        "dberr-cachederror": "Wat heh noh kütt es en Kopi vum Zwescheshpeisher vun dä Sigg,\ndie De häs han welle. Se künnt jet ällder un nit mieh aktoäll sin.",
        "revdelete-uname-unhid": "der Name vum Metmaacher öffentlesh jemaat",
        "revdelete-restricted": ", och för de Wiki-Köbesse",
        "revdelete-unrestricted": ", och för de Wiki-Köbesse",
+       "logentry-merge-merge": "{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät di Sigg „$3“ met dä Sigg „$4“ zersamme jelaat &emdash; Väsjohne bes  $5",
        "logentry-move-move": "{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hätt di Sigg „$3“ en „$4“ ömjenannt.",
        "logentry-move-move-noredirect": "{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hätt di Sigg „$3“ en „$4“ ömjenannt un derbei kein Ömleidong aanjelaat.",
        "logentry-move-move_redir": "{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hätt di Sigg „$3“ en „$4“ ömjenannt un derbei en ahle Ömleindongßsigg fottjeschmeße.",
        "logentry-rights-rights": "{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} „$1“ hät däm Metmaacher „$3“ sing Jroppe-Räächde vun „$4“ op „$5“ ömjestallt.",
        "logentry-rights-rights-legacy": "{{GENDER:$1|Dä|Et|Dä Metmaacher|De|Dat}} $1 hät däm Metmaacher $3 sing Räääschte-Jroppe verändert.",
        "logentry-rights-autopromote": "{{GENDER:$1|Dä|Et|Dä Metmaacher|De|Dat}} $1 wood automattesch vum $4 zom $5 jemaat.",
+       "logentry-upload-upload": "{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät di Dattei „$3“ huhjelahe.",
+       "logentry-upload-overwrite": "{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät en neue Väsjohn vun dä Dattei „$3“ huhjelahe.",
+       "logentry-upload-revert": "{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät di Dattei „$3“ huhjelahe.",
        "rightsnone": "(nix)",
        "revdelete-summary": "dä Täx en „{{int:summary}}“",
        "feedback-bugornote": "Wann de em Bejreff bes, övver e täschesch Probleem ze schrieve, bes esu jood un donn dat als en [$1 Fählermäldong].\nSöns, nemm dat koote Fommulaa heh dronger.\nWat De doh enjiß, kütt met Dingem Metmaachername un Dingem Brauser op die Sigg „[$3 $2]“ drop.",
        "expand_templates_generate_xml": "Och dä XML-Parser-Boum zeije",
        "expand_templates_generate_rawhtml": "Donn de Röh HTML Ußjaav aanzeije",
        "expand_templates_preview": "Vör-Aansich",
+       "expand_templates_preview_fail_html": "<em>Weil et Wiki rüh <i xml:lang=\"en\" title=\"HyperText Markup Language\" lang=\"en\">HTML</i> zohlöht un de Sezongsdahte verschött jejange sin, dom_mer de {{int:preview}} uß Vörseesch nit aanzeije, öm Aanjreffe övver JavaSkrep zevör ze kumme.</em>\n\n<strong>Wann dat heh en Ohdenong es, bes esu johd un versöhg et norr_ens.</strong>\nwann dat nix hellef, versöhg ens [[Special:UserLogout|ußzelogge]] un neu enzelogge.",
+       "expand_templates_preview_fail_html_anon": "<em>Weil et Wiki rüh <i xml:lang=\"en\" title=\"HyperText Markup Language\" lang=\"en\">HTML</i> zohlöht un Do nit ennjelogg bes, dom_mer de {{int:preview}} uß Vörseesch nit aanzeije, öm Aanjreffe övver JavaSkrep zevör ze kumme.</em>\n\n<strong>Wann dat heh en Ohdenong es, bes esu johd un donn [[Special:UserLogin|enlogge]] un versöhg et norr_ens.</strong>",
        "pagelanguage": "De Schprohch för di Sigg faßlääje",
        "pagelang-name": "Sigg",
        "pagelang-language": "De Schprohch",
        "right-pagelang": "Ener Sigg ier Schprohch tuusche",
        "action-pagelang": "Sigge ier Schprohch zu tuusche",
        "log-name-pagelang": "Logbooch vum Tuusche vun Sige iehr Schprohche",
+       "log-description-pagelang": "Dat heh es et Logbohch vun de Veränderonge aan de Schprohch vun de Sigge.",
+       "logentry-pagelang-pagelang": "{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät de Schprohch vun dä Sigg „$3“ vun $4 op $5 verändert.",
+       "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (enjeschalldt)",
+       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''ußjeschalldt''')",
+       "mediastatistics": "Schtateßteke övver de Meedije",
+       "mediastatistics-summary": "Schtatißteke övver de huhjelahde Zoote Datteije. Von de Datteije weed bloß de jeweils neuste Väsjohn jezallt. Fottjeschmeße un övverhollte Datteije wähde nit metjezallt.",
+       "mediastatistics-nbytes": "{{PLURAL:$1|Ei Byte|$1 Bytes|Nix}} ($2; $3%)",
+       "mediastatistics-table-mimetype": "<i lang=\"en\" xml:lang=\"en\" title=\"Multi-Purpose Internet Mail Extensions\">MIME</i>-Tüpp",
+       "mediastatistics-table-count": "De Aanzahl Dateije",
        "mediastatistics-header-unknown": "Onbikannt",
        "mediastatistics-header-video": "Viddejos",
        "mediastatistics-header-text": "Täx",
index 643bc40..bd25d62 100644 (file)
        "hidetoc": "veşêre",
        "collapsible-collapse": "Bigire",
        "collapsible-expand": "Berfireh bike",
+       "confirmable-yes": "Erê",
+       "confirmable-no": "Na",
        "thisisdeleted": "Li $1 binêre an jî serast bike?",
        "viewdeleted": "Li $1 binêre?",
        "restorelink": "{{PLURAL:$1|guherandineke|$1 guherandinên}} jêbirî",
        "delete-edit-reasonlist": "Sedemên jêbirinê biguherîne",
        "delete-toobig": "Dîroka vê rûpelê pir mezin e, zêdetirî $1 guherandin. Jêbirina van rûpelan hatîye sînorkirin, ji bo pir şaşbûn (error) di {{SITENAME}} da çênebin.",
        "delete-warning-toobig": "Dîroka vê rûpelê pir mezin e, zêdetirî $1 guherandin. Jêbirina van rûpelan dikarin şaşbûnan di database'ê {{SITENAME}} da çêkin; zandibe tu çi dikê!",
-       "rollback_short": "Bizîvirîne pêş",
        "rollbacklink": "bizîvirîne pêş",
        "cantrollback": "Guherto naye vegerandin;\nbikarhênerê dawî, tenya nivîskarê vê rûpelê ye.",
        "alreadyrolled": "Guherandina dawiya [[$1]]\nbi [[User:$2|$2]] ([[User talk:$2|gotûbêj]]) venizivre; kesekî din ew rûpel zîvirandiye an guherandiye.\n\nGuhertoya dawî bi [[User:$3|$3]] ([[User talk:$3|gotûbêj]]).",
index 633acdf..af64e28 100644 (file)
        "prefs-personal": "Benotzerprofil",
        "prefs-rc": "Rezent Ännerungen",
        "prefs-watchlist": "Iwwerwaachungslëscht",
+       "prefs-editwatchlist": "Iwwerwaachungslëscht änneren",
+       "prefs-editwatchlist-raw": "Net-formatéiert Iwwerwaachungslëscht änneren",
+       "prefs-editwatchlist-clear": "Är Iwwerwaachungslëscht eidelmaachen",
        "prefs-watchlist-days": "Zuel vun den Deeg, déi an der Iwwerwaachungslëscht ugewise solle ginn:",
        "prefs-watchlist-days-max": "Maximal $1 {{PLURAL:$1|Dag|Deeg}}",
        "prefs-watchlist-edits": "Maximal Zuel vun den Ännerungen déi an der erweiderter Iwwerwaachungslëscht ugewise solle ginn:",
        "tags-tag": "Numm vun der Markéierung",
        "tags-display-header": "Opzielungen op den Ännerungslëschten",
        "tags-description-header": "Ganz Beschreiwung vun der Bedeitung",
+       "tags-source-header": "Quell",
        "tags-active-header": "Aktiv?",
        "tags-hitcount-header": "Markéiert Ännerungen",
+       "tags-actions-header": "Aktiounen",
        "tags-active-yes": "Jo",
        "tags-active-no": "Neen",
+       "tags-source-extension": "Duerch eng Erweiderung definéiert",
+       "tags-source-none": "Gëtt net méi gebraucht",
        "tags-edit": "änneren",
+       "tags-delete": "läschen",
+       "tags-activate": "aktivéieren",
+       "tags-deactivate": "desaktivéieren",
        "tags-hitcount": "$1 {{PLURAL:$1|Ännerung|Ännerungen}}",
+       "tags-create-reason": "Grond:",
+       "tags-create-submit": "Uleeën",
+       "tags-create-already-exists": "D'Markéierung (tag) ''$1'' gëtt et schonn.",
+       "tags-delete-title": "Markéierung (tag) läSchen",
+       "tags-delete-reason": "Grond:",
+       "tags-delete-not-found": "D'Markéierung (tag) ''$1'' gëtt et net.",
+       "tags-activate-title": "Markéierung (tag) aktivéieren",
+       "tags-activate-reason": "Grond:",
+       "tags-activate-not-found": "D'Markéierung (tag) ''$1'' gëtt et net.",
+       "tags-activate-submit": "Aktivéieren",
+       "tags-deactivate-title": "Markéierung (tag) desaktivéieren",
+       "tags-deactivate-reason": "Grond:",
+       "tags-deactivate-submit": "Desaktivéieren",
        "comparepages": "Säite vergläichen",
        "compare-page1": "Säit 1",
        "compare-page2": "Säit 2",
        "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-stashfilestorage": "Beim Späichere vum Fichier ass ee Feeler geschitt.",
        "api-error-stashzerolength": "De Server konnt de Fichier net späicheren, well en eng Längt vun Null hat.",
+       "api-error-stashnotloggedin": "Dir musst ageloggt si fir Fichiere späicheren ze kënnen.",
        "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\"",
index d008401..cb5a563 100644 (file)
        "prefs-personal": "پروفایل کاریار",
        "prefs-rc": "آلشتیا تازه باو",
        "prefs-watchlist": "سیل برگ",
+       "prefs-editwatchlist": "ویرایشت سیل برگ",
+       "prefs-editwatchlist-clear": "سیل برگه تونه پاک بکیت",
        "prefs-watchlist-days": "روزیا نه د سیل برگ نشو دئه بو:",
        "prefs-watchlist-days-max": "$1 بیشترونه {{جمی:$1|روز|روزیا}}",
        "prefs-watchlist-edits": "بیشترونه انازه آلشتیایی که د سیل برگ گپ بیه نشو دئه بیه:",
        "javascripttest": "ازمایشت کردن جاوا اسکریپت",
        "javascripttest-pagetext-noframework": "ای بلگه سی انجوم دئن ازمایشتیا جاوا اسکریپت اماییه کاری بیه.",
        "javascripttest-pagetext-unknownframework": "چوئه کار نادیار ازمایشت \"$1\"",
+       "javascripttest-pagetext-unknownaction": "کنشتکاری نادیار \"$1\".",
        "javascripttest-pagetext-frameworks": "لطفن یه گل د چوئه یا ازمایشت هاری نه انتخاو بکیت :$1",
        "javascripttest-pagetext-skins": "یه گل پوسه نه سی انجوم دئن ازمایشتا انتخاو بکیت:",
        "javascripttest-qunit-intro": "[$1 مستندیا ازمایشت] نه د mediawiki.org سیل بکیت.",
        "deletedwhileediting": "<strong>زئنار:</strong>ای بلگه د او گاتی که شما شرو د ویرایشت کردیته پاکسا بیه!",
        "recreate": "د نو راس کردن",
        "confirm_purge_button": "خوئه",
+       "confirm-purge-top": "میهایت کش ای بلگه نا پاک بکیت؟",
        "confirm-watch-button": "خوئه",
        "confirm-watch-top": "ای بلگه نه د سیل برگتو اضاف می کید؟",
        "confirm-unwatch-button": "خوئه",
        "redirect-revision": "وانئری بلگه",
        "redirect-file": "نوم جانیا",
        "redirect-not-exists": "انازه که پیدا نبی",
+       "fileduplicatesearch-legend": "پی جوری سی دوکونه",
        "fileduplicatesearch-filename": "نوم جانیا:",
        "fileduplicatesearch-submit": "پی جوری",
        "fileduplicatesearch-info": "$1 × $2 pixel<br />انازه جانیا: $3<br />MIME type: $4",
        "specialpages-group-wiki": "رسینه و اوزاریا",
        "specialpages-group-redirects": "بلگه ویجه واگردونی بیه",
        "specialpages-group-spam": "اوزاریا اسپم",
+       "specialpages-group-developer": "اوزاریا گپ کلون یار",
        "blankpage": "بلگه حالی",
        "external_image_whitelist": "یه خط نه ول بکید چی وه<pre>",
        "tags": "سردیسیا آلشت دئن خو",
        "tag-filter": "فيلتر [[Special:Tags|Tag]]:",
        "tag-filter-submit": "فيلتر",
+       "tag-list-wrapper": "([[Special:سردیسیا|{{PLURAL:$1|سردیس|سردیسیا}}]]: $2)",
        "tags-title": "سردیسیا",
        "tags-tag": "نوم سردیس",
        "tags-display-header": "دیاری کردن د نوم گه آلشتیا",
+       "tags-source-header": "سرچشمه",
        "tags-active-header": "کنشتگره؟",
        "tags-hitcount-header": "آلشتیا سردیس دار",
+       "tags-actions-header": "کنشتکاریا",
        "tags-active-yes": "هری",
        "tags-active-no": "نه",
        "tags-edit": "ویرایشت",
+       "tags-delete": "پاکسا کردن",
+       "tags-activate": "کنشتیاری کردن",
        "tags-hitcount": "$1 {{جمی:$1|آلشت|آلشتیا}}",
+       "tags-create-heading": "راس کردن یه گل سردیس تازه",
+       "tags-create-tag-name": "نوم سردیس",
+       "tags-create-reason": "دلیل",
+       "tags-create-submit": "راس کردن",
+       "tags-delete-title": "پاکسا کردن سردیس",
+       "tags-delete-reason": "دليل:",
+       "tags-delete-not-found": "سردیس \"$1\" نیئش.",
+       "tags-activate-title": "کنشتیاری کردن سردیس",
+       "tags-activate-reason": "دليل:",
+       "tags-activate-not-found": "سردیس \"$1\" نیئش.",
+       "tags-activate-submit": "کنشتیاری کردن",
+       "tags-deactivate-title": "ناکشتیاری کردن سردیس",
+       "tags-deactivate-reason": "دليل:",
+       "tags-deactivate-submit": "ناکنشتیاری کردن",
        "comparepages": "کنار یک نیاین بلگه یا",
        "compare-page1": "بلگه 1",
        "compare-page2": "بلگه 2",
        "htmlform-cloner-create": "هنی اضاف بکیت",
        "htmlform-cloner-delete": "ؤرداشتن",
        "htmlform-cloner-required": "سی کمترونه یه گل ارزایشت لازمه",
+       "logentry-delete-delete": "$1 بلگه {{GENDER:$2|پاکسا بیه}} $3",
        "revdelete-content-hid": "مینونه قام بیه",
        "revdelete-summary-hid": "چکسته ویرایشت قام بیه",
        "revdelete-uname-hid": "نوم کاروری قام بیه",
        "revdelete-content-unhid": "مینونه قام نبیه",
        "revdelete-summary-unhid": "چکسته ویرایشت قام نبیه",
        "revdelete-uname-unhid": "نوم کاروری قام نبیه",
+       "logentry-move-move": "$1 {{GENDER:$2|جا وه جا کرده}} بلگه $3 نه سی $4",
+       "logentry-newusers-create": "حساو کاریاری $1 {{GENDER:$2|راس بی}}",
+       "logentry-upload-upload": "$1 {{GENDER:$2|سوار کرده}} $3",
        "rightsnone": "(هيش كوم)",
        "revdelete-summary": "چکسه ویرایشت",
        "feedback-subject": "سرون:",
        "feedback-message": "پيغوم:",
        "feedback-cancel": "انجوم شیوسن",
        "feedback-submit": "کل کردن نهاهوال حون",
+       "feedback-adding": "اضاف کردن هوال حون یار د بلگه....",
        "feedback-error2": "خطا:ویرایشت خو نبی",
        "feedback-close": "انجوم بی",
        "feedback-bugnew": "مه وارسیش کردمه. یه گل سیسرک تازه گزارشت بی",
        "searchsuggest-containing": "د حال و بار مینونه دار...",
        "api-error-badaccess-groups": "شما سی سوار کرد جانیایا د ای ویکی اجازه ناریت.",
        "api-error-copyuploaddisabled": "سوار کردن وا یو آر ال دی ای سرور غیرفعال بیه.",
+       "api-error-file-too-large": "جانیایی که دئیته فره گپه.",
        "api-error-filename-tooshort": "نوم جانیا فره کؤچکه.",
+       "api-error-filetype-banned": "چنی جانیا قدقه بیه.",
        "api-error-illegal-filename": "نوم جانیا اجازه دئه نئ.",
        "api-error-mustbeloggedin": "شما سی سوارکردن فایلیا با بیایت وامین",
        "api-error-unclassified": "یه گل خطا نادیار ری ون کرده.",
        "duration-years": "$1{{جمی:$1| سال|سالیا}}",
        "duration-decades": "$1 {{PLURAL:$1|دهه|دهه یا}}",
        "duration-centuries": "$1 {{PLURAL:$1|سده|سده یا}}",
+       "limitreport-cputime": "گات وه کار گرتن سی پی یو",
        "limitreport-cputime-value": "$1 {{PLURAL:$1|ثانیه|ثانیه یا}}",
        "limitreport-walltime": "زمون راستکی وه کار گرتن",
+       "limitreport-walltime-value": "$1 {{PLURAL:$1|ثانیه|ثانیه یا}}",
        "limitreport-ppvisitednodes-value": "$1/$2",
        "limitreport-ppgeneratednodes-value": "$1/$2",
        "limitreport-expansiondepth-value": "$1/$2",
        "limitreport-expensivefunctioncount-value": "$1/$2",
+       "expandtemplates": "گپ کلون کردن چوئه یا",
        "expand_templates_input": "نیسسه درینده:",
        "expand_templates_output": "نتیجه",
        "expand_templates_xml_output": "درده ایکس ام ال",
        "default-skin-not-found-row-disabled": "* <رازینه>$1</رازینه> / $2 ('''ناکنشتگر بیه''')",
        "mediastatistics": "آماریا وارسگر",
        "mediastatistics-nbytes": "{{PLURAL:$1|$1 بایت|$1 بایتیا}} ($2; $3%)",
+       "mediastatistics-table-extensions": "دمادیسیا ممکن",
        "mediastatistics-table-count": "شماره جانیایا",
        "mediastatistics-table-totalbytes": "انازه وه یک شیوسه",
        "mediastatistics-header-unknown": "نادیار",
index 0f94255..efbf6bb 100644 (file)
        "currentrev": "Pašreizējā versija",
        "currentrev-asof": "Pašreizējā versija, $1",
        "revisionasof": "Versija, kas saglabāta $1",
-       "revision-info": "Versija $1 laikā, kādu to atstāja $2",
+       "revision-info": "Versija $1, kādu to atstāja {{GENDER:$6|$2}}$7",
        "previousrevision": "← Senāka versija",
        "nextrevision": "Jaunāka versija →",
        "currentrevisionlink": "skatīt pašreizējo versiju",
        "right-reupload-own": "Pārrakstīt paša augšuplādētu esošu failu",
        "right-upload_by_url": "Augšupielādēt failus no URL",
        "right-autoconfirmed": "Izmainīt daļēji aizsargātas lapas",
+       "right-writeapi": "Rakstīšanas API lietošana",
        "right-delete": "Dzēst lapas",
        "right-bigdelete": "Dzēst lapas ar lielām hronoloģijām",
        "right-deleterevision": "Dzēst un atjaunot lapu noteiktas versijas",
        "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",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|diskusija]])",
        "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",
index 2ad7a06..7636ee2 100644 (file)
@@ -13,7 +13,9 @@
                        "Yanteng3",
                        "아라",
                        "LNDDYL",
-                       "Jason924tw"
+                       "Jason924tw",
+                       "灰太狼Wolffy55",
+                       "RalfX"
                ]
        },
        "tog-underline": "鏈墊線:",
        "category-empty": "''無頁或媒也。''",
        "hidden-categories": "$1隱類",
        "hidden-category-category": "隱類",
-       "category-subcat-count": "{{PLURAL:$2|é\96\80æ\9c\89æ\88¶å£¹ã\80\82\96\80æ\9c\89æ\88¶$1ï¼\8cæ\9c\89$2æ\88也。}}",
-       "category-subcat-count-limited": "é\96\80æ\9c\89æ\88$1。",
-       "category-article-count": "{{PLURAL:$2|é\96\80æ\9c\89é \81壹ã\80\82\96\80æ\9c\89é \81$1ï¼\8cæ\9c\89$2é \81也。}}",
-       "category-article-count-limited": "é\96\80有頁$1。",
-       "category-file-count": "{{PLURAL:$2|é\96\80æ\9c\89æª\94壹ã\80\82\96\80æ\9c\89æª\94$1ï¼\8cæ\9c\89$2æª\94也。}}",
-       "category-file-count-limited": "é\96\80有檔$1。",
+       "category-subcat-count": "{{PLURAL:$2|é¡\9eæ\9c\89å­\90é¡\9eå¦\82ä¸\8bã\80\82|é¡\9eæ\9c\89$1å­\90é¡\9eï¼\8cè½\84ä¸\8bå­\90é¡\9eæ\95¸$2也。}}",
+       "category-subcat-count-limited": "é¡\9eæ\9c\89å­\90é¡\9e$1。",
+       "category-article-count": "{{PLURAL:$2|é¡\9eæ\9c\89é \81å¦\82ä¸\8bã\80\82|é¡\9eæ\9c\89é \81$1ï¼\8cè½\84ä¸\8bé \81æ\95¸$2也。}}",
+       "category-article-count-limited": "é¡\9e有頁$1。",
+       "category-file-count": "{{PLURAL:$2|é¡\9eæ\9c\89æª\94å¦\82ä¸\8bã\80\82|é¡\9eæ\9c\89æª\94$1ï¼\8cè½\84ä¸\8bæª\94æ\95¸$2也。}}",
+       "category-file-count-limited": "é¡\9e有檔$1。",
        "listingcontinuesabbrev": "續",
        "index-category": "已索之頁",
        "noindex-category": "未索之頁",
        "accountcreatedtext": "[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|書]])簿增矣。",
        "createaccount-title": "於{{SITENAME}}增簿",
        "createaccount-text": "有人於{{SITENAME}}用爾之電郵增名為 \"$2\" 之簿 ($4),符節為 \"$3\" 。汝應登,再改符節也。\n\n如簿誤增,爾可略之。",
-       "login-throttled": "ç\88¾å¤\9a試æ\96¼æ­¤ç°¿ç\99»ä¸­。\n請候 $1 再試之。",
+       "login-throttled": "ç\88¾å\98\97ç\99»ç°¿ç\94\9aç\9f£。\n請候 $1 再試之。",
        "login-abort-generic": "登簿未成——棄",
        "loginlanguagelabel": "語:$1",
        "suspicious-userlogout": "爾欲無離也,可由壞瀏覽器或快枝代理呈送之。",
        "retypenew": "重察新符節:",
        "resetpass_submit": "設符再登",
        "changepassword-success": "爾之符節已改!",
-       "changepassword-throttled": "ç\88¾å¤\9a試æ\96¼æ­¤ç°¿ç\99»ä¸­ã\80\82\nè«\8bå\80\99再試之。",
+       "changepassword-throttled": "ç\88¾å\98\97ç\99»ç°¿ç\94\9aç\9f£ã\80\82\nè«\8bå\80\99 $1 再試之。",
        "resetpass_forbidden": "無改符節",
        "resetpass-no-info": "爾須登簿後方進此頁。",
        "resetpass-submit-loggedin": "改符節",
        "changeemail-newemail": "新郵驛:",
        "changeemail-none": "(無)",
        "changeemail-password": "汝 {{SITENAME}} 之符節",
+       "changeemail-throttled": "爾嘗登簿甚矣。\n請候 $1 再試之。",
        "bold_sample": "粗體",
        "bold_tip": "粗體",
        "italic_sample": "斜體",
        "withoutinterwiki-submit": "示",
        "fewestrevisions": "鮮察",
        "nbytes": "$1位元組",
-       "ncategories": "$1é\96\80",
+       "ncategories": "$1é¡\9e",
        "nlinks": "$1鏈",
        "nmembers": "$1戶",
        "nrevisions": "$1審",
        "uncategorizedtemplates": "待蘸",
        "unusedcategories": "樞鏽",
        "unusedimages": "色褪",
-       "wantedcategories": "æ±\82é\96\80",
+       "wantedcategories": "æ±\82é¡\9e",
        "wantedpages": "徵頁",
        "wantedpages-badtitle": "結組無題: $1",
        "wantedfiles": "求檔",
        "wantedtemplates": "徵模",
        "mostlinked": "好料",
-       "mostlinkedcategories": "豪é\96\80",
+       "mostlinkedcategories": "豪é¡\9e",
        "mostlinkedtemplates": "美模",
        "mostcategories": "跨船",
        "mostimages": "名檔",
        "move": "遷",
        "movethispage": "遷此頁",
        "unusedimagestext": "下檔存也,未嵌於其頁之。\n他站可以網址鏈檔,故下列並非盡閒,註記之。",
-       "unusedcategoriestext": "以ä¸\8b空é\96\80,無依可活。",
+       "unusedcategoriestext": "以ä¸\8b空é¡\9e,無依可活。",
        "notargettitle": "落靶",
        "notargettext": "簿、頁未定,無可為之。",
        "nopagetitle": "落靶之頁",
        "speciallogtitlelabel": "標:",
        "log": "誌",
        "all-logs-page": "眾誌",
-       "alllogstext": "眾{{SITENAME}}之誌有合者,俱併版見。擇、選簿、限疆以裁之。",
+       "alllogstext": "眾{{SITENAME}}之誌有合者,俱併版見。擇、選簿、限疆以裁之。",
        "logempty": "無合誌也。",
        "log-title-wildcard": "題以此始者,取之",
        "allpages": "全典",
        "delete-toobig": "此頁含大誌,過$1修。刪頁限矣,防於{{SITENAME}}之亂也。",
        "delete-warning-toobig": "此頁含大誌,過$1修。刪之可亂{{SITENAME}}之事也;續時留神之。",
        "rollback": "反正",
-       "rollback_short": "正",
        "rollbacklink": "正",
        "rollbackfailed": "未能反正",
        "cantrollback": "獨一作者,無以反正。",
        "sp-contributions-search": "問勛",
        "sp-contributions-username": "簿名或IP址",
        "sp-contributions-toponly": "僅示至新審之纂",
+       "sp-contributions-newonly": "僅示創文之纂",
        "sp-contributions-submit": "問",
        "whatlinkshere": "取佐",
        "whatlinkshere-title": "「$1」取佐",
        "exportcuronly": "獨匯今審",
        "exportnohistory": "----\n'''囑記,'''封匯全誌,因累甚也。",
        "export-submit": "出匯",
-       "export-addcattext": "索門擇題:",
+       "export-addcattext": "擇題入類:",
        "export-addcat": "增",
        "export-addnstext": "索名集擇題:",
        "export-addns": "增",
        "tooltip-ca-nstab-mediawiki": "聞官耗",
        "tooltip-ca-nstab-template": "尋模造",
        "tooltip-ca-nstab-help": "助拳腳",
-       "tooltip-ca-nstab-category": "入門道",
+       "tooltip-ca-nstab-category": "觀類",
        "tooltip-minoredit": "正小錯,謙註校",
        "tooltip-save": "葺修畢,儲之窖",
        "tooltip-preview": "篤存儲,先草稿",
        "tag-filter": "[[Special:Tags|標]] 之濾:",
        "tags-title": "標",
        "tags-tag": "標名",
+       "tags-source-header": "源",
+       "tags-actions-header": "动",
        "tags-active-yes": "是",
        "tags-active-no": "否",
        "tags-edit": "纂",
+       "tags-delete": "削",
+       "tags-deactivate": "閉",
+       "tags-manage-no-permission": "無准遷檔也。",
+       "tags-create-tag-name": "標名:",
+       "tags-create-reason": "因:",
+       "tags-create-submit": "立",
+       "tags-create-no-name": "子必名此签!",
+       "tags-create-warnings-below": "子欲立此签乎?",
+       "tags-delete-title": "削签",
+       "tags-delete-reason": "因:",
+       "tags-delete-not-found": "$1之頁無存焉。",
+       "tags-activate-title": "活簽",
+       "tags-activate-reason": "因:",
+       "tags-activate-submit": "活",
+       "tags-deactivate-reason": "因:",
+       "tags-deactivate-submit": "闭",
        "comparepages": "較頁",
        "compare-page1": "頁一",
        "compare-page2": "頁二",
index b2d0dcc..7099fd6 100644 (file)
@@ -35,7 +35,7 @@
        "tog-shownumberswatching": "Asehoy ny isan'ny mpikambana manara-maso ny pejy",
        "tog-oldsig": "Topi-mason'ny sonia :",
        "tog-fancysig": "Sonia tsotra (tsy misy rohy)",
-       "tog-uselivepreview": "Hampiasa ny topi-maso malakay (andramana)",
+       "tog-uselivepreview": "Hampiasa ny topi-maso mivantana",
        "tog-forceeditsummary": "Teneno ahy ra tsy nametraka ny ambangovangony",
        "tog-watchlisthideown": "Tsy ampiseho anatin'ny pejy fanaraha-maso ny zavatra nosoratako",
        "tog-watchlisthidebots": "Asitriho amin'ny lisitro ny fanovàna nataon'ny rôbô",
        "viewsourcetext": "Azonao atao no mijery sy mandrika ny votoatin'ity pejy ity :",
        "viewyourtext": "Azonao atao ny mijery ary mandika ny fangon'ny '''fanovanao''' tamin'ity pejy ity:",
        "protectedinterface": "Ity pejy ity dia manome ny lahatsoratra ho an'ny rindrankajy eto amin'ity Wiki ity, ary narovana mba tsy hisian'ny fanararaotana. Raha tia hanampy na hanova ny dikanteny ho an'ny wiki rehetra, ampiasao [//translatewiki.net/ translatewiki.net], izay tetikasa fandikanan ny rindrankajy Mediawiki.",
-       "editinginterface": "'''Tandremo''' : Manova pejy ampiasaina amin'ny famoahana ny hafatray ny rindrankajy ianao io.\n\nHisy fiantraikany amin'ny fisehon'ny tranonkala amin'ny mpampiasa rehetra eto amin'ity wiki ity ny fanovana.\n\nRaha hanampy dikanteny izay tokony hihatra amin'ny wiki rehetra, ampiaao ny tranonkala [//translatewiki.net/ translatewiki.net translatewiki.net], ny tetikasa fandikana an'i MediaWiki.",
+       "editinginterface": "<strong> Fampitandremana: <strong> manova pejy ampiasaina amin'ny famoronan-tsoratry ny rindrankajy ianao. Hisy fiatraika amin'ny fisehon'ny interfasim-pikambana ho an'ny mpikambana hafan'ity wiki ity ny fiovana ho atao.",
        "cascadeprotected": "Ankehitriny dia voaaro ity pejy ity satria misy pejy voaaro {{PLURAL:$1||$1}}1 mampiasa ity pejy ity. Io pejy io dia mampiasa ny fiarovana \"en cascade\" :\n\n$2",
        "namespaceprotected": "Tsy manana alalàna manova ny toeran'anarana « '''$1''' » ianao.",
        "customcssprotected": "Tsy afaka manova ity pejy CSS ity ianao satria misy ny safidy manokan'ny mpikambana hafa.",
        "gender-female": "Manova pejy wiki izy (vehivavy)",
        "prefs-help-gender": "Ankifidy : ampiasaina ho an'ny fifandraisan'ny rindrankajy aminao. Ho sarababem-bahoaka ity fampahalalana ity.",
        "email": "Imailaka",
-       "prefs-help-realname": "Anarana marina (afaka tsy fenoina): raha fenoinao ity dia hampiasaina hanomezana anao tambin'ny asa izay efainao eto.",
+       "prefs-help-realname": "Tsy voatery omena ny tena anarana.\nRaha omena izany dia hanomezana dera ny fandraisan'anjaranao",
        "prefs-help-email": "Azo tsy omena ny adiresy imailaka, fa ilaina izy io raha sendra hadino ny tenimiafinao.",
        "prefs-help-email-others": "Azonareo atao ny misafidy mba hamela ny hafa hifandray aminao eo amin'ny alanana rohy iray eo amin'ny pejin-dresakao.\nTsy haseho ny adiresy imailakao rehefa manoratra any aminao ny mpikambana hafa.",
        "prefs-help-email-required": "Ilaina ny adiresy imailaka",
        "uploaderror": "Nisy tsy fetezana ny fandefasana rakitra",
        "upload-recreate-warning": "'''Tandremo : novain-toerana na nofafana ny rakitra mitondra io anarana io.'''\n\nAseho eo ambany ho fampahalalana fanampiny ny iditra ao amin'ny laogim-panisahana ary ny laogim-pamafana :",
        "uploadtext": "Ampiasao ity fisy ity handefasana rakitra. Jereo eto ny [[Special:FileList|lisitry ny rakitra]] nalefan'ny mpikambana, na koa azonao ampiasaina ny [[Special:Log/delete|tantaran'asan'ny fandefasana sy famonoana rakitra]].\n\nRaha hanisy sary ao anaty pejy, dia mampiasà rohy toy ny iray amin'ireto\n'''<nowiki>[[</nowiki>{{ns:file}}<nowiki>:file.jpg]]</nowiki>''', na\n'''<nowiki>[[</nowiki>{{ns:file}}<nowiki>:file.png|alt text]]</nowiki>''' na\n'''<nowiki>[[</nowiki>{{ns:media}}<nowiki>:file.ogg]]</nowiki>''' raha hirohy mivantana amin'ny rakitra.",
-       "upload-permitted": "Endriky ny rakitra manan-alalana : $1.",
-       "upload-preferred": "Endriky ny rakitra nampidirina : $1",
-       "upload-prohibited": "Endriky ny rakitra tsy manan-alalana : $1",
+       "upload-permitted": "Karazan-drakitra {{PLURAL:$2||}}mahazo alalana : $1",
+       "upload-preferred": "Karazan-drakitra tiana{{PLURAL:$2||}}: $1.",
+       "upload-prohibited": "Karazan-drakitra voarara{{PLURAL:$2||}}: $1.",
        "uploadlogpage": "Fampidiran-drakitra",
        "uploadlogpagetext": "Ity ny lisitr'ireo rakitra nalefa farany indrindra.",
        "filename": "Anarana",
        "delete-toobig": "Ity pejy ity dia manana tantaram-panovana lava be, izany hoe manana versiona {{PLURAL:$1}} $1.\nNoferana mba tsy hikorontana ny fandehanan'i {{SITENAME}} ny famafana ireo pejy ireo.{{PLURAL:$1|}}",
        "delete-warning-toobig": "Lava be mihitsy ny tantaram-piovan'ity pejy ity, mihoatra santiôna $1{{PLURAL:}}.\nMety hitondra fikorontanana ao amin'ny banky angon'i {{SITENAME}} ny famafana azy ;\nataovy am-pitandremana ity tao ity.",
        "rollback": "Foano indray ilay fanovana",
-       "rollback_short": "Aza ovaina indray",
        "rollbacklink": "foano",
        "rollbacklinkcount": "hamoana fanovana{{PLURAL:$1}} $1",
        "rollbackfailed": "Tsy voaverina amin'ny teo aloha",
        "import-logentry-upload": "nampiditra [[$1]] tamin'ny fampidiran-drakitra",
        "import-logentry-interwiki": "nampiditra $1 tamin'ny transwiki",
        "javascripttest": "Fanandramana JavaScript",
-       "javascripttest-title": "Mandefa fanandramana $1",
        "javascripttest-pagetext-skins": "Mifidia skin hanaovana ny fanandramana:",
        "javascripttest-qunit-intro": "Jereo ny [$1 fanoroana mikasika ny andrana] eo amin'i mediawiki.org.",
-       "javascripttest-qunit-heading": "Tohin'andrana QUnit an'i Javascript eo amin'i MediaWiki",
        "tooltip-pt-userpage": "Ny pejinao",
        "tooltip-pt-anonuserpage": "Ny pejim-bikamban'ny IP andraisanao anjara",
        "tooltip-pt-mytalk": "Pejin-dresakao",
index 3c84e4c..7b62d9a 100644 (file)
        "tog-showtoolbar": "Прикажи алатник за уредување",
        "tog-editondblclick": "Уредување на страници при двоен стисок",
        "tog-editsectiononrightclick": "Уредување на заглавија со десно копче од глушецот на нивниот наслов",
-       "tog-watchcreations": "Додавај ги страниците што ги создавам и податотеките што ги подигам во списокот на набљудувања",
-       "tog-watchdefault": "Додавај ги страниците и податотеките што ги уредувам во списокот на набљудувања",
-       "tog-watchmoves": "Додавај ги страниците и податотеките што ги преместувам во списокот на набљудувања",
-       "tog-watchdeletion": "Додавај ги страниците и податотеките што ги бришам во списокот на набљудувања",
+       "tog-watchcreations": "Додавај ги страниците што ги создавам и податотеките што ги подигам во набљудуваните",
+       "tog-watchdefault": "Додавај ги страниците и податотеките што ги уредувам во набљудуваните",
+       "tog-watchmoves": "Додавај ги страниците и податотеките што ги преместувам во набљудуваните",
+       "tog-watchdeletion": "Додавај ги страниците и податотеките што ги бришам во набљудуваните",
        "tog-watchrollback": "Додај ги страниците сум ги отповикал во набљудувани",
        "tog-minordefault": "Обележувај ги сите уредувања како ситни по основно",
        "tog-previewontop": "Прикажи го прегледот пред кутијата за уредување",
        "tog-fancysig": "Сметај го потписот за викитекст (без автоматска врска)",
        "tog-uselivepreview": "Користи преглед во живо",
        "tog-forceeditsummary": "Извести ме кога нема опис на промените",
-       "tog-watchlisthideown": "Скриј мои уредувања од списокот на набљудувања",
-       "tog-watchlisthidebots": "Скриј ботовски уредувања од списокот на набљудувања",
-       "tog-watchlisthideminor": "Скриј ги ситните уредувања во списокот на набљудувања",
-       "tog-watchlisthideliu": "Скриј ги уредувањата на најавените корисници во списокот на набљудувања",
-       "tog-watchlisthideanons": "Скриј ги уредувањата од анонимни корисници во списокот на набљудувања",
+       "tog-watchlisthideown": "Скриј мои уредувања од набљудуваните",
+       "tog-watchlisthidebots": "Скриј ботовски уредувања од набљудуваните",
+       "tog-watchlisthideminor": "Скриј ги ситните уредувања во набљудуваните",
+       "tog-watchlisthideliu": "Скриј ги уредувањата на најавените корисници во набљудуваните",
+       "tog-watchlisthideanons": "Скриј ги уредувањата од анонимни корисници во набљудуваните",
        "tog-watchlisthidepatrolled": "Скриј испатролирани уредувања од мојот список на набљудувања",
        "tog-ccmeonemails": "Испраќај ми мои примероци од писмата што ги праќам на другите корисници",
        "tog-diffonly": "Не ја покажувај содржината на страницата под разликите",
        "restorelink": "{{PLURAL:$1|едно избришано уредување|$1 избришани уредувања}}",
        "feedlinks": "Во вид:",
        "feed-invalid": "Погрешен начин на претплата на емитувања",
-       "feed-unavailable": "RSS/Atom емитувањата не се достапни",
+       "feed-unavailable": "RSS/Атом-емитувањата не се достапни",
        "site-rss-feed": "$1 — RSS-емитувања",
-       "site-atom-feed": "$1 — Atom-емитувања",
+       "site-atom-feed": "$1 — Атом-емитувања",
        "page-rss-feed": "„$1“ - RSS емитувања",
-       "page-atom-feed": "„$1“ — Atom-емитувања",
-       "feed-atom": "Atom",
+       "page-atom-feed": "„$1“ — Атом-емитувања",
+       "feed-atom": "Атом",
        "feed-rss": "RSS",
        "red-link-title": "$1 (страницата не постои)",
        "sort-descending": "Подреди надолно",
        "resettokens-legend": "Враќање одново на шифри",
        "resettokens-tokens": "Шифри:",
        "resettokens-token-label": "$1 (тековна вредност: $2)",
-       "resettokens-watchlist-token": "Шифра за каналот (Atom/RSS) на [[Special:Watchlist|измени во набљудуваните страници]]",
+       "resettokens-watchlist-token": "Шифра за каналот (Атом/RSS) на [[Special:Watchlist|измени во набљудуваните страници]]",
        "resettokens-done": "Шифрата е вратена одново.",
        "resettokens-resetbutton": "Врати избрани шифри",
        "bold_sample": "Задебелен текст",
        "prefs-personal": "Кориснички профил",
        "prefs-rc": "Скорешни промени",
        "prefs-watchlist": "набљудувања",
-       "prefs-watchlist-days": "Број на денови за приказ во списокот на набљудувања:",
+       "prefs-editwatchlist": "Уреди набљудувани",
+       "prefs-editwatchlist-label": "Уреди ставки во набљудуваните:",
+       "prefs-editwatchlist-edit": "Прегл. и отстрани наслови во набљудуваните",
+       "prefs-editwatchlist-raw": "Уреди сирови набљудувани",
+       "prefs-editwatchlist-clear": "Исчисти набљудувани",
+       "prefs-watchlist-days": "Број на денови за приказ во набљудуваните",
        "prefs-watchlist-days-max": "Највеќе $1 {{PLURAL:$1|ден|дена}}",
        "prefs-watchlist-edits": "Максимален број на прикажани промени во проширениот список на набљудувања:",
        "prefs-watchlist-edits-max": "Највеќе: 1000",
        "right-editmyusercss": "Уредување на сопствени кориснички каскадни стилски податотеки (CSS)",
        "right-editmyuserjs": "Уредување на сопствени кориснички податотеки со JavaScript",
        "right-viewmywatchlist": "Преглед на вашиот список на набљудувања",
-       "right-editmywatchlist": "Уредување на вашиот список на набљудувања. Извесни дејства сепак ќе ставаат страници во списокот и без да го имате ова право.",
+       "right-editmywatchlist": "Уредување на вашите набљудувани. Извесни дејства сепак ќе ставаат страници во нив и без да го имате ова право.",
        "right-viewmyprivateinfo": "Преглед на сопствените лични податоци (на пр. е-пошта, вистинско име и презиме)",
        "right-editmyprivateinfo": "Уредување на сопствените лични податоци (на пр. е-пошта, вистинско име и презиме)",
        "right-editmyoptions": "Уредување на вашите нагодувања",
        "right-override-export-depth": "Извезување на страници вклучувајќи поврзани страници со длабочина до 5",
        "right-sendemail": "Испраќање на е-пошта до други корисници",
        "right-passwordreset": "Преглед на пораки по е-пошта за промена на лозинка",
+       "right-managechangetags": "Создавање3 или бришење на [[Special:Tags|ознаки]] од базата",
        "newuserlogpage": "Дневник на регистрирања на корисници",
        "newuserlogpagetext": "Ова е дневник на регистрирани корисници.",
        "rightslog": "Дневник на корисничките права",
        "action-userrights-interwiki": "уредување на кориснички права на корисници на други викија",
        "action-siteadmin": "заклучување или отклучување на базата на податоци",
        "action-sendemail": "испраќање на е-пошта",
-       "action-editmywatchlist": "Ñ\83Ñ\80едÑ\83ваÑ\9aе Ð½Ð° Ð²Ð°Ñ\88иоÑ\82 Ñ\81пиÑ\81ок Ð½Ð° Ð½Ð°Ð±Ñ\99Ñ\83дÑ\83ваÑ\9aа",
+       "action-editmywatchlist": "Ñ\83Ñ\80едÑ\83ваÑ\9aе Ð½Ð° Ð¼Ð¾Ð¸ Ð½Ð°Ð±Ñ\99Ñ\83дÑ\83вани",
        "action-viewmywatchlist": "преглед на вашиот список на набљудувања",
        "action-viewmyprivateinfo": "преглед на вашите лични податоци",
        "action-editmyprivateinfo": "уредување на вашите лични податоци",
        "action-editcontentmodel": "уредување на содржинскиот модел на страница",
+       "action-managechangetags": "создавање или бришење на ознаки од базата",
        "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>:Податотека.jpg]]</nowiki></code>''' за верзија на сликата во целосна големина\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Податотека.png|200px|thumb|left|опис]]</nowiki></code>''' за верзија на сликата со големина од 200 пиксели прикажана во соодветна кутија, со опис како што е наведено во '''опис'''\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Податотека.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": "Име на податотеката",
        "watchlist": "набљудувања",
        "mywatchlist": "Набљудувања",
        "watchlistfor2": "За $1 $2",
-       "nowatchlist": "Немате ништо во списокот на набљудувања.",
-       "watchlistanontext": "Најавете се за да можете да го прегледувате и уредувате списокот на набљудувања.",
+       "nowatchlist": "Немате ништо во набљудуваните.",
+       "watchlistanontext": "Најавете се за да можете да го прегледувате и уредувате набљудуваните.",
        "watchnologin": "Не сте најавени",
-       "addwatch": "Додај во списокот на набљудувања",
-       "addedwatchtext": "Страницата „[[:$1]]“ е додадена во [[Special:Watchlist|списокот на набљудувања]].\nИдните промени на оваа страница и нејзината страница за разговор ќе се прикажуваат таму.",
+       "addwatch": "Додај во набљудувани",
+       "addedwatchtext": "Страницата „[[:$1]]“ е додадена во [[Special:Watchlist|набљудуваните]].\nИдните промени на оваа страница и нејзината страница за разговор ќе се прикажуваат таму.",
        "addedwatchtext-short": "Страницата „$1“ е додадена во вашите набљудувања.",
-       "removewatch": "Ð\9eÑ\82Ñ\81Ñ\82Ñ\80ани Ð¾Ð´ Ñ\81пиÑ\81окоÑ\82 Ð½Ð° Ð½Ð°Ð±Ñ\99Ñ\83дÑ\83ваÑ\9aа",
-       "removedwatchtext": "Страницата „[[:$1]]“ е отстранета од [[Special:Watchlist|списокот на набљудувања]].",
+       "removewatch": "Ð\9eÑ\82Ñ\81Ñ\82Ñ\80ани Ð½Ð°Ð±Ñ\99Ñ\83дÑ\83ваниÑ\82е",
+       "removedwatchtext": "Страницата „[[:$1]]“ е отстранета од [[Special:Watchlist|набљудуваните]].",
        "removedwatchtext-short": "Страницата „$1“ е отстранета од вашите набљудувања.",
        "watch": "Набљудувај",
        "watchthispage": "Набљудувај ја страницава",
        "watchlist-options": "Поставки за список на набљудувања",
        "watching": "Набљудување...",
        "unwatching": "Отстранувам од набљудувани...",
-       "watcherrortext": "Се појави грешка при менувањето на вашите нагодувања списокот на набљудувања за „$1“.",
+       "watcherrortext": "Се појави грешка при менувањето на вашите нагодувања набљудуваните за „$1“.",
        "enotif_reset": "Означи ги сите страници како посетени",
        "enotif_impersonal_salutation": "Википедија корисник",
        "enotif_subject_deleted": "Страницата $1 на {{SITENAME}} е избришана од {{gender:$2|$2}}",
        "tooltip-ca-delete": "Избриши ја страницава",
        "tooltip-ca-undelete": "Обнови ги уредувањата направени на оваа страница пред да биде избришана",
        "tooltip-ca-move": "Премести ја страницава",
-       "tooltip-ca-watch": "Додај ја страницава во списокот на набљудувања",
-       "tooltip-ca-unwatch": "Отстрани ја страницава од списокот на набљудувања",
+       "tooltip-ca-watch": "Додај ја страницава во набљудуваните",
+       "tooltip-ca-unwatch": "Отстрани ја страницава од набљудуваните",
        "tooltip-search": "Пребарај низ {{SITENAME}}",
        "tooltip-search-go": "Оди на страница со ова име доколку постои",
        "tooltip-search-fulltext": "Пребарај го овој текст низ странците",
        "tooltip-t-whatlinkshere": "Список на сите вики-страници што водат овде",
        "tooltip-t-recentchangeslinked": "Скорешни промени на страници со врски на оваа страница",
        "tooltip-feed-rss": "RSS емитување за оваа страница",
-       "tooltip-feed-atom": "Atom емитување за оваа страница",
+       "tooltip-feed-atom": "Атом-емитување за оваа страница",
        "tooltip-t-contributions": "Список на придонеси на овој корисник",
        "tooltip-t-emailuser": "Испрати е-пошта на овој корисник",
        "tooltip-t-info": "Повеќе информаици за страницава",
        "tooltip-preview": "Преглед на промените - ве молиме користете го ова пред зачувување!",
        "tooltip-diff": "Покажи кои промени ги направи во текстот.",
        "tooltip-compareselectedversions": "Видете ја разликата помеѓу двете избрани верзии на оваа страница.",
-       "tooltip-watch": "Додај ја страницава во списокот на набљудувања",
+       "tooltip-watch": "Додај ја страницава во набљудуваните",
        "tooltip-watchlistedit-normal-submit": "Отстрани наслови",
        "tooltip-watchlistedit-raw-submit": "Поднови го списокот",
        "tooltip-recreate": "Повторно создај ја страницата иако е избришана",
        "pageinfo-header-properties": "Својства на страницата",
        "pageinfo-display-title": "Наслов за приказ",
        "pageinfo-default-sort": "Основен подредбен клуч",
-       "pageinfo-length": "Ð\94олжина на страницата (во бајти)",
+       "pageinfo-length": "Ð\93олемина на страницата (во бајти)",
        "pageinfo-article-id": "Назнака на страницата",
        "pageinfo-language": "Јазик на содржината на страницата",
        "pageinfo-content-model": "Модел на содржината на страницата",
        "confirm-purge-top": "Да го исчистам меѓускладот на страницава?",
        "confirm-purge-bottom": "Со оваа операција се чисти опслужувачкиот меѓусклад и се прикажува најновата верзија.",
        "confirm-watch-button": "ОК",
-       "confirm-watch-top": "Да ја додадам страницава во списокот на набљудувања?",
+       "confirm-watch-top": "Да ја додадам страницава во набљудуваните?",
        "confirm-unwatch-button": "ОК",
-       "confirm-unwatch-top": "Да ја отстранам страницава од списокот на набљудувања?",
+       "confirm-unwatch-top": "Да ја отстранам страницава од набљудуваните?",
        "percent": "$1&#160;%",
        "quotation-marks": "„$1“",
        "imgmultipageprev": "&larr; претходна страница",
        "bitrate-yottabits": "$1 Јб/с",
        "lag-warn-normal": "Промените во {{PLURAL:$1|последната секунда|последните $1 секунди}} може да не бидат прикажани во списокот.",
        "lag-warn-high": "Поради преоптовареност на податочниот опслужувач, промените понови од {{PLURAL:$1|една секунда|$1 секунди}}\nможе да не бидат прикажани во списокот.",
-       "watchlistedit-normal-title": "Уредување на списокот на набљудувања",
+       "watchlistedit-normal-title": "Уредување на набљудуваните",
        "watchlistedit-normal-legend": "Бришење на наслови од список на набљудување",
        "watchlistedit-normal-explain": "Насловите во вашиот список на набљудувања се прикажани подолу.\nЗа да избришете наслов, штиклирајте го квадратчето лево од насловот, и стиснете на „{{int:Watchlistedit-normal-submit}}“.\nМожете и да го [[Special:EditWatchlist/raw|уредувате сировиот список]].",
        "watchlistedit-normal-submit": "Избриши",
        "watchlistedit-normal-done": "{{PLURAL:$1|1 наслов беше|$1 наслови беа}} избришани од вашиот список на набљудувања:",
-       "watchlistedit-raw-title": "Ð\9dапÑ\80едно Ñ\83Ñ\80едÑ\83ваÑ\9aе Ð½Ð° Ñ\81пиÑ\81окоÑ\82 Ð½Ð° Ð½Ð°Ð±Ñ\99Ñ\83дÑ\83ваÑ\9aа",
-       "watchlistedit-raw-legend": "Уредување на списокот на набљудувања",
+       "watchlistedit-raw-title": "УÑ\80еди Ñ\81иÑ\80ови Ð½Ð°Ð±Ñ\99Ñ\83дÑ\83вани",
+       "watchlistedit-raw-legend": "Уреди сирови набљудувани",
        "watchlistedit-raw-explain": "Насловите во вашиот список на набљудувања се прикажани подолу, и можат да се уредуваат со додавање или бришење на ставки од списокот; \nеден наслов по ред. \nКога ќе завршите, стиснете на „{{int:Watchlistedit-raw-submit}}“.\nМожете да го [[Special:EditWatchlist|употребите обичниот уредник]].",
        "watchlistedit-raw-titles": "Наслови:",
        "watchlistedit-raw-submit": "Поднови го списокот",
        "watchlistedit-raw-done": "Вашиот список на набљудувања е подновен.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 наслов беше|$1 наслови беа}} додадени:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|Избришан е еден наслов|Избришани се $1 наслови}}:",
-       "watchlistedit-clear-title": "Исчистен списокот на набљудувања",
+       "watchlistedit-clear-title": "Исчистени набљудуваните",
        "watchlistedit-clear-legend": "Исчисти набљудувани",
-       "watchlistedit-clear-explain": "Сите наслови ќе бидат отстранети од списокот на набљудувања",
+       "watchlistedit-clear-explain": "Сите наслови ќе бидат отстранети од набљудуваните",
        "watchlistedit-clear-titles": "Наслови:",
        "watchlistedit-clear-submit": "Исчисти ги набљудуваните (Ова е трајно!)",
        "watchlistedit-clear-done": "Вашиот список на набљудувања е исчистен.",
        "watchlisttools-clear": "Исчисти ги набљудуваните",
        "watchlisttools-view": "Преглед на релевантни промени",
        "watchlisttools-edit": "Погледај и уреди список на набљудувања",
-       "watchlisttools-raw": "Ð\9dапÑ\80едно Ñ\83Ñ\80едÑ\83ваÑ\9aе Ð½Ð° Ñ\81пиÑ\81окоÑ\82 Ð½Ð° Ð½Ð°Ð±Ñ\99Ñ\83дÑ\83ваÑ\9aа",
+       "watchlisttools-raw": "УÑ\80еди Ñ\81иÑ\80ови Ð½Ð°Ð±Ñ\99Ñ\83дÑ\83вани",
        "iranian-calendar-m1": "Фарвардин",
        "iranian-calendar-m2": "Ордибехешт",
        "iranian-calendar-m3": "Хордад",
        "tags-tag": "Име на ознака",
        "tags-display-header": "Изглед во списоците на промени",
        "tags-description-header": "Целосен опис на значењето",
+       "tags-source-header": "Извор",
        "tags-active-header": "Активно?",
        "tags-hitcount-header": "Означени промени",
+       "tags-actions-header": "Дејства",
        "tags-active-yes": "Да",
        "tags-active-no": "Не",
+       "tags-source-extension": "Одредени од додаток",
+       "tags-source-manual": "Применети рачно од корисници и ботови",
+       "tags-source-none": "Вон употреба",
        "tags-edit": "уреди",
+       "tags-delete": "избриши",
+       "tags-activate": "активирај",
+       "tags-deactivate": "деактивирај",
        "tags-hitcount": "$1 {{PLURAL:$1|промена|промени}}",
+       "tags-manage-no-permission": "Немате дозвола за раководење со ознаки за промени.",
+       "tags-create-heading": "Создај нова ознака",
+       "tags-create-explanation": "Новосоздадните ознаки по основно ќе се стават на располагање за употреба од корисници и ботови.",
+       "tags-create-tag-name": "Име на ознаката:",
+       "tags-create-reason": "Причина:",
+       "tags-create-submit": "Создај",
+       "tags-create-no-name": "Мора да укажете име на ознаката.",
+       "tags-create-invalid-chars": "Ознаката не смее да содржи запирки (<code>,</code>) и надесни коси црти (<code>/</code>).",
+       "tags-create-invalid-title-chars": "Имињата на ознаките не смеат да содржат знаци што не може да се користат во наслови на страници.",
+       "tags-create-already-exists": "Ознаката „$1“ веќе постои.",
+       "tags-create-warnings-above": "Во обидот да ја создадам ознаката „$1“ наидов на {{PLURAL:$2|следново предупредување|следниве предупредувања}}:",
+       "tags-create-warnings-below": "Дали сакате да продолжите со создавањето на ознаката?",
+       "tags-delete-title": "Избриши ознака",
+       "tags-delete-explanation-initial": "На пат сте да ја избришете ознаката „$1“ од базата.",
+       "tags-delete-explanation-in-use": "Ќе биде отстранета од {{PLURAL:$2|една преработка или дневнички запис врз која|сите $2 преработки и/или дневнички записи врз кои}} е применета.",
+       "tags-delete-explanation-warning": "Ова дејство е <strong>неповратно</strong> и <strong>не може да се отповика</strong>, дури ни од администраторите на базата. Затоа, осигурајте се дека ова навистина е ознаката што сакате да ја избришете.",
+       "tags-delete-explanation-active": "<strong>Ознаката „$1“ сè уште е активна и во иднина ќе продолжи да се применува.</strong> За да го запрете ова, одете на местото/тата на кои ѝ е зададено да се применува и оневозможете ја таму.",
+       "tags-delete-reason": "Причина:",
+       "tags-delete-submit": "Неповратно избриши ја ознакава",
+       "tags-delete-not-allowed": "Ознаките зададени од додаток не можат да се бришат освен ако тоа не е изрично дозволено од додатокот.",
+       "tags-delete-not-found": "Ознаката „$1“ не постои.",
+       "tags-delete-too-many-uses": "Ознаката „$1“ се применува во повеќе од {{PLURAL:$2|една преработка|$2 преработки}}, што значи дека не може да се избрише.",
+       "tags-delete-warnings-after-delete": "Ознаката „$1“ е успешно избришана, но наидов на {{PLURAL:$2|следново предупредување|следниве предупредувања}}:",
+       "tags-activate-title": "Активирај ознака",
+       "tags-activate-question": "На пат сте да ја активирате ознаката „$1“.",
+       "tags-activate-reason": "Причина:",
+       "tags-activate-not-allowed": "Не можам да ја активирам ознаката „$1“.",
+       "tags-activate-not-found": "Ознаката „$1“ не постои.",
+       "tags-activate-submit": "Активирај",
+       "tags-deactivate-title": "Деактивирај ознака",
+       "tags-deactivate-question": "На пат сте да ја деактивирате ознаката „$1“.",
+       "tags-deactivate-reason": "Причина:",
+       "tags-deactivate-not-allowed": "Не можам да ја деактивирам ознаката „$1“.",
+       "tags-deactivate-submit": "Декативирај",
        "comparepages": "Спореди страници",
        "compare-page1": "Страница 1",
        "compare-page2": "Страница 2",
        "logentry-upload-upload": "$1 {{GENDER:$2|ја подигна}} $3",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|подигна}} нова верзија на $3",
        "logentry-upload-revert": "$1 {{GENDER:$2|ја подигна}} $3",
+       "log-name-managetags": "Дневник на раководство со ознаки",
+       "log-description-managetags": "На страницава се наведени раководните задачи што се однесуваат на [[Special:Tags|ознаки]]. Дневникот содржи само дејства извршени рачно од администратор; ознаките можат да се создаваат и бришат од википрограмот без да се заведуваат во дневников.",
+       "logentry-managetags-create": "$1 {{GENDER:$2|ја создаде}} ознаката „$4“",
+       "logentry-managetags-delete": "$1 {{GENDER:$2|ја избриша}} ознаката „$4“ (отстранета од {{PLURAL:$5|една преработка или дневнички запис|$5 преработки и/или дневнички записи}})",
+       "logentry-managetags-activate": "$1 {{GENDER:$2|ја активираше}} ознаката „$4“ за употреба од корисници и ботови",
+       "logentry-managetags-deactivate": "$1 {{GENDER:$2|ја деактивираше}} ознаката „$4“ за употреба од корисници и ботови",
        "rightsnone": "(нема)",
        "revdelete-summary": "опис на уредување",
        "feedback-bugornote": "Ако сте спремни подробно да го опишете техничкиот проблем, тогаш [$1 пријавете грешка]. \nВо спротивно, послужете се со едноставниот образец подолу. Вашиот коментар ќе стои на страницата „[$3 $2]“, заедно со корисничкото име и прелистувачот што го користите.",
index a8b0177..f3c3f3d 100644 (file)
        "prefs-personal": "എന്നെപ്പറ്റി",
        "prefs-rc": "സമീപകാല മാറ്റങ്ങൾ",
        "prefs-watchlist": "ശ്രദ്ധിക്കുന്നവ",
+       "prefs-editwatchlist": "ശ്രദ്ധിക്കുന്നവയുടെ പട്ടിക തിരുത്തുക",
+       "prefs-editwatchlist-label": "താങ്കൾ ശ്രദ്ധിക്കുന്നവയുടെ പട്ടികയിലെ ഉൾപ്പെടുത്തലുകൾ തിരുത്തുക:",
+       "prefs-editwatchlist-edit": "താങ്കൾ ശ്രദ്ധിക്കുന്നവയുടെ പട്ടികയിലെ തലക്കെട്ടുകൾ കാണുക നീക്കംചെയ്യുക",
+       "prefs-editwatchlist-raw": "ശ്രദ്ധിക്കുന്നവയുടെ പട്ടികയുടെ മൂലരൂപം തിരുത്തുക",
+       "prefs-editwatchlist-clear": "ശ്രദ്ധിക്കുന്നവയുടെ പട്ടിക ശൂന്യമാക്കുക",
        "prefs-watchlist-days": "ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടികയിൽ പ്രദർശിപ്പിക്കേണ്ട പരമാവധി ദിവസങ്ങൾ:",
        "prefs-watchlist-days-max": "പരമാവധി {{PLURAL:$1|ഒരു ദിവസം|$1 ദിവസങ്ങൾ}}",
        "prefs-watchlist-edits": "ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടികയുടെ വികസിത രൂപത്തിൽ പ്രദർശിപ്പിക്കേണ്ട പരമാവധി മാറ്റങ്ങൾ:",
        "right-override-export-depth": "കണ്ണിവത്കരിക്കപ്പെട്ട താളുകളുടെ ആഴം 5 വരെയുള്ള താളുകൾ കയറ്റുമതി ചെയ്യുക",
        "right-sendemail": "മറ്റുപയോക്താക്കൾക്ക് ഇമെയിൽ അയയ്ക്കുക",
        "right-passwordreset": "രഹസ്യവാക്ക് പുനഃക്രമീകരിക്കാനുള്ള ഇമെയിലുകൾ കാണുക",
+       "right-managechangetags": "ഡേറ്റാബേസിൽ നിന്നുള്ള [[Special:Tags|ടാഗുകൾ]] സൃഷ്ടിക്കുക അല്ലെങ്കിൽ മായ്ക്കുക",
        "newuserlogpage": "ഉപയോക്തൃ സൃഷ്ടിയുടെ രേഖ",
        "newuserlogpagetext": "പുതിയതായി അംഗത്വമെടുത്ത ഉപയോക്താക്കളുടെ പട്ടിക താഴെ കാണാം.",
        "rightslog": "ഉപയോക്തൃ അവകാശ രേഖ",
        "action-viewmyprivateinfo": "താങ്കളുടെ സ്വകാര്യവിവരങ്ങൾ കാണുക",
        "action-editmyprivateinfo": "താങ്കളുടെ സ്വകാര്യവിവരങ്ങൾ തിരുത്തുക",
        "action-editcontentmodel": "താളിന്റെ ഉള്ളടക്ക രീതി തിരുത്തുക",
+       "action-managechangetags": "ഡേറ്റാബേസിൽ നിന്നുള്ള ടാഗുകൾ സൃഷ്ടിക്കുക അല്ലെങ്കിൽ മായ്ക്കുക",
        "nchanges": "{{PLURAL:$1|ഒരു മാറ്റം|$1 മാറ്റങ്ങൾ}}",
        "enhancedrc-since-last-visit": "കഴിഞ്ഞ സന്ദർശനത്തിനു ശേഷം {{PLURAL:$1|ഒരെണ്ണം|$1 എണ്ണം}}",
        "enhancedrc-history": "നാൾവഴി",
        "tags-tag": "റ്റാഗിന്റെ പേര്‌",
        "tags-display-header": "മാറ്റങ്ങളുടെ പട്ടികകളിലെ രൂപം",
        "tags-description-header": "അർത്ഥത്തിന്റെ പൂർണ്ണ വിവരണം",
+       "tags-source-header": "സ്രോതസ്സ്",
        "tags-active-header": "സീജീവമാണോ?",
        "tags-hitcount-header": "അനുബന്ധമുള്ള മാറ്റങ്ങൾ",
+       "tags-actions-header": "പ്രവൃത്തികൾ",
        "tags-active-yes": "അതെ",
        "tags-active-no": "അല്ല",
+       "tags-source-extension": "ഒരു അനുബന്ധം നിർവ്വചിച്ചിരിക്കുന്നത് പ്രകാരം",
+       "tags-source-manual": "ഉപയോക്താക്കളോ ബോട്ടോ നേരിട്ട് ചെയ്തിട്ടുള്ളവ",
+       "tags-source-none": "ഇപ്പോൾ ഉപയോഗത്തിലില്ല",
        "tags-edit": "തിരുത്തുക",
+       "tags-delete": "മായ്ക്കുക",
+       "tags-activate": "സജ്ജമാക്കുക",
+       "tags-deactivate": "പ്രവർത്തനരഹിതമാക്കുക",
        "tags-hitcount": "{{PLURAL:$1|ഒരു മാറ്റം|$1 മാറ്റങ്ങൾ}}",
+       "tags-manage-no-permission": "മാറ്റ ടാഗുകൾ കൈകാര്യം ചെയ്യാനുള്ള അനുവാദം താങ്കൾക്കില്ല.",
+       "tags-create-heading": "പുതിയൊരു ടാഗ് സൃഷ്ടിക്കുക",
        "comparepages": "താളുകൾ താരതമ്യപ്പെടുത്തുക",
        "compare-page1": "താൾ 1",
        "compare-page2": "താൾ 2",
index 1c24015..5858c09 100644 (file)
@@ -42,7 +42,8 @@
                        "प्रतिमा",
                        "शࣿरीहरि",
                        "संतोष दहिवळ",
-                       "아라"
+                       "아라",
+                       "BPositive"
                ]
        },
        "tog-underline": "दुव्यांचे अधोरेखन:",
        "suspicious-userlogout": "तुमच्या सनोंद-निर्गमनास नकार दिल्या गेला कारण असे दिसते की ती विनंती अन-अनुबंधित(डिसकनेक्टेड) न्याहाळकाद्वारे पाठवल्या गेली.",
        "createacct-another-realname-tip": "आपले खरे नाव टाकणे वैकल्पिक आहे.\nजर आपण ते द्यायचे ठरविले तर,ते आपल्या कामाचा मूळ स्रोत म्णून देण्यास वापरले जाईल.",
        "pt-login": "सनोंद-प्रवेश करा",
+       "pt-createaccount": "खाते बनवा",
        "pt-userlogout": "सनोंद-निर्गम",
        "php-mail-error-unknown": "पीएचपीच्या विपत्र() पर्यायात अज्ञात चूक",
        "user-mail-no-addy": "ईमेल पत्त्या विना ईमेल पाठवण्यचा प्रयत्न केला",
        "querypage-disabled": "हे विषेश पान कार्यमापन (performance) करणांमुळे प्रतिबंधित करण्यात आले आहे.",
        "booksources": "पुस्तक स्रोत",
        "booksources-search-legend": "पुस्तक स्रोत शोधा",
+       "booksources-search": "शोधा",
        "booksources-text": "खालील यादीत नवी आणिजुनी पुस्तके विकणाऱ्या संकेतस्थळाचे दुवे आहेत,आणि त्यात कदाचित आपण शोधू पहात असलेल्या पुस्तकाची अधिक माहिती असेल:",
        "booksources-invalid-isbn": "दिलेला आयएसबीएन वैध नाही; मूळ स्रोतातून उतरवताना झालेल्या चुकांचे निरसन करा.",
        "specialloguserlabel": "कार्यकर्ता:",
        "delete-warning-toobig": "या पानाला, $1 {{PLURAL:$1|आवृत्ती|आवृत्त्यां}}मुळे तयार झालेला खूप मोठा संपादन इतिहास आहे.त्याचे वगळण्याने {{SITENAME}} वर डाटाबेसच्या क्रियांची उलथापालथ होऊ शकते; सावधगिरीने पुढे जा.",
        "deleting-backlinks-warning": "'''ईशारा:''' आपण वगळत असणाऱ्या पानास दुसरी पाने जोडलेली किंवा आंतरविन्यासित आहेत.",
        "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 testing documentation] पहा",
-       "javascripttest-qunit-heading": "मीडिया विकी जावा स्क्रिप्ट कयू यूनिट टेस्ट ची जागा",
        "tooltip-pt-userpage": "तुमचे सदस्य पान",
        "tooltip-pt-anonuserpage": "तुम्ही ज्या अंकपत्त्यान्वये संपादित करत आहात त्याकरिता हे सदस्य पान",
        "tooltip-pt-mytalk": "तुमचे चर्चा पान",
index f7a6aeb..1518d9f 100644 (file)
        "right-override-export-depth": "Mengeksport laman termasuk laman dipaut sehingga kedalaman 5",
        "right-sendemail": "Mengirim e-mel kepada pengguna-pengguna lain",
        "right-passwordreset": "Lihat e-mel set semula kata laluan",
+       "right-managechangetags": "Mencipta dan menghapuskan [[Special:Tags|teg]] dari pangkalan data",
        "newuserlogpage": "Log akaun baru",
        "newuserlogpagetext": "Yang berikut ialah log penciptaan pengguna.",
        "rightslog": "Log hak pengguna",
        "action-viewmyprivateinfo": "melihat maklumat peribadi sendiri",
        "action-editmyprivateinfo": "menyunting maklumat peribadi sendiri",
        "action-editcontentmodel": "menyunting model kandungan laman",
+       "action-managechangetags": "mencipta dan menghapuskan teg dari pangkalan data",
        "nchanges": "$1 perubahan",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|sejak lawatan terakhir}}",
        "enhancedrc-history": "sejarah",
        "tags-tag": "Nama label",
        "tags-display-header": "Rupa dalam senarai perubahan",
        "tags-description-header": "Keterangan makna",
+       "tags-source-header": "Sumber",
        "tags-active-header": "Aktif?",
        "tags-hitcount-header": "Perubahan",
+       "tags-actions-header": "Tindakan",
        "tags-active-yes": "Ya",
        "tags-active-no": "Tidak",
+       "tags-source-extension": "Ditetapkan oleh suatu sambungan",
+       "tags-source-manual": "Digunakan secara manual oleh pengguna dan bot",
+       "tags-source-none": "Tidak digunakan lagi",
        "tags-edit": "sunting",
+       "tags-delete": "hapuskan",
+       "tags-activate": "hidupkan",
+       "tags-deactivate": "matikan",
        "tags-hitcount": "$1 perubahan",
+       "tags-create-explanation": "Secara asali, teg-teg yang baru dicipta akan dibuka untuk kegunaan pengguna dan juga bot.",
+       "tags-create-tag-name": "Nama teg:",
+       "tags-create-reason": "Sebab:",
+       "tags-create-submit": "Cipta",
+       "tags-create-no-name": "Anda mesti menyebut satu nama teg.",
+       "tags-create-invalid-chars": "Nama teg tidak boleh mengandungi tanda koma (<code>,</code>) atau tanda miring (<code>/</code>).",
+       "tags-create-already-exists": "Teg \"$1\" sudah wujud.",
+       "tags-create-warnings-above": "{{PLURAL:$2|Amaran|Amaran-amaran}} berikut ditemui ketika cuba mencipta teg \"$1\":",
+       "tags-create-warnings-below": "Adakah anda hendak bersambung mencipta teg ini?",
+       "tags-delete-explanation-initial": "Anda bakal menghapuskan teg \"$1\" dari pangkalan data.",
+       "tags-delete-explanation-active": "<strong>Teg \"$1\" masih aktif dan akan terus dijalankan di masa akan datang.</strong> Untuk menghentikannya, pergi ke tempat(-tempat) di mana teg ini disetkan untuk dijalankan, dan matikannya di sana.",
+       "tags-delete-reason": "Sebab:",
+       "tags-delete-not-allowed": "Teg-teg yang ditakrifkan oleh sambungan tidak boleh dihapuskan melainkan dibenarkan khususnya oleh sambungan berkenaan.",
+       "tags-delete-not-found": "Teg \"$1\" tidak wujud.",
+       "tags-activate-title": "Hidupkan teg",
+       "tags-activate-question": "Anda bakal menghidupkan teg \"$1\".",
+       "tags-activate-reason": "Sebab:",
+       "tags-activate-not-found": "Teg \"$1\" tidak wujud.",
+       "tags-activate-submit": "Hidupkan",
+       "tags-deactivate-title": "Matikan teg",
+       "tags-deactivate-question": "Anda bakal mematikan teg \"$1\".",
+       "tags-deactivate-reason": "Sebab:",
+       "tags-deactivate-not-allowed": "Teg \"$1\" tidak boleh dimatikan.",
+       "tags-deactivate-submit": "Matikan",
        "comparepages": "Perbandingan laman",
        "compare-page1": "Laman 1",
        "compare-page2": "Laman 2",
        "logentry-upload-upload": "$1 telah {{GENDER:$2|muat naik}} $3",
        "logentry-upload-overwrite": "$1 telah {{GENDER:$2|muat naik}} versi baru $3",
        "logentry-upload-revert": "$1 telah {{GENDER:$2|muat naik}} $3",
+       "log-name-managetags": "Log pengurusan teg",
+       "logentry-managetags-create": "$1 {{GENDER:$2|mencipta}} teg \"$4\"",
+       "logentry-managetags-delete": "$1 {{GENDER:$2|menghapuskan}} teg \"$4\" (digugurkan dari $5 {{PLURAL:$5|semakan atau entri log}})",
+       "logentry-managetags-activate": "$1 {{GENDER:$2|menghidupkan}} teg \"$4\" untuk kegunaan pengguna dan bot",
+       "logentry-managetags-deactivate": "$1 {{GENDER:$2|mematikan}} teg \"$4\" untuk kegunaan pengguna dan bot",
        "rightsnone": "(tiada)",
        "revdelete-summary": "ringkasan",
        "feedback-bugornote": "Jika anda bersedia untuk menerangkan masalah teknikal secara terperinci, sila [$1 laporkan pepijat]. \nAtaupun, anda boleh menggunakan borang yang mudah di bawah. Ulasan anda akan dicatatkan pada laman \"[$3 $2]\", beserta nama pengguna anda dan pelayar yang anda gunakan.",
index 525b388..9872ead 100644 (file)
        "prefs-personal": "Profilo utente",
        "prefs-rc": "Urdeme nove",
        "prefs-watchlist": "Asservate speciale",
+       "prefs-editwatchlist": "Cagna l'elenco 'e paggene cuntrullate",
+       "prefs-editwatchlist-label": "Cagna ll'elemente 'e l'elenco 'e paggene cuntrullate",
+       "prefs-editwatchlist-edit": "Vide e lèva titule dint' 'a l'elenco 'e paggene cuntrullate vuosto",
+       "prefs-editwatchlist-raw": "Cagna l'elenco 'e paggene cuntrullate ncruro",
+       "prefs-editwatchlist-clear": "Sbacanta l'elenco 'e paggene cuntrullate",
        "prefs-watchlist-days": "Nummero 'e juorne 'a mmustà dint'a l'elenco 'e cuntrollo:",
        "prefs-watchlist-days-max": "Massimo $1 {{PLURAL:$1|juorno|juorne}}",
        "prefs-watchlist-edits": "Numero massimo 'e cagnamiente 'a mmustà ch' 'e funziune avanzate:",
        "right-override-export-depth": "Esporta 'e paggene azzeccanno 'e paggene cullegate nfin'a na profondità 'e 5",
        "right-sendemail": "Manna na mail a ll'at'utente",
        "right-passwordreset": "Vide 'e mmasciate 'e rimpustazione d' 'a password",
+       "right-managechangetags": "Crìa e scancella 'e [[Special:Tags|tag]] d' 'o database",
        "newuserlogpage": "Riggistro 'e nuove utente",
        "newuserlogpagetext": "Chest'è nu riggistro 'e criazione d'utenze.",
        "rightslog": "Deritte 'e ll'utente",
        "action-viewmyprivateinfo": "vide 'e date perzunale",
        "action-editmyprivateinfo": "cagnà 'e proprie date perzunale",
        "action-editcontentmodel": "càgna 'o mudelo 'e cuntenute 'e na paggena",
+       "action-managechangetags": "crìa e scancella 'e tag d' 'o database",
        "nchanges": "$1 {{PLURAL:$1|cagnamiento|cagnamiente}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|'a ll'urdema visita}}",
        "enhancedrc-history": "cronologgia",
        "notargettext": "Nun avete specificato na paggena o n'utente 'e destinazione pe' putè fa sta operazione.",
        "nopagetitle": "Nisciuna paggena 'e destinazione",
        "nopagetext": "'A paggena 'e destinazione c'avite specificato nun esiste.",
-       "pager-newer-n": "{{PLURAL:$1|1 cchiù viecchio|$1 cchiù viecchie}}",
+       "pager-newer-n": "{{PLURAL:$1|1 cchiù nova|$1 cchiù nnove}}",
        "pager-older-n": "{{PLURAL:$1|1 cchiù viecchio|$1 cchiù viecchie}}",
        "suppress": "Supervisione",
        "querypage-disabled": "Sta paggena speciale è stutata pe' mutive 'e prestaziune.",
        "tags-tag": "Nomme 'e ll'etichetta",
        "tags-display-header": "Comme cumpàreno ncopp' 'a lista 'e cagnamiente",
        "tags-description-header": "Descrizione sana d' 'o significato",
+       "tags-source-header": "Funte",
        "tags-active-header": "Attivo?",
        "tags-hitcount-header": "Cagnamiente etichettate",
+       "tags-actions-header": "Aziune",
        "tags-active-yes": "Sì",
        "tags-active-no": "No",
+       "tags-source-extension": "Definito 'a na stensione",
+       "tags-source-manual": "Apprecato manualmente 'a ll'utente e re bot",
+       "tags-source-none": "Nun cchiù ausato",
        "tags-edit": "càgna",
+       "tags-delete": "scancèlla",
+       "tags-activate": "appiccia",
+       "tags-deactivate": "stuta",
        "tags-hitcount": "$1 {{PLURAL:$1|cagnamiento|cagnamiente}}",
+       "tags-manage-no-permission": "Nun tenite 'o permesso pe' cagnà 'e tag.",
+       "tags-create-heading": "Crìa nu tag nuovo",
+       "tags-create-explanation": "Comme predefinito, 'e tag criate nuove nuove se farranno disponibbele pe ll'ausà ll'utente e re bot",
+       "tags-create-tag-name": "Nomme 'e ll'etichetta ('o tag):",
+       "tags-create-reason": "Mutivo:",
+       "tags-create-submit": "Crìa",
+       "tags-create-no-name": "Avite 'a specificà nu nomme p' 'o tag.",
+       "tags-create-invalid-chars": "'E nomme d' 'e tag nun avesser'a cuntenè comme (<code>,</code>) o pallicche (<code>/</code>).",
+       "tags-create-invalid-title-chars": "'E nomme d' 'e tag nun avesser'a cuntenè carattere ca nun se stann'ausanno dint' 'e titule d' 'e paggene.",
+       "tags-create-already-exists": "'O tag \"$1\" esiste già.",
+       "tags-create-warnings-above": "{{PLURAL:$2|Chist'avviso s'è truvato|Chist'avvise se so' truvate}} pe' tramente ca se steva a crià 'o tag \"$1\":",
+       "tags-create-warnings-below": "Vulite cuntinuà a crià 'o tag?",
+       "tags-delete-title": "Scancella tag",
+       "tags-delete-explanation-initial": "State pe' scancellà 'o tag \"$1\" d' 'o database.",
+       "tags-delete-explanation-in-use": "Sarrà luvato d' 'o {{PLURAL:$2|$2 verziona o d' 'o riggistro|tutt' 'e verziune $2 e/o 'e nutarelle int' 'o riggistro}} ô quale fosse azzeccato mò mò.",
+       "tags-delete-explanation-warning": "St'aziona è <strong>irreversibbele</strong> e <strong>nun se pò turnà arreto</strong>, pure 'a ll'ammenistrature d' 'o database. Faciteve capace ca stu tag è chillu ca vulite scancellà.",
+       "tags-delete-explanation-active": "<strong>'O tag \"$1\" è ancora attivo, e sarrà apprecato int' 'o futuro.</strong> Pe' fernì cu st'attività, jate, a lloco addò 'o tag s'è apprecato, e stutate llànno.",
+       "tags-delete-reason": "Mutivo:",
+       "tags-delete-submit": "Scancellà 'e manera irreversibbele stu tag",
+       "tags-delete-not-allowed": "'E tag ca se so' definite 'a na stensiona nun se ponno scancellà si nun è c' 'a stensiona 'o premmettesse.",
+       "tags-delete-not-found": "'O tag $1 nun esiste.",
+       "tags-delete-too-many-uses": "'O tag \"$1\" è apprecato a cchiù 'e $2 {{PLURAL:$2|verziona|verziune}}, cosa ca vulesse dicere ca nun se ò scancellà.",
+       "tags-delete-warnings-after-delete": "'O tag \"$1\" s'è scancellato buono, ma {{PLURAL:$2|s'è ncuntrato ll'avviso|se songhe ncuntrate ll'avise}} ccà:",
+       "tags-activate-title": "Appiccia 'o tag",
+       "tags-activate-question": "Vuje state p'appiccià 'o tag \"$1\".",
+       "tags-activate-reason": "Mutivo:",
+       "tags-activate-not-allowed": "Nun se pò appiccià 'o tag \"$1\".",
+       "tags-activate-not-found": "'O tag \"$1\" nun esiste.",
+       "tags-activate-submit": "Appicia",
+       "tags-deactivate-title": "Stuta tag",
+       "tags-deactivate-question": "Vuje state pe' stutà 'o tag \"$1\".",
+       "tags-deactivate-reason": "Mutivo:",
+       "tags-deactivate-not-allowed": "Nun se pò stutà 'o tag \"$1\".",
+       "tags-deactivate-submit": "Stuta",
        "comparepages": "Miette a cunfronto 'e paggene",
        "compare-page1": "Paggena 1",
        "compare-page2": "Paggena 2",
        "logentry-upload-upload": "$1 {{GENDER:$2|ave carrecato}} $3",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|ave carrecato}} na verziona nnova 'e $3",
        "logentry-upload-revert": "$1 {{GENDER:$2|ave carrecato}} $3",
+       "log-name-managetags": "Riggistro 'e ggistione d' 'e tag",
+       "log-description-managetags": "Sta paggena accucchiasse ll'aziune 'e ggistione azzeccate a [[Special:Tags|tagge]]. 'O riggistro cuntene surtanto ll'aziune ca se fanno manualmente 'a n'ammenistratore; 'e tag s'avesser'a crià o scancellà p' 'o software wiki senza na nutarella nzignata int'a stu riggistro.",
+       "logentry-managetags-create": "$1 {{GENDER:$2|criaje}} 'o tag \"$4\"",
+       "logentry-managetags-delete": "$1 {{GENDER:$2|scancellaje}} 'o tag \"$4\" (luvato 'a $5 {{PLURAL:$5|verziona o nutarella 'e riggistro|verziune o nutarelle 'e riggistro}})",
+       "logentry-managetags-activate": "$1 {{GENDER:$2|appicciaje}} 'o tag \"$4\" pe ll'uso 'a ll'utente e re bot",
+       "logentry-managetags-deactivate": "$1 {{GENDER:$2|stutaje}} 'o tag \"$4\" pe' ll'uso d'utente e re bot",
        "rightsnone": "(nisciuno)",
        "revdelete-summary": "cagna 'o riepilego",
        "feedback-bugornote": "Si site pronto/a a descrivere nu probblema tecnico ch' 'e dettaglie, pe' piacere [$1 mannate nu bug].\nSi nun site pronto/a, allora putite ausà 'o modulo semprice ca vedite ccà abbascio. 'O commento vuosto sarrà mpezzato dint' 'a paggena [$3 $2]\", seguenno 'o nomme utente vuosto e 'o navigatóre web ca state ausanno.",
index 1176b6a..1e52c1a 100644 (file)
        "prefs-personal": "Brukerdata",
        "prefs-rc": "Siste endringer",
        "prefs-watchlist": "Overvåkningsliste",
+       "prefs-editwatchlist": "Rediger overvåkningsliste",
+       "prefs-editwatchlist-label": "Rediger elementer på overvåkningslista di:",
+       "prefs-editwatchlist-edit": "Vis og fjern titler fra overvåkningslista di",
+       "prefs-editwatchlist-raw": "Rediger rå overvåkningsliste",
+       "prefs-editwatchlist-clear": "Slett overvåkningslista di",
        "prefs-watchlist-days": "Dager som skal vises i overvåkningslisten:",
        "prefs-watchlist-days-max": "Maksimalt $1 {{PLURAL:$1|dag|dager}}",
        "prefs-watchlist-edits": "Antall redigeringer som skal vises i utvidet overvåkningsliste:",
        "right-override-export-depth": "Eksporter sider inkludert lenkede sider til en dypde på 5",
        "right-sendemail": "Send e-post til andre brukere",
        "right-passwordreset": "Vis e-poster over tilbakestilte passord",
+       "right-managechangetags": "Opprette og slette [[Special:Tags|tagger]] fra databasen",
        "newuserlogpage": "Brukeropprettelseslogg",
        "newuserlogpagetext": "Dette er en logg over brukeropprettelser.",
        "rightslog": "Brukerrettighetslogg",
        "action-viewmyprivateinfo": "vise din private informasjon",
        "action-editmyprivateinfo": "rediger din private informasjon",
        "action-editcontentmodel": "rediger innholdsmodellen til en side",
+       "action-managechangetags": "opprette og slette tagger fra databasen",
        "nchanges": "$1 {{PLURAL:$1|endring|endringer}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|siden forrige besøk}}",
        "enhancedrc-history": "historikk",
        "uploaderror": "Feil under opplasting av fil",
        "upload-recreate-warning": "'''Advarsel: En fil med det navnet har blitt slettet eller flyttet.'''\n\nSlette- og flytteloggen for denne siden gjengis her:",
        "uploadtext": "Bruk skjemaet nedenfor for å laste opp filer.\nFor å se eller søke i eksisterende filer, gå til [[Special:FileList|listen over filer]]. Opplastinger lagres også i [[Special:Log/upload|opplastingsloggen]] og slettinger i [[Special:Log/delete|sletteloggen]].\n\nFor å inkludere en fil på en side, bruk en slik lenke:\n*'''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Filnavn.jpg]]</nowiki></code>''' for å bruke bildet i opprinnelig form\n*'''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Filnavn.png|200px|thumb|left|Alternativ tekst]]</nowiki></code>''' for å bruke bildet med en bredde på 200&nbsp;piksler, venstrestilt og med «Alternativ tekst» som beskrivelse\n*'''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Filnavn.ogg]]</nowiki></code>''' for å lenke direkte til filen uten å vise den",
-       "upload-permitted": "Tillatte filtyper: $1.",
-       "upload-preferred": "Foretrukne filtyper: $1",
-       "upload-prohibited": "Forbudte filtyper: $1.",
+       "upload-permitted": "{{PLURAL:$2|Tillatt filtype|Tillatte filtyper}}: $1.",
+       "upload-preferred": "{{PLURAL:$2|Foretrukket filtype|Foretrukne filtyper}}: $1.",
+       "upload-prohibited": "{{PLURAL:$2|Forbudt filtype|Forbudte filtyper}}: $1.",
        "uploadlogpage": "Opplastingslogg",
        "uploadlogpagetext": "Her er en liste over de siste opplastede filene.\nSe [[Special:NewFiles|galleriet over nye filer]] for en mer visuell visning",
        "filename": "Filnavn",
        "tags-tag": "Taggnavn",
        "tags-display-header": "Utseende på endringslister",
        "tags-description-header": "Fullstendig betydning",
+       "tags-source-header": "Kilde",
        "tags-active-header": "Aktive?",
        "tags-hitcount-header": "Taggede endringer",
+       "tags-actions-header": "Handlinger",
        "tags-active-yes": "Ja",
        "tags-active-no": "Nei",
+       "tags-source-extension": "Definert av en utvidelse",
+       "tags-source-manual": "Brukes manuelt av brukere og roboter",
+       "tags-source-none": "Brukes ikke lenger",
        "tags-edit": "rediger",
+       "tags-delete": "slett",
+       "tags-activate": "aktiver",
+       "tags-deactivate": "deaktiver",
        "tags-hitcount": "{{PLURAL:$1|én endring|$1 endringer}}",
+       "tags-manage-no-permission": "Du har ikke tillatelse til å behandle tagger.",
+       "tags-create-heading": "Opprett ny tagg",
+       "tags-create-explanation": "Som standard vil nyopprettede tagger være tilgjengelige for brukere og roboter.",
+       "tags-create-tag-name": "Taggnavn:",
+       "tags-create-reason": "Årsak:",
+       "tags-create-submit": "Opprett",
+       "tags-create-no-name": "Du må oppgi et taggnavn.",
+       "tags-create-invalid-chars": "Taggnavn kan ikke inneholde kommaer (<code>,</code>) eller skråstreker (<code>/</code>).",
+       "tags-create-invalid-title-chars": "Taggnavn kan ikke inneholde tegn som ikke kan brukes i sidetitler.",
+       "tags-create-already-exists": "Taggen «$1» finnes fra før.",
+       "tags-create-warnings-above": "Vi fikk følgende {{PLURAL:$2|advarsel|advarsler}} da vi prøvde å opprette taggen «$1»:",
+       "tags-create-warnings-below": "Ønsker du å fortsette å opprette taggen?",
+       "tags-delete-title": "Slett tagen",
+       "tags-delete-explanation-initial": "Du er i ferd med å slette taggen «$1» fra databasen.",
+       "tags-delete-explanation-in-use": "Den vil bli fjernet fra {{PLURAL:$2|$2 revisjon eller loggoppføring|alle $2 revisjoner og/eller loggoppføringer}} der den er i bruk.",
+       "tags-delete-explanation-warning": "Derne handlingen <strong>kan ikke gjøres om</strong>, ikke engang av administratorer. Vær helt sikker på at dette er taggen du mente å slette.",
+       "tags-delete-explanation-active": "<strong>Taggen «$1» er fortsatt aktiv, og vil fortsatt bli brukt i framtiden.</strong> For å hindre dette fra å skje, gå til stedet/stedene der taggen er satt til å brukes, og slå den av derfra.",
+       "tags-delete-reason": "Årsak:",
+       "tags-delete-submit": "Slett denne taggen",
+       "tags-delete-not-allowed": "Tagger definert av utvidelser kan ikke slettes med mindre utvidelsen tillater det.",
+       "tags-delete-not-found": "Taggen «$1» finnes ikke.",
+       "tags-delete-too-many-uses": "Taggen «$1» brukes på mer enn $2 {{PLURAL:$2|revisjon|revisjoner}}, hvilket betyr at den ikke kan slettes.",
+       "tags-delete-warnings-after-delete": "Taggen «$1» ble slettet, men følgende {{PLURAL:$2|advarsel|advarsler}} dukket opp:",
+       "tags-activate-title": "Aktiver taggen",
+       "tags-activate-question": "Du er i ferd med å aktivere taggen «$1».",
+       "tags-activate-reason": "Årsak:",
+       "tags-activate-not-allowed": "Det er ikke mulig å aktivere taggen «$1».",
+       "tags-activate-not-found": "Taggen «$1» finnes ikke.",
+       "tags-activate-submit": "Aktiver",
+       "tags-deactivate-title": "Deaktiver taggen",
+       "tags-deactivate-question": "Du er i ferd med å deaktivere taggen «$1».",
+       "tags-deactivate-reason": "Årsak:",
+       "tags-deactivate-not-allowed": "Det er ikke mulig å deaktivere taggen «$1».",
+       "tags-deactivate-submit": "Deaktiver",
        "comparepages": "Sammenlign sider",
        "compare-page1": "Side 1",
        "compare-page2": "Side 2",
        "logentry-upload-upload": "$1 {{GENDER:$2|lastet opp}} $3",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|lastet opp}} en ny versjon av $3",
        "logentry-upload-revert": "$1 {{GENDER:$2|lastet opp}} $3",
+       "log-name-managetags": "Taggbehandlingslogg",
+       "log-description-managetags": "Denne siden lister opp behandlingsoppgaver i forbindelse med [[Special:Tags|tagger]]. Loggen inneholder bare handlinger som er blitt gjort manuelt av en administrator; tagger kan opprettes eller slettes av programvaren uten at det kommer et oppslag i denne loggen.",
+       "logentry-managetags-create": "$1 {{GENDER:$2|opprettet}} taggen «$4»",
+       "logentry-managetags-delete": "$1 {{GENDER:$2|slettet}} taggen «$4» (fjernet fra $5 {{PLURAL:$5|revisjon eller loggoppføring|revisjoner og/eller loggoppføringer}})",
+       "logentry-managetags-activate": "$1 {{GENDER:$2|aktiverte}} taggen «$4» for bruke av brukere og roboter",
+       "logentry-managetags-deactivate": "$1 {{GENDER:$2|deaktiverte}} taggen «$4» for bruk av brukere og roboter",
        "rightsnone": "(ingen)",
        "revdelete-summary": "redigeringssammendrag",
        "feedback-bugornote": "Hvis du er klar til å sende inn en detaljert feilrapport, vennligst [$1 rapporter en feil].\nOm det ikke er tilfellet, kan du bruke det enkle skjemaet som du finner under. Kommentaren din vil bli lagt til siden \"[$3 $2]\", sammen med brukernavnet ditt og informasjon om hvilken nettleser du bruker.",
index 741ec6d..dbf1d16 100644 (file)
        "editlink": "bewark",
        "viewsourcelink": "brontekste bekieken",
        "editsectionhint": "Bewarkingsveld: $1",
-       "toc": "Kömp an bod",
+       "toc": "Overzicht",
        "showtoc": "Bekieken",
        "hidetoc": "Verbarg",
        "collapsible-collapse": "Inklappen",
        "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.",
        "protectedpagetext": "Disse zied is beveiligd. Bewarken of aandere haandelingen bin niet meugelik.",
        "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.",
+       "protectedinterface": "Op disse zied steet tekste die gebruukt wördt 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": "<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.",
        "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.",
        "summary": "Samenvatting:",
        "subject": "Onderwarp:",
        "minoredit": "kleine wieziging",
-       "watchthis": "Volg disse zied",
+       "watchthis": "volg disse zied",
        "savearticle": "Zied opslaon",
        "preview": "Naokieken",
        "showpreview": "Bewarking naokieken",
        "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)",
        "undo-success": "De bewarking kan weerummedreid wörden. Kiek de vergelieking hieronder nao um der wisse van de ween dat alles goed is, en slao de de zied op um de bewarking weerumme te dreien.",
        "undo-failure": "De wieziging kon niet weerummedreid wörden umdat t ondertussen awweer ewiezigd is.",
        "undo-norev": "De bewarking kon niet weerummedreid wörden, umdat t niet besteet of vortedaon is.",
-       "undo-summary": "Versie $1 van [[Special:Contributions/$2|$2]] ([[User talk:$2|overleg]]) weerummedreid.",
+       "undo-summary": "Versie $1 van [[Special:Contributions/$2|$2]] ([[User talk:$2|overleg]]) weerummedreid",
        "undo-summary-username-hidden": "Versie $1 deur n verbörgen gebruker weerummedreid",
        "cantcreateaccounttitle": "Anmaken van n gebrukersprofiel is niet meugelik",
        "cantcreateaccount-text": "t Anmaken van gebrukers van dit IP-adres (<b>$1</b>) is eblokkeerd deur [[User:$3|$3]].\n\nDe deur $3 op-egeven reden is ''$2''",
        "right-edit": "Ziejen bewarken",
        "right-createpage": "Ziejen anmaken",
        "right-createtalk": "Overlegziejen anmaken",
-       "right-createaccount": "Nieje gebrukers anmaken",
+       "right-createaccount": "Nieje gebrukerskonto anmaken",
        "right-minoredit": "Bewarkingen markeren as klein",
        "right-move": "Ziejen herneumen",
        "right-move-subpages": "Ziejen samen mit de ziejen die deronder hangen verplaotsen",
        "right-reupload": "n Bestaond bestaand overschrieven",
        "right-reupload-own": "Bestaanden overschrieven die'j der zelf bie ezet hebben",
        "right-reupload-shared": "Media uut de edeelden mediadatabanke plaotselik overschrieven",
-       "right-upload_by_url": "Bestaanden inlaojen via n webadres",
+       "right-upload_by_url": "Bestaanden oplaojen via n webadres",
        "right-purge": "t Tussengeheugen van n zied legen",
        "right-autoconfirmed": "Uutezonderd van IP-adres-ebaseerden tiedsaofhankelike beparkingen",
        "right-bot": "Behaandeld wörden as n eautomatiseerd preces",
        "action-upload": "dit bestaand opsturen",
        "action-reupload": "dit bestaonde bestaand overschrieven",
        "action-reupload-shared": "n aander bestaand over dit bestaand uut de edeelden mediadatabanke hinne zetten.",
-       "action-upload_by_url": "dit bestaand vanaof n webadres inlaojen",
+       "action-upload_by_url": "dit bestaand vanaof n webadres oplaojen",
        "action-writeapi": "de schrief-API bewarken",
        "action-delete": "disse zied vortdoon",
        "action-deleterevision": "disse versie vortdoon",
        "recentchangeslinked-feed": "Volg verwiezigingen",
        "recentchangeslinked-toolbox": "Volg verwiezigingen",
        "recentchangeslinked-title": "Wiezigingen verwaant an $1",
-       "recentchangeslinked-summary": "Op disse spesiale zied steet n lieste mit de leste wieziginen op ziejen waornaor verwezen wörden. Ziejen op [[Special:Watchlist|joew volglieste]] staon '''vet-edrokt'''.",
+       "recentchangeslinked-summary": "Op disse spesiale zied steet n lieste mit de leste wieziginen op ziejen waornaor verwezen wördt. Ziejen op [[Special:Watchlist|joew volglieste]] staon '''vet'''.",
        "recentchangeslinked-page": "Ziednaam:",
        "recentchangeslinked-to": "Bekiek wiezigingen op ziejen mit verwiezingen naor disse zied",
        "upload": "Bestaand opsturen",
        "uploadnologintext": "Je mutten $1 ween um bestaanden op te kunnen sturen.",
        "upload_directory_missing": "De inlaojmap veur bestaanden ($1) is vort en kon niet an-emaakt wörden deur de webserver.",
        "upload_directory_read_only": "Op t moment ku'j gien bestaanden opsturen vanwegen techniese problemen ($1).",
-       "uploaderror": "Fout bie t inlaojen van t bestaand",
+       "uploaderror": "Fout bie t oplaojen 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.",
        "uploadlogpage": "Logboek mit nieje bestaanden",
-       "uploadlogpagetext": "Hieronder steet n lieste mit bestaanden die net niej bin.\nZie de [[Special:NewFiles|uutstalling mit media]] veur n overzichte.",
+       "uploadlogpagetext": "Hieronder steet n lieste mit bestaanden die net niej bin.\nZie de [[Special:NewFiles|uutstalling mit media]] veur n overzicht.",
        "filename": "Bestaandsnaam",
        "filedesc": "Beschrieving",
        "fileuploadsummary": "Beschrieving:",
        "fileexists-forbidden": "n Bestaand mit disse naam besteet al, en kan niet overschreven wörden.\nVoeg t bestaand toe onder n aandere naam.\n[[File:$1|thumb|center|$1]]",
        "fileexists-shared-forbidden": "Der besteet al n bestaand mit disse naam in de gezamenlike bestaandslokasie.\nA'j t bestaand evengoed op willen sturen, gao dan weerumme en kies n aandere naam.\n[[File:$1|thumb|center|$1]]",
        "file-exists-duplicate": "Dit bestaand is liek alleens as {{PLURAL:$1|t volgende bestaand|de volgende bestaanden}}:",
-       "file-deleted-duplicate": "n Bestaand dat liek alleens is an dit bestaand ([[:$1]]) is eerder al vortedaon.\nBekiek t vortdologboek veurda'j veurdan gaon.",
+       "file-deleted-duplicate": "n Bestaand dat liek alleens is an dit bestaand ([[:$1]]) is eerder al vortedaon.\nBekiek t vortdologboek veurda'j verdan gaon.",
        "uploadwarning": "Waorschuwing",
        "uploadwarning-text": "Pas de bestaandsbeschrieving hieronder an en probeer t opniej",
        "savefile": "Bestaand opslaon",
        "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 Oplaojen van Java-bestaanden is niet toe-estaon umdat hiermee beveiligingsinstellingen umzeild kunnen wörden.",
        "upload-source": "Bronbestaand",
        "sourcefilename": "Bestaandsnaam op de hardeschieve:",
        "sourceurl": "Bronwebadres:",
        "filename-bad-prefix": "De naam van t bestaand da'j opsturen, begint mit '''\"$1\"''', dit is n niet-beschrievende naam die meestentieds automaties deur n digitale kamera egeven wörden. Kies n dudelike naam veur t bestaand.",
        "upload-success-subj": "t Bestaand is op-estuurd",
        "upload-success-msg": "t Bestaand [$2] steet derop. Je kunnen t hier vienen: [[:{{ns:file}}:$1]]",
-       "upload-failure-subj": "Probleem bie t inlaojen van t bestaand",
-       "upload-failure-msg": "Der was n probleem bie t inlaojen van [$2]:\n\n$1",
+       "upload-failure-subj": "Probleem bie t oplaojen van t bestaand",
+       "upload-failure-msg": "Der was n probleem bie t oplaojen van [$2]:\n\n$1",
        "upload-warning-subj": "Waorschuwing veur t opsturen van bestaanden",
-       "upload-warning-msg": "Der was n probleem mit t inlaojen van t bestaand [$2].\nGao weerumme naor t [[Special:Upload/stash/$1|opstuurformulier]] um dit probleem te verhelpen.",
+       "upload-warning-msg": "Der was n probleem mit t oplaojen van t bestaand [$2].\nGao weerumme naor t [[Special:Upload/stash/$1|opstuurformulier]] um dit probleem te verhelpen.",
        "upload-proto-error": "Verkeerd protokol",
        "upload-proto-error-text": "Um op disse maniere bestaanden toe te voegen mutten webadressen beginnen mit <code>http://</code> of <code>ftp://</code>.",
        "upload-file-error": "Interne fout",
        "upload-file-error-text": "Bie ons gung der effen wat fout to n tiedelik bestaand op de server an-emaakt wörden. Neem kontakt op mit n [[Special:ListUsers/sysop|beheerder]].",
-       "upload-misc-error": "Onbekende fout bie t inlaojen van joew bestaand",
-       "upload-misc-error-text": "Der is bie t inlaojen van t bestaand n onbekende fout op-etrejen. \nKiek effen nao of de verwiezing t wel döt en probeer t opniej. \nAs t probleem zo blif, neem dan kontakt op mit één van de [[Special:ListUsers/sysop|beheerders]].",
+       "upload-misc-error": "Onbekende fout bie t oplaojen van joew bestaand",
+       "upload-misc-error-text": "Der is bie t oplaojen van t bestaand n onbekende fout op-etrejen. \nKiek effen nao of de verwiezing t wel dut en probeer t opniej. \nAs t probleem zo blif, neem dan kontakt op mit één van de [[Special:ListUsers/sysop|beheerders]].",
        "upload-too-many-redirects": "Der zatten te veule deurverwiezingen in de URL.",
        "upload-http-error": "Der is n HTTP-fout op-etrejen: $1",
        "upload-copy-upload-invalid-domain": "Bestaanden per kopie opsturen is niet beschikbaor vanuut dit domein.",
        "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",
        "notvisiblerev": "Bewarking is vortedaon",
        "watchlist-details": "Der {{PLURAL:$1|steet één zied|staon $1 ziejen}} op joew volglieste, zonder de overlegziejen mee-erekend.",
        "wlheader-enotif": "Je kriegen bericht per netpost",
-       "wlheader-showupdated": "Ziejen die sinds joew leste bezeuk bie-ewörken bin, staon '''vet-edrokt'''.",
+       "wlheader-showupdated": "Ziejen die sinds joew leste bezeuk bie-ewörken bin staon '''vet'''.",
        "wlnote": "Hieronder {{PLURAL:$1|steet de leste wieziging|staon de leste $1 wiezigingen}} in {{PLURAL:$2|t aofgeleupen ure|de leste $2 uren}} vanaof $3 um $4.",
        "wlshowlast": "Laot de veurbieje $1 uur $2 dagen  zien",
        "watchlist-options": "Opsies veur de volglieste",
        "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",
+       "rollbacklink": "weerummedreien",
        "rollbacklinkcount": "{{PLURAL:$1|één bewarking|$1 bewarkingen}} weerummedreien",
        "rollbacklinkcount-morethan": "Meer as {{PLURAL:$1|één bewarking|$1 bewarkingen}} weerummedreien",
        "rollbackfailed": "Wieziging herstellen is mislokt",
        "sessionfailure-title": "Sessiefout",
        "sessionfailure": "Der is n probleem mit joew anmeldsessie. De aksie is stop-ezet uut veurzörg tegen n beveiligingsrisico (dat besteet uut t meugelike \"kraken\" van disse sessie). Gao weerumme naor de veurige zied, laoj disse zied opniej en probeer t nog es.",
        "protectlogpage": "Beveiligingslogboek",
-       "protectlogtext": "Hieronder staon de leste wiezigingen veur t blokkeren en vriegeven van artikels en ziejen.\nZie de [[Special:ProtectedPages|lieste mit ziejen die beveiligd bin]] veur t hele overzichte.",
+       "protectlogtext": "Hieronder staon de leste wiezigingen veur t blokkeren en vriegeven van artikels en ziejen.\nZie de [[Special:ProtectedPages|lieste mit ziejen die beveiligd bin]] veur t hele overzicht.",
        "protectedarticle": "[[$1]] is beveiligd",
        "modifiedarticleprotection": "beveiligingsnivo van \"[[$1]]\"  ewiezigd",
        "unprotectedarticle": "hef de beveiliging van \"[[$1]]\" deraof ehaold",
        "movedarticleprotection": "hef de beveiligingsinstellingen over-ezet van \"[[$2]]\" naor \"[[$1]]\"",
-       "protect-title": "Instellen van beveiligingsnivo veur \"$1\"",
+       "protect-title": "Beveiligingsnivo instellen veur \"$1\"",
        "protect-title-notallowed": "Beveiligingsnivo veur \"$1\" bekieken",
        "prot_1movedto2": "[[$1]] is ewiezigd naor [[$2]]",
        "protect-badnamespace-title": "Niet te beveiligen naamruumte",
        "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",
        "undeletedrevisions-files": "{{PLURAL:$1|1 versie|$1 versies}} en {{PLURAL:$2|1 bestaand|$2 bestaanden}} bin weerummeplaotst",
        "undeletedfiles": "{{PLURAL:$1|1 bestaand|$1 bestaanden}} weerummeplaotst",
        "cannotundelete": "t Weerummeplaotsen is mislokt:\n$1",
-       "undeletedpage": "'''$1 is weerummeplaotst'''\n\nBekiek t [[Special:Log/delete|vortdologboek]] veur n overzichte van ziejen die kortens vortedaon en weerummeplaotst bin.",
+       "undeletedpage": "'''$1 is weerummeplaotst'''\n\nBekiek t [[Special:Log/delete|vortdologboek]] veur n overzicht van ziejen die kortens vortedaon en weerummeplaotst bin.",
        "undelete-header": "Zie t [[Special:Log/delete|vortdologboek ]] veur spul dat krek vortedaon is.",
        "undelete-search-title": "Vortedaone ziejen zeuken",
        "undelete-search-box": "Deurzeuk vortedaone ziejen",
        "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",
        "ipbnounblockself": "Je maggen je eigen niet deblokkeren",
        "lockdb": "Databanke blokkeren",
        "unlockdb": "Databanke vriegeven",
-       "lockdbtext": "Waorschuwing: a'j de databanke blokkeren dan kan der gienene meer ziejen bewarken, zien veurkeuren wiezingen of wat aanders doon waorveur der wiezigingen in de databanke neudig bin.",
+       "lockdbtext": "Waorschuwing: a'j de databanke blokkeren dan kan der gienene meer ziejen bewarken, zien veurkeuren wiezigen of wat aanders doon waorveur der wiezigingen in de databanke neudig bin.",
        "unlockdbtext": "Vriegeven van de databanke maak alle bewarkingen weer meugelik.\nMut de databanke vrie-egeven wörden?",
        "lockconfirm": "Ja, ik wille de databanke blokkeren.",
        "unlockconfirm": "Ja, ik wille de databanke vriegeven.",
        "move-page": "Herneum \"$1\"",
        "move-page-legend": "Zied herneumen",
        "movepagetext": "Mit dit formulier ku'j de zied n nieje naam geven, de geschiedenisse geet dan vanzelf mee.\nDe ouwe naam zal automaties n deurverwiezing wörden naor de nieje zied.\nDeurverwiezingen naor de ouwe naam kunnen automaties ewiezigd wörden.\nA'j derveur kiezen um dat niet te doon, kiek t dan effen nao of der [[Special:DoubleRedirects|dubbele]] en [[Special:BrokenRedirects|ebreuken deurverwiezingen]] bin ontstaon.\nt Is an joe um derveur te zörgen dat de deurverwiezingen naor de goeie naam gaon.\n\nn Zied kan '''allinnig''' herneumd wörden as de nieje naam niet besteet of t n deurverwiezing is zonder veerdere geschiedenisse.\nDit betekent da'j n zied weer naor de ouwe naam kunnen herneumen, a'j bieveurbeeld n fout emaakt hebben, zonder da'j de bestaonde zied overschrieven.\n\n'''WAORSCHUWING!'''\nVeur populaere ziejen kan t herneumen drastiese en onveurziene gevolgen hebben.\nZörg derveur da'j de gevolgen overzien veurda'j veerder gaon.",
-       "movepagetext-noredirectfixer": "Mit dit formulier ku'j de zied n nieje naam geven, de geschiedenisse geet dan vanzelf mee.\nDe ouwe naam zal automaties n deurverwiezing wörden naor de nieje zied.\nKiek oek effen nao of der gien [[Special:DoubleRedirects|dubbele]] of [[Special:BrokenRedirects|ebreuken deurverwiezingen]] bin ontstaon.\nt Is an joe um derveur te zörgen dat de deurverwiezingen naor de goeie naam gaon.\n\nn Zied kan '''allinnig''' herneumd wörden as de nieje naam niet besteet of t n deurverwiezing is zonder veerdere geschiedenisse.\nDit betekent da'j n zied weer naor de ouwe naam kunnen herneumen, a'j bieveurbeeld n fout emaakt hebben, zonder da'j de bestaonde zied overschrieven.\n\n'''WAORSCHUWING!'''\nVeur populaere ziejen kan t herneumen drastiese en onveurziene gevolgen hebben.\nZörg derveur da'j de gevolgen overzien veurda'j veerder gaon.",
-       "movepagetalktext": "De overlegzied die derbie heurt krig oek n nieje titel, mer '''niet''' in de volgende gevallen:\n* As de zied in n aandere naamruumte eplaotst wörden\n* As der al n niet-lege overlegzied besteet onder de aandere naam\n* a'j t onderstaonde vinkjen vorthaolen",
+       "movepagetext-noredirectfixer": "Mit dit formulier ku'j de zied n nieje naam geven, de geschiedenisse geet dan vanzelf mee.\nDe ouwe naam zal automaties n deurverwiezing wörden naor de nieje zied.\nKiek oek effen nao of der gien [[Special:DoubleRedirects|dubbele]] of [[Special:BrokenRedirects|ebreuken deurverwiezingen]] bin ontstaon.\nt Is an joe um derveur te zörgen dat de deurverwiezingen naor de goeie naam gaon.\n\nn Zied kan '''allinnig''' herneumd wörden as de nieje naam niet besteet of t n deurverwiezing is zonder veerdere geschiedenisse.\nDit betekent da'j n zied weer naor de ouwe naam herneumen kunnen, a'j bieveurbeeld n fout emaakt hebben, zonder da'j de bestaonde zied overschrieven.\n\n'''WAORSCHUWING!'''\nVeur ziejen die vake bekeken wörden kan t herneumen drastiese en onveurziene gevolgen hebben.\nZörg derveur da'j de gevolgen overzien veurda'j veerder gaon.",
+       "movepagetalktext": "De overlegzied die derbie heurt krig oek n nieje titel, mer '''niet''' in de volgende gevallen:\n* As der al n niet-lege overlegzied besteet onder de aandere naam, of\n* A'j de opsie hieronder uutzetten.\n\nAs dat zo is dan mu'j de zied haandmaotig herneumen of samenvoegen.",
        "movearticle": "Herneum",
        "moveuserpage-warning": "'''Waorschuwing:''' Je staon op t punt um n gebrukerszied te herneumen. Allinnig disse zied zal herneumd wörden, '''niet''' de gebruker.",
        "movenologintext": "Je mutten [[Special:UserLogin|an-emeld]] ween um de naam van n zied te wiezigen.",
        "cant-move-user-page": "Je hebben gien rechten um gebrukersziejen te herneumen.",
        "cant-move-to-user-page": "Je hebben gien rechten um n zied naor n gebrukerszied te herneumen. Herneumen naor n zied die deronder völt ma'j wel doon.",
        "newtitle": "Nieje naam",
-       "move-watch": "volg disse zied",
+       "move-watch": "Volg disse zied",
        "movepagebtn": "Herneum",
        "pagemovedsub": "Naamwieziging suksesvol",
        "movepage-moved": "'''\"$1\" is ewiezigd naor \"$2\"'''",
        "movesubpagetext": "De {{PLURAL:$1|zied die onder disse zied hank|$1 ziejen die onder disse zied hangen}} vie'j hieronder.",
        "movenosubpage": "Onder disse zied hangen gien aandere ziejen.",
        "movereason": "Reden:",
-       "revertmove": "Weerummedreien",
+       "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.",
        "importcantopen": "Kon t invoerbestaand niet los doon",
        "importbadinterwiki": "Foute interwikiverwiezing",
        "importsuccess": "Invoeren suksesvol!",
-       "importnosources": "Gien transwiki-invoerbronnen vastesteld en t drek inlaojen van versies is eblokkeerd.",
+       "importnosources": "Gien transwiki-invoerbronnen vastesteld en t drek oplaojen van versies is eblokkeerd.",
        "importnofile": "Der is gien invoerbestaand op-estuurd.",
        "importuploaderrorsize": "t Opsturen van t invoerbestaand is mislokt.\nt Bestaand is groter as de in-estelde limiet.",
        "importuploaderrorpartial": "t Opsturen van t invoerbestaand is mislokt.\nt Bestaand is mer gedeeltelik an-ekeumen.",
        "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.",
-       "tooltip-pt-userpage": "Oew gebroekersbladziede",
+       "tooltip-pt-userpage": "Oew gebroekersziede",
        "tooltip-pt-anonuserpage": "Gebroekersbladziede vuur t IP-adres da'j broekt",
        "tooltip-pt-mytalk": "Oew oaverlegbladziede",
        "tooltip-pt-anontalk": "Oaverlegbladziede van n naamlozen gebroeker van dit IP-adres",
        "tooltip-pt-preferences": "Miene vuurkeuren",
-       "tooltip-pt-watchlist": "Lieste van bladzieden die op miene volglieste stoan",
+       "tooltip-pt-watchlist": "Lieste van zieden die op miene volglieste stoan",
        "tooltip-pt-mycontris": "Liest van oew biejdraegen",
        "tooltip-pt-login": "Iej wördt van harte oetneugd um oe an te melden as gebroeker, mer t is nich verplicht",
        "tooltip-pt-logout": "Ofmaelden",
-       "tooltip-ca-talk": "Loat n oaverlegtekst oaver disse bladziede zeen",
-       "tooltip-ca-edit": "Bewaerk disse bladziede",
+       "tooltip-ca-talk": "Loat n oaverlegtekst oaver disse ziede zeen",
+       "tooltip-ca-edit": "Bewaerk disse ziede",
        "tooltip-ca-addsection": "Niej oonderwaerp tovogen",
-       "tooltip-ca-viewsource": "Disse bladziede is beveiligd taegen veraanderen. Iej könt wal kieken noar de bladziede",
-       "tooltip-ca-history": "Oaldere versies van disse bladziede",
-       "tooltip-ca-protect": "Beveilig disse bladziede taegen veraanderen",
-       "tooltip-ca-unprotect": "De beveiliging vuur disse bladziede wiezigen",
-       "tooltip-ca-delete": "Smiet disse bladziede vort",
-       "tooltip-ca-undelete": "Haal n inhoald van disse bladziede oet n emmer",
-       "tooltip-ca-move": "Gef disse bladziede nen aanderen titel",
-       "tooltip-ca-watch": "Voog disse bladziede to an oewe volglieste",
-       "tooltip-ca-unwatch": "Smiet disse bladziede van oewe voalglieste",
-       "tooltip-search": "{{SITENAME}} duurzeukn",
-       "tooltip-search-go": "Noar n bladziede mit disse naam goan as t besteet",
-       "tooltip-search-fulltext": "Zeuk noar ziedn woar disse tekst in steet",
+       "tooltip-ca-viewsource": "Disse ziede is beveiligd taegen veraanderen. Iej könt wal kieken noar de ziede",
+       "tooltip-ca-history": "Oaldere versies van disse ziede",
+       "tooltip-ca-protect": "Beveilig disse ziede taegen veraanderen",
+       "tooltip-ca-unprotect": "De beveiliging vuur disse ziede wiezigen",
+       "tooltip-ca-delete": "Smiet disse ziede vort",
+       "tooltip-ca-undelete": "Haal n inhoald van disse ziede oet n emmer",
+       "tooltip-ca-move": "Gef disse ziede nen aanderen titel",
+       "tooltip-ca-watch": "Voog disse ziede to an oewe volglieste",
+       "tooltip-ca-unwatch": "Smiet disse ziede van oewe voalglieste",
+       "tooltip-search": "{{SITENAME}} duurzeuken",
+       "tooltip-search-go": "Noar n ziede mit disse naam goan as t besteet",
+       "tooltip-search-fulltext": "Zeuk noar zieden woar disse tekst in steet",
        "tooltip-p-logo": "Goa noar t vuurblad",
        "tooltip-n-mainpage": "Goa noar t vuurblad",
        "tooltip-n-mainpage-description": "Goa noar t vuurblad",
        "tooltip-n-portal": "Informoasie oaver t projekt: wel, wat, ho en woarum",
        "tooltip-n-currentevents": "Achtergroondinformoasie oaver dinge in t niejs",
        "tooltip-n-recentchanges": "Lieste van pas verrichte veraanderingen",
-       "tooltip-n-randompage": "Loat ne willekeurige bladziede zeen",
+       "tooltip-n-randompage": "Loat ne willekeurige ziede zeen",
        "tooltip-n-help": "Hölpinformoasie oaver {{SITENAME}}",
-       "tooltip-t-whatlinkshere": "Lieste van alle bladzieden die hiernoar verwiezen",
-       "tooltip-t-recentchangeslinked": "Pas verrichte veraanderingen die noar disse bladziede verwiezen",
-       "tooltip-feed-rss": "RSS-voer vuur disse bladziede",
-       "tooltip-feed-atom": "Atom-voer vuur disse bladziede",
+       "tooltip-t-whatlinkshere": "Lieste van alle zieden die hiernoar verwiezen",
+       "tooltip-t-recentchangeslinked": "Pas verrichte veraanderingen die noar disse ziede verwiezen",
+       "tooltip-feed-rss": "RSS-voer vuur disse ziede",
+       "tooltip-feed-atom": "Atom-voer vuur disse ziede",
        "tooltip-t-contributions": "Lieste met biejdraegen van disse gebroeker",
        "tooltip-t-emailuser": "Stuur disse gebroeker n netpostbericht",
+       "tooltip-t-info": "Meer informasie over disse zied",
        "tooltip-t-upload": "Laad ofbeeldingen en/of geluudsmateriaal",
-       "tooltip-t-specialpages": "Lieste van alle biejzeundere bladzieden",
-       "tooltip-t-print": "De ofdrukboare versie van disse bladziede",
-       "tooltip-t-permalink": "Verbeending vuur altied noar de versie van disse bladziede van vandaag-an-n-dag",
+       "tooltip-t-specialpages": "Lieste van alle biejzeundere zieden",
+       "tooltip-t-print": "De ofdrukboare versie van disse ziede",
+       "tooltip-t-permalink": "Verbeending vuur altied noar de versie van disse ziede van vandaag-an-n-dag",
        "tooltip-ca-nstab-main": "Loat n tekst van t artikel zeen",
        "tooltip-ca-nstab-user": "Loat de gebroekersbladziede zeen",
        "tooltip-ca-nstab-media": "Loat n mediatekst zeen",
-       "tooltip-ca-nstab-special": "Dit is ne biejzeundere bladziede die'j nich könt veraanderen",
+       "tooltip-ca-nstab-special": "Dit is ne biejzeundere ziede die'j nich könt veraanderen",
        "tooltip-ca-nstab-project": "Loat de projektbladziede zeen",
        "tooltip-ca-nstab-image": "Loat de bestaandsbladziede zeen",
        "tooltip-ca-nstab-mediawiki": "Loat de systeemtekstbladziede zeen",
        "tooltip-preview": "Bekiek oew versie vuurda'j t opsloan (anbeveulen)!",
        "tooltip-diff": "Bekiek oew aegen wiezigingen",
        "tooltip-compareselectedversions": "Bekiek de verschillen tussen de ekeuzen versies.",
-       "tooltip-watch": "Voog disse bladziede to an oew volglieste",
+       "tooltip-watch": "Voog disse ziede to an oew volglieste",
        "tooltip-watchlistedit-normal-submit": "Ziejen vortdoon",
        "tooltip-watchlistedit-raw-submit": "Volglieste biewarken",
-       "tooltip-recreate": "Disse bladziede opniej anmaken, ondanks t feit dat t vortdoan is.",
-       "tooltip-upload": "Bestaanden tovogen",
-       "tooltip-rollback": "Mit \"weerummedreien\" kö'j mit één klik de bewaerking(en) van n leste gebroeker dee disse bladziede bewaerkt hef terugdraeien.",
-       "tooltip-undo": "A'j op \"weerummedreien\" klikken geet t bewaerkingsvaenster lös en kö'j ne vurige versie terugzetten.\nIej könt in de bewearkingssamenvatting n reden opgeven.",
+       "tooltip-recreate": "Disse ziede opniej anmaken, ondanks t feit dat t vortdoan is.",
+       "tooltip-upload": "Bestaanden opsturen",
+       "tooltip-rollback": "Mit \"weerummedreien\" kö'j mit één klik de bewaerking(en) van n leste gebroeker dee disse ziede bewaerkt hef terugdraeien.",
+       "tooltip-undo": "A'j op \"weerummedreien\" klikken geet t bewaerkingsvaenster lös en kö'j ne vurige versie terugzetten.\nIej könt in de bewaerkingssamenvatting n reden opgeven.",
        "tooltip-preferences-save": "Vuurkeuren opsloan",
        "tooltip-summary": "Voer ne korte samenvatting in",
        "interlanguage-link-title": "$1 – $2",
        "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-credits": "Disse wiki wördt an-estuurd deur '''[https://www.mediawiki.org/ MediaWiki]''', auteursrecht © 2001-$1 $2.",
        "version-poweredby-others": "aanderen",
        "version-poweredby-translators": "vertalers van translatewiki.net",
        "version-credits-summary": "Wulen erkennen grege de volgende personen veur der biedrage an [[Special:Version|MediaWiki]].",
        "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:",
        "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",
        "feedback-bugnew": "Ik heb t nao-ekeken. Meld n nieje programmafout",
        "searchsuggest-search": "Zeuken / zuken / zuiken",
        "searchsuggest-containing": "bevat...",
-       "api-error-badaccess-groups": "Je maggen gien bestaanden in disse wiki inlaojen.",
+       "api-error-badaccess-groups": "Je maggen gien bestaanden in disse wiki oplaojen.",
        "api-error-badtoken": "Interne fout: t token klopt niet.",
        "api-error-copyuploaddisabled": "Bestaanden opsturen via n webadres is uutezet op disse server.",
        "api-error-duplicate": "Der {{PLURAL:$1|steet al [$2 n bestaand]|staon al [$2 bestaanden]}} mit de zelfde inhoud in de wiki.",
        "expand_templates_generate_xml": "XML-parserboom bekieken",
        "expand_templates_preview": "Naokieken",
        "pagelang-language": "Taal",
+       "mediastatistics": "Mediastaotistieken",
        "mediastatistics-header-audio": "Audio",
        "mediastatistics-header-video": "Video's",
        "mediastatistics-header-multimedia": "Interaktieve media"
index 19edc9e..6e349e3 100644 (file)
@@ -11,7 +11,8 @@
                        "Zylbath",
                        "לערי ריינהארט",
                        "아라",
-                       "Kolega2357"
+                       "Kolega2357",
+                       "Servien"
                ]
        },
        "tog-underline": "Verwies ünnerstrieken",
        "virus-unknownscanner": "Unbekannten Virenscanner:",
        "logouttext": "'''Du büst nu afmellt.'''\n\nDu kannst {{SITENAME}} nu anonym wiederbruken oder di ünner dissen oder en annern Brukernaam wedder <span class='plainlinks'>[$1 anmellen]</span>.\nDenk dor an, dat welk Sieden ünner Ümstänn noch jümmer so wiest warrn köönt, as wenn du anmellt weerst. Dat ännert sik, wenn du den Cache vun dien Browser leddig maakst.",
        "yourname": "Dien Brukernaam",
+       "userlogin-yourname": "Brukernaam",
        "yourpassword": "Dien Passwoort",
+       "userlogin-yourpassword": "Passwoort",
+       "userlogin-yourpassword-ph": "Passwoort ingeven",
+       "createacct-yourpassword-ph": "Passwoort ingeven",
        "yourpasswordagain": "Passwoort nochmal ingeven",
        "remembermypassword": "Mit dissen Browser duersam inloggen (för maximal $1 {{PLURAL:$1|Dag|Daag}})",
        "yourdomainname": "Diene Domään:",
        "logout": "Afmellen",
        "userlogout": "Afmellen",
        "notloggedin": "Nich anmellt",
+       "userlogin-joinproject": "Bi {{SITENAME}} anmellen",
        "nologin": "Wenn du noch keen Brukerkonto hest, denn kannst di anmellen: $1.",
        "nologinlink": "Brukerkonto inrichten",
        "createaccount": "Nieg Brukerkonto anleggen",
        "gotaccount": "Hest Du al en Brukerkonto? '''$1'''.",
        "gotaccountlink": "Anmellen",
        "userlogin-resetlink": "De Anmelldaten vergaten?",
+       "userlogin-resetpassword-link": "Passwoort vergeten?",
+       "userlogin-helplink2": "Hülp bi dat anmellen",
        "createaccountmail": "över E-Mail",
        "createaccountreason": "Grund:",
+       "createacct-submit": "Brukerkonto inrichten",
        "badretype": "De beiden Passwöör stimmt nich övereen.",
        "userexists": "Disse Brukernaam is al weg. Bitte söök di en annern ut.",
        "loginerror": "Fehler bi dat Anmellen",
        "login-abort-generic": "Dien Anmellen harr keen Spood. Dat is afbroken worrn.",
        "loginlanguagelabel": "Spraak: $1",
        "suspicious-userlogout": "Dien Anfraag, di aftomellen, worr aflehnt, wieldat se vermoodlich vun en Browser oder Cache-Proxy sennt worrn is, de nich mehr funkschoneert.",
+       "pt-login": "Anmellen",
+       "pt-login-button": "Anmellen",
+       "pt-createaccount": "Brukerkonto inrichten",
+       "pt-userlogout": "Afmellen",
        "php-mail-error-unknown": "Unbekennten Fehler in PHP sien mail()-Funkschoon",
        "user-mail-no-addy": "Versöch en E-Mail ahn E-Mail-Adress to sennen.",
        "changepassword": "Passwoort ännern",
        "timezoneregion-indian": "Indisch Ozean",
        "timezoneregion-pacific": "Pazifisch Ozean",
        "allowemail": "Nettbreven vun annere Brukers annehmen",
-       "prefs-searchoptions": "Söökopschonen",
+       "prefs-searchoptions": "Söken",
        "prefs-namespaces": "Naamrüüm",
        "default": "Standard",
        "prefs-files": "Datein",
        "prefs-reset-intro": "Du kannst disse Sied bruken, dien Instellungen al op de Standardinstellung trüchtosetten.\nDat kann nich wedder ungeschehn maakt warrn.",
        "prefs-emailconfirm-label": "E-Mail-Bestätigung:",
        "youremail": "Dien E-Mail (kene Plicht) *",
-       "username": "Brukernaam:",
+       "username": "{{GENDER:$1|Brukernaam}}:",
        "prefs-memberingroups": "Liddmaten vun de {{PLURAL:$1|Grupp|Gruppen}}:",
        "prefs-registration": "Tied vun dat Anmellen:",
        "yourrealname": "Dien echten Naam (kene Plicht)",
        "suppress": "Oversight",
        "booksources": "Bookhannel",
        "booksources-search-legend": "Na Böker bi Bookhökers söken",
+       "booksources-search": "Söken",
        "booksources-text": "Hier staht Lenken na Websteden, woneem dat Böker to köpen gifft, de mitünner ok mehr Informatschonen to dat Book anbeden doot:",
        "booksources-invalid-isbn": "Süht ut, as wenn de angeven ISBN ungüllig is. Villicht hett dat en Fehler bi’t Afschrieven oder Koperen geven.",
        "specialloguserlabel": "Bruker:",
        "delete-toobig": "Disse Siet hett en temlich lange Versionsgeschicht vun mehr as {{PLURAL:$1|ene Version|$1 Versionen}}. Dat Wegsmieten kann de Datenbank vun {{SITENAME}} för längere Tied utlasten un den Bedriev vun dat Wiki stöörn.",
        "delete-warning-toobig": "Disse Siet hett en temlich lange Versionsgeschicht vun mehr as {{PLURAL:$1|ene Version|$1 Versionen}}. Dat Wegsmieten kann de Datenbank vun {{SITENAME}} för längere Tied utlasten un den Bedriev vun dat Wiki stöörn.",
        "rollback": "Trüchnahm vun de Ännern",
-       "rollback_short": "Trüchnehmen",
        "rollbacklink": "Trüchnehmen",
        "rollbackfailed": "Trüchnahm hett kenen Spood",
        "cantrollback": "De Ännern kann nich trüchnahmen warrn; de letzte Autor is de eenzige.",
        "watchlisttools-edit": "Oppasslist ankieken un ännern",
        "watchlisttools-raw": "Oppasslist as Textlist ännern",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|Diskusschoon]])",
-       "unknown_extension_tag": "Unbekannt Extension-Tag „$1“",
        "duplicate-defaultsort": "Wohrschau: De DEFAULTSORTKEY „$2“ överschrifft den vörher bruukten Slötel „$1“.",
        "version": "Version",
        "version-extensions": "Installeerte Extensions",
        "specialpages-group-wiki": "Systemdaten un Warktüüch",
        "specialpages-group-redirects": "Redirect-Spezialsieden",
        "specialpages-group-spam": "Spam-Warktüüch",
+       "specialpages-group-developer": "Developer-Warktüüch",
        "blankpage": "Leddige Sied",
        "intentionallyblankpage": "Disse Sied is mit Afsicht leddig.",
        "external_image_whitelist": "  #Disse Reeg nich ännern<pre>\n#Ünnen köönt Delen vun reguläre Utdrück (de Deel twischen de //) angeven warrn.\n#De warrt mit de URLs vun Biller ut externe Borns vergleken\n#En positiv Vergliek föhrt dorto, dat dat Bild wiest warrt, ans warrt dat Bild blot as Lenk wiest\n#Regen, de mit en # anfangt, warrt as Kommentar behannelt\n#De List maakt keen Ünnerscheed bi grote un lütte Bookstaven\n\n#Delen vun reguläre Utdrück na disse Reeg indragen. Disse Reeg nich ännern</pre>",
        "revdelete-unrestricted": "Inschränkungen för Administraters rutnahmen",
        "rightsnone": "(kene)",
        "revdelete-summary": "Tosamenfaten",
+       "searchsuggest-search": "Söken",
        "expandtemplates": "Vörlagen oplösen",
        "expand_templates_intro": "Mit disse Spezialsied köönt Vörlagen in ingeven Text in Wikitext ümwannelt warrn.\nOk Parserfunkschonen so as\n<nowiki>{{</nowiki>#language:…}}, un Variabeln so as\n<nowiki>{{</nowiki>CURRENTDAY}} warrt ümwannelt. Also so temlich allens, wat twischen swiefte Klammern steit.\nDorto warrt de nödigen Parser-Phasen in MediaWiki direkt opropen.",
        "expand_templates_title": "Kontexttitel, för {{FULLPAGENAME}} etc.:",
index b5d6908..fd2f490 100644 (file)
        "otherlanguages": "अरु भाषामा",
        "redirectedfrom": "($1 बाट पठाइएको)",
        "redirectpagesub": "अनुप्रेषित पृष्ठ",
+       "redirectto": "अनुप्रेषित पृष्ठ:",
        "lastmodifiedat": "यो पृष्ठलाई अन्तिमपटक $2, $1 मा परिवर्तन गरिएको थियो।",
        "viewcount": "यो पृष्ठ हेरिएको थियो {{PLURAL:$1|एकपटक|$1 पटक}}",
        "protectedpage": "सुरक्षित गरिएका पृष्ठहरू",
        "hidetoc": "लुकाउनुहोस्",
        "collapsible-collapse": "खुम्च्याउने",
        "collapsible-expand": "फैलाउ",
+       "confirmable-yes": "हो",
+       "confirmable-no": "होइन",
        "thisisdeleted": "$1 हेर्ने या पूर्वरुपमा फर्काउने हो ?",
        "viewdeleted": "$1 हेर्ने ?",
        "restorelink": "{{PLURAL:$1|एक मेटिएको सम्पादन |$1 मेटिएका सम्पादनहरू}}",
        "delete-toobig": "यो पृष्ठको सम्पादन इतिहास धेरै र  $1 {{PLURAL:$1|पुनरावलोक|पुनरावलोकहरु}}भन्दा बढी रहेको छ।\n {{SITENAME}}मा दुर्घटनाको कारणले गडबडी आउनसक्ने कुरालाई रोक्न यस्ता पृष्ठहरुलाई मेट्नबाट निषेध गरिएको छ ।",
        "delete-warning-toobig": "This page has a large edit history, over $1 {{PLURAL:$1|revision|revisions}}.\nDeleting it may disrupt database operations of {{SITENAME}};\nproceed with caution.",
        "rollback": "सम्पादनहरु  पछाडि लाने",
-       "rollback_short": "रोलब्याक",
        "rollbacklink": "पहिलेको रुपमा फर्काउने",
        "rollbackfailed": "रोलब्याक असफल",
        "cantrollback": "फर्काउन सकिंदैन;\nअन्तिम योगदान कर्ता मात्र यस पृष्ठका लेखक थिए।",
        "hebrew-calendar-m12-gen": "एलल्",
        "signature": "[[{{ns:user}}:$1|$2]]",
        "timezone-utc": "युटिसी(UTC)",
-       "unknown_extension_tag": "अज्ञात  एक्सटेन्सन ट्याग \"$1\"",
        "duplicate-defaultsort": "'''चेतावनी:''' पूर्व निर्धारित छोटकरी \"$2\" ले पुरानो पूर्वनिर्धारित छोटकरी\"$1\"लाई विस्थापन गरेको छ ।",
        "version": "संस्करण",
        "version-extensions": "स्थापना गरिएका एक्सटेन्सनहरु",
index bc4ae50..041cd32 100644 (file)
@@ -64,7 +64,8 @@
                        "Macofe",
                        "Mirolith",
                        "Akoopal",
-                       "Sikjes"
+                       "Sikjes",
+                       "Robin0van0der0vliet"
                ]
        },
        "tog-underline": "Koppelingen onderstrepen:",
        "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.",
        "invalidemailaddress": "Het e-mailadres is niet aanvaard, omdat het een ongeldige opmaak heeft.\nGeef een geldig e-mailadres op of laat het veld leeg.",
        "cannotchangeemail": "Het e-mailadres voor een gebruiker kan op deze wiki niet gewijzigd worden.",
        "emaildisabled": "Deze site kan geen e-mails verzenden.",
-       "accountcreated": "Gebruiker aangemaakt",
-       "accountcreatedtext": "De gebruiker [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|overleg]]) is aangemaakt.",
+       "accountcreated": "Account aangemaakt",
+       "accountcreatedtext": "Het gebruikersaccount [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|overleg]]) is aangemaakt.",
        "createaccount-title": "Gebruikers registreren voor {{SITENAME}}",
        "createaccount-text": "Iemand heeft een gebruiker op {{SITENAME}} ($4) aangemaakt met de naam \"$2\" en uw e-mailadres.\nHet wachtwoord voor \"$2\" is \"$3\".\nMeld u aan en wijzig uw wachtwoord.\n\nNegeer dit bericht als deze gebruiker zonder uw medeweten is aangemaakt.",
        "login-throttled": "U heeft recentelijk te veel mislukte aanmeldpogingen gedaan.\nWacht alstublieft $1 voordat u het opnieuw probeert.",
        "prefs-personal": "Gebruikersprofiel",
        "prefs-rc": "Recente wijzigingen",
        "prefs-watchlist": "Volglijst",
+       "prefs-editwatchlist": "Volglijst bewerken",
+       "prefs-editwatchlist-label": "Items op uw volglijst bewerken:",
+       "prefs-editwatchlist-edit": "Items op uw volglijsten bekijken en verwijderen",
+       "prefs-editwatchlist-raw": "Ruwe volglijst bewerken",
+       "prefs-editwatchlist-clear": "Volglijst wissen",
        "prefs-watchlist-days": "Dagen weer te geven in de volglijst:",
        "prefs-watchlist-days-max": "Maximaal $1 {{PLURAL:$1|dag|dagen}}",
        "prefs-watchlist-edits": "Maximaal aantal bewerkingen in de uitgebreide volglijst:",
        "action-viewmywatchlist": "uw eigen volglijst te bekijken",
        "action-viewmyprivateinfo": "uw eigen privégegevens te bekijken",
        "action-editmyprivateinfo": "uw eigen privégegevens te bewerken",
+       "action-managechangetags": "labels aanmaken en verwijderen",
        "nchanges": "$1 {{PLURAL:$1|bewerking|bewerkingen}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|sinds uw laatste bezoek}}",
        "enhancedrc-history": "geschiedenis",
        "tags-tag": "Labelnaam",
        "tags-display-header": "Weergave in wijzigingslijsten",
        "tags-description-header": "Volledige beschrijving van betekenis",
+       "tags-source-header": "Bron",
        "tags-active-header": "Actief?",
        "tags-hitcount-header": "Gelabelde bewerkingen",
+       "tags-actions-header": "Acties",
        "tags-active-yes": "Ja",
        "tags-active-no": "Nee",
+       "tags-source-extension": "Door een extensie toegevoegd",
+       "tags-source-manual": "Handmatig toegevoegd door gebruikers en bots",
+       "tags-source-none": "Niet meer in gebruik",
        "tags-edit": "bewerken",
+       "tags-delete": "verwijderen",
+       "tags-activate": "activeren",
+       "tags-deactivate": "deactiveren",
        "tags-hitcount": "$1 {{PLURAL:$1|wijziging|wijzigingen}}",
+       "tags-manage-no-permission": "U hebt geen rechten om labels te beheren.",
+       "tags-create-heading": "Een nieuw label aanmaken",
+       "tags-create-tag-name": "Labelnaam:",
+       "tags-create-reason": "Reden:",
+       "tags-create-submit": "Aanmaken",
+       "tags-create-already-exists": "Het label \"$1\" bestaat al.",
+       "tags-delete-title": "Label verwijderen",
+       "tags-delete-reason": "Reden:",
+       "tags-delete-not-found": "Het label \"$1\" bestaat niet.",
+       "tags-activate-title": "Label activeren",
+       "tags-activate-reason": "Reden:",
+       "tags-activate-not-found": "Het label \"$1\" bestaat nog niet.",
+       "tags-activate-submit": "Activeren",
+       "tags-deactivate-title": "Label deactiveren",
+       "tags-deactivate-question": "U staat op het punt om het label \"$1\" te deactiveren.",
+       "tags-deactivate-reason": "Reden:",
+       "tags-deactivate-submit": "Deactiveren",
        "comparepages": "Pagina's vergelijken",
        "compare-page1": "Pagina 1",
        "compare-page2": "Pagina 2",
        "logentry-patrol-patrol": "$1 {{GENDER:$2|heeft}} versie $4 van pagina $3 gemarkeerd als gecontroleerd",
        "logentry-patrol-patrol-auto": "$1 {{GENDER:$2|heeft}} versie $4 van pagina $3 automatisch gemarkeerd als gecontroleerd",
        "logentry-newusers-newusers": "Gebruiker $1 {{GENDER:$2|is}} aangemaakt",
-       "logentry-newusers-create": "Gebruiker $1 {{GENDER:$2|is}} aangemaakt",
+       "logentry-newusers-create": "Gebruikersaccount $1 {{GENDER:$2|is}} aangemaakt",
        "logentry-newusers-create2": "Gebruiker $3 {{GENDER:$2|is}} aangemaakt door $1",
        "logentry-newusers-byemail": "Gebruiker $3 {{GENDER:$2|is}} aangemaakt door $1 en het wachtwoord is per e-mail verzonden",
-       "logentry-newusers-autocreate": "Gebruiker $1 {{GENDER:$2|is}} automatisch aangemaakt",
+       "logentry-newusers-autocreate": "Gebruikersaccount $1 {{GENDER:$2|is}} automatisch aangemaakt",
        "logentry-rights-rights": "$1 {{GENDER:$2|heeft}} groepslidmaatschap voor $3 gewijzigd van $4 naar $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|heeft}} het groepslidmaatschap gewijzigd voor $3",
        "logentry-rights-autopromote": "$1 {{GENDER:$2|is}} automatisch gepromoveerd van $4 naar $5",
        "logentry-upload-upload": "$1 heeft $3 {{GENDER:$2|geupload}}",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|heeft}} een nieuwe versie van $3 geüpload",
        "logentry-upload-revert": "$1 heeft $3 {{GENDER:$2|geupload}}",
+       "logentry-managetags-create": "$1 heeft het label \"$4\" {{GENDER:$2|aangemaakt}}",
        "rightsnone": "(geen)",
        "revdelete-summary": "bewerkingssamenvatting",
        "feedback-bugornote": "Als u zover bent om een technisch probleem in detail te beschrijven, [$1 rapporteer dan een bug].\nAnders kunt u ook het eenvoudige formulier hieronder gebruiken. Uw reactie wordt dan toegevoegd aan de pagina \"[$3 $2]\", samen met uw gebruikersnaam en de browser die u gebruikt.",
index e44ec12..1e1748a 100644 (file)
@@ -22,9 +22,9 @@
        "tog-extendwatchlist": "Espandir la lista de seguiment per afichar totas las modificacions e non pas solament las mai recentas",
        "tog-usenewrc": "Agropar los cambiaments per pagina dins los darrièrs cambiaments e la lista de seguiment",
        "tog-numberheadings": "Numerotar automaticament los títols",
-       "tog-showtoolbar": "Far veire la barra de menú",
-       "tog-editondblclick": "Modificar las paginas amb un clic doble",
-       "tog-editsectiononrightclick": "Modificar una seccion en fasent un clic drech suls títols de seccion",
+       "tog-showtoolbar": "Far veire la barra d'aisinas de modificacion (necessita JavaScript)",
+       "tog-editondblclick": "Modificar de paginas amb un clic doble (necessita JavaScript)",
+       "tog-editsectiononrightclick": "Activar la modificacion de seccions en fasent un clic drech suls títols (necessita JavaScript)",
        "tog-watchcreations": "Apondre las paginas que creï e los fichièrs qu'impòrti a ma lista de seguiment",
        "tog-watchdefault": "Apondre las paginas que modifiqui e los fichièrs qu'impòrti a ma lista de seguiment",
        "tog-watchmoves": "Apondre las paginas e los fichièrs que tòrni nomenar a ma lista de seguiment",
@@ -38,9 +38,9 @@
        "tog-enotifminoredits": "M’avertir per corrièr electronic quitament en cas de modificacions menoras de las paginas o dels fichièrs",
        "tog-enotifrevealaddr": "Afichar mon adreça electronica dins la los corrièrs electronics d’avertiment",
        "tog-shownumberswatching": "Afichar lo nombre d'utilizaires que seguisson aquesta pagina",
-       "tog-oldsig": "Apercebut de la signatura existenta :",
+       "tog-oldsig": "Signatura existenta :",
        "tog-fancysig": "Tractar la signatura coma de wikitèxte (sens ligam automatic)",
-       "tog-uselivepreview": "Utilizar l’apercebut rapid (experimental)",
+       "tog-uselivepreview": "Utilizar l’apercebut rapid",
        "tog-forceeditsummary": "M'avertir quand ai pas completat lo contengut de la bóstia de comentaris",
        "tog-watchlisthideown": "Amagar mas pròprias modificacions dins la lista de seguiment",
        "tog-watchlisthidebots": "Amagar los cambiaments faches pels bòts dins la lista de seguiment",
        "pool-queuefull": "La fila de trabalh es plena",
        "pool-errorunknown": "Error desconeguda",
        "pool-servererror": "Lo servici de comptatge de la reserva es pas disponible ($1).",
+       "poolcounter-usage-error": "Error d’utilizacion : $1",
        "aboutsite": "A prepaus de {{SITENAME}}",
        "aboutpage": "Project:A prepaus",
        "copyright": "Lo contengut es disponible jos licéncia $1 levat mencion contrària.",
        "filerenameerror": "Impossible de tornar nomenar lo fichièr « $1 » en « $2 ».",
        "filedeleteerror": "Impossible de suprimir lo fichièr « $1 ».",
        "directorycreateerror": "Impossible de crear lo dorsièr « $1 ».",
+       "directoryreadonlyerror": "Lo repertòri « $1 » es en lectura sola.",
        "filenotfound": "Impossible de trobar lo fichièr « $1 ».",
        "unexpected": "Valor imprevista : « $1 » = « $2 ».",
        "formerror": "Error: Impossible de sometre lo formulari",
        "viewsourcetext": "Podètz veire e copiar lo contengut de l’article per poder trabalhar dessús :",
        "viewyourtext": "Podètz veire e copiar lo contengut de '''vòstras modificacions''' a aquesta pagina :",
        "protectedinterface": "Aquesta pagina provesís de tèxte d’interfàcia pel logicial susaqueste wiki, e es protegida per evitar los abuses.\nPer apondre o modificar de traduccions sus totes los wikis, utilizatz [//translatewiki.net/ translatewiki.net], lo projècte de localizacion de MediaWiki.",
-       "editinginterface": "'''Atencion :''' sètz a mand de modificar una pagina utilizada per crear lo tèxte de l’interfàcia del logicial. Los cambiaments sus aquesta pagina se repercutaràn sus l'aparéncia de l'interfàcia d'utilizaire pels autres utilizaires d'aqueste wiki. Per apondre o modificar de traduccions per totes los wikis, utilizatz [//translatewiki.net/translatewiki.net], lo projècte MediaWiki d'internacionalizacion dels messatges .",
+       "editinginterface": "<strong>Atencion :<strong> sètz a mand de modificar una pagina utilizada per crear lo tèxte de l’interfàcia del logicial.\nLos cambiaments sus aquesta pagina se repercutaràn sus l'aparéncia de l'interfàcia d'utilizaire pels autres utilizaires d'aqueste wiki.",
        "cascadeprotected": "Aquesta pagina es actualament protegida perque es inclusa dins {{PLURAL:$1|la pagina seguenta|las paginas seguentas}}, {{PLURAL:$1|qu'es estada protegida|que son estadas protegidas}} amb l’opcion « proteccion en cascada » activada :\n$2",
        "namespaceprotected": "Avètz pas la permission de modificar las paginas de l’espaci de noms « '''$1''' ».",
        "customcssprotected": "Avètz pas la permission d'editar aquesta pagina CSS perque conten de preferéncias d’autres utilizaires.",
        "showpreview": "Previsualizacion",
        "showdiff": "Veire los cambiaments",
        "blankarticle": "<strong>Atencion :</strong> La pagina que creatz es voida.\nSe clicatz tornarmai sus « {{int:savearticle}} », la pagina serà creada sens cap de contengut.",
-       "anoneditwarning": "'''Atencion :''' sètz pas identificat(ada).\nVòstra adreça IP serà enregistrada dins l’istoric d'aquesta pagina.",
+       "anoneditwarning": "<strong>Atencion :<strong> sètz pas connectat.\nVòstra adreça IP serà visibla per tot lo monde se fasètz de modificacions. Se <strong>[$1 vos connectatz]</strong> o <strong>[$2 creatz un compte]</strong>, vòstras modificacions seràn atribuidas a vòstre nom d’utilizaire, entre autres avantatges.",
        "anonpreviewwarning": "''Sètz pas identificat. Salvar enregistrarà vòstra adreça IP dins l’istoric de las modificacions de la pagina.''",
        "missingsummary": "'''Atencion :''' avètz pas modificat lo resumit de vòstra modificacion. Se clicatz tornarmai sul boton « Salvar », lo salvament serà fach sens avertiment mai.",
        "missingcommenttext": "Mercé de metre un comentari çaijós.",
        "content-model-text": "tèxte brut",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "Objècte void",
+       "content-json-empty-array": "Tablèu void",
        "expensive-parserfunction-warning": "Atencion : Aquesta pagina conten tròp d’apèls dispendioses de foncions del parser.\n\nI deurià aver mens de {{PLURAL:$2|ampèl|ampèls}}, e actualament {{PLURAL:$1|i a $1 ampèl|i a $1 ampèls}}..",
        "expensive-parserfunction-category": "Paginas amb tròp d’apèls dispendioses de foncions parsaires",
        "post-expand-template-inclusion-warning": "Atencion : Aquesta pagina conten tròp d'inclusions de modèls.\nD'unas inclusions seràn pas efectuadas.",
        "history-feed-empty": "La pagina demandada existís pas.\nBenlèu es estada escafada o renomenada.\nEnsajatz de [[Special:Search|recercar sul wiki]] per trobar de paginas en rapòrt.",
        "rev-deleted-comment": "(resumit de comentari suprimit)",
        "rev-deleted-user": "(nom d’utilizaire suprimit)",
-       "rev-deleted-event": "(entrada suprimida)",
+       "rev-deleted-event": "(detalhs de l'entrada suprimida)",
        "rev-deleted-user-contribs": "[nom d'utilizaire o adreça IP suprimida - modificacion amagada sus las contribucions]",
        "rev-deleted-text-permission": "Aquesta version de la pagina es estada '''escafada'''.\nI pòt aver de detalhs dins lo [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} jornal dels escafaments].",
        "rev-suppressed-text-permission": "Aquesta version de la page es estada <strong>suprimida</strong>.\nLos detalhs se tròban dins lo [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} jornal de las supressions].",
        "revdelete-legend": "Metre en plaça de restriccions de version :",
        "revdelete-hide-text": "Tèxte de la revision",
        "revdelete-hide-image": "Amagar lo contengut del fichièr",
-       "revdelete-hide-name": "Amagar l’accion e la cibla",
+       "revdelete-hide-name": "Amagar la cibla e los paramètres",
        "revdelete-hide-comment": "Modificar lo resumit",
        "revdelete-hide-user": "Nom d’utilizaire/Adreça IP de l’editor",
        "revdelete-hide-restricted": "Suprimir aquestas donadas als administrators e mai als autres",
        "search-result-category-size": "$1 membre{{PLURAL:$1||s}} ($2 soscategoria{{PLURAL:$2||s}}, $3 fichièr{{PLURAL:$3||s}})",
        "search-redirect": "(redireccion cap a $1)",
        "search-section": "(seccion $1)",
+       "search-category": "(categoria $1)",
        "search-file-match": "(correspond al contengut del fichièr)",
        "search-suggest": "Avètz volgut dire : $1",
        "search-interwiki-caption": "Projèctes fraires",
        "searchall": "Totes",
        "showingresults": "Afichatge de <b>$1</b> resultat{{PLURAL:$1||s}} a partir del n°<b>$2</b>.",
        "showingresultsinrange": "Afichar çaijós fins a {{PLURAL:$1|<strong>1</strong> resultat|<strong>$1</strong> resultats}} dins la seria #<strong>$2</strong> a #<strong>$3</strong>.",
+       "search-showingresults": "{{PLURAL:$4|Resultat <strong>$1</strong> demest <strong>$3</strong>|Resultats <strong>$1 a $2</strong> demest <strong>$3</strong>}}",
        "search-nonefound": "I a pas cap de resultat correspondent a la requèsta.",
        "powersearch-legend": "Recèrca avançada",
        "powersearch-ns": "Recercar dins los espacis de nom :",
        "gender-female": "Modifica de paginas del wiki",
        "prefs-help-gender": "Definir aquesta preferéncia es facultatiu.\nAqueste logicial utiliza sa valor per s’adreçar a vos e vos mencionar als autres en utilizant lo bon genre gramatical.\nAquesta informacion serà publica.",
        "email": "Corrièr electronic",
-       "prefs-help-realname": "(facultatiu) : se l'especificatz, serà utilizat per vos atribuir vòstras contribucions.",
+       "prefs-help-realname": "Lo nom vertadièr es facultatiu.\nSe l'especificatz, serà utilizat per vos atribuir vòstras contribucions.",
        "prefs-help-email": "L’adreça de corrièr electronic es facultativa mas vos permet de reçaupre lo senhal se lo doblidatz.\nTanben podètz causir de permetre a d’autres de vos contactar per vòstra pagina d’utilizaire o la de discussion sens sofracha de desvelar vòstra idenditat.",
        "prefs-help-email-others": "Tanben podètz causir de daissar los autres vos contactar sus vòstra pagina de discussion d'utilizaire sens que siá necessari de revelar vòstra identitat.",
        "prefs-help-email-required": "Una adreça de corrièr electronic es requesa.",
        "uploaderror": "Error",
        "upload-recreate-warning": "'''Atencion : Un fichièr amb aqueste nom es estat suprimit o desplaçat.'''\n\nLo jornal de las supressions e lo dels desplaçaments d'aquesta pagina son afichats aicí per informacion :",
        "uploadtext": "Utilizatz lo formulari çaijós per importar de fichièrs sul servidor.\nPer veire o recercar d'imatges mandats precedentament, consultatz [[Special:FileList|la lista dels imatges]]. Las còpias e las supressions tanben son enregistradas dins l'[[Special:Log/upload|istoric dels impòrts]], las supressions dins l’[[Special:Log/delete|istoric de las supressions]].\n\nPer inclure un imatge dins una pagina, utilizatz un ligam de la forma\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:fichièr.jpg]]</nowiki></code>''',\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:fichièr.png|200px|thumb|left|tèxte descriptiu]]</nowiki></code>''' per utilizar una miniatura de 200 pixèls de larg dins una bóstia a esquèrra amb 'tèxte descriptiu' coma descripcion\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:fichièr.ogg]]</nowiki></code>''' per ligar dirèctament cap al fichièr sens l'afichar.",
-       "upload-permitted": "Formats de fichièrs autorizats : $1.",
-       "upload-preferred": "Formats de fichièrs preferits : $1.",
-       "upload-prohibited": "Formats de fichièrs interdiches : $1.",
+       "upload-permitted": "{{PLURAL:$2|Tipe|Tipes}} de fichièrs autorizats : $1.",
+       "upload-preferred": "{{PLURAL:$2|Tipe|Tipes}} de fichièrs preferits : $1.",
+       "upload-prohibited": "{{PLURAL:$2|Tipe|Tipes}} de fichièrs interdiches : $1.",
        "uploadlogpage": "Istoric de las importacions de fichièrs multimèdia",
        "uploadlogpagetext": "Aquí la lista dels darrièrs fichièrs copiats sul servidor.\nVejatz la [[Special:NewFiles|galariá dels imatges novèls]] per una presentacion mai visuala.",
        "filename": "Nom del fichièr",
        "pager-older-n": "{{PLURAL:$1|1 mai anciana|$1 mai ancianas}}",
        "suppress": "Supervisor",
        "querypage-disabled": "Aquesta pagina especiala es desactivada per de rasons de performàncias.",
+       "apihelp": "Ajuda de l'API",
+       "apihelp-no-such-module": "Lo modul « $1 » es introbable.",
        "booksources": "Obratges de referéncia",
        "booksources-search-legend": "Recercar demest d'obratges de referéncia",
        "booksources-isbn": "ISBN :",
        "wlheader-enotif": "La notificacion per corrièr electronic es activada.",
        "wlheader-showupdated": "Las paginas que son estadas modificadas dempuèi vòstra darrièra visita son afichadas en '''gras'''.",
        "wlnote": "Çaijós {{PLURAL:$1|figura la darrièra modificacion efectuada|figuran las <strong>$1</strong> darrièras modificacions efectuadas}} pendent {{PLURAL:$2|la darrièra ora|las <strong>$2</strong> darrièras oras}}, dempuèi $3, $4.",
-       "wlshowlast": "Far veire las darrièras $1 oras, los darrièrs $2 jorns, o .",
+       "wlshowlast": "Far veire las darrièras $1 oras, los darrièrs $2 jorns",
        "watchlist-options": "Opcions de la lista de seguiment",
        "watching": "Seguit...",
        "unwatching": "Fin del seguit...",
        "delete-warning-toobig": "Aquesta pagina dispausa d'un istoric important, depassant {{PLURAL:$1|revision|revisions}}.\nLa suprimir pòt perturbar lo foncionament de la banca de donada de {{SITENAME}}.\nD'efectuar amb prudéncia.",
        "deleteprotected": "Podètz pas suprimir aquesta pagina perque es estada protegida.",
        "rollback": "Anullar las modificacions",
-       "rollback_short": "Anullar",
        "rollbacklink": "anullar",
        "rollbacklinkcount": "revocar $1 {{PLURAL:$1|modificacion|modificacions}}",
        "rollbacklinkcount-morethan": "revocar mai de $1 {{PLURAL:$1|modificacion|modificacions}}",
        "protect_expiry_invalid": "Lo temps d’expiracion es invalid",
        "protect_expiry_old": "Lo temps d’expiracion ja es passat.",
        "protect-unchain-permissions": "Desvarrolhar ancara mai d'opcions de proteccion",
-       "protect-text": "Podètz consultar e modificar lo nivèl de proteccion de la pagina '''$1'''. Asseguratz-vos que seguissètz las règlas intèrnas.",
-       "protect-locked-blocked": "Podètz pas modificar lo nivèl de proteccion tant que sètz blocat. Vaquí los reglatges actuals de la pagina '''$1''' :",
-       "protect-locked-dblock": "Lo nivèl de proteccion pòt pas èsser modificat perque la banca de donadas es blocada. Vaquí los reglatges actuals de la pagina '''$1''' :",
-       "protect-locked-access": "Avètz pas los dreches necessaris per modificar la proteccion de la pagina. Vaquí los reglatges actuals de la pagina '''$1''' :",
+       "protect-text": "Podètz consultar e modificar lo nivèl de proteccion de la pagina «$1».",
+       "protect-locked-blocked": "Podètz pas modificar los nivèls de proteccion tant que sètz bloca{{GENDER:||t|ada}}.. Vaquí los reglatges actuals de la pagina <strong>$1</strong> :",
+       "protect-locked-dblock": "Lo nivèl de proteccion pòt pas èsser modificat perque la banca de donadas es varrolhada.\nVaquí los reglatges actuals de la pagina <strong>$1</strong> :",
+       "protect-locked-access": "Avètz pas los dreches necessaris per modificar los nivèls de proteccion de las paginas.\nVaquí los reglatges actuals de la pagina <strong>$1</strong> :",
        "protect-cascadeon": "Aquesta pagina es protegida perque es inclusa dins {{PLURAL:$1|la pagina seguenta qu'es estada protegida|las paginas seguentas que son estadas protegidas}}, amb l’opcion « proteccion en cascada » activada. Podètz cambiar lo nivèl de proteccion d'aquesta pagina sens qu'aquò afècte la proteccion en cascada.",
        "protect-default": "Autorizar totes los utilizaires",
        "protect-fallback": "Autorizar unicament los utilizaires amb lo drech « $1 »",
        "undeletedrevisions-files": "{{PLURAL:$1|1 revision|$1 revisions}} e {{PLURAL:$2|1 fichièr restablit|$2 fichièrs restablits}}",
        "undeletedfiles": "$1 {{PLURAL:$1|fichièr restablit|fichièrs restablits}}",
        "cannotundelete": "Fracàs del restabliment :\n$1",
-       "undeletedpage": "'''La pagina $1 es estada restablida'''.\n\nConsultatz l’[[Special:Log/delete|istoric de las supressions]] per veire las paginas recentament suprimidas e restablidas.",
+       "undeletedpage": "<strong>La pagina $1 es estada restablida</strong>.\n\nConsultatz l’[[Special:Log/delete|istoric de las supressions]] per veire la lista de las supressions e dels restabliments recents.",
        "undelete-header": "Consultatz l’[[Special:Log/delete|istoric de las supressions]] per veire las paginas recentament suprimidas.",
        "undelete-search-title": "Recercar las paginas suprimidas",
        "undelete-search-box": "Cercar una pagina suprimida",
        "sp-contributions-blocklog": "Istoric dels blocatges",
        "sp-contributions-suppresslog": "contribucions suprimidas d’un utilizaire",
        "sp-contributions-deleted": "contribucions suprimidas",
-       "sp-contributions-uploads": "importat",
+       "sp-contributions-uploads": "impòrts",
        "sp-contributions-logs": "jornals",
        "sp-contributions-talk": "Discutir",
        "sp-contributions-userrights": "gerir los dreches",
        "sp-contributions-blocked-notice-anon": "Aquesta adreça IP es actualament blocada.\nLa darrièra intrada del jornal dels blocatges es indicada çaijós a títol d’informacion :",
        "sp-contributions-search": "Cercar las contribucions",
        "sp-contributions-username": "Adreça IP o nom d’utilizaire :",
-       "sp-contributions-toponly": "Mostrar sonque las contribucions que son lo darrièr cambiament",
+       "sp-contributions-toponly": "Mostrar sonque las contribucions que son las darrièras dels articles",
        "sp-contributions-newonly": "Afichar unicament las modificacions que son de creacions de pagina",
        "sp-contributions-submit": "Cercar",
        "whatlinkshere": "Paginas ligadas a aquesta",
        "nolinkshere-ns": "Cap de pagina conten pas de ligam cap a '''[[:$1]]''' dins l’espaci de nom causit.",
        "isredirect": "pagina de redireccion",
        "istemplate": "inclusion",
-       "isimage": "Paginas ligadas al fichièr",
+       "isimage": "ligam cap al fichièr",
        "whatlinkshere-prev": "{{PLURAL:$1|precedent|$1 precedents}}",
        "whatlinkshere-next": "{{PLURAL:$1|seguent|$1 seguents}}",
        "whatlinkshere-links": "← ligams",
        "ipaddressorusername": "Adreça IP o nom d’utilizaire :",
        "ipbexpiry": "Durada del blocatge :",
        "ipbreason": "Motiu :",
-       "ipbreason-dropdown": "* Motius de blocatge mai frequents\n** Vandalisme\n** Insercion d’informacions faussas\n** Supression de contengut sens justificacion\n** Insercion repetida de ligams extèrnes publicitaris (spam)\n** Insercion de contengut sens cap de sens\n** Temptativa d’intimidacion o agarriment\n** Abús d’utilizacion de comptes multiples\n** Nom d’utilizaire inacceptable, injuriós o difamant",
+       "ipbreason-dropdown": "* Motius de blocatge mai frequents\n** Insercion d’informacions faussas\n** Supression injustificada de contengut de las paginas\n** Insercion repetida de ligams extèrnes publicitaris (spam)\n** Insercion de contengut sens cap de sens e de bordilhas dins las paginas\n** Temptativa d’intimidacion o agarriment\n** Abús d’utilizacion de comptes multiples\n** Nom d’utilizaire inacceptable, injuriós o difamant",
        "ipb-hardblock": "Empachar los utilizaires connectats de modificar en utilizant aquesta adreça IP",
        "ipbcreateaccount": "Empachar la creacion de compte",
        "ipbemailban": "Empachar l’utilizaire de mandar de corrièrs electronics",
        "unblocked": "[[User:$1|$1]] es estat desblocat",
        "unblocked-range": "$1 es estat desblocat",
        "unblocked-id": "Lo blocatge $1 es estat levat",
-       "blocklist": "Utilizaires o adreças IP blocats",
-       "ipblocklist": "Utilizaires o adreças IP blocats",
+       "blocklist": "Utilizaires blocats",
+       "ipblocklist": "Utilizaires blocats",
        "ipblocklist-legend": "Cercar un utilizaire blocat",
        "blocklist-userblocks": "Amagar los blocatges de comptes",
        "blocklist-tempblocks": "Amagar los blocatges temporaris",
        "unblocklink": "desblocar",
        "change-blocklink": "modificar lo blocatge",
        "contribslink": "contribucions",
-       "emaillink": "mandar un messatge",
+       "emaillink": "Mandar un corrièr electronic",
        "autoblocker": "Sètz estat blocat automaticament perque vòstra adreça IP es estada utilizada recentament per « [[User:$1|$1]] ».\nLo motiu provesit pel blocatge de $1 es « $2 »",
        "blocklogpage": "Istoric dels blocatges",
        "blocklog-showlog": "Aqueste utilizaire es estat blocat precedentament. Lo jornal dels blocatges es disponible çaijós :",
        "movepagetalktext": "La pagina de discussion associada, se presenta, serà automaticament desplaçada amb ''' levat se :'''\n*Desplaçatz una pagina cap a un autre espaci,\n*Una pagina de discussion ja existís amb lo nom novèl, o\n*Avètz deseleccionat lo boton çaijós.\n\nDins aqueste cas, vos caldrà desplaçar o fusionar la pagina manualament se o volètz.",
        "movearticle": "Tornar nomenar l'article",
        "moveuserpage-warning": "'''Atencion :''' Sètz a mand de tornar nomenar una pagina d’utilizaire. Notatz que sola la pagina serà renomenada e que l’utilizaire '''ne''' serà '''pas''' renomenat.",
-       "movenologintext": "Per poder tornar nomenar un article, vos cal èsser [[Special:UserLogin|connectat(ada)]]\nen tant qu'utilizaire enregistrat.",
-       "movenotallowed": "Avètz pas la permission de tornar nomenar de paginas.",
+       "movenologintext": "Per poder renomenar una pagina, vos cal èsser [[Special:UserLogin|indentific{{GENDER:||t|da)}}]]\nen tant qu'utilizaire enregistrat amb pro d'ancianetat.",
+       "movenotallowed": "Avètz pas la permission de renomenar de paginas.",
        "movenotallowedfile": "Avètz pas la permission de desplaçar los fichièrs.",
-       "cant-move-user-page": "Avètz pas la permission de tornar nomenar de paginas d'utilizaires raices sus aqueste wiki.",
+       "cant-move-user-page": "Avètz pas la permission de renomenar las paginas principalas d'utilizaires.",
        "cant-move-to-user-page": "Avètz pas la permission de tornar nomenar una pagina cap a una pagina d'utilizaire (a l'excepcion d'una sospagina).",
        "cant-move-category-page": "Avètz pas la permission de renomenar las paginas de categorias.",
        "newtitle": "Títol novèl",
        "move-watch": "Seguir aquesta pagina",
        "movepagebtn": "Tornar nomenar l'article",
        "pagemovedsub": "Cambiament de nom capitat",
-       "movepage-moved": "La pagina « $1 » es estada renomenada en « $2 ».",
+       "movepage-moved": "'''« $1 » es estada renomenada en « $2 »'''",
        "movepage-moved-redirect": "Una redireccion es estada creada.",
        "movepage-moved-noredirect": "La creacion de la redireccion es estada suprimida.",
        "articleexists": "Existís ja un article que pòrta aqueste títol, o lo títol qu'avètz causit es pas valid.\nCausissètz-ne un autre.",
        "allmessagesdefault": "Messatge per defaut",
        "allmessagescurrent": "Messatge actual",
        "allmessagestext": "Aquò es la lista de totes los messatges disponibles dins l’espaci MediaWiki.\nVisitatz la [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation Localizacion MediaWiki] e [//translatewiki.net translatewiki.net] se desiratz contribuir a la localizacion MediaWiki generica.",
-       "allmessagesnotsupportedDB": "'''{{ns:special}}:Allmessages''' es pas disponible perque '''$wgUseDatabaseMessages''' es desactivat.",
+       "allmessagesnotsupportedDB": "Aquesta pagina '''{{ns:special}}:Allmessages''' es pas utilizabla perque '''$wgUseDatabaseMessages''' es estat desactivat.",
        "allmessages-filter-legend": "Filtre",
        "allmessages-filter": "Filtrar per estat de modificacion :",
        "allmessages-filter-unmodified": "Pas modificat",
        "import-revision-count": "$1 {{PLURAL:$1|version|versions}}",
        "importnopages": "Cap de pagina d'importar.",
        "imported-log-entries": "$1 {{PLURAL:$1|entrada|entradas}} del jornal {{PLURAL:$1|importada|importadas}}.",
-       "importfailed": "Fracàs de l’impòrt : $1",
+       "importfailed": "Fracàs de l'importacion : <nowiki>$1</nowiki>",
        "importunknownsource": "Tipe de la font d’impòrt desconegut",
        "importcantopen": "Impossible de dobrir lo fichièr d'importar",
        "importbadinterwiki": "Ligam interwiki marrit",
        "import-rootpage-nosubpage": "L'espaci de noms « $1 » de la pagina raiç autoriza pas las sospaginas.",
        "importlogpage": "Istoric de las importacions de paginas",
        "importlogpagetext": "Impòrts administratius de paginas amb l’istoric a partir dels autres wikis.",
-       "import-logentry-upload": "a importat (telecargament) [[$1]]",
+       "import-logentry-upload": "a importat [[$1]] per mandadís de fichièr",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|revision importada|revisions importadas}}",
-       "import-logentry-interwiki": "a importat (transwiki) $1",
+       "import-logentry-interwiki": "a importat $1 d'un wiki a l'autre",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|revision importada|revisions importadas}} dempuèi $2",
        "javascripttest": "Tèst de JavaScript",
-       "javascripttest-title": "Execucion dels tèsts $1",
        "javascripttest-pagetext-noframework": "Aquesta pagina es reservada per l'execucion dels tèsts JavaScript.",
        "javascripttest-pagetext-unknownframework": "Estructura « $1 » desconeguda.",
+       "javascripttest-pagetext-unknownaction": "Accion « $1 » desconeguda.",
        "javascripttest-pagetext-frameworks": "Causissètz una de las estructuras de tèst seguentas : $1",
        "javascripttest-pagetext-skins": "Causissètz un abilhatge amb lo qual cal aviar los tèsts :",
        "javascripttest-qunit-intro": "Veire [$1 la documentacion de tèst] sus mediawiki.org.",
-       "javascripttest-qunit-heading": "Seguida de tèst QUnit de JavaScript sus MediaWiki",
        "tooltip-pt-userpage": "Vòstra pagina d'utilizaire",
        "tooltip-pt-anonuserpage": "La pagina d'utilizare de l’IP amb la quala contribuissètz",
        "tooltip-pt-mytalk": "Vòstra pagina de discussion",
        "others": "autres",
        "siteusers": "{{PLURAL:$2|utilizaire|utilizaires}} $1 de {{SITENAME}}",
        "anonusers": "{{PLURAL:$2|l'utilizaire anonim|los utilizaires anonims}} $1 de {{SITENAME}}",
-       "creditspage": "Pagina de crèdits",
+       "creditspage": "Crèdits de la pagina",
        "nocredits": "I a pas d’entresenhas d’atribucion disponiblas per aquesta pagina.",
        "spamprotectiontitle": "Pagina protegida automaticament per causa de spam",
        "spamprotectiontext": "La pagina qu'avètz ensajat de publicar es estada blocada pel filtre antispam.\nAquò es probablament causat per un ligam sus lista negra que punta cap a un site extèrne.",
        "markedaspatrollederrornotify": "Fracàs del marcatge coma contrarotlat.",
        "patrol-log-page": "Istoric de las versions patrolhadas",
        "patrol-log-header": "Vaquí un jornal de las versions patrolhadas.",
-       "log-show-hide-patrol": "$1 l'istoric de las versions patrolhadas",
+       "log-show-hide-patrol": "$1 l'istoric de las relecturas",
        "deletedrevision": "La version anciana $1 es estada suprimida.",
        "filedeleteerror-short": "Error al moment de la supression del fichièr : $1",
        "filedeleteerror-long": "D'errors son estadas rencontradas al moment de la supression del fichièr :\n\n$1",
        "filedelete-archive-read-only": "Lo dorsièr d’archivatge « $1 » es pas modificable pel servidor.",
        "previousdiff": "← Cambiament precedent",
        "nextdiff": "Cambiament seguent →",
-       "mediawarning": "'''Atencion :''' Aqueste fichièr pòt conténer de còde malvolent.\nSe l'executatz, vòstre sistèma pòt èsser compromés.",
+       "mediawarning": "<strong>Atencion :</strong> Aqueste tipe de fichièr pòt conténer de còde malvolent.\nSe l'executatz, vòstre sistèma pòt èsser compromés.",
        "imagemaxsize": "Format maximal dels imatges :<br />''(per las paginas de descripcion d’imatges)''",
        "thumbsize": "Talha de la miniatura :",
        "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|pagina|paginas}}",
        "file-info": "Talha del fichièr: $1, tipe MIME: $2",
        "file-info-size": "$1 × $2 pixèl, talha del fichièr: $3, tipe MIME: $4",
        "file-info-size-pages": "$1 × $2 pixèls, talha de fichièr: $3, tipe MIME: $4, $5 {{PLURAL:$5|pagina|paginas}}",
-       "file-nohires": "Pas de resolucion mai nauta disponibla.",
+       "file-nohires": "Pas de resolucion mai nauta de disponibla.",
        "svg-long-desc": "Fichièr SVG, resolucion de $1 × $2 pixèls, talha : $3",
        "svg-long-desc-animated": "Fichièr SVG animat, talha $1 x $2 pixèls, talha del fichièr : $3",
        "svg-long-error": "Fichièr SVG invalid : $1",
        "saturday-at": "Dissabte a $1",
        "sunday-at": "Dimenge a $1",
        "yesterday-at": "Ièr a $1",
-       "bad_image_list": "Lo format es lo seguent :\n\nSolas las listas d'enumeracion (las linhas començant per *) son presas en compte. Lo primièr ligam d'una linha deu èsser cap a un imatge marrit.\nLos autres ligams sus la meteissa linha son considerats coma d'excepcions, per exemple d'articles sulsquals l'imatge deu aparéisser.",
+       "bad_image_list": "Lo format es lo seguent :\n\nSolas las listas d'enumeracion (las linhas començant per *) son presas en compte. Lo primièr ligam d'una linha deu èsser cap a un imatge marrit.\nLos autres ligams sus la meteissa linha son considerats coma d'excepcions, per exemple de paginas sus las quals l'imatge deu aparéisser.",
        "variantname-kk-arab": "kk-arabi",
        "variantname-ku-arab": "ku-Arabi",
        "metadata": "Metadonadas",
        "metadata-help": "Aqueste fichièr conten d'entresenhas suplementàrias probablament apondudas per l’aparelh de fòto numeric o l'escanèr que las a aquesas. Se lo fichièr es estat modificat dempuèi son estat original, d'unes detalhs pòdon reflectir pas entièrament l’imatge modificat.",
        "metadata-expand": "Far veire las entresenhas detalhadas",
        "metadata-collapse": "Amagar las entresenhas detalhadas",
-       "metadata-fields": "Los camps de metadonadas d’EXIF listats dins aqueste message seràn incluses dins la pagina de descripcion de l’imatge quand la taula de metadonadas serà reducha. Los autres camps seràn amagats per manca.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
+       "metadata-fields": "Los camps de metadonadas d’EXIF listats dins aqueste messatge seràn incluses dins la pagina de descripcion de l’imatge quand la taula de metadonadas serà redusida. Los autres camps seràn amagats per defaut.\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": "Largor",
        "exif-imagelength": "Nautor",
        "exif-bitspersample": "Bits per compausanta",
        "exif-iimcategory-evn": "Environament",
        "exif-iimcategory-hth": "Santat",
        "exif-iimcategory-hum": "Interès uman",
-       "exif-iimcategory-lab": "Tribailh",
+       "exif-iimcategory-lab": "Trabalh",
        "exif-iimcategory-lif": "Mòde de vida e de lésers",
-       "exif-iimcategory-pol": "Politic",
+       "exif-iimcategory-pol": "Politica",
        "exif-iimcategory-rel": "Religion e cresenças",
        "exif-iimcategory-sci": "Sciéncia e tecnologia",
        "exif-iimcategory-soi": "Questions socialas",
        "exif-iimcategory-spo": "Espòrts",
-       "exif-iimcategory-war": "Guèrra, conflictes",
+       "exif-iimcategory-war": "Guèrra, conflictes e borrolhs",
        "exif-iimcategory-wea": "Metèo",
        "exif-urgency-normal": "Normala ($1)",
        "exif-urgency-low": "Febla ($1)",
        "confirmemail": "Confirmar l'adreça de corrièr electronic",
        "confirmemail_noemail": "L’adreça de corrièr electronic configurada dins vòstras [[Special:Preferences|preferéncias]] es pas valida.",
        "confirmemail_text": "{{SITENAME}} necessita la verificacion de vòstra adreça de corrièr electronic abans de poder utilizar tota foncion de messatjariá. Utilizatz lo boton çaijós per mandar un corrièr electronic de confirmacion a vòstra adreça. Lo corrièr contendrà un ligam contenent un còde, cargatz aqueste ligam dins vòstre navigador per validar vòstra adreça.",
-       "confirmemail_pending": "Un còde de confirmacion ja vos es estat mandat per corrièr electronic ; se venètz de crear vòstre compte, esperatz qualques minutas que l’e-mail arribe abans de demandar un còde novèl.",
+       "confirmemail_pending": "Un còde de confirmacion ja vos es estat mandat per corrièr electronic ;\nse venètz de crear vòstre compte, esperatz qualques minutas que l’e-mail arribe abans de demandar un còde novèl.",
        "confirmemail_send": "Mandar un còde de confirmacion",
        "confirmemail_sent": "Corrièr electronic de confirmacion mandat.",
        "confirmemail_oncreate": "Un còde de confirmacion es estat mandat a vòstra adreça de corrièr electronic.\nAqueste còde es pas requerit per se connectar, mas n'aurètz besonh per activar las foncionalitats ligadas als corrièrs electronics sus aqueste wiki.",
        "confirm_purge_button": "Confirmar",
        "confirm-purge-top": "Volètz refrescar aquesta pagina (purgar l'escondedor) ?",
        "confirm-purge-bottom": "Purgar una pagina vioda l'escondedor e fòrça la darrièra version a èsser afichada.",
-       "confirm-watch-button": "Confirmar",
-       "confirm-watch-top": "Apondre aquesta pagina a vòstra lista de seguiment?",
-       "confirm-unwatch-button": "Confirmar",
-       "confirm-unwatch-top": "Levar aquesta pagina de vòstra lista de seguiment?",
+       "confirm-watch-button": "D'acòrdi",
+       "confirm-watch-top": "Apondre aquesta pagina a vòstra lista de seguiment ?",
+       "confirm-unwatch-button": "D'acòrdi",
+       "confirm-unwatch-top": "Levar aquesta pagina de vòstra lista de seguiment ?",
        "colon-separator": "&nbsp;:&#32;",
        "quotation-marks": "« $1 »",
        "imgmultipageprev": "← pagina precedenta",
        "table_pager_first": "Primièra pagina",
        "table_pager_last": "Darrièra pagina",
        "table_pager_limit": "Far veire $1 elements per pagina",
-       "table_pager_limit_label": "Elements per pagina:",
+       "table_pager_limit_label": "Resultats per pagina :",
        "table_pager_limit_submit": "Accedir",
        "table_pager_empty": "Cap de resultat",
        "autosumm-blank": "Blanquiment de la pagina",
        "lag-warn-high": "En rason d’una fòrta carga de las bancas de donadas, los cambiaments que datan de mens de $1 {{PLURAL:$1|segonda|segondas}} pòdon aparéisser pas dins aquesta lista.",
        "watchlistedit-normal-title": "Modificacion de la lista de seguiment",
        "watchlistedit-normal-legend": "Levar de paginas de la lista de seguiment",
-       "watchlistedit-normal-explain": "Las paginas que seguissètz son visiblas çaijós, classadas per espaci de noms. Per levar una pagina (e sa pagina de discussion) de la lista, seleccionatz la casa al costat puèi clicatz sul boton en bas. Tanben la podètz [[Special:EditWatchlist/raw|modificar en mòde brut]].",
+       "watchlistedit-normal-explain": "Las paginas que seguissètz son visiblas çaijós, classadas per espaci de noms.\nPer levar una pagina (e sa pagina de discussion) de la lista, seleccionatz la casa al costat puèi clicatz sul boton en bas.\nTanben la podètz [[Special:EditWatchlist/raw|modificar en mòde brut]].",
        "watchlistedit-normal-submit": "Levar las paginas seleccionadas",
        "watchlistedit-normal-done": "{{PLURAL:$1|Una pagina es estada levada|$1 paginas son estadas levadas}} de vòstra lista de seguiment :",
        "watchlistedit-raw-title": "Modificacion de la lista de seguiment (mòde brut)",
        "watchlistedit-raw-legend": "Modificacion de la lista de seguiment en mòde brut",
-       "watchlistedit-raw-explain": "!!FLa lista de las paginas que seguissètz es afichada çaijós, sens las paginas de discussion (enclusas automaticament) e triadas per espaci de noms. Podètz modificar la lista, apondètz las paginas que volètz seguir (pauc impòrta ont), una pagina per linha, e levatz las paginas que volètz pas mai seguir. Tanlèu acabat, clicatz sul boton en bas per metre la lista a jorn. Tanben podètz utilizar [[Special:EditWatchlist|l’editor normal]].",
+       "watchlistedit-raw-explain": "Los títols de vòstra lista de seguiment son afichats çaijós e pòdon èsser modificats en los apondent o los levant de la lista (un títol per linha). Quand avètz acabat, clicatz sul boton « {{int:Watchlistedit-raw-submit}} » en bas. Tanben podètz [[Special:EditWatchlist|utilizar l'editor normal]].",
        "watchlistedit-raw-titles": "Títols :",
        "watchlistedit-raw-submit": "Metre la lista a jorn",
        "watchlistedit-raw-done": "Vòstra lista de seguiment es estada mesa a jorn.",
        "watchlisttools-edit": "Veire e modificar la lista de seguiment",
        "watchlisttools-raw": "Modificar la lista (mòde brut)",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|discussion]])",
-       "unknown_extension_tag": "Balisa d'extension « $1 » desconeguda",
        "duplicate-defaultsort": "Atencion : La clau de triada per defaut « $2 » espotís la mai recenta « $1 ».",
        "duplicate-displaytitle": "<strong>Atencion :</strong> Lo títol d'afichatge «$2» remplaça l'ancian títol d'afichatge «$1».",
        "version": "Version",
        "version-license-not-found": "Cap d'informacion detalhada de la licéncia es pas estada trobada per aquesta extension.",
        "version-credits-title": "Mercejaments per $1",
        "version-credits-not-found": "Cap d'informacion detalhada dels mercejaments es pas estada trobada per aquesta extension.",
-       "version-poweredby-credits": "Aqueste wiki fonciona gràcias a '''[https://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
+       "version-poweredby-credits": "Aqueste wiki fonciona gràcias a <strong>[https://www.mediawiki.org/ MediaWiki]</strong>, copyright © 2001-$1 $2.",
        "version-poweredby-others": "autres",
        "version-poweredby-translators": "traductors de translatewiki.net",
        "version-software": "Logicial installat",
        "version-entrypoints": "URL dels punts d'entrada",
        "version-entrypoints-header-entrypoint": "Punt d'entrada",
        "version-entrypoints-header-url": "URL",
+       "version-libraries": "Bibliotècas installadas",
+       "version-libraries-library": "Bibliotèca",
+       "version-libraries-version": "Version",
        "redirect": "Redirigit per fichièr, utilizaire, pagina o ID de revision.",
        "redirect-legend": "Redirigir cap a una pagina o un fichièr",
        "redirect-submit": "Validar",
        "redirect-file": "Nom del fichièr",
        "redirect-not-exists": "Valor pas trobada",
        "fileduplicatesearch": "Recèrca dels fichièrs en doble",
-       "fileduplicatesearch-summary": "Recèrca per de fichièrs en doble sus la banca de valors fragmentàrias.",
+       "fileduplicatesearch-summary": "Recèrca de las còpias de fichièrs identics d'aprèp lor emprenta de hachatge.",
        "fileduplicatesearch-legend": "Recèrca d’un doble",
        "fileduplicatesearch-filename": "Nom del fichièr :",
        "fileduplicatesearch-submit": "Recercar",
        "specialpages-group-wiki": "Donadas e aisinas",
        "specialpages-group-redirects": "Redireccions",
        "specialpages-group-spam": "Aisinas antispam",
+       "specialpages-group-developer": "Aisinas del desvolopaire",
        "blankpage": "Pagina voida",
        "intentionallyblankpage": "Aquesta pagina es intencionalament voida e es utilizada coma un tèst de performància, eca.",
-       "external_image_whitelist": " #Daissatz aquesta linha exactament coma es<pre>\n#Indicatz los fragments d’expression regularas (sonque la partida indicada entre los //) çaijós\n#Correspondràn amb las URLs dels imatges (fòrt ligadas) extèrnes\n#Las que correspondon s'aficharàn coma d'imatges, siquenon solament un ligam cap a l'imatge serà afichat\n#Las linhas que començan amb # seràn consideradas coma de comentaris\n#Aquesta linha es pas sensibla a la cassa\n\n#Metetz totes los fragments d’expressions regularas al dessús d'aquesta linha. Daissatz aquesta darrièra linha exactament coma es.</pre>",
+       "external_image_whitelist": " #Daissatz aquesta linha exactament coma es.<pre>\n#Indicatz los fragments d’expression racionalas (sonque la partida indicada entre los //) çaijós.\n#Correspondràn amb las URLs dels imatges extèrnes\n#Los que correspondon s'aficharàn coma d'imatges, siquenon solament un ligam cap a l'imatge serà afichat.\n#Las linhas que començan amb un # seràn consideradas coma de comentaris.\n#Aquesta linha es pas sensibla a la cassa.\n\n#Metètz totes los fragments d’expressions racionalas al dessús d'aquesta linha. Daissatz aquesta darrièra linha exactament coma es.</pre>",
        "tags": "Balisas de las modificacions validas",
        "tag-filter": "Filtrar las [[Special:Tags|balisas]] :",
        "tag-filter-submit": "Filtrar",
        "compare-revision-not-exists": "La revision qu'avètz especificada existís pas.",
        "dberr-problems": "O planhèm ! Aqueste site rencontra de dificultats tecnicas.",
        "dberr-again": "Ensajatz d'esperar qualques minutas e tornatz cargar.",
-       "dberr-info": "(Se pòt pas connectar al servidor de la banca de donadas : $1)",
-       "dberr-info-hidden": "(Connexion al servidor de la banca de donadas impossibla)",
+       "dberr-info": "(Accès a la banca de donadas impossible : $1)",
+       "dberr-info-hidden": "(Accès a la banca de donadas impossible)",
        "dberr-usegoogle": "Podètz ensajar de cercar amb Google pendent aqueste temps.",
        "dberr-outofdate": "Notatz que lors indèxes de nòstre contengut pòdon èsser depassats.",
        "dberr-cachederror": "Aquò es una còpia amagada de la pagina demandada e pòt èsser depassada.",
        "revdelete-uname-unhid": "nom d’utilizaire afichat",
        "revdelete-restricted": "aplicar las restriccions als administrators",
        "revdelete-unrestricted": "restriccions levadas pels administrators",
+       "logentry-merge-merge": "$1 {{GENDER:$2|a fusionat}} $3 en $4 (revisions fins a $5)",
        "logentry-move-move": "$1  {{GENDER:$2|a desplaçat}} la pagina $3 cap a $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|a desplaçat}} la pagina $3 cap a $4 sens daissar cap de redireccion",
        "logentry-move-move_redir": "$1 {{GENDER:$2|a desplaçat}} la pagina $3 cap a $4 per dessús una redireccion",
        "limitreport-expensivefunctioncount": "Nombre de foncions d’analisi costosas",
        "expandtemplates": "Espandiment dels modèls",
        "expand_templates_intro": "Aquesta pagina especiala accèpta un tèxte wiki source e permet de realizar recursivament l’espandiment dels modèls que conten.\nRealiza tanben l’espandiment de las foncions del parser talas coma\n<code><nowiki>{{</nowiki>#language:...}}</code> e de variablas coma\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>.\nEn fach, realiza l'espandiment de gaireben tot çò qu'es enquadrat per d'acoladas doblas.",
-       "expand_templates_title": "Títol de l’article, util per exemple se lo modèl utiliza {{FULLPAGENAME}} :",
+       "expand_templates_title": "Títol de la pagina, se lo còde utiliza {{FULLPAGENAME}}, etc. :",
        "expand_templates_input": "Picatz vòstre tèxte aicí :",
        "expand_templates_output": "Visualizatz lo resultat :",
        "expand_templates_xml_output": "Sortida XML",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2|a cambiat}} la lenga de la pagina $3 de $4 a $5.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (activat)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''desactivat''')",
+       "mediastatistics": "Estatisticas suls mèdias",
        "mediastatistics-nbytes": "{{PLURAL:$1|$1 octet|$1 octets}} ($2 ; $3%)",
        "mediastatistics-table-mimetype": "Tipe MIME",
        "mediastatistics-table-extensions": "Extensions possiblas",
index c96e2e7..a7245dc 100644 (file)
        "right-userrights": "I-edit la ngan deng katulirang talagamit (user rights)",
        "right-userrights-interwiki": "I-edit la reng katulirang talagamit (user rights) da reng talagamit kareng aliwang karinan a wiki",
        "right-siteadmin": "Isara ya ampong ibusni ing database",
+       "right-managechangetags": "Maglalang at magbura [[Special:Tags|tags]] ibat database",
        "newuserlogpage": "Tala ning pamaglalang talagamit (''User creation log'')",
        "rightslog": "Tala da reng katulirang talagamit (user rights log)",
        "rightslogtext": "Ini tala de reng miyalilan king katulirang talagamit (user rights).",
        "action-edit": "i-edit/alilan ya ing bulung a ini",
+       "action-managechangetags": "maglalang at magbura tags ibat database",
        "nchanges": "$1 {{PLURAL:$1|miyalilan|miyalilan}}",
        "recentchanges": "Bayung mengayalili",
        "recentchanges-legend": "Pipamilinan kareng bayung mengayalili",
        "delete-toobig": "Maki maragul yang amlat ning pamag-edit ing bulung a ini, nung nu maigit lang $1 deng miyalilan.\nMe-limita ing pamamura kareng bulung a anti kaniti, bang e maliliari ing e sasarian a kaguluan o pamag-distorbu king {{SITENAME}}.",
        "delete-warning-toobig": "Makaba ya ing amlat ding mibayu/me-edit ning bulung a ini, maigit la king $1 ding pamagbayu.\nPosibling miyapektuan ing palakad ning database ning {{SITENAME}};\npakakalale ka.",
        "rollback": "Iurung la retang me-edit",
-       "rollback_short": "Iurung",
        "rollbacklink": "i-urung",
        "rollbackfailed": "E melaus ing pamanurung",
        "cantrollback": "E malyaring ibalik itang miyalilan; bukud mung ing tawling minambag yang sinulat king bulung a ini.",
        "specialpages-group-media": "Ulat king media ampong pamaglulan (uploads)",
        "specialpages-group-users": "Talagamit ampong katuliran",
        "specialpages-group-highuse": "Deng bulung a magamitan",
+       "tags-source-header": "Pikwanan",
+       "tags-actions-header": "Deng aksyun",
+       "tags-source-none": "Ali ne gagamitan",
+       "tags-delete": "buran",
+       "tags-activate": "iyaktiba",
+       "tags-create-heading": "Maglalang ning bayung tag",
+       "tags-create-tag-name": "Tag lagyu",
+       "tags-create-reason": "Dayilan:",
+       "tags-create-submit": "Maglalang",
+       "tags-create-already-exists": "Ati yu ne ing tag \"$1\".",
+       "tags-delete-title": "Buran ya ing tag",
+       "tags-delete-reason": "Sangkan:",
+       "tags-activate-title": "Iyaktiba ing tag",
+       "tags-activate-reason": "Sangkan:",
+       "tags-activate-not-found": "Ala yu ing tag \"$1\"",
+       "tags-activate-submit": "Iyaktiba",
+       "tags-deactivate-reason": "Sangkan:",
        "revdelete-restricted": "ipairal la reng limitasiun kareng sysop",
        "revdelete-unrestricted": "ilako la reng makabawal kareng sysops",
        "rightsnone": "(ala)",
index afd652b..b2da7bd 100644 (file)
        "recentchangesdays-max": "(maksymalnie $1 {{PLURAL:$1|dzień|dni}})",
        "recentchangescount": "Domyślna liczba wyświetlanych edycji:",
        "prefs-help-recentchangescount": "Uwzględnia ostatnie zmiany, historię stron i rejestry.",
-       "prefs-help-watchlist-token2": "To jest tajny klucz umożliwiający dostęp do kanału internetowego zmian w obserwowanych przez ciebie stronach.\nKażdy, kto go zna, będzie mógł je zobaczyć, więc zachowaj go dla siebie.\n[[Special:ResetTokens|Kliknij tu, jeśli musisz go zresetować]].",
+       "prefs-help-watchlist-token2": "To jest tajny klucz umożliwiający dostęp do kanału internetowego zmian w obserwowanych przez Ciebie stronach.\nKażdy, kto go zna, będzie mógł je zobaczyć, więc zachowaj go dla siebie.\n[[Special:ResetTokens|Kliknij tu, jeśli musisz go zresetować]].",
        "savedprefs": "Twoje preferencje zostały zapisane.",
        "timezonelegend": "Strefa czasowa:",
        "localtime": "Czas lokalny:",
        "right-override-export-depth": "Eksport stron wraz z linkowanymi do głębokości 5 linków",
        "right-sendemail": "Wysyłanie e‐maili do innych użytkowników",
        "right-passwordreset": "Sprawdzanie treści e‐maila o resetowaniu hasła",
+       "right-managechangetags": "Tworzenie i usuwanie [[Special:Tags|znaczników]] z bazy danych",
        "newuserlogpage": "Nowi użytkownicy",
        "newuserlogpagetext": "To jest rejestr ostatnio utworzonych kont użytkowników",
        "rightslog": "Uprawnienia",
        "action-viewmywatchlist": "zobaczenia swojej listy obserwowanych stron",
        "action-viewmyprivateinfo": "zobaczenia swoich prywatnych danych",
        "action-editmyprivateinfo": "edycji swoich prywatnych danych",
+       "action-managechangetags": "utwórz lub usuń znaczniki z bazy danych",
        "nchanges": "$1 {{PLURAL:$1|zmiana|zmiany|zmian}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|od ostatniej wizyty}}",
        "enhancedrc-history": "historia",
        "tags-tag": "Nazwa znacznika",
        "tags-display-header": "Wystąpienia na listach zmian",
        "tags-description-header": "Pełny opis znaczenia",
+       "tags-source-header": "Źródło",
        "tags-active-header": "Aktywny?",
        "tags-hitcount-header": "Oznaczone zmiany",
+       "tags-actions-header": "Działania",
        "tags-active-yes": "Tak",
        "tags-active-no": "Nie",
        "tags-edit": "edytuj",
+       "tags-delete": "usuń",
+       "tags-activate": "aktywuj",
+       "tags-deactivate": "dezaktywuj",
        "tags-hitcount": "$1 {{PLURAL:$1|zmiana|zmiany|zmian}}",
+       "tags-manage-no-permission": "Nie masz uprawnień do zarządzaniem zmianami znaczników.",
+       "tags-create-heading": "Utwórz nowy znacznik",
+       "tags-create-tag-name": "Nazwa znacznika:",
+       "tags-create-reason": "Powód:",
+       "tags-create-submit": "Utwórz",
+       "tags-create-no-name": "Musisz podać nazwę znacznika.",
+       "tags-create-invalid-chars": "Nazwy znaczników nie mogą zawierać przecinków (<code>,</code>) ani ukośników (<code>/</code>).",
+       "tags-create-invalid-title-chars": "Nazwy znaczników nie mogą zawierać znaków, które nie mogą być używane w tytułach stron.",
+       "tags-create-already-exists": "Znacznik „$1” już istnieje.",
+       "tags-create-warnings-below": "Czy chcesz kontynuować tworzenie znacznika?",
+       "tags-delete-title": "Usuwanie znacznika",
+       "tags-delete-explanation-initial": "Zamierzasz usunąć znacznik „$1” z bazy danych.",
+       "tags-delete-reason": "Powód:",
+       "tags-delete-submit": "Nieodwracalnie usuń ten znacznik",
+       "tags-delete-not-found": "Znacznik „$1” nie istnieje.",
+       "tags-delete-too-many-uses": "Znacznik „$1” jest stosowany w więcej niż {{PLURAL:$2|jednej wersji|$2 wersjach}}, co oznacza, że nie może być usunięty.",
+       "tags-activate-title": "Aktywacja znacznika",
+       "tags-activate-question": "Zamierzasz aktywować znacznik „$1”.",
+       "tags-activate-reason": "Powód:",
+       "tags-activate-not-allowed": "Nie można aktywować znacznika „$1”.",
+       "tags-activate-not-found": "Znacznik „$1” nie istnieje.",
+       "tags-activate-submit": "Aktywuj",
+       "tags-deactivate-title": "Dezaktywacja znacznika",
+       "tags-deactivate-question": "Zamierzasz dezaktywować znacznik „$1”.",
+       "tags-deactivate-reason": "Powód:",
+       "tags-deactivate-not-allowed": "Nie można dezaktywować znacznika „$1”.",
+       "tags-deactivate-submit": "Dezaktywuj",
        "comparepages": "Porównanie stron",
        "compare-page1": "Strona 1",
        "compare-page2": "Strona 2",
        "logentry-upload-upload": "$1 {{GENDER:$2|przesłał|przesłała}} $3",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|przesłał|przesłała}} nową wersję $3",
        "logentry-upload-revert": "$1 {{GENDER:$2|przesłał|przesłała}} $3",
+       "log-name-managetags": "Rejestr zarządzania znacznikami",
+       "logentry-managetags-create": "$1 {{GENDER:$2|utworzył|utworzyła}} znacznik „$4”",
        "rightsnone": "brak",
        "revdelete-summary": "opis zmian",
        "feedback-bugornote": "Jeśli jesteś w stanie szczegółowo opisać problem techniczny, proszę [$1 zgłoś błąd].\nW przeciwnym wypadku można użyć prostego formularza poniżej. Komentarz zostanie dodany do strony \"[$3  $2]\", wraz z nazwą użytkownika.",
index e089ec9..93869c2 100644 (file)
        "prefs-personal": "Profil dl'utent",
        "prefs-rc": "Ùltime modìfiche",
        "prefs-watchlist": "Ròba che as ten sot euj",
+       "prefs-editwatchlist": "Modifiché la lista ëd lòn ch'as ten sot-euj",
+       "prefs-editwatchlist-label": "Modifiché dle vos ëd la lista ëd lòn ch'as ten sot-euj:",
+       "prefs-editwatchlist-edit": "Vëdde e gavé dle vos ëd la lista ëd lòn ch'as ten sot-euj",
+       "prefs-editwatchlist-raw": "Modìfica lesta ëd la lista ëd lòn ch'as ten sot-euj",
+       "prefs-editwatchlist-clear": "Dësvujdé la lista ëd lòn ch'as ten sot-euj",
        "prefs-watchlist-days": "Vàire dì che a veul ës-ciairé an soa lista ëd lòn che as ten sot euj:",
        "prefs-watchlist-days-max": "Al pì $1 {{PLURAL:$1|di|di}}",
        "prefs-watchlist-edits": "Vàire modìfiche che a veul ës-ciairé con le funsion avansà:",
        "right-override-export-depth": "Esporté le pàgine ancludend le pàgine colegà fin-a a na profondeur ëd 5",
        "right-sendemail": "Mandé un mëssagi an pòsta eletrònica a j'àutri utent",
        "right-passwordreset": "Vëdde ij mëssagi ëd pòsta eletrònica ëd riampostassion dle ciav",
+       "right-managechangetags": "Creé e dëscancelé dle [[Special:Tags|tichëtte]] da la base ëd dàit",
        "newuserlogpage": "Registr dla creassion dj'utent",
        "newuserlogpagetext": "Sossì a l'é un registr andova ch'as marco le creassion dj'utent.",
        "rightslog": "Argistr dij drit ëd j'utent",
        "action-viewmyprivateinfo": "vëdde soe anformassion përsonaj",
        "action-editmyprivateinfo": "modifiché soe anformassion përsonaj",
        "action-editcontentmodel": "modifiché ël model ëd contnù ëd na pàgina",
+       "action-managechangetags": "creé e dëscancelé dle tichëtte da la base ëd dàit",
        "nchanges": "$1 {{PLURAL:$1|modìfica|modìfiche}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|da l'ùltima visita}}",
        "enhancedrc-history": "stòria",
        "uploaderror": "Eror dëmentré che as cariava",
        "upload-recreate-warning": "'''Atension: n'archivi con col nòm a l'é già stàit ëscancelà o tramudà.'''\n\nËl registr dle scancelassion e dij tramud për sta pàgina a l'é butà ambelessì për comodità:",
        "uploadtext": "Dovra ël formolari sì-sota për carié dj'archivi.\nPër vardé ò sërché dle figure già carià, ch'a vada an sla [[Special:FileList|lista dle figure]], ij (ri)càrich a son ëdcò registrà ant ël [[Special:Log/upload|registr dij càrich]], jë scancelament ant ël [[Special:Log/delete|registr djë scancelament]].\n\nPër buté na figura ant n'artìcol, dovré n'anliura ant un-a dle forme sì sota:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' për dovré la version pien-a dla figura\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code>''' për dovré na dimension ëd 200 pontin ant un quàder a la bordura snistra con 'alt text' com descrission\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' për coleghé diretament la figura sensa fé vëdde l'archivi",
-       "upload-permitted": "Sòrt d'archivi consentìe: $1.",
-       "upload-preferred": "Sòrt d'archivi preferìe: $1.",
-       "upload-prohibited": "Sòrt d'archivi proibìe: $1.",
+       "upload-permitted": "Sòrt d'archivi {{PLURAL:$2|consentìa|consentìe}}: $1.",
+       "upload-preferred": "Sòrt d'archivi {{PLURAL:$2|preferì|preferìe}}: $1.",
+       "upload-prohibited": "Sòrt d'archivi {{PLURAL:$2:proibì|proibìe}}: $1.",
        "uploadlogpage": "Registr dij càrich",
        "uploadlogpagetext": "Ambelessì-sota a-i é na lista dj'ùltim archivi carià.\nBeiché la [[Special:NewFiles|galarìa dj'archivi neuv]] për na presentassion pì visual.",
        "filename": "Nòm dl'archivi",
        "namespace": "Spassi nominal:",
        "invert": "Anvertì la selession",
        "tooltip-invert": "Ch'a selession-a sta casela për stërmé le modìfiche a le pàgine ant lë spassi nominal selessionà (e ant lë spassi nominal associà se selessionà)",
+       "tooltip-whatlinkshere-invert": "Ch'a selession-a sa casela për ëstërmé le liure dle pàgine ant lë spassi nominal selessionà.",
        "namespace_association": "Spassi nominal associà",
        "tooltip-namespace_association": "Ch'a selession-a sta casela për anserì ëdcò la discussion o lë spassi nominal dël soget associà a lë spassi nomina selessionà",
        "blanknamespace": "(Prinsipal)",
        "tags-tag": "Nòm ëd la tichëtta",
        "tags-display-header": "Aparensa ant la lista dle modìfiche",
        "tags-description-header": "Descrission completa dël significà",
+       "tags-source-header": "Sorgiss",
        "tags-active-header": "Ativ?",
        "tags-hitcount-header": "Modìfiche con tichëtta",
+       "tags-actions-header": "Assion",
        "tags-active-yes": "Bò",
        "tags-active-no": "Nò",
+       "tags-source-extension": "Definì da n'estension",
+       "tags-source-manual": "Aplicà a man da utent e trigomiro",
+       "tags-source-none": "Pi nen dovrà",
        "tags-edit": "modifiché",
+       "tags-delete": "dëscancelé",
+       "tags-activate": "ativé",
+       "tags-deactivate": "disativé",
        "tags-hitcount": "$1 {{PLURAL:$1|cambiament|cambiament}}",
+       "tags-manage-no-permission": "A l'ha nen ël përmess ëd gestì le modìfiche dle tichëtte.",
+       "tags-create-heading": "Creé na neuva tichëtta",
+       "tags-create-explanation": "Për sòlit, le neuve tichëtte creà a saran disponìbij për esse dovrà da j'utent e dai trigomiro.",
+       "tags-create-tag-name": "Nòm ëd la tichëtta",
+       "tags-create-reason": "Rason:",
+       "tags-create-submit": "Creé",
+       "tags-create-no-name": "A dev spessifiché un nòm ëd tichëtta.",
+       "tags-create-invalid-chars": "Ij nòm ëd tichëtta a devo nen conten-e ëd còme (<code>,</code>) nì ëd bare anans (<code>/</code>).",
+       "tags-create-invalid-title-chars": "Ij nòm ëd tichëtta a devo nen conten-e dij caràter ch'a peulo nen esse dovrà ant ij tìtok dle pàgine.",
+       "tags-create-already-exists": "La tichëtta «$1» a esist già.",
+       "tags-create-warnings-above": "{{PLURAL:$2|L'avertensa|J'avertense}} sì-dapress a son ëstàite rancontrà durant ël tentativ ëd creassion ëd la tichëtta «$1»:",
+       "tags-create-warnings-below": "Veul-lo andé anans ant la creassion dla tichëtta?",
+       "tags-delete-title": "Dëscancelé la tichëtta",
+       "tags-delete-explanation-initial": "A l'é a brus ëd dëscancelé la tichëtta «$1» da la base ëd dàit.",
+       "tags-delete-explanation-in-use": "A sarà gavà da {{PLURAL:$2|$2 revision|tute le $2 revisions}} o vos d'argistr a la quaj a l'é atualman aplicà.",
+       "tags-delete-explanation-warning": "Costa assion a l'é <strong>ireversìbij</strong> e <strong>a peul nen esse anulà</strong>, gnanca da l'aministrator ëd base ëd dàit. Ch'a sia sigur che costa a l'é la tichëtta ch'a veul eliminé.",
+       "tags-delete-explanation-active": "<strong>La tichëtta «$1» a l'é ancor ativa, e a seghitrà a esse aplicà ant l'avnì.</strong> Për fé chité sòn, ch'a vada ant ij pòst andoa la tichëtta a l'é aplicà, e ch'a la disativa ambelelà.",
+       "tags-delete-reason": "Rason:",
+       "tags-delete-submit": "Eliminé costa tichëtta ëd fasson ireversìbil",
        "comparepages": "Confronté dle pàgine",
        "compare-page1": "Pàgina 1",
        "compare-page2": "Pàgina 2",
index ce7e617..c01ddf5 100644 (file)
@@ -4,7 +4,8 @@
                        "Ahmed-Najib-Biabani-Ibrahimkhel",
                        "Kaganer",
                        "Umherirrender",
-                       "아라"
+                       "아라",
+                       "عثمان خان شاہ"
                ]
        },
        "tog-underline": "کرښنې تړنې:",
@@ -31,7 +32,7 @@
        "tog-shownumberswatching": "د کتونکو کارنانو شمېر ښکاره کول",
        "tog-oldsig": "اوسنی لاسليک:",
        "tog-fancysig": "لاسليک د ويکي متن په توگه په پام کې نيول (د خپلکاره تړن د تړلو پرته)",
-       "tog-uselivepreview": "ژوندۍ مخليدنه کارول (آزمېښتي)",
+       "tog-uselivepreview": "ژوندۍ مخليدنه کارول",
        "tog-forceeditsummary": "د يوه تش سمون لنډيز په ورکولو سره دې خبر راکړل شي",
        "tog-watchlisthideown": "په کتنلړ کې زما سمونې پټول",
        "tog-watchlisthidebots": "په کتنلړ کې د روباټ سمونې پټول",
        "otherlanguages": "په نورو ژبو کې",
        "redirectedfrom": "(له $1 نه مخ گرځېدلی)",
        "redirectpagesub": "د مخ گرځونې مخ",
+       "redirectto": "دې ته اړولې :",
        "lastmodifiedat": "دا مخ وروستی ځل په $2، $1 بدلون موندلی.",
        "viewcount": "همدا مخ {{PLURAL:$1|يو وار|$1 واره}} کتل شوی.",
        "protectedpage": "ژغورلی مخ",
        "view-pool-error": "اوبخښۍ، دم گړۍ پالنگران د ډېر بارېدو ستونزې سره مخامخ شوي.\nډېر زيات کارنان د همدې مخ د کتلو په هڅه کې دي.\nلطفاً د دې مخ د کتلو د بيا هڅې نه دمخه يو څو شېبې صبر وکړۍ.\n\n$1",
        "pool-queuefull": "د بهير صف ډک دی",
        "pool-errorunknown": "ناجوته ستونزه",
+       "poolcounter-usage-error": "استعمال کې خطا:",
        "aboutsite": "د {{SITENAME}} په اړه",
        "aboutpage": "Project:په اړه",
        "copyright": "دا مېنځپانگه د $1 له مخې ستاسې لاسرسي ته پرته ده، خو هغه څه چې په خلاف يې وييل شوي.",
        "viewsourcetext": "تاسې د دې مخ سرچينه کتلی او لمېسلی شی:",
        "viewyourtext": "تاسې په دې مخ کې د '''خپلو سمونونو''' سرچينه کتلی او لمېسلی شی:",
        "protectedinterface": "دا مخ د دې ويکي د ساوترې د ليدنمخ متن لري، او د ورانکارۍ په خاطر ژغورل شوی.\nپه ټولو ويکي گانو کې د ژباړې د ورگډولو او يا هم د ژباړې د سمون او بدلون لپاره د مېډياويکي د ځايتابه پروژه [//translatewiki.net/ translatewiki.net] وکاروۍ.",
-       "editinginterface": "'''گواښنه:''' تاسو په يوه داسې مخ کې بدلون راولی کوم چې د يوې پوستکالی د ليدنمخ متن په توگه کارېږي.\nپه همدې مخ کې بدلون راوستل به د نورو کارنانو د ليدنمخ بڼه اغېزمنه کړي.\nد ژباړې د ورگډولو او بدلون لپاره، مهرباني وکړی د [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net]، وېبځي ته ولاړ شی. دا وېبځی د ميډياويکي د ځايتابه پروژه ده.",
+       "editinginterface": "<strong>گواښنه:</strong> تاسې چې په دې مخ کې بدلون راولۍ همدا مخ د يوې ساوترې د ليدنمخ متن په توگه کارېږي.\nد دې مخ بدلون به د ټولو کارنانو لپاره د ليدنمخ بڼه اغېزمنه کړي.",
        "namespaceprotected": "تاسې د '''$1''' په نوم-تشيال کې د مخونو د سمولو اجازه نه لرۍ.",
        "customcssprotected": "تاسې د دې CSS مخ د سمولو اجازه نه لرۍ، دا ځکه چې دا مخ د بل کارن شخصي امستنې لري.",
        "customjsprotected": "تاسې د دې جاواسکرېپټ مخ د سمولو اجازه نه لرۍ، دا ځکه چې دا مخ د بل کارن شخصي امستنې لري.",
        "preview": "مخليدنه",
        "showpreview": "مخليدنه",
        "showdiff": "بدلونونه ښکاره کول",
-       "anoneditwarning": "'''يادونه:''' تاسې غونډال ته نه ياست ننوتي. ستاسې IP پته به د دې مخ د سمونونو په پېښليک کې ثبت شي.",
+       "anoneditwarning": "<strong>گواښنه:</strong>  تاسې غونډال کې نه ياست ننوتي. که تاسې کوم سمونونه ترسره کوۍ نو ستاسې IP پته به ټولو ته د دې مخ د سمونونو په پېښليک کې ښکاري. که تاسې په خپل نوم <strong>[$1 کې ننوځئ]</strong> يا <strong>[$2 يو گڼون جوړ کړئ]</strong>، نو ستاسې سمونونه به ستاسې کارن-نوم اړونده ثبت شي چې ډېرې نورې گټې هم لري.",
        "anonpreviewwarning": "''تاسې غونډال ته نه ياست ننوتي. خوندي کولو سره به ستاسې IP پته به د دې مخ د سمونونو په پېښليک کې ثبت شي.''",
        "missingcommenttext": "لطفاً تبصره لاندې وليکۍ.",
        "summary-preview": "د لنډيز مخليدنه:",
        "currentrev": "اوسنۍ بڼه",
        "currentrev-asof": "د $1 پورې تازه بڼه",
        "revisionasof": "د $1 بڼه",
-       "revision-info": "د $1 Ù¾Ù\88رÛ\90 Ø´ØªÙ\87 Ù\85Ø®Ù\84Ù\8aدÙ\86Ù\87Ø\8c Ø¯ $2 لخوا ترسره شوې",
+       "revision-info": "تر $1 Ù¾Ù\88رÛ\90 Ø´ØªÙ\87 Ù\85Ø®Ù\84Ù\8aدÙ\86Ù\87Ø\8c Ø¯ {{GENDER:$6|$2}}$7 لخوا ترسره شوې",
        "previousrevision": "← زړه بڼه",
        "nextrevision": "← نوې بڼه",
        "currentrevisionlink": "اوسنۍ بڼه",
        "history-feed-empty": "ستاسې غوښتلی مخ نه شته.\nکېدای شي چې دا له ويکي نه ړنگ شوی وي، او يا هم په بل نوم بدل شوی وي.\nتاسې په دې ويکي د اړوندو نوؤ مخونو لپاره [[Special:Search|د پلټنې هڅه وکړۍ]].",
        "rev-deleted-comment": "(د سمون لنډيز لرې شو)",
        "rev-deleted-user": "(کارن-نوم ليري شوی)",
-       "rev-delundel": "ښکاره کول/ پټول",
+       "rev-delundel": "ښکارېدنه بدلول",
        "rev-showdeleted": "ښکاره کول",
        "revisiondelete": "د ړنگولو/ناړنگولو مخکتنې",
        "revdelete-no-file": "ځانگړې شوې دوتنه نشته.",
        "revdelete-legend": "د ښکارېدنې محدوديتونه ټاکل",
        "revdelete-hide-text": "د مخکتنې متن",
        "revdelete-hide-image": "د دوتنې مېنځپانگه پټول",
-       "revdelete-hide-name": "کړنه او موخه پټول",
+       "revdelete-hide-name": "کړنې او موخې پټول",
        "revdelete-hide-comment": "د سمون لنډيز",
        "revdelete-hide-user": "د سمونگر کارن-نوم/آی پي پته",
        "revdelete-radio-same": "(مه بدلوه)",
        "revdelete-log": "سبب:",
        "revdel-restore": "ښکارېدنه بدلول",
        "pagehist": "د مخ پېښليک",
-       "deletedhist": "د ړنگولو پېښليک",
+       "deletedhist": "ړنگېدلی پېښليک",
        "revdelete-reason-dropdown": "*د ړنگولو ټولگړي سببونه\n** د خپرېدو د رښتو سرغړونه\n** ناسم شخصي مالومات\n** پارونکي او بلواگر مالومات",
        "revdelete-otherreason": "بل/اضافي سبب:",
        "revdelete-reasonotherlist": "بل سبب",
        "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 څخه:",
        "preferences": "غوره توبونه",
        "mypreferences": "غوره توبونه",
        "prefs-edits": "د سمونو شمېر:",
-       "prefsnologintext2": "د ØºÙ\88رÙ\87 ØªÙ\88بÙ\88Ù\86Ù\88 Ø¨Ø¯Ù\84Ù\88Ù\86 Ù\84پارÙ\87 Ù\85Ù\88 $1 ØªØ±Ø³Ø±Ù\87 Ú©Ú\93ئ.",
+       "prefsnologintext2": "د ØºÙ\88رÙ\87 ØªÙ\88بÙ\88Ù\86Ù\88 Ø¨Ø¯Ù\84Ù\88Ù\84Ù\88 Ù\84پارÙ\87 Ù\85Ù\88 ØºÙ\88Ù\86Ú\89اÙ\84 ØªÙ\87 Ù\86Ù\86Ù\88Ú\81ئ.",
        "prefs-skin": "پوښۍ",
        "skin-preview": "مخکتنه",
        "datedefault": "هېڅ نه ټاکل",
        "prefs-personal": "د کارن پېژنليک",
        "prefs-rc": "وروستي بدلونونه",
        "prefs-watchlist": "کتنلړ",
+       "prefs-editwatchlist": "کتنلړ سمول",
        "prefs-watchlist-days": "د ورځو شمېر چې په کتنلړ کې به ښکاري:",
        "prefs-watchlist-days-max": "حد اکثر $1 {{PLURAL:$1|ورځ|ورځې}}",
        "prefs-watchlist-edits-max": "د شمېر اکثر بريد: 1000",
        "gender-male": "نارينه",
        "gender-female": "ښځينه",
        "email": "برېښليک",
-       "prefs-help-realname": "د Ø¢Ø± Ù\86Ù\88Ù\85 Ù\84Ù\8aÚ©Ù\84 Ø³ØªØ§Ø³Û\90 Ù¾Ù\87 Ø®Ù\88Ú\9aÙ\87 Ø¯Û\8c Ø®Ù\88 Ú©Ù\87 ØªØ§Ø³Û\90 Ø®Ù¾Ù\84 Ø¢Ø± Ù\86Ù\88Ù\85 Ù\88ټاکÛ\8d Ù¾Ø¯Û\90 Ø³Ø±Ù\87 Ø¨Ù\87 Ø³ØªØ§Ø³Û\90 Ù¼Ù\88Ù\84 Ú©Ø§Ø±Ù\88Ù\86Ù\87 Ø§Ù\88 Ù\88Ù\86Ú\89Û\90 Ø³ØªØ§Ø³Û\90 Ø¯ Ù\86Ù\88Ù\85 Ù¾Ù\87 Ø§Ú\93Ù\88Ù\86دÙ\88Ù\84Ù\88 Ú©Û\90 Ù\88کارÛ\90Ú\96ي.",
+       "prefs-help-realname": "آر Ù\86Ù\88Ù\85 Ù\88رکÙ\88Ù\84 Ø³ØªØ§Ø³Û\90 Ø¯ Ø®Ù\88Ú\9aÛ\90 Ú©Ø§Ø± Ø¯Û\8c.\nÚ©Ù\87 ØªØ§Ø³Û\90 Ø®Ù¾Ù\84 Ø¢Ø± Ù\86Ù\88Ù\85 Ù\88رکÚ\93Û\8dØ\8c Ù\86Ù\88 Ø³ØªØ§Ø³Û\90 Ù¼Ù\88Ù\84Û\90 Ú©Ú\93Ù\86Û\90 Ø¨Ù\87 Ø³ØªØ§Ø³Û\90 Ù¾Ù\87 Ù\86Ù\88Ù\85 Ø§Ú\93Ù\88Ù\86دÛ\90 Ø´ي.",
        "prefs-help-email": "د برېښليک ورکړه ستاسې په خوښه ده، خو په ورکړې سره به يې د يوه نوي پټنوم د لېږلو چار آسانه کړي هغه هم کله چې تاسې نه خپل پټنوم هېر شوی وي.",
        "prefs-help-email-others": "تاسې دا هم ټاکلی شی چې نور کارنان ستاسې د خبرو اترو او يا د کارن مخ يوې تړنې له لارې له تاسې سره برېښليکي اړيکه ونيسي.\nد اړيکو ټينگولو په وخت کې به ستاسې برېښليک پته نورو کارنانو ته نه ښکاري.",
        "prefs-help-email-required": "ستاسو د برېښليک پته پکار ده.",
        "minoreditletter": "و",
        "newpageletter": "ن",
        "boteditletter": "ر",
-       "number_of_watching_users_pageview": "[$1  {{PLURAL:$1|کارن|کارنان}} يې ګوري]",
+       "number_of_watching_users_pageview": "[$1  {{PLURAL:$1|کتونکی کارن|کتونکي کارنان}}]",
+       "rc_categories": "د وېشنيزو بريدونه (په \"|\" بېلول)",
        "rc_categories_any": "هر يو",
        "rc-change-size-new": "$1 {{PLURAL:$1|بايټ|بايټونه}} د بدلون وروسته",
        "newsectionsummary": "/* $1 */ نوې برخه",
        "uploaderror": "د پورته کولو ستونزه",
        "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|بټنوک|کيڼ|د انځور څرگندونې]]</nowiki></code>''' کوډ وکاروۍ.\n* د انځور د ښودلو نه پرته، د دوتنې سره د سيخې تړنې لپاره د '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' کوډ وکاروۍ.",
        "upload-permitted": "د پرېښودلو دوتنو ډولونه: $1.",
-       "upload-preferred": "د غوره دوتنو ډولونه: $1.",
+       "upload-preferred": "د غوره {{PLURAL:$2|دوتنې ډول|دوتنو ډول}}: $1.",
        "upload-prohibited": "د منع شويو دوتنو ډولونه: $1.",
        "uploadlogpage": "د پورته شويو دوتنو يادښت",
        "uploadlogpagetext": "دا لاندې د نوو پورته شوو دوتنو لړليک دی.",
        "upload-warning-subj": "د پورته کولو گواښ",
        "upload-proto-error": "ناسم پروتوکول",
        "upload-file-error": "کورنۍ ستونزه",
+       "upload-misc-error": "نامالومه اپلوډ خطا",
        "upload-http-error": "د HTTP يوه ستونزه رامېنځ ته شوې: $1",
        "backend-fail-notexists": "د $1 په نوم دوتنه نشته.",
        "backend-fail-delete": "د \"$1\" دوتنه ړنګه نه شوه.",
        "backend-fail-alreadyexists": "د $1 دوتنه له پخوا نه شته.",
+       "backend-fail-move": "\"$1\" دوتنه \"$2\" ته نشو ليږدولې",
+       "backend-fail-opentemp": "لنډمهاله دوتنه جوړېدای نه شي",
        "backend-fail-read": "د \"$1\" دوتنه نه شي لوستل کېدای.",
        "backend-fail-create": "د \"$1\" په دوتنه کې نور څه و نه ليکل شول.",
        "zip-wrong-format": "ځانگړې شوې دوتنه يوه ZIP دوتنه نه وه.",
+       "uploadstash-refresh": "د دوتنو لړليک راتازه کړۍ",
        "img-auth-accessdenied": "لاسرسی رد شو",
        "img-auth-nofile": "د $1 په نوم کومه دوتنه نشته.",
        "http-invalid-url": "ناسم URL: $1",
        "nolicense": "هېڅ نه دي ټاکل شوي",
        "license-nopreview": "(مخليدنه نشته)",
        "upload_source_file": "(ستاسو په کمپيوټر کې يوه دوتنه)",
+       "listfiles-delete": "ړنگول",
        "listfiles-summary": "همدا ځانگړی مخ ټولې پورته شوې دوتنې ښکاره کوي.",
        "listfiles_search_for": "د رسنۍ نوم پلټنه:",
        "imgfile": "دوتنه",
        "listfiles_size": "کچه (بايټونه)",
        "listfiles_description": "څرگندونه",
        "listfiles_count": "بڼې",
+       "listfiles-show-all": "د دوټنو پخوانې ورژن پکې شامل کړۍ",
        "listfiles-latestversion": "اوسنۍ بڼه",
        "listfiles-latestversion-yes": "هو",
        "listfiles-latestversion-no": "نه",
        "uploadnewversion-linktext": "د همدغې دوتنې نوې بڼه پورته کول",
        "shared-repo-from": "د $1 لخوا",
        "upload-disallowed-here": "تاسې د دې دوتنې دپاسه نشی ليکلی.",
+       "filerevert": "$1 بيرته اړول",
+       "filerevert-legend": "دوتنه بيرته اړول",
        "filerevert-comment": "سبب:",
        "filerevert-submit": "په څټ گرځول",
        "filedelete": "$1 ړنگول",
        "randompage": "ناټاکلی مخ",
        "randompage-nopages": "په لانديني {{PLURAL:$2|نوم-تشيال|نوم-تشيالونو}} کې هېڅ کوم مخ نشته: $1.",
        "randomincategory": "په وېشنيزه کې ناټاکلی مخ",
+       "randomincategory-category": "وېشنيزه:",
+       "randomincategory-legend": "په وېشنيزه کې ناټاکلی مخ",
        "randomredirect": "ناټاکلی ورگرځېدنه",
        "statistics": "شمار",
        "statistics-header-pages": "د مخونو شمار",
        "protectedpages-expiry": "پای نېټه",
        "protectedpages-reason": "سبب",
        "protectedpages-unknown-timestamp": "ناجوت",
+       "protectedpages-unknown-performer": "ناڅرگنده کارن",
        "protectedtitles": "ژغورلي سرليکونه",
        "listusers": "کارن لړليک",
        "listusers-editsonly": "يوازې هغه کارنان چې سمونونه يې کړي ښکاره کول",
        "suppress": "څارن",
        "booksources": "د کتاب سرچينې",
        "booksources-search-legend": "د کتابي سرچينو پلټنه",
+       "booksources-search": "پلټل",
        "booksources-text": "دا لاندې د هغه وېبځايونو د تړنو لړليک دی چېرته چې نوي او زاړه کتابونه پلورل کېږي، او يا هم کېدای شي چې د هغه کتاب په هکله مالومات ولري کوم چې تاسو ورپسې لټېږۍ:",
        "specialloguserlabel": "ترسره کوونکی:",
        "speciallogtitlelabel": "موخه (سرليک يا کارن):",
        "wlheader-enotif": "برېښليک خبرونه چارنه شوې.",
        "wlheader-showupdated": "هغه مخونه چې ستاسې د کتلو نه وروسته بدلون موندلی په '''روڼ''' ليک په نښه شوي.",
        "wlnote": "دلته لاندې {{PLURAL:$1|وروستی بدلون دی|وروستي '''$1''' بدلونونه دي}} چې په {{PLURAL:$2|تېر ساعت|تېرو '''$2''' ساعتونو}} کې تر $3 نېټې او $4 بجو پېښ شوي.",
-       "wlshowlast": "وروستي $1 ساعتونه $2 ورځې  ښکاره کړه",
+       "wlshowlast": "وروستي $1 ساعتونه $2 ورځې ښکاره کول",
        "watchlist-options": "د کتنلړ خوښنې",
        "watching": "د کتلو په حال کې...",
        "unwatching": "د نه کتلو په حال کې...",
        "deletereasonotherlist": "بل سبب",
        "deletereason-dropdown": "*د ړنگولو ټولگړی سبب\n** چټيات\n** د پوهې سره دښمني\n** د رښتو تېری\n** د ليکوال غوښتنه\n** ناسمه مخ گرځېدنه",
        "delete-edit-reasonlist": "د ړنگولو سببونه سمول",
-       "rollback_short": "په شابېول",
        "rollbacklink": "په شابېول",
        "rollbacklinkcount": "$1 {{PLURAL:$1|سمون|سمونونه}} پرشابېول",
        "protectlogpage": "د ژغورنې يادښت",
        "whatlinkshere-filters": "چاڼگرونه",
        "block": "په کارن بنديز لگول",
        "unblock": "کارن له بنديزه وېستل",
-       "blockip": "په کارن بنديز لگول",
+       "blockip": "په {{GENDER:$1|کارن}} بنديز لگول",
        "blockip-legend": "په کارن بنديز لگول",
        "ipaddressorusername": "IP پته يا کارن نوم",
        "ipbexpiry": "د پای نېټه:",
        "ipb-unblock-addr": "له $1 بنديز ليرې کول",
        "ipb-unblock": "له يوه کارن-نوم يا IP پتې بنديز ليري کول",
        "ipb-blocklist": "شته بنديزونه کتل",
-       "ipb-blocklist-contribs": "د $1 ونډې",
+       "ipb-blocklist-contribs": "د {{GENDER:$1|$1}} ونډې",
        "unblockip": "کارن له بنديزه وېستل",
        "unblockiptext": "د لاندې فورمې په کارولو سره يو بنديز شوي کارن يا آی پي پتې ته د ليکلو لاسرسی ورکولی شی.",
        "ipusubmit": "دا بنديز ليرې کول",
        "movereason": "سبب:",
        "revertmove": "په څټ گرځول",
        "delete_and_move": "ړنگول او لېږدول",
+       "delete_and_move_text": "== د ړنگولو اړتيا ==\nد \"[[:$1]]\" په نوم مخ له پخوا څخه شته.\nآيا د دې په ړنگولو سره لېږدولو ته لاره هوارول غواړۍ؟",
        "delete_and_move_confirm": "هو, دا مخ ړنگ کړه",
        "immobile-source-page": "دا مخ نه لېږدېدنونکی دی",
        "imageinvalidfilename": "د موخنې دوتنې نوم سم نه دی",
        "thumbnail_error": "د  بټنوک د جوړېدنې ستونزه: $1",
        "import-interwiki-history": "د دې مخ د پېښليک ټولې بڼې لمېسل",
        "import-interwiki-templates": "ټولې کينډۍ نغاړل",
+       "import-interwiki-submit": "رالېږدول",
        "import-interwiki-namespace": "د موخې نوم-تشيال:",
        "import-upload-filename": "د دوتنې نوم:",
        "import-comment": "تبصره:",
        "import-revision-count": "$1 {{PLURAL:$1|بڼه|بڼې}}",
+       "importnopages": "د رالېږدولو لپاره مخونه نشته.",
        "importlogpage": "د واردولو يادښت",
-       "import-logentry-upload-detail": "$1 {{PLURAL:$1|بڼه|بڼې}}",
+       "import-logentry-upload-detail": "$1 {{PLURAL:$1|بڼه|بڼې}} راولېږدېدې",
        "javascripttest": "د جاوا سکرېپټ آزمېښت",
        "tooltip-pt-userpage": "ستاسې کارن مخ",
        "tooltip-pt-mytalk": "ستاسې د خبرواترو مخ",
        "ilsubmit": "پلټل",
        "bydate": "د نېټې له مخې",
        "sp-newimages-showfrom": "هغه نوې دوتنې چې په $1 په $2 بجو پيلېږي ښکاره کول",
-       "hours-abbrev": "$1ګ",
+       "hours-abbrev": "$1 گ",
        "seconds": "{{PLURAL:$1|$1 ثانيه|$1 ثانيې}}",
        "minutes": "{{PLURAL:$1|$1 دقيقه|$1 دقيقې}}",
        "hours": "{{PLURAL:$1|$1 ساعت|$1 ساعتونه}}",
        "duplicate-defaultsort": "'''گواښنه:'''د \"$2\" تلواليزه اوډون تڼۍ تر دې پخوا ټاکلې تلواليزه اوډون تڼۍ \"$1\" پر ځای چارنه کېږي.",
        "version": "بڼه",
        "version-extensions": "لگېدلي شاتاړي",
-       "version-skins": "پوښۍ",
+       "version-skins": "Ù\86صب Ø´Ù\88Û\90 Ù¾Ù\88Ú\9aÛ\8d",
        "version-specialpages": "ځانگړي مخونه",
        "version-other": "بل",
        "version-hooks": "کونډۍ",
        "version-version": "(بڼه $1)",
        "version-license": "مېډياويکي منښتليک",
        "version-ext-license": "منښتليک",
+       "version-skin-colheader-name": "پوښۍ",
+       "version-ext-colheader-version": "بڼه",
        "version-ext-colheader-license": "منښتليک",
        "version-ext-colheader-description": "څرگندونه",
        "version-ext-colheader-credits": "ليکوالان",
        "version-software-product": "اېبره",
        "version-software-version": "بڼه",
        "version-entrypoints-header-url": "يو آر اېل",
+       "version-libraries-library": "کتابتون",
+       "version-libraries-version": "بڼه",
+       "redirect": "د دوتنې، کارن، مخ يا بڼې پېژند له مخې ورگرځېدنې",
        "redirect-submit": "ورځه",
        "redirect-value": "ارزښت:",
        "redirect-user": "کارن پېژند",
        "tag-filter-submit": "چاڼگر",
        "tags-display-header": "د بدلون په لړليکونو کې ښکارېدنه",
        "tags-description-header": "د مانا بشپړه څرگندونه",
+       "tags-source-header": "سرچينه",
        "tags-active-header": "فعال؟",
+       "tags-actions-header": "کړنې",
        "tags-active-yes": "هو",
        "tags-active-no": "نه",
        "tags-edit": "سمول",
+       "tags-delete": "ړنگول",
+       "tags-activate": "فعالول",
+       "tags-deactivate": "نافعالول",
        "tags-hitcount": "$1 {{PLURAL:$1|بدلون|بدلونونه}}",
+       "tags-create-reason": "سبب:",
+       "tags-create-submit": "جوړول",
+       "tags-delete-reason": "سبب:",
+       "tags-activate-reason": "سبب:",
+       "tags-activate-submit": "فعالول",
+       "tags-deactivate-reason": "سبب:",
+       "tags-deactivate-submit": "نافعالول",
        "comparepages": "مخونه پرتلل",
        "compare-page1": "۱ مخ",
        "compare-page2": "۲ مخ",
        "htmlform-selectorother-other": "بل",
        "htmlform-no": "نه",
        "htmlform-yes": "هو",
+       "htmlform-cloner-create": "نور ورگډول",
+       "htmlform-cloner-delete": "غورځول",
        "logentry-delete-delete": "$1 د $3 مخ {{GENDER:$2|ړنگ کړ}}",
        "revdelete-content-hid": "مېنځپانگه پټېدلې",
        "revdelete-uname-hid": "کارن نوم پټ شوی",
        "limitreport-walltime": "اصلي وخت کارېدنه",
        "limitreport-walltime-value": "$1 {{PLURAL:$1|ثانيه|ثانيې}}",
        "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|بايټ|بايټونه}}",
+       "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|بايټ|بايټونه}}",
        "expandtemplates": "کينډۍ غځول",
        "expand_templates_input": "ځايونکی متن:",
        "expand_templates_output": "پايله",
        "expand_templates_ok": "ښه",
+       "expand_templates_remove_comments": "تبصرې غورځول",
        "expand_templates_remove_nowiki": "په پايلو کې د <nowiki> نښلنونه ځپل",
        "expand_templates_generate_rawhtml": "خام HTML ښکاره کول",
        "expand_templates_preview": "مخکتنه",
+       "pagelanguage": "د مخ ژبټاکونکی",
+       "pagelang-name": "مخ",
+       "pagelang-language": "ژبه",
+       "pagelang-use-default": "تلواليزه ژبه کارول",
+       "pagelang-select-lang": "ژبه ټاکل",
+       "right-pagelang": "د مخ ژبه بدلول",
+       "action-pagelang": "د مخ ژبه بدلول",
+       "log-name-pagelang": "ژبيادښت بدلول",
+       "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (چارن)",
+       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''ناچارن''')",
        "mediastatistics": "د رسنيو شمار",
+       "mediastatistics-nbytes": "{{PLURAL:$1|$1 بايټ|$1 بايټونه}} ($2; $3%)",
+       "mediastatistics-table-mimetype": "MIME بڼه",
        "mediastatistics-table-count": "د دوتنو شمېر",
-       "mediastatistics-header-audio": "غږ"
+       "mediastatistics-header-unknown": "ناجوت",
+       "mediastatistics-header-bitmap": "بېټ مپ انځورونه",
+       "mediastatistics-header-drawing": "رسمونه (وېکټور انځورونه)",
+       "mediastatistics-header-audio": "غږ",
+       "mediastatistics-header-video": "ويډيوگانې",
+       "mediastatistics-header-multimedia": "بډايه رسنۍ",
+       "mediastatistics-header-office": "دفتر",
+       "mediastatistics-header-text": "متني"
 }
index 8b615dd..a909721 100644 (file)
@@ -75,7 +75,9 @@
                        "Jefersonmoraes",
                        "Marcos dias de oliveira",
                        "He7d3r",
-                       "PauloEduardo"
+                       "PauloEduardo",
+                       "Webysther",
+                       "Fasouzafreitas"
                ]
        },
        "tog-underline": "Sublinhar links:",
        "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.",
        "prefs-personal": "Dados do usuário",
        "prefs-rc": "Mudanças recentes",
        "prefs-watchlist": "Lista de páginas vigiadas",
+       "prefs-editwatchlist": "Editar lista de páginas vigiadas",
+       "prefs-editwatchlist-label": "Editar entradas na sua lista de páginas vigiadas:",
+       "prefs-editwatchlist-edit": "Visualizar e remover títulos da sua lista de páginas vigiadas",
+       "prefs-editwatchlist-raw": "Edição crua da lista de páginas vigiadas",
+       "prefs-editwatchlist-clear": "Limpar sua lista de páginas vigiadas",
        "prefs-watchlist-days": "Dias a mostrar na lista de páginas vigiadas:",
        "prefs-watchlist-days-max": "Máximo $1 {{PLURAL:$1|dia|dias}}",
        "prefs-watchlist-edits": "Número de edições mostradas na lista de páginas vigiadas expandida:",
        "right-override-export-depth": "Exportar páginas incluindo páginas ligadas até uma profundidade de 5",
        "right-sendemail": "Enviar email a outros usuários",
        "right-passwordreset": "Ver todos os e-mails de reposição de senhas",
+       "right-managechangetags": "Criar e apagar [[Special:Tags|tags]] na base de dados",
        "newuserlogpage": "Registro de criação de usuários",
        "newuserlogpagetext": "Este é um registro de novas contas de usuário",
        "rightslog": "Registro de privilégios de usuário",
        "action-viewmyprivateinfo": "veja suas informações privadas",
        "action-editmyprivateinfo": "modifique suas informações privadas",
        "action-editcontentmodel": "editar o conteudo do modelo de uma pagina",
+       "action-managechangetags": "Criar e apagar etiquetas da base de dados",
        "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 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",
        "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).",
+       "broken-file-category-desc": "A página contém um link de arquivo quebrado (um link para incorporar quando o arquivo 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",
        "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",
        "selfmove": "O título fonte e o título destinatário são os mesmos; não é possível mover uma página para ela mesma.",
        "immobile-source-namespace": "Não é possível mover páginas no espaço nominal \"$1\"",
        "immobile-target-namespace": "Não é possível mover páginas para o espaço nominal \"$1\"",
-       "immobile-target-namespace-iw": "Uma ligação interwiki não é um destino válido para uma movimentação de página.",
+       "immobile-target-namespace-iw": "Um link interwiki não é um destino válido para movimentação de página.",
        "immobile-source-page": "Esta página não pode ser movida.",
        "immobile-target-page": "Não é possível mover para esse título de destino.",
        "bad-target-model": "O destino especificado usa um modelo de conteúdo diferente. Não é possível converter $1 para $2.",
        "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",
        "tooltip-pt-mycontris": "Listagem de suas contribuições",
        "tooltip-pt-login": "Você é encorajado a autenticar-se, apesar disso não ser obrigatório.",
        "tooltip-pt-logout": "Sair",
+       "tooltip-pt-createaccount": "É recomendado que você crie uma conta e inicie uma seção; todavia, isto não é obrigatório",
        "tooltip-ca-talk": "Discussão sobre o conteúdo da página",
        "tooltip-ca-edit": "Você pode editar esta página. Use o botão \"Mostrar previsão\" antes de salvar.",
        "tooltip-ca-addsection": "Iniciar uma nova seção",
        "tooltip-feed-atom": "Feed Atom desta página",
        "tooltip-t-contributions": "Ver as contribuições deste usuário",
        "tooltip-t-emailuser": "Enviar um e-mail a este usuário",
+       "tooltip-t-info": "Mais informações sobre esta página",
        "tooltip-t-upload": "Enviar arquivos",
        "tooltip-t-specialpages": "Lista de páginas especiais",
        "tooltip-t-print": "Versão para impressão desta página",
        "creditspage": "Créditos da página",
        "nocredits": "Não há informações disponíveis sobre os créditos desta página.",
        "spamprotectiontitle": "Filtro de proteção contra spam",
-       "spamprotectiontext": "A página que deseja salvar foi bloqueada pelo filtro de spam.\nTal bloqueio foi provavelmente causado por uma ligação para um ''website'' externo que conste na lista negra.",
+       "spamprotectiontext": "O texto que deseja salvar foi bloqueado pelo filtro de spam.\nIsso é provavelmente causado por um link para um site externo que está na lista negra.",
        "spamprotectionmatch": "O seguinte texto ativou o filtro de spam: $1",
        "spambot_username": "MediaWiki limpeza de spam",
        "spam_reverting": "Revertendo para a última versão que não contém links para $1",
        "confirmemail_success": "O seu endereço de e-mail foi confirmado. Pode agora se ligar.",
        "confirmemail_loggedin": "O seu endereço de e-mail foi agora confirmado.",
        "confirmemail_subject": "{{SITENAME}} confirmação de endereço de e-mail",
-       "confirmemail_body": "Alguém, provavelmente você, com o endereço de IP $1,\nregistrou uma conta \"$2\" com este endereço de e-mail em {{SITENAME}}.\n\nPara confirmar que esta conta realmente é sua, e para ativar\nas funcionalidades de e-mail em {{SITENAME}},\nabra o seguinte endereço no seu navegador:\n\n$3\n\nSe você *não* registrou a conta, siga a seguinte ligação\npara cancelar a confirmação do endereço de e-mail:\n\n$5\n\nEste código de confirmação irá expirar em $4.",
+       "confirmemail_body": "Alguém, provavelmente você, com o endereço de IP $1,\nregistrou uma conta \"$2\" com este endereço de email em {{SITENAME}}.\n\nPara confirmar que esta conta realmente é sua, e para ativar\nas funcionalidades de email em {{SITENAME}},\nabra o seguinte endereço no seu navegador:\n\n$3\n\nSe você *não* registrou a conta, clique neste link\npara cancelar a confirmação do endereço de email:\n\n$5\n\nEste código de confirmação irá expirar em $4.",
        "confirmemail_body_changed": "Alguém, provavelmente você com o endereço de IP $1,\nalterou o endereço de e-mail da conta \"$2\" para este em {{SITENAME}}.\n\nPara confirmar que esta conta é realmente sua e reativar\nas funcionalidades de e-mail em {{SITENAME}},\nabra o seguinte link no seu navegador:\n\n$3\n\nCaso a conta *não* lhe pertença, siga o seguinte link\npara cancelar a confirmação do endereço de e-mail:\n\n$5\n\nEste código de confirmação irá expirar em $4.",
        "confirmemail_body_set": "Alguém, provavelmente você, com o endereço de IP $1,\ndefiniu o endereço de e-mail da conta \"$2\" para este em {{SITENAME}}.\n\nPara confirmar que esta conta é realmente sua e reativar\nas funcionalidades de email em {{SITENAME}},\nabra o seguinte link no seu navegador:\n\n$3\n\nCaso a conta *não* lhe pertença, siga o seguinte link\npara cancelar a confirmação do endereço de e-mail:\n\n$5\n\nEste código de confirmação irá expirar em $4.",
        "confirmemail_invalidated": "Confirmação de endereço de e-mail cancelada",
        "version-entrypoints": "URLs dos pontos 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": "Redirecionar por arquivo, usuário ou ID de revisão",
        "redirect-legend": "Redirecionar para um arquivo ou página",
        "redirect-summary": "Esta página especial redireciona a um arquivo (dado o nome do arquivo), a uma página (dado um ID de revisão ou ID da página) ou a uma página de usuário (dado o ID do usuário). Uso: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], or [[{{#Special:Redirect}}/user/101]].",
        "tags-tag": "Nome da etiqueta",
        "tags-display-header": "Aparência nas listas de modificações",
        "tags-description-header": "Descrição completa do significado",
+       "tags-source-header": "Fonte",
        "tags-active-header": "Ativo?",
        "tags-hitcount-header": "Modificações etiquetadas",
+       "tags-actions-header": "Ações",
        "tags-active-yes": "Sim",
        "tags-active-no": "Não",
+       "tags-source-extension": "Definida por uma extensão",
+       "tags-source-manual": "Aplicado manualmente pelos usuários e pelos robôs",
+       "tags-source-none": "Não mais em uso",
        "tags-edit": "editar",
+       "tags-delete": "Apagar",
+       "tags-activate": "Ativar",
+       "tags-deactivate": "Desativar",
        "tags-hitcount": "$1 {{PLURAL:$1|modificação|modificações}}",
+       "tags-manage-no-permission": "Você não possui permissão para gerenciar alterações de etiquetas",
+       "tags-create-heading": "Criar uma nova etiqueta",
+       "tags-create-explanation": "Por padrão, etiquetas recém-criadas serão disponibilizadas para usuários e robôs",
+       "tags-create-tag-name": "Nome de etiqueta",
+       "tags-create-reason": "Razão:",
+       "tags-create-submit": "Criar",
+       "tags-create-no-name": "Você deve especificar um nome de etiqueta",
+       "tags-create-invalid-chars": "Nomes de etiquetas não devem conter vírgulas (<code>,</code>) ou barras (<code>/</code>).",
+       "tags-create-invalid-title-chars": "Nomes de etiqueta não devem conter caracteres que não possam ser utilizados em títulos de páginas.",
+       "tags-create-already-exists": "A etiqueta \"$1\" já existe.",
+       "tags-create-warnings-below": "Você deseja continuar a criar a etiqueta?",
+       "tags-delete-title": "Apagar etiqueta",
+       "tags-delete-submit": "Apagar irreversivelmente esta etiqueta",
+       "tags-delete-not-allowed": "Etiquetas definidas por uma extensão não podem ser apagadas a menos que a extensão especificamente o permita.",
+       "tags-delete-not-found": "A etiqueta \"$1\" não existe.",
+       "tags-activate-title": "Ativar etiqueta",
+       "tags-activate-submit": "Ativar",
+       "tags-deactivate-title": "Desativar etiqueta",
+       "tags-deactivate-submit": "Desativar",
        "comparepages": "Comparar páginas",
        "compare-page1": "Página 1",
        "compare-page2": "Página 2",
        "compare-revision-not-exists": "A revisão que você especificou não existe.",
        "dberr-problems": "Desculpe! Este sítio está passando por dificuldades técnicas.",
        "dberr-again": "Experimente esperar alguns minutos e atualizar.",
-       "dberr-info": "(Não foi possível contatar o servidor de base de dados: $1)",
+       "dberr-info": "(Não pode acessar a base de dados: $1)",
        "dberr-info-hidden": "(Não foi possível contatar o banco de dados do servidor)",
        "dberr-usegoogle": "Você pode tentar pesquisar no Google entretanto.",
        "dberr-outofdate": "Note que os seus índices relativos ao nosso conteúdo podem estar desatualizados.",
        "logentry-rights-rights": "$1 alterou os grupos de usuário de $3 de $4 para $5",
        "logentry-rights-rights-legacy": "$1 alterou os grupos de $3",
        "logentry-rights-autopromote": "$1 foi promovido automaticamente de $4 para $5",
+       "logentry-upload-upload": "$1 {{GENDER:$2|carregado}} $3",
        "rightsnone": "(nenhum)",
        "revdelete-summary": "sumário de edição",
        "feedback-bugornote": "Se você está preparado para descrever detalhadamente um problema técnico, [$1 relate um bug].\nCaso contrário, você poderá usar o formulário simplificado a seguir. Seu comentário será adicionado à página \"[$3 $2]\", junto com o seu nome de usuário e o navegador que estiver usando neste momento.",
        "expand_templates_generate_xml": "Mostrar árvore de análise (parse) do XML",
        "expand_templates_generate_rawhtml": "Mostrar HTML puro",
        "expand_templates_preview": "Pré-visualização",
+       "pagelanguage": "Seletor de idioma de página",
        "pagelang-name": "Página",
        "pagelang-language": "Idioma",
        "pagelang-use-default": "Idioma padrão de uso",
index e332e1d..1477393 100644 (file)
        "prefs-personal": "Dados do utilizador",
        "prefs-rc": "Mudanças recentes",
        "prefs-watchlist": "Páginas vigiadas",
+       "prefs-editwatchlist": "Editar lista de páginas vigiadas",
+       "prefs-editwatchlist-label": "Editar entradas na sua lista de páginas vigiadas:",
+       "prefs-editwatchlist-edit": "Ver e remover títulos da sua lista de páginas vigiadas",
+       "prefs-editwatchlist-raw": "Editar lista de páginas vigiadas em forma de texto",
+       "prefs-editwatchlist-clear": "Limpar lista de páginas vigiadas",
        "prefs-watchlist-days": "Dias a mostrar nas mudanças às páginas vigiadas:",
        "prefs-watchlist-days-max": "Máximo: $1 {{PLURAL:$1|dia|dias}}",
        "prefs-watchlist-edits": "Número de edições a mostrar na listagem expandida:",
        "right-override-export-depth": "Exportar páginas incluindo páginas ligadas até uma profundidade de 5",
        "right-sendemail": "Enviar correio eletrónico a outros utilizadores",
        "right-passwordreset": "Ver mensagens de redefinição da palavra-passe",
+       "right-managechangetags": "Criar e eliminar [[Special:Tags|etiquetas]] da base de dados",
        "newuserlogpage": "Registo de criação de utilizadores",
        "newuserlogpagetext": "Este é um registo de novas contas de utilizador",
        "rightslog": "Registo de privilégios de utilizador",
        "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",
+       "action-managechangetags": "criar e eliminar etiquetas da base de dados",
        "nchanges": "$1 {{PLURAL:$1|alteração|alterações}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|desde a última visita}}",
        "enhancedrc-history": "histórico",
        "listgrouprights-namespaceprotection-header": "Restrições do domínio",
        "listgrouprights-namespaceprotection-namespace": "Domínio",
        "listgrouprights-namespaceprotection-restrictedto": "Direito(s) do utilizador para editar",
-       "trackingcategories": "Categorias de monitoramento",
+       "trackingcategories": "Categorias de monitorização",
        "trackingcategories-summary": "Esta página lista as categorias monitoradas que foram geradas automaticamente pelo software MediaWiki. Os seus nomes podem ser alterados ao editar sua mensagem correspondente no domínio {{ns:8}}.",
        "trackingcategories-msg": "Categoria monitorada",
        "trackingcategories-name": "Nome da mensagem",
        "tags-tag": "Nome da etiqueta",
        "tags-display-header": "Aparência nas listas de modificações",
        "tags-description-header": "Descrição completa do significado",
+       "tags-source-header": "Origem",
        "tags-active-header": "Ativa?",
        "tags-hitcount-header": "Modificações etiquetadas",
+       "tags-actions-header": "Ações",
        "tags-active-yes": "Sim",
        "tags-active-no": "Não",
+       "tags-source-extension": "Definida por uma extensão",
+       "tags-source-manual": "Aplicada manualmente pelos utilizadores e robôs",
+       "tags-source-none": "Já não está em uso",
        "tags-edit": "editar",
+       "tags-delete": "eliminar",
+       "tags-activate": "ativar",
+       "tags-deactivate": "desativar",
        "tags-hitcount": "$1 {{PLURAL:$1|modificação|modificações}}",
+       "tags-manage-no-permission": "Não possui permissão para gerir alterações de etiquetas.",
+       "tags-create-heading": "Criar nova etiqueta",
+       "tags-create-explanation": "Por definição, etiquetas recém-criadas estarão disponíveis para utilização por utilizadores e robôs.",
+       "tags-create-tag-name": "Nome da etiqueta:",
+       "tags-create-reason": "Motivo:",
+       "tags-create-submit": "Criar",
+       "tags-create-no-name": "Deve especificar um nome para a etiqueta.",
+       "tags-create-invalid-chars": "Os nomes das etiquetas não devem conter vírgulas (<code>,</code>) ou barras (<code>/</code>).",
+       "tags-create-invalid-title-chars": "Os nomes das etiquetas não devem conter caracteres que não podem ser usados em títulos de página.",
+       "tags-create-already-exists": "A etiqueta \"$1\" já existe.",
+       "tags-create-warnings-above": "{{PLURAL:$2|O seguinte aviso foi encontrado|Os seguintes avisos foram encontrados}} ao tentar criar a etiqueta \"$1\":",
+       "tags-create-warnings-below": "Pretende continuar com a criação da etiqueta?",
+       "tags-delete-title": "Eliminar etiqueta",
+       "tags-delete-explanation-initial": "Está prestes a eliminar a etiqueta \"$1\" da base de dados.",
+       "tags-delete-explanation-in-use": "Será removida de {{PLURAL:$2|$2 edição ou entrada de registo|todas as $2 edições e/ou entradas de registo}} em que está atualmente aplicada.",
+       "tags-delete-explanation-warning": "Esta ação é <strong>irreversível</strong> e <strong>não pode ser desfeita</strong>, nem mesmo por administradores da base de dados. Tenha a certeza de que é esta etiqueta que pretende eliminar.",
+       "tags-delete-explanation-active": "<strong>A etiqueta \"$1\" ainda está ativa e continuará a ser aplicada no futuro.</strong> Para prevenir que isto aconteça, deve dirigir-se ao(s) local(is) em que a etiqueta é aplicada, e a partir daí, desativá-la.",
+       "tags-delete-reason": "Motivo:",
+       "tags-delete-submit": "Eliminar irreversivelmente esta etiqueta",
+       "tags-delete-not-allowed": "Etiquetas definidas por uma extensão não podem ser eliminadas, a menos que a extensão, especificamente, o permita.",
+       "tags-delete-not-found": "A etiqueta \"$1\" não existe.",
+       "tags-delete-too-many-uses": "A etiqueta \"$1\" está aplicada em mais que $2 {{PLURAL:$2|edição|edições}}, o que significa que não pode ser eliminada.",
+       "tags-delete-warnings-after-delete": "A etiqueta \"$1\" foi eliminada com sucesso, mas {{PLURAL:$2|o seguinte aviso foi encontrado|os seguintes avisos foram encontrados}}:",
+       "tags-activate-title": "Ativar etiqueta",
+       "tags-activate-question": "Está prestes a ativar a etiqueta \"$1\".",
+       "tags-activate-reason": "Motivo:",
+       "tags-activate-not-allowed": "Não é possível ativar a etiqueta \"$1\".",
+       "tags-activate-not-found": "A etiqueta \"$1\" não existe.",
+       "tags-activate-submit": "Ativar",
+       "tags-deactivate-title": "Desativar etiqueta",
+       "tags-deactivate-question": "Está prestes a desativar a etiqueta \"$1\".",
+       "tags-deactivate-reason": "Motivo:",
+       "tags-deactivate-not-allowed": "Não é possível desativar a etiqueta \"$1\".",
+       "tags-deactivate-submit": "Desativar",
        "comparepages": "Comparar páginas",
        "compare-page1": "Página 1",
        "compare-page2": "Página 2",
        "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",
        "logentry-upload-upload": "$1 {{GENDER:$2|carregou}} $3",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|carregou}} uma nova versão de $3",
        "logentry-upload-revert": "$1 {{GENDER:$2|carregou}} $3",
+       "log-name-managetags": "Registo de gestão de etiquetas",
+       "log-description-managetags": "Esta página lista as tarefas de gestão relacionadas com [[Special:Tags|etiquetas]]. O registo contém apenas ações realizadas manualmente por um administrador; etiquetas podem ser criadas ou eliminadas pelo ''software'' da wiki sem uma entrada a ser gravada neste registo.",
+       "logentry-managetags-create": "$1 {{GENDER:$2|criou}} a etiqueta \"$4\"",
+       "logentry-managetags-delete": "$1 {{GENDER:$2|eliminou}} a etiqueta \"$4\" (removida de $5 {{PLURAL:$5|edição ou entrada de registo|edições e/ou entradas de registo}})",
+       "logentry-managetags-activate": "$1 {{GENDER:$2|ativou}} a etiqueta \"$1\" para uso de utilizadores e robôs.",
+       "logentry-managetags-deactivate": "$1 {{GENDER:$2|desativou}} a etiqueta \"$1\" para uso de utilizadores e robôs.",
        "rightsnone": "(nenhum)",
        "revdelete-summary": "editar resumo",
        "feedback-bugornote": "Se está pronto para descrever um problema técnico em detalhe, por favor, [$1 comunique o defeito].\nCaso contrário, pode facilmente usar o formulário abaixo. O seu comentário será adicionado à página \"[$3 $2]\", junto com o seu nome de utilizador e o navegador que está a usar.",
        "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-recursion": "Uma ou mais referências recursivas no valor a ser codificado",
+       "json-error-inf-or-nan": "Um ou mais valores NaN ou INF no valor a ser codificado",
        "json-error-unsupported-type": "Foi dado um valor de um tipo que não pode ser codificado"
 }
index 14345bf..f2abd03 100644 (file)
        "oct": "Abbreviation of October, the tenth month of the Gregorian calendar\n\nOne of the set: {{msg-mw|Jan}}, {{msg-mw|Feb}}, {{msg-mw|Mar}}, {{msg-mw|Apr}}, {{msg-mw|May}}, {{msg-mw|Jun}}, {{msg-mw|Jul}}, {{msg-mw|Aug}}, {{msg-mw|Sep}}, {{msg-mw|Oct}}, {{msg-mw|Nov}}, {{msg-mw|Dec}}.",
        "nov": "Abbreviation of November, the eleventh month of the Gregorian calendar\n\nOne of the set: {{msg-mw|Jan}}, {{msg-mw|Feb}}, {{msg-mw|Mar}}, {{msg-mw|Apr}}, {{msg-mw|May}}, {{msg-mw|Jun}}, {{msg-mw|Jul}}, {{msg-mw|Aug}}, {{msg-mw|Sep}}, {{msg-mw|Oct}}, {{msg-mw|Nov}}, {{msg-mw|Dec}}.",
        "dec": "Abbreviation of December, the twelfth month of the Gregorian calendar\n\nOne of the set: {{msg-mw|Jan}}, {{msg-mw|Feb}}, {{msg-mw|Mar}}, {{msg-mw|Apr}}, {{msg-mw|May}}, {{msg-mw|Jun}}, {{msg-mw|Jul}}, {{msg-mw|Aug}}, {{msg-mw|Sep}}, {{msg-mw|Oct}}, {{msg-mw|Nov}}, {{msg-mw|Dec}}.",
-       "january-date": "A date in the Gregorian month of January. $1 is the numerical date, for example \"23\".",
-       "february-date": "A date in the Gregorian month of February. $1 is the numerical date, for example \"23\".",
-       "march-date": "A date in the Gregorian month of March. $1 is the numerical date, for example \"23\".",
+       "january-date": "A date in the Gregorian month of January. $1 is the numerical date, for example \"23\".\n{{Identical|January}}",
+       "february-date": "A date in the Gregorian month of February. $1 is the numerical date, for example \"23\".\n{{Identical|February}}",
+       "march-date": "A date in the Gregorian month of March. $1 is the numerical date, for example \"23\".\n{{Identical|March}}",
        "april-date": "A date in the Gregorian month of April. $1 is the numerical date, for example \"23\".",
        "may-date": "A date in the Gregorian month of May. $1 is the numerical date, for example \"23\". The month name is not abbreviated.\n{{Identical|May}}",
        "june-date": "A date in the Gregorian month of June. $1 is the numerical date, for example \"23\".",
        "nowiki_tip": "This is the text that appears when you hover the mouse over the third button from the right on the edit toolbar.",
        "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_sample": "{{optional}}\n{{Identical|Example}}",
+       "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}}",
        "textmatches": "When displaying search results",
        "notextmatches": "Error message when there are no results",
        "prevn": "This is part of the navigation message on the top and bottom of Special pages (lists of things in alphabetical order, i.e. the '[[Special:Categories]]' page), where it is used as the first argument of {{msg-mw|Viewprevnext}}.\nIt is also used by Category pages (which do ''not'' use {{msg-mw|Viewprevnext}}).\n{{PLURAL:$1|$1}} is the number of items shown per page. It is not used when {{PLURAL:$1|$1}} is zero; not sure what happens when {{PLURAL:$1|$1}} is one.\n[[Special:WhatLinksHere|Whatlinkshere]] pages use {{msg-mw|Whatlinkshere-prev}} instead (still as an argument to {{msg-mw|Viewprevnext}}).\n\n{{Identical|Previous}}",
-       "nextn": "This is part of the navigation message on the top and bottom of Special pages (lists of things in alphabetical order, i.e. the '[[Special:Categories]]' page), where it is used as the second argument of {{msg-mw|Viewprevnext}}.\n\nIt is also used by Category pages (which do ''not'' use {{msg-mw|Viewprevnext}}).\n\nParameters:\n* $1 - the number of items shown per page. It is not used when $1 is zero; not sure what happens when $1 is one.\n[[Special:WhatLinksHere|Whatlinkshere]] pages use {{msg-mw|Whatlinkshere-next}} instead (still as an argument to {{msg-mw|Viewprevnext}}).\n\n{{Identical|Next $1}}",
+       "nextn": "This is part of the navigation message on the top and bottom of Special pages (lists of things in alphabetical order, i.e. the '[[Special:Categories]]' page), where it is used as the second argument of {{msg-mw|Viewprevnext}}.\n\nIt is also used by Category pages (which do ''not'' use {{msg-mw|Viewprevnext}}).\n\nParameters:\n* $1 - the number of items shown per page. It is not used when $1 is zero; not sure what happens when $1 is one.\n[[Special:WhatLinksHere|Whatlinkshere]] pages use {{msg-mw|Whatlinkshere-next}} instead (still as an argument to {{msg-mw|Viewprevnext}}).\n\n{{Identical|Next}}",
        "prevn-title": "Parameters:\n* $1 - number of search results\nSee also:\n* {{msg-mw|Viewprevnext}}",
        "nextn-title": "Parameters:\n* $1 - number of search results\nSee also:\n* {{msg-mw|Viewprevnext}}",
        "shown-title": "Parameters:\n* $1 - number of search results",
        "prefs-personal": "Title of a tab in [[Special:Preferences]].\n{{Identical|User profile}}",
        "prefs-rc": "Used in user preferences.\n\n{{Identical|Recent changes}}",
        "prefs-watchlist": "Used in user preferences.\n{{Identical|Watchlist}}",
+       "prefs-editwatchlist": "Used in [[Special:Preferences]], tab \"Watchlist\".",
+       "prefs-editwatchlist-label": "Used in [[Special:Preferences]], tab \"Watchlist\".",
+       "prefs-editwatchlist-edit": "Used in [[Special:Preferences]], tab \"Watchlist\". Link to [[Special:EditWatchlist]]\n\nSee also:\n* {{msg-mw|prefs-editwatchlist-clear}}\n* {{msg-mw|prefs-editwatchlist-raw}}",
+       "prefs-editwatchlist-raw": "Used in [[Special:Preferences]], tab \"Watchlist\". Link to [[Special:EditWatchlist/raw]].\n\nSee also:\n* {{msg-mw|prefs-editwatchlist-edit}}\n* {{msg-mw|prefs-editwatchlist-clear}}\n{{Identical|Edit raw watchlist}}",
+       "prefs-editwatchlist-clear": "Used in [[Special:Preferences]], tab \"Watchlist\". Link to [[Special:EditWatchlist/clear]].\n\nSee also:\n* {{msg-mw|prefs-editwatchlist-edit}}\n* {{msg-mw|prefs-editwatchlist-raw}}\n{{Identical|Clear watchlist}}",
        "prefs-watchlist-days": "Used in [[Special:Preferences]], tab \"Watchlist\".",
        "prefs-watchlist-days-max": "Shown as hint in [[Special:Preferences]], tab \"Watchlist\". Parameters:\n* $1 - number of days\nSee also:\n* {{msg-mw|Recentchangesdays-max}}",
        "prefs-watchlist-edits": "Used in [[Special:Preferences]], tab \"Watchlist\".",
        "right-override-export-depth": "{{doc-right|override-export-depth}}",
        "right-sendemail": "{{doc-right|sendemail}}",
        "right-passwordreset": "{{doc-right|passwordreset}}",
+       "right-managechangetags": "{{doc-right|managechangetags}}",
        "newuserlogpage": "{{doc-logpage}}\n\nPart of the \"Newuserlog\" extension. It is both the title of [[Special:Log/newusers]] and the link you can see in [[Special:RecentChanges]].",
        "newuserlogpagetext": "Part of the \"Newuserlog\" extension. It is the description you can see on [[Special:Log/newusers]].",
        "rightslog": "{{doc-logpage}}\n\nIn [[Special:Log]]",
        "action-viewmyprivateinfo": "{{doc-action|viewmyprivateinfo}}",
        "action-editmyprivateinfo": "{{doc-action|editmyprivateinfo}}",
        "action-editcontentmodel": "{{doc-action|editcontentmodel}}",
+       "action-managechangetags": "{{doc-action|managechangetags}}",
        "nchanges": "Appears on enhanced watchlist and recent changes when page has more than one change on given date, linking to a diff of the changes.\n\nParameters:\n* $1 - the number of changes on that day (2 or more)\nThree messages are shown side-by-side: ({{msg-mw|Nchanges}} | {{msg-mw|Enhancedrc-since-last-visit}} | {{msg-mw|Enhancedrc-history}}).",
        "enhancedrc-since-last-visit": "Appears on enhanced watchlist and recent changes when page has more than one change on given date and at least one that the user hasn't seen yet, linking to a diff of the unviewed changes.\n\nParameters:\n* $1 - the number of unviewed changes (1 or more)\nThree messages are shown side-by-side: ({{msg-mw|nchanges}} | {{msg-mw|enhancedrc-since-last-visit}} | {{msg-mw|enhancedrc-history}}).",
        "enhancedrc-history": "Appears on enhanced watchlist and recent changes when page has more than one change on given date, linking to its history.\n\nThis is the same as {{msg-mw|hist}}, but not abbreviated.\n\nThree messages are shown side-by-side: ({{msg-mw|nchanges}} | {{msg-mw|enhancedrc-since-last-visit}} | {{msg-mw|enhancedrc-history}}).\n{{Identical|History}}",
        "booksources-summary": "{{doc-specialpagesummary|booksources}}",
        "booksources-search-legend": "Box heading on [[Special:BookSources|book sources]] special page. The box is for searching for places where a particular book can be bought or viewed.",
        "booksources-isbn": "{{optional}}\nThis is a label that appears before a text input field on the Special:BookSources page.\n{{Identical|ISBN}}",
-       "booksources-search": "Search button in [[Special:BookSources]]\n\n{{Identical|Go}}",
+       "booksources-search": "Search button in [[Special:BookSources]]\n\n{{Identical|Search}}",
        "booksources-text": "Used in [[Special:BookSources/1]].\n\nThis message is followed by a list of links to other sites.\n\nSee also:\n* {{msg-mw|Booksources|title}}\n* {{msg-mw|Booksources-text|text}}",
        "booksources-invalid-isbn": "This message is displayed after an invalid ISBN is entered on [[Special:Booksources]].",
        "rfcurl": "{{notranslate}}\nParameters:\n* $1 - RFC number\nSee also:\n* {{msg-mw|Pubmedurl}}",
        "usermessage-summary": "This message is used as an edit summary for any message that is posted because of a system event. Translate \"leaving a message\" in the sense of: to give a message to someone; to deliver a message somewhere; to deposit.",
        "usermessage-editor": "The user name for the user that is the editor of system messages. See [{{canonicalurl:Thread:Support/Message_info_please}} discussion on Support].",
        "usermessage-template": "{{optional}}",
-       "watchlist": "{{Identical|Watchlist}}",
+       "watchlist": "Title of the Special:Watchlist page.\n\n{{Identical|Watchlist}}",
        "watchlist-summary": "{{doc-specialpagesummary|watchlist}}",
        "mywatchlist": "Link at the upper right corner of the screen.\n\nSee also:\n* {{msg-mw|Mywatchlist}}\n* {{msg-mw|Accesskey-pt-watchlist}}\n* {{msg-mw|Tooltip-pt-watchlist}}\n{{Identical|Watchlist}}",
        "watchlistfor2": "Subtitle on [[Special:Watchlist]].\nParameters:\n* $1 - Username of current user\n* $2 - Tool links (View relevant changes | View and edit watchlist | Edit raw watchlist)\n{{Identical|For $1}}",
        "tags-tag": "Caption of a column in [[Special:Tags]]. For more information on tags see [[mw:Manual:Tags|MediaWiki]].",
        "tags-display-header": "Caption of a column in [[Special:Tags]]. For more information on tags see [[mw:Manual:Tags|MediaWiki]].",
        "tags-description-header": "Caption of a column in [[Special:Tags]]. For more information on tags see [[mw:Manual:Tags|MediaWiki]].",
+       "tags-source-header": "Caption of a column in [[Special:Tags]]. For more information on tags see [[mw:Manual:Tags|MediaWiki]].\n{{Identical|Source}}",
        "tags-active-header": "Caption of a column in [[Special:Tags]]. Values are \"Yes\" or \"No\" to indicate if a tag that was ever used is current still registered.\n\nSee example: [[mw:Special:Tags]].\n\nFor more information on tags see [[mw:Manual:Tags|MediaWiki]].\n{{Identical|Active}}",
        "tags-hitcount-header": "Caption of a column in [[Special:Tags]]. For more information on tags see [[mw:Manual:Tags|MediaWiki]].",
+       "tags-actions-header": "Caption of a column in [[Special:Tags]]. The column contains action links like \"delete\". For more information on tags see [[mw:Manual:Tags|MediaWiki]].\n{{Identical|Action}}",
        "tags-active-yes": "Table cell contents if given tag is \"active\".\n\nSee also:\n* {{msg-mw|Tags-active-no}}\n{{Identical|Yes}}",
        "tags-active-no": "Table cell contents if given tag is not \"active\".\n\nSee also:\n* {{msg-mw|Tags-active-yes}}\n{{Identical|No}}",
+       "tags-source-extension": "Table cell contents if given tag can be applied automatically by a software [[mw:Manual:Extensions|extension]].\n\nSee also:\n* {{msg-mw|Tags-source-manual}}\n* {{msg-mw|Tags-source-none}}",
+       "tags-source-manual": "Table cell contents if given tag can be applied by users or bots.\n\nSee also:\n* {{msg-mw|Tags-source-extension}}\n* {{msg-mw|Tags-source-none}}",
+       "tags-source-none": "Table cell contents if given tag is no longer in use. (It was applied in the past, but it is currently not applied.)\n\nSee also:\n* {{msg-mw|Tags-source-extension}}\n* {{msg-mw|Tags-source-manual}}",
        "tags-edit": "Used on [[Special:Tags]]. Verb. Used as display text on a link to create/edit a description.\n{{Identical|Edit}}",
+       "tags-delete": "Used on [[Special:Tags]]. Verb. Used as display text on a link to delete a tag.\n{{Identical|Delete}}",
+       "tags-activate": "Used on [[Special:Tags]]. Verb. Used as display text on a link to activate a tag.\n{{Identical|Activate}}",
+       "tags-deactivate": "Used on [[Special:Tags]]. Verb. Used as display text on a link to deactivate a tag.\n{{Identical|Delete}}",
        "tags-hitcount": "Shown in the \"{{msg-mw|Tags-hitcount-header}}\" column in [[Special:Tags]]. For more information on tags see [[mw:Manual:Tags|MediaWiki]].\n\nParameters:\n* $1 - the number of changes marked with the tag",
+       "tags-manage-no-permission": "Error message on [[Special:Tags]]",
+       "tags-create-heading": "The title of a fieldset, beneath which lies a form used to create a tag. For more information on tags see [[mw:Manual:Tags|MediaWiki]].",
+       "tags-create-explanation": "The first paragraph of an explanation to tell users what they are about to do.",
+       "tags-create-tag-name": "Form field label for the name of the tag to be created.",
+       "tags-create-reason": "{{Identical|Reason}}",
+       "tags-create-submit": "The label of the form \"submit\" button when the user is about to create a tag.\n{{Identical|Create}}",
+       "tags-create-no-name": "Error message on [[Special:Tags]]",
+       "tags-create-invalid-chars": "Error message on [[Special:Tags]]",
+       "tags-create-invalid-title-chars": "Error message on [[Special:Tags]]",
+       "tags-create-already-exists": "Error message on [[Special:Tags]]",
+       "tags-create-warnings-above": "Explanation placed before warning messages upon creating a tag.\n\nParameters:\n* $1 - the code name of the tag that the user is attempting to create\n* $2 - the number of warnings",
+       "tags-create-warnings-below": "Question placed after warning messages upon creating a tag.",
+       "tags-delete-title": "The title of a page used to delete a tag. For more information on tags see [[mw:Manual:Tags|MediaWiki]].",
+       "tags-delete-explanation-initial": "The first paragraph of an explanation to tell users what they are about to do.\n\nParameters:\n* $1 - the code name of the tag that is about to be deleted",
+       "tags-delete-explanation-in-use": "The second paragraph (not always shown) of an explanation to tell users what they are about to do.\n\nParameters:\n* $1 - the code name of the tag that is about to be deleted\n*$2 - the number of places the tag is used. The value is the sum of (revisions + log entries) where the tag is used.",
+       "tags-delete-explanation-warning": "The third paragraph of an explanation to tell users what they are about to do.\n\nParameters:\n* $1 - the code name of the tag that is about to be deleted",
+       "tags-delete-explanation-active": "The fourth paragraph (not always shown) of an explanation to tell users what they are about to do.\n\nParameters:\n* $1 - the code name of the tag that is about to be deleted\n*$2 - the number of places the tag is used. The value is the sum of (rev",
+       "tags-delete-reason": "{{Identical|Reason}}",
+       "tags-delete-submit": "The label of the form \"submit\" button when the user is about to delete a tag. The word \"irreversibly\" is used to emphasise that the action destroys some data and is impossible to undo, even by server administrators.",
+       "tags-delete-not-allowed": "Error message on [[Special:Tags]]",
+       "tags-delete-not-found": "Error message on [[Special:Tags]]",
+       "tags-delete-too-many-uses": "Error message on [[Special:Tags]]",
+       "tags-delete-warnings-after-delete": "Warning shown after deleting a tag.\n\nParameters:\n* $1 - the code name of the tag that was deleted\n* $2 - the number of warnings",
+       "tags-activate-title": "The title of a page used to activate a tag. For more information on tags see [[mw:Manual:Tags|MediaWiki]].",
+       "tags-activate-question": "An explanation to tell users what they are about to do.\n\nParameters:\n* $1 - the code name of the tag that is about to be activated",
+       "tags-activate-reason": "{{Identical|Reason}}",
+       "tags-activate-not-allowed": "Error message on [[Special:Tags]]",
+       "tags-activate-not-found": "Error message on [[Special:Tags]]",
+       "tags-activate-submit": "The label of the form \"submit\" button when the user is about to activate a tag.\n{{Identical|Activate}}",
+       "tags-deactivate-title": "The title of a page used to deactivate a tag. For more information on tags see [[mw:Manual:Tags|MediaWiki]].",
+       "tags-deactivate-question": "An explanation to tell users what they are about to do.\n\nParameters:\n* $1 - the code name of the tag that is about to be deactivated",
+       "tags-deactivate-reason": "{{Identical|Reason}}",
+       "tags-deactivate-not-allowed": "Error message on [[Special:Tags]]",
+       "tags-deactivate-submit": "The label of the form \"submit\" button when the user is about to deactivate a tag.\n{{Identical|Deactivate}}",
        "comparepages": "The title of [[Special:ComparePages]]",
        "comparepages-summary": "{{doc-specialpagesummary|comparepages}}",
        "compare-page1": "Label for the field of the 1st page in the comparison for [[Special:ComparePages]]\n{{Identical|Page}}",
        "logentry-upload-upload": "{{Logentry|[[Special:Log/upload]]}}",
        "logentry-upload-overwrite": "{{Logentry|[[Special:Log/upload]]}}",
        "logentry-upload-revert": "{{Logentry|[[Special:Log/upload]]}}",
+       "log-name-managetags": "The title of a log which contains entries related to the management of change tags. \"Tag\" here refers to the same thing as {{msg-mw|tags-tag}}.",
+       "log-description-managetags": "The description of the tag management log. \"Tag\" here refers to the same thing as {{msg-mw|tags-tag}}.",
+       "logentry-managetags-create": "{{Logentry|[[Special:Log/managetags]]}}\n*$4 - tag name",
+       "logentry-managetags-delete": "{{Logentry|[[Special:Log/managetags]]}}\n*$4 - tag name\n* $5 - number of revisions + log entries that were tagged with the tag",
+       "logentry-managetags-activate": "{{Logentry|[[Special:Log/managetags]]}}\n*$4 - tag name",
+       "logentry-managetags-deactivate": "{{Logentry|[[Special:Log/managetags]]}}\n*$4 - tag name",
        "rightsnone": "Default rights for registered users.\n\n{{Identical|None}}",
        "revdelete-logentry": "{{RevisionDelete}}\nThis is the message for the log entry in [[Special:Log/delete]] when changing visibility restrictions for page revisions.\n\nFollowed by the message {{msg-mw|revdelete-log-message}} in brackets.\n\nPreceded by the name of the user doing this task.\n\nParameters:\n* $1 - the page name\nSee also:\n* {{msg-mw|Logdelete-logentry}}",
        "logdelete-logentry": "{{RevisionDelete}}\nThis is the message for the log entry in [[Special:Log/delete]] when changing visibility restrictions for log events.\n\nFollowed by the message {{msg-mw|logdelete-log-message}} in brackets.\n\nPreceded by the name of the user who did this task.\n\nParameters:\n* $1 - the log name in brackets\nSee also:\n* {{msg-mw|Revdelete-logentry}}",
index 753d0c0..983b819 100644 (file)
        "loginlanguagelabel": "Lingua: $1",
        "suspicious-userlogout": "Tia dumonda per partir è vegnida refusada perquai ch'i para ch'ella è vegnida tramessa d'in navigatur che funcziuna betg correctamain u d'in proxy da cache.",
        "createacct-another-realname-tip": "Il num real è opziunal.\nSche ti l'inditgeschas, vegn el duvrà per attribuir las contribuziuns.",
+       "pt-login": "T'annunziar",
+       "pt-login-button": "T'annunziar",
+       "pt-createaccount": "Crear in conto d'utilisader",
        "php-mail-error-unknown": "Errur nunenconuschenta en la funcziun mail() da PHP",
        "user-mail-no-addy": "Empruvà da trametter in e-mail senza ina adressa dad e-mail.",
        "changepassword": "Midar pled-clav",
        "delete-toobig": "Questa pagina ha in grond dumber da midadas (passa $1 {{PLURAL:$1|versiun|versiuns}}).\nLa funcziun da stizzar è vegnida restrenschida per talas paginas per evitar ch'il server da {{SITENAME}} vegni surchargià.",
        "delete-warning-toobig": "Questa pagina ha in grond dumber da midadas (passa $1 {{PLURAL:$1|versiun|versiuns}}).\nStizzar ina tala pagina pudess surchargiar las operaziuns da la banca da datas da {{SITENAME}}.\nCuntinuescha cun precauziun.",
        "rollback": "Revocar modificaziuns",
-       "rollback_short": "Revocar",
        "rollbacklink": "revocar",
        "rollbacklinkcount": "revocar $1 {{PLURAL:$1|midada|midadas}}",
        "rollbacklinkcount-morethan": "revocar dapli che $1 {{PLURAL:$1|midada|midadas}}",
        "import-logentry-interwiki": "ha importà $1 (transwiki)",
        "import-logentry-interwiki-detail": "{{PLURAL:$1|Ina versiun|$1 versiuns}} da $2",
        "javascripttest": "Test da JavaScript",
-       "javascripttest-title": "Exequir tests da $1",
        "javascripttest-pagetext-noframework": "Questa pagina è reservada per exequir tests da JavaScript.",
        "javascripttest-pagetext-unknownframework": "Framework da test nunenconuschent \"$1\".",
        "javascripttest-pagetext-frameworks": "Tscherna per plaschair in dals suandantas frameworks da test: $1",
        "javascripttest-pagetext-skins": "Tscherna in skin che duai vegnir utilisà per ils tests:",
        "javascripttest-qunit-intro": "Legia la [$1 documentaziun da tests] sin mediawiki.org.",
-       "javascripttest-qunit-heading": "Collecziun da test da QUnit per JavaScript en MediaWiki",
        "tooltip-pt-userpage": "Mussar tia pagina d'utilisader",
        "tooltip-pt-anonuserpage": "La pagina d'utilisader per l'adressa IP cun la quala che ti fas modificaziuns",
        "tooltip-pt-mytalk": "Mussar tia pagina da discussiun",
        "watchlisttools-edit": "Mussar e modifitgar la glista d'observaziun",
        "watchlisttools-raw": "Modifitgar il format da la glista (import/export)",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|talk]])",
-       "unknown_extension_tag": "Tag d'extensiun nunenconuschent \"$1\"",
        "duplicate-defaultsort": "'''Attenziun:''' La clav da zavrar da standard \"$2\" remplazza la clav da zavrar da standard veglia \"$1\".",
        "version": "Versiun",
        "version-extensions": "Extensiuns installadas",
index fdfea4d..de08d6e 100644 (file)
@@ -23,7 +23,8 @@
                        "Urhixidur",
                        "לערי ריינהארט",
                        "아라",
-                       "XXN"
+                       "XXN",
+                       "Fitoschido"
                ]
        },
        "tog-underline": "Sublinierea legăturilor:",
        "session_fail_preview_html": "'''Ne pare rău! Modificările dvs. nu au putut fi procesate din cauza pierderii datelor sesiunii.'''\n\n''Deoarece {{SITENAME}} are activat HTML brut, previzualizarea este ascunsă ca măsură de precauție împotriva atacurilor JavaScript.''\n\n'''Dacă această încercare de modificare este legitimă, vă rugăm să încercați din nou. Dacă nu funcționează nici în acest fel, [[Special:UserLogout|închideți sesiunea]] și încearcați să vă autentificați din nou.'''",
        "token_suffix_mismatch": "'''Modificarea ta a fost refuzată pentru că clientul tău a deformat caracterele de punctuatie în modificarea semnului.\nModificarea a fost respinsă pentru a preveni deformarea textului paginii.\nAcest fapt se poate întâmpla atunci când folosești un serviciu proxy anonim.'''",
        "edit_form_incomplete": "'''Unele părți ale formularului de modificare nu au ajuns la server; verificați dacă modificările dumneavoastră sunt intacte și reîncercați.'''",
-       "editing": "modificare $1",
-       "creating": "Crearea paginii $1",
+       "editing": "Modificare „$1”",
+       "creating": "Crearea paginii „$1”",
        "editingsection": "modificare $1 (secțiune)",
        "editingcomment": "Modificare $1 (secțiune nouă)",
        "editconflict": "Conflict de modificare: $1",
        "prefs-personal": "Informații personale",
        "prefs-rc": "Schimbări recente",
        "prefs-watchlist": "Listă de urmărire",
+       "prefs-editwatchlist": "Modifică lista de pagini urmărite",
+       "prefs-editwatchlist-label": "Modificați titluri din lista dumneavoastră de pagini urmărite:",
+       "prefs-editwatchlist-edit": "Vizualizați și eliminați titluri din lista dumneavoastră de pagini urmărite",
+       "prefs-editwatchlist-raw": "Modifică lista brută de pagini urmărite",
+       "prefs-editwatchlist-clear": "Goliți-vă lista de pagini urmărite",
        "prefs-watchlist-days": "Numărul de zile care apar în lista paginilor urmărite:",
        "prefs-watchlist-days-max": "Maxim $1 {{PLURAL:$1|zi|zile}}",
        "prefs-watchlist-edits": "Numărul de modificări care apar în lista extinsă a paginilor urmărite:",
        "right-override-export-depth": "Exportă inclusiv paginile legate până la o adâncime de 5",
        "right-sendemail": "Trimite e-mail altor utilizatori",
        "right-passwordreset": "Vizualizează e-mailurile de reinițializare a parolelor",
+       "right-managechangetags": "Creează și șterge [[Special:Tags|etichete]] din baza de date",
        "newuserlogpage": "Jurnal utilizatori noi",
        "newuserlogpagetext": "Acesta este jurnalul creărilor conturilor de utilizator.",
        "rightslog": "Jurnal permisiuni de utilizator",
        "action-viewmyprivateinfo": "vă vizualizați informațiile personale",
        "action-editmyprivateinfo": "să vă modificați informațiile personale",
        "action-editcontentmodel": "modificați modelul de conținut al unei pagini",
+       "action-managechangetags": "creați și să ștergeți etichete din baza de date",
        "nchanges": "$1 {{PLURAL:$1|modificare|modificări|de modificări}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|de la ultima vizită}}",
        "enhancedrc-history": "istoric",
        "tags-tag": "Numele etichetei",
        "tags-display-header": "Apariția în listele cu schimbări",
        "tags-description-header": "Descrierea completă a sensului",
+       "tags-source-header": "Sursă",
        "tags-active-header": "Activă?",
        "tags-hitcount-header": "Modificări etichetate",
+       "tags-actions-header": "Acțiuni",
        "tags-active-yes": "Da",
        "tags-active-no": "Nu",
+       "tags-source-extension": "Definită de o extensie",
+       "tags-source-manual": "Aplicată manual de utilizatori și roboți",
+       "tags-source-none": "Nu mai este în uz",
        "tags-edit": "modificare",
+       "tags-delete": "șterge",
+       "tags-activate": "activează",
+       "tags-deactivate": "dezactivează",
        "tags-hitcount": "$1 {{PLURAL:$1|modificare|modificări}}",
+       "tags-manage-no-permission": "Nu aveți permisiunea de a gestiona schimbarea etichetelor.",
+       "tags-create-heading": "Creare etichetă nouă",
+       "tags-create-explanation": "În mod implicit, etichetele nou create vor fi disponibile spre utilizarea de către utilizatori și roboți.",
+       "tags-create-tag-name": "Numele etichetei:",
+       "tags-create-reason": "Motiv:",
+       "tags-create-submit": "Creează",
+       "tags-create-no-name": "Trebuie să specificați un nume de etichetă.",
+       "tags-create-invalid-chars": "Numele etichetelor nu trebuie să conțină virgule (<code>,</code>) sau bare oblice (<code>/</code>).",
+       "tags-create-invalid-title-chars": "Numele etichetelor nu trebuie să conțină caractere ce nu pot fi utilizate în titlurile paginilor.",
+       "tags-create-already-exists": "Eticheta „$1” există deja.",
+       "tags-create-warnings-above": "{{PLURAL:$2|Următorul avertisment a|Următoarele avertismente au}} fost {{PLURAL:$2|întâlnit|întâlnite}} în încercarea de a crea eticheta „$1”:",
+       "tags-create-warnings-below": "Doriți să continuați crearea etichetei?",
+       "tags-delete-title": "Ștergere etichetă",
+       "tags-delete-explanation-initial": "Sunteți pe cale să ștergeți eticheta „$1” din baza de date.",
+       "tags-delete-explanation-in-use": "Va fi eliminată {{PLURAL:$2|din cadrul unei versiuni sau intrări din jurnal căreia îi|din toate cele $2 versiuni și/sau intrări din jurnal cărora le|din toate cele $2 de versiuni și/sau intrări din jurnal cărora le}} este aplicată în acest moment.",
+       "tags-delete-explanation-warning": "Această acțiune este <strong>ireversibilă</strong> și <strong>nu poate fi anulată</strong>, nici chiar de către administratorii bazei de date. Asigurați-vă încă o dată că aceasta este eticheta pe care doriți să o ștergeți.",
+       "tags-delete-explanation-active": "<strong>Eticheta „$1” este încă activă și va continua să fie aplicată și pe viitor.</strong> Pentru a opri aplicarea ei, mergeți în locul(rile) în care este setată aplicarea acesteia și dezactivați-o de acolo.",
+       "tags-delete-reason": "Motiv:",
+       "tags-delete-submit": "Șterge ireversibil această etichetă",
+       "tags-delete-not-allowed": "Etichetele definite printr-o extensie pot fi șterse doar dacă extensia permite acest lucru în mod expres.",
+       "tags-delete-not-found": "Eticheta „$1” nu există.",
+       "tags-delete-too-many-uses": "Eticheta „$1” este aplicată pentru mai mult de $2 {{PLURAL:$2|versiune|versiuni|de versiuni}}, ceea ce înseamnă că nu poate fi ștearsă.",
+       "tags-delete-warnings-after-delete": "Eticheta „$1” a fost ștearsă cu succes, deși {{PLURAL:$2|s-a întâlnit următorul avertisment|s-au întâlnit următoarele avertismente}}:",
+       "tags-activate-title": "Activare etichetă",
+       "tags-activate-question": "Sunteți pe cale să activați eticheta „$1”.",
+       "tags-activate-reason": "Motiv:",
+       "tags-activate-not-allowed": "Nu este posibilă activarea etichetei „$1”.",
+       "tags-activate-not-found": "Eticheta „$1” nu există.",
+       "tags-activate-submit": "Activează",
+       "tags-deactivate-title": "Dezactivare etichetă",
+       "tags-deactivate-question": "Sunteți pe cale să dezactivați eticheta „$1”.",
+       "tags-deactivate-reason": "Motiv:",
+       "tags-deactivate-not-allowed": "Nu este posibilă dezactivarea etichetei „$1”.",
+       "tags-deactivate-submit": "Dezactivează",
        "comparepages": "Comparație între pagini",
        "compare-page1": "Pagina 1",
        "compare-page2": "Pagina 2",
        "logentry-upload-upload": "$1 {{GENDER:$2|a încărcat}} $3",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|a încărcat}} o nouă versiune pentru $3",
        "logentry-upload-revert": "$1 {{GENDER:$2|a încărcat}} $3",
+       "log-name-managetags": "Jurnal gestionare etichete",
+       "log-description-managetags": "Această pagină listează activitățile de gestionare în ceea ce privește [[Special:Tags|etichetele]]. Jurnalul conține numai acțiunile efectuate manual de către un administrator; etichetele pot fi create sau șterse de software-ul wiki fără ca vreo intrare să fie înregistrată în acest jurnal.",
+       "logentry-managetags-create": "$1 {{GENDER:$2|a creat}} eticheta „$4”",
+       "logentry-managetags-delete": "$1 {{GENDER:$2|a șters}} eticheta „$4” (eliminată din cadrul {{PLURAL:$5|unei versiuni sau intrări din jurnal|a $5 versiuni și/sau intrări din jurnal|a $5 de versiuni și/sau intrări din jurnal}})",
+       "logentry-managetags-activate": "$1 {{GENDER:$2|a activat}} eticheta „$4” pentru utilizarea de către utilizatori și roboți",
+       "logentry-managetags-deactivate": "$1 {{GENDER:$2|a dezactivat}} eticheta „$4” de la utilizarea de către utilizatori și roboți",
        "rightsnone": "(niciunul)",
        "revdelete-summary": "descrierea modificărilor",
        "feedback-bugornote": "Dacă sunteți pregătit să descrieți o problemă tehnică în detaliu vă rugăm să [$1 raportați un bug].\nÎn caz contrar, puteți utiliza formularul de mai jos. Comentariul dumneavoastră va fi adăugat pe pagina „[$3 $2]”, împreună cu numele de utilizator și numele navigatorului pe care îl folosiți.",
index 82044e2..31fff42 100644 (file)
        "prefs-personal": "Личные данные",
        "prefs-rc": "Свежие правки",
        "prefs-watchlist": "Список наблюдения",
+       "prefs-editwatchlist": "Изменение списка наблюдения",
+       "prefs-editwatchlist-label": "Изменение записей вашего списка наблюдения:",
+       "prefs-editwatchlist-edit": "Просмотр и удаление названий из вашего списка наблюдения",
+       "prefs-editwatchlist-raw": "Редактирование списка наблюдения как текста",
+       "prefs-editwatchlist-clear": "Очистить список наблюдения",
        "prefs-watchlist-days": "Количество дней:",
        "prefs-watchlist-days-max": "Не более $1 {{PLURAL:$1|дня|дней}}",
        "prefs-watchlist-edits": "Максимальное количество правок, отображаемых в расширенном списке наблюдения:",
        "right-override-export-depth": "экспортирование страниц, включая связанные страницы с глубиной до 5",
        "right-sendemail": "отправка электронной почты другим участникам",
        "right-passwordreset": "просмотр электронных писем с изменением пароля",
+       "right-managechangetags": "Создавать и удалять [[Special:Tags|метки]] из базы данных",
        "newuserlogpage": "Журнал регистрации участников",
        "newuserlogpagetext": "Список недавно зарегистрировавшихся участников",
        "rightslog": "Журнал прав участника",
        "action-viewmyprivateinfo": "просмотр вашей частной информации",
        "action-editmyprivateinfo": "редактирование вашей частной информации",
        "action-editcontentmodel": "редактирование контентной модели страницы",
+       "action-managechangetags": "создание и удаление меток из базы данных",
        "nchanges": "$1 {{PLURAL:$1|изменение|изменения|изменений}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|с последнего посещения}}",
        "enhancedrc-history": "история",
        "watchlistedit-raw-done": "Ваш список наблюдения сохранён.",
        "watchlistedit-raw-added": "{{PLURAL:$1|Была добавлена|Были добавлены|Было добавлено}} $1 {{PLURAL:$1|запись|записи|записей}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|Была удалена|Были удалены|Было удалено}} $1 {{PLURAL:$1|запись|записи|записей}}:",
-       "watchlistedit-clear-title": "Ð\9eÑ\87иÑ\89ение списка наблюдения",
+       "watchlistedit-clear-title": "Ð\9eÑ\87иÑ\81Ñ\82ка списка наблюдения",
        "watchlistedit-clear-legend": "Очистить список наблюдения",
        "watchlistedit-clear-explain": "Все записи будут удалены из вашего списка наблюдения",
        "watchlistedit-clear-titles": "Заголовки:",
        "tags-tag": "Имя метки",
        "tags-display-header": "Отображение в списках изменений",
        "tags-description-header": "Полное описание значения",
+       "tags-source-header": "Источник",
        "tags-active-header": "Активна?",
        "tags-hitcount-header": "Отмеченные правки",
+       "tags-actions-header": "Действия",
        "tags-active-yes": "Да",
        "tags-active-no": "Нет",
+       "tags-source-extension": "Определяется расширением",
+       "tags-source-none": "Больше не используется",
        "tags-edit": "править",
+       "tags-delete": "удалить",
+       "tags-activate": "активировать",
+       "tags-deactivate": "отключить",
        "tags-hitcount": "$1 {{PLURAL:$1|изменение|изменения|изменений}}",
+       "tags-create-heading": "Создать новую метку",
+       "tags-create-tag-name": "Название метки:",
+       "tags-create-reason": "Причина:",
+       "tags-create-submit": "Создать",
+       "tags-create-no-name": "Вы должны указать имя метки.",
+       "tags-create-already-exists": "Метка «$1» уже существует.",
+       "tags-create-warnings-below": "Вы хотите продолжить создание метки?",
+       "tags-delete-title": "Удалить метку",
+       "tags-delete-explanation-initial": "Вы собираетесь удалить метку «$1» из базы данных.",
+       "tags-delete-reason": "Причина:",
+       "tags-activate-title": "Активировать метку",
+       "tags-activate-question": "Вы собираетесь активировать метку «$1».",
+       "tags-activate-reason": "Причина:",
+       "tags-activate-not-allowed": "Невозможно активировать метку «$1».",
+       "tags-activate-not-found": "Метка «$1» не существует.",
+       "tags-activate-submit": "Активировать",
+       "tags-deactivate-title": "Отключить метку",
+       "tags-deactivate-reason": "Причина:",
+       "tags-deactivate-submit": "Отключить",
        "comparepages": "Сравнение страниц",
        "compare-page1": "Первая страница",
        "compare-page2": "Вторая страница",
        "logentry-upload-upload": "$1 загрузил{{GENDER:$2||а}} $3",
        "logentry-upload-overwrite": "$1 загрузил{{GENDER:$2||а}} новую версию $3",
        "logentry-upload-revert": "$1 загрузил{{GENDER:$2||а}} $3",
+       "log-name-managetags": "Журнал управления метками",
+       "logentry-managetags-create": "$1 создал{{GENDER:$2||а}} метку «$4»",
        "rightsnone": "(нет)",
        "revdelete-summary": "описание изменений",
        "feedback-bugornote": "Если вы готовы подробно описать техническую проблему, пожалуйста, [$1 сообщите об ошибке].\nВ противном случае вы можете использовать данную простую форму. Ваш комментарий будет добавлен на страницу «[$3 $2]» вместе с вашим именем участника и используемым браузером.",
index df4600a..52949b0 100644 (file)
        "delete-warning-toobig": "Тота сторінка має велику історію едітацій, через $1 {{PLURAL:$1|верзії|верзій|верзій}}. Мазаня такых сторінок може нарушыти датабазовы операцім {{grammar:2sg|{{SITENAME}}}}; мерькуйте.",
        "deleting-backlinks-warning": "'''Позірь:'''  Сторінка, котру ся рыхтуєте вымазати, є одказована на [[Special:WhatLinksHere/{{FULLPAGENAME}}|іншых сторінках]] ці вложена до них.",
        "rollback": "Вернути назад едітованя",
-       "rollback_short": "Вернути назад",
        "rollbacklink": "вернути назад",
        "rollbacklinkcount": "вернутя $1 {{PLURAL:$1|едітованя|едітовань}} назад",
        "rollbacklinkcount-morethan": "вернутя бівше як $1 {{PLURAL:$1|едітованя|едітовань}} назад",
        "sp-contributions-search": "Глядати приспівкы",
        "sp-contributions-username": "IP-адреса або імя хоснователя:",
        "sp-contributions-toponly": "Вказати лем актуалны ревізії",
+       "sp-contributions-newonly": "Вказати лем ревізії, котры суть створїнями сторінок",
        "sp-contributions-submit": "Найти",
        "whatlinkshere": "Одказы на тоту сторінку",
        "whatlinkshere-title": "Сторінкы, што ся одказують на \"$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": "Сет тестів JavaScript в MediaWiki QUnit",
        "tooltip-pt-userpage": "Ваша сторінка хоснователя",
        "tooltip-pt-anonuserpage": "Сторінка хоснователя про IP-адресу, з котрой едітуєте",
        "tooltip-pt-mytalk": "Ваша діскузна сторінка",
index d9bc166..e830e18 100644 (file)
        "recentchanges-label-minor": "इदं लघु सम्पादनम्",
        "recentchanges-label-bot": "बोट्-द्वारा कृतं सम्पादनमेतत्",
        "recentchanges-label-unpatrolled": "एतावता अस्य सम्पादनस्य परिशीलिनं नाभूत् ।",
+       "recentchanges-label-plusminus": "पृष्ठस्य आकारः एतावद्भिः बैट्स्-संख्याभिः परिवर्तितः",
        "recentchanges-legend-heading": "'''विकल्पविषयकम्'''",
        "rcnotefrom": "<strong>$2</strong> तः आरभ्य (<strong>$1</strong> पर्यन्तं) जातानि परिवर्तनानि अधः प्रदर्शितानि ।",
        "rclistfrom": "$3 $2 पश्चात् जातानि नूतनानि परिवर्तनानि दृश्यन्ताम्",
        "delete-toobig": "अस्य पुटास्य सम्पादनेतिहासः$1तः अधिकः {{PLURAL:$1|पुनरावृत्तिः}} इति कारणेन बृहत् अस्ति । \n{{SITENAME}} इत्यस्य अकस्मात् प्रविदारणम् अवरोद्धुं तादृशपुटस्य अपमर्जनं निषिद्धम्  ।",
        "delete-warning-toobig": " $1 {{PLURAL:$1|पुनरावृत्तिः|पुनरावृत्तयः}} अस्मिन् पुटे विसृतः सम्पादनेतिहासः ।",
        "rollback": "सम्पादनं निर्वर्तयतु ।",
-       "rollback_short": "प्रत्याहरणम् ।",
        "rollbacklink": "प्रत्याहरणं",
        "rollbacklinkcount": "$1 {{PLURAL:$1|सम्पादनम्|सम्पादनानि}} प्रत्याहरतु ।",
        "rollbacklinkcount-morethan": "$1 {{PLURAL:$1|सम्पादनम्|सम्पादनानि}} अधिकं प्रत्याहरतु ।",
index 75874f7..d2e05ef 100644 (file)
@@ -10,7 +10,8 @@
                        "Nemo bis",
                        "Urhixidur",
                        "아라",
-                       "Purodha"
+                       "Purodha",
+                       "Krivoshapkina"
                ]
        },
        "tog-underline": "Сигэлэри аннынан тардыы:",
@@ -38,7 +39,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:туһунан",
        "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": "''Эн тиһиккэ ааккын эппэттэххин. Уларытыыгын бигэргэттэххинэ IP-аадырыһыҥ сирэй устуоруйатыгар суруллуо.''",
        "missingsummary": "'''Санатыы:''' Уларыппытыҥ кылгас быһаарыытын суруйбатаххын. Уларытыыны бигэргэттэххинэ улартытыыҥ хос быһаарыыта суох барыа.",
+       "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> or <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "Болҕой. Бу сирэй наһаа элбэх көмпүүтэри ноҕуруускалыыр ресурсаларга сигэнэр.\n\n{{PLURAL:$2|Сигэнии ахсаана|Сигэниилэр ахсааннара}} мантан тахсыа суохтаах - $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": "Сирэй бу барыла '''сотуллубут'''.\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": "Маны дьаһабыллартан эмиэ кистииргэ",
        "searchall": "бары",
        "showingresults": "Манна {{PLURAL:$1|түмүк|түмүктэр}} {{PLURAL:$1|көрдөрүлүннэ|көрдөрүлүннүлэр}} <strong>$1</strong> , мантан саҕалаан №&nbsp;<strong>$2</strong>.",
        "showingresultsinrange": "Манна {{PLURAL:$1|<strong>1</strong> түмүк|<strong>$1</strong> түмүк}} мантан саҕалаан <strong>$2</strong> маныаха дылы <strong>$3</strong> көрдөрүлүннэ.",
+       "search-showingresults": "{{PLURAL:$4|Түмүк <strong>$1</strong> из <strong>$3</strong>|Түмүктэр <strong>$1 — $2</strong> мантан <strong>$3</strong>}}",
        "search-nonefound": "Көрдөбүлгэ эппиэттиир билэлэр көстүбэтилэр.",
        "powersearch-legend": "Дириҥэтэн көрдөөһүн",
        "powersearch-ns": "Аат далыгар көрдөө:",
        "powersearch-togglelabel": "Бэлиэтээ:",
        "powersearch-toggleall": "Барытын",
        "powersearch-togglenone": "Бэлиэтээмэ",
+       "powersearch-remember": "Кэлин көрдүүргэ маны туһан",
        "search-external": "Тастан көрдөөһүн",
        "searchdisabled": "{{SITENAME}} көрдүүр тэрилэ араарыллыбыт. Атын көрдүүр системаларынан наадыйар сирэйдэргитин көрдөтүөххүтүн сөп. Ол гынан баран поисковик кээһигэр баар торум эргэрбит буолуон сөп.",
        "search-error": "Көрдүүр кэмҥэ алҕас таҕыста: $1",
        "preferences": "Уларытыылар",
        "mypreferences": "Туруоруулар",
        "prefs-edits": "Көннөрүү ахсаана:",
-       "prefsnologintext2": "Туруоруулары уларытарга $1 наада.",
+       "prefsnologintext2": "Туруоруулары уларытарга ааккынан киириэхтээххин.",
        "prefs-skin": "Тас көстүү",
        "skin-preview": "Хайдах буолара",
        "datedefault": "Көннөрү көстүүтэ",
        "gender-female": "Кини биики сирэйдэри уларытар",
        "prefs-help-gender": "Маны туруорар булгуччута суох. \nБырагыраамма сорох дьоҥҥо туһаайыллыбыт биллэриилэригэр эбэтэр кинилэргэ сыһыаннаах этиилэригэр кытааччы дьахтарыттан эбэтэр эр киһититтэн көрөн этии тутулун уларытан биэриэн сөп. \nТуора дьоҥҥо көстөр бэлиэтээһин.",
        "email": "Почта",
-       "prefs-help-realname": "Сурукка киирбит аатыҥ (булгуччута суох): ким бу сирэйи уларыппытын көрдөрөргө туттуллар",
+       "prefs-help-realname": "Сурукка киирбит аатыҥ булгуччута суох. Суруйдаххына ааптар быһыытынан ыйыллар буолуоҥ.",
        "prefs-help-email": "Электроннай аадырыһы суруйар булгуччута суох, ол эрээри киирии тылгын умуннаххына санатарга көмөлөһүө.",
        "prefs-help-email-others": "Эбии. Атын кыттааччылар Эйигин кытта электроннай почтаҕын билбэккэ эрэ суруйсар кыахтаныахтара.",
        "prefs-help-email-required": "E-mail баар буолуохтаах.",
        "prefs-advancedwatchlist": "Дириҥэтиллибит туруоруулар",
        "prefs-displayrc": "Туруоруулары көрдөр",
        "prefs-displaywatchlist": "Көстүүтүн туруоруулара",
+       "prefs-tokenwatchlist": "Токен",
        "prefs-diffs": "Уратылара",
        "prefs-help-prefershttps": "Аныгыскы киириигэр үлэлиир буолуо.",
+       "prefswarning-warning": "Туруорууларгын уларыппыккын ол эрэн бигэргэппэтэххин.\nБу сирэйтэн «$1» баттамы баттаабакка таҕытаххына, барыта уруккутунан хаалыа.",
        "prefs-tabs-navigation-hint": "Сүбэ: Көмпүүтэриҥ клаватууратын стрелкаларын туһанан кыбытыктан кыбытыкка көһүөххүн сөп.",
        "email-address-validity-valid": "Сөп курдук көстөр",
        "email-address-validity-invalid": "Алҕаһа суох аадырыс ирдэнэр",
        "right-deletedtext": "Сотуллубут тиэкиһи уонна сотуллубут сирэйдэр бэйэ-бэйэлэрин ыккардыларыгар уратыларын көрүү",
        "right-browsearchive": "Сотуллубут сирэйдэри көрдөөһүн",
        "right-undelete": "Сотуллубут сирэйи хат киллэрии",
-       "right-suppressrevision": "Администраатардартан кистэммит сирэйдэри көрүү уонна урукку барылларыгар төннөрүү",
+       "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": "$1 {{PLURAL:$1|уларытыы|уларытыылар}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|тиһэх сылдьыыгыттан}}",
        "enhancedrc-history": "устуоруйата",
        "recentchanges-label-plusminus": "Сирэй кээмэйэ бачча баайтынан уларыйбыт",
        "recentchanges-legend-heading": "'''Легендата:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (өссө көр: [[Special:NewPages|Саҥа сирэйдэр тиһиктэрэ]])",
-       "rcnotefrom": "УлаÑ\80Ñ\82Ñ\8bÑ\8bлаÑ\80 Ð±Ñ\83 ÐºÑ\8dмÑ\82Ñ\8dн Ñ\8bла ÐºÓ©Ñ\80дөÑ\80үлүннүлÑ\8dÑ\80: <strong>$2</strong> (манÑ\82ан Ñ\8dлбÑ\8dÑ\85 ÐºÓ©Ñ\80дөÑ\80үллүбÑ\8dÑ\82Ñ\8d: <strong>$1</strong>).",
+       "rcnotefrom": "Ð\9cанна {{PLURAL:$5|Ñ\83лаÑ\80Ñ\8bÑ\82Ñ\8bÑ\8b ÐºÓ©Ñ\80дөÑ\80үлүннÑ\8d\83лаÑ\80Ñ\8bÑ\82Ñ\8bÑ\8bлаÑ\80 ÐºÓ©Ò»Ò¯Ð½Ð½Ò¯Ð»Ñ\8dÑ\80}} Ð±Ð°Ñ\87Ñ\87аÑ\82Ñ\82ан <strong>$3, $4</strong> (баÑ\87Ñ\87аÑ\82Ñ\82ан Ñ\8dлбÑ\8dÑ\85 ÐºÓ©Ñ\81Ñ\82үбÑ\8dÑ\82 <strong>$1</strong>).",
        "rclistfrom": "Бу кэм $3 $2 кэнниттэн оҥоһуллубуттары көрдөр",
        "rcshowhideminor": "$1 кыра уларыйыылары",
        "rcshowhideminor-show": "Көрдөр",
        "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": "Ð\9cаннÑ\8bк Ð±Ð¸Ð»Ñ\8d ÐºÓ©Ñ\80үҥнÑ\8dÑ\80ин туһанар ордук: $1.",
-       "upload-prohibited": "Ð\9cаннÑ\8bк Ð±Ð¸Ð»Ñ\8d ÐºÓ©Ñ\80үҥнÑ\8dÑ\80Ñ\8d Ð±Ð¾Ð±Ñ\83ллÑ\83бÑ\83Ñ\82Ñ\82аÑ\80: $1.",
+       "upload-permitted": "Көҥүллэммит билэ {{PLURAL:$2|көрүҥэ|көрүҥнэрэ}}: $1.",
+       "upload-preferred": "Ð\91илÑ\8d Ð¼Ð°Ð½Ð½Ñ\8bк {{PLURAL:$2|көÑ\80үҥүн|көÑ\80үҥнÑ\8dÑ\80ин}} туһанар ордук: $1.",
+       "upload-prohibited": "Ð\91илÑ\8d Ð¼Ð°Ð½Ð½Ñ\8bк {{PLURAL:$2|көÑ\80Ò¯Ò¥Ñ\8d Ð±Ð¾Ð±Ñ\83ллÑ\83бÑ\83Ñ\82|көÑ\80үҥнÑ\8dÑ\80Ñ\8d Ð±Ð¾Ð±Ñ\83ллÑ\83бÑ\83Ñ\82Ñ\82аÑ\80}}: $1.",
        "uploadlogpage": "Уларытыы устуоруйата",
        "uploadlogpagetext": "Манна бүтэһик уларытыылар тиһиктэрэ көстөр.\nӨссө [[Special:NewFiles|саҥа билэлэр]] тиһиктэрин көрүөххүн сөп.",
        "filename": "Билэ аата",
        "largefileserver": "Билэ ыйааһына көҥүллэммиттэн ордук.",
        "emptyfile": "Суруйбут билэҥ арааһа кураанах быһылаах. Баҕар билэ аатын сыыһа суруйбутуҥ буолаарай. Өссө төгүл көр.",
        "windows-nonascii-filename": "Бу биики ASCII табылыыссатыгар суох бэлиэлэри өйөөбөт..",
-       "fileexists": "Ð\98нник Ð°Ð°Ñ\82Ñ\82ааÑ\85 Ð±Ð¸Ð»Ñ\8d Ð±Ñ\8dлиÑ\8dÑ\80 Ð±Ð°Ð°Ñ\80 Ñ\8dбиÑ\82, Ð¾Ð½Ñ\83 Ñ\83лаÑ\80Ñ\8bÑ\82Ñ\8bаÑ\85Ñ\85Ñ\8bн саарбахтыыр буоллаххына - маны көр <strong>[[:$1]]</strong>.\n[[$1|thumb]]",
+       "fileexists": "Ð\9cаннÑ\8bк Ð°Ð°Ñ\82Ñ\82ааÑ\85 Ð±Ð¸Ð»Ñ\8d Ð±Ñ\8dлиÑ\8dÑ\80 Ð±Ð°Ð°Ñ\80 Ñ\8dбиÑ\82, Ð¾Ð½Ñ\83 Ñ\81олбÑ\83йÑ\83оÑ\85Ñ\85Ñ\83н саарбахтыыр буоллаххына - маны көр <strong>[[:$1]]</strong>.\n[[$1|thumb]]",
        "filepageexists": "Бу билэни быһаарар сирэй урут бу аатынан оҥоһуллубут эбит: <strong>[[:$1]]</strong>, ол гынан баран маннык ааттаах сирэй суох.\nКиллэрбит быһаарыыҥ быһаарыы сирэйигэр тахсыа суоҕа.\nСаҥа быһаарыыны эбэр буоллаххына илиигинэн уларытыаххын наада.\n[[$1|thumb]]",
-       "fileexists-extension": "Ð\9cайгÑ\8bннÑ\8bÑ\8bÑ\80 Ð°Ð°Ñ\82Ñ\82ааÑ\85 Ð±Ð¸Ð»Ñ\8d Ð±Ð°Ð°Ñ\80: [[$2|thumb]]\n* Ð­Ð½ Ñ\81Ñ\83Ñ\80Ñ\83йбÑ\83Ñ\82 Ð±Ð¸Ð»Ñ\8dÒ¥ Ð°Ð°Ñ\82а: <strong>[[:$1]]</strong>\n* Ð£Ñ\80Ñ\83ккÑ\83Ñ\82Ñ\82ан Ð±Ð°Ð°Ñ\80 Ð±Ð¸Ð»Ñ\8d Ð°Ð°Ñ\82а: <strong>[[:$2]]</strong>\nÐ\90Ñ\82Ñ\8bн Ð°Ð°Ñ\82Ñ\82а Ñ\82алаÑ\80Ñ\8bÒ¥ Ð±Ñ\83оллаÑ\80.",
+       "fileexists-extension": "Ð\9cайгÑ\8bннÑ\8bÑ\8bÑ\80 Ð°Ð°Ñ\82Ñ\82ааÑ\85 Ð±Ð¸Ð»Ñ\8d Ð±Ð°Ð°Ñ\80: [[$2|thumb]]\n* Ð­Ð½ Ñ\81Ñ\83Ñ\80Ñ\83йбÑ\83Ñ\82 Ð±Ð¸Ð»Ñ\8dÒ¥ Ð°Ð°Ñ\82а: <strong>[[:$1]]</strong>\n* Ð£Ñ\80Ñ\83ккÑ\83Ñ\82Ñ\82ан Ð±Ð°Ð°Ñ\80 Ð±Ð¸Ð»Ñ\8d Ð°Ð°Ñ\82а: <strong>[[:$2]]</strong>\nÐ\9eÑ\80дÑ\83к Ñ\83Ñ\80аÑ\82Ñ\8bлааÑ\85 Ð°Ð°Ñ\82Ñ\82а Ñ\82алÑ\8bаÑ\85Ñ\85Ñ\8bн Ð±Ð°Ò\95аÑ\80баккÑ\8bн Ð´Ñ\83о?",
        "fileexists-thumbnail-yes": "Ойуу арааһа кыччатыллыбыт ойуу (миниатюра) быһыылаах. [[$1|thumb]]\nКөр <strong>[[:$1]]</strong>.\nБу ойуу урукку ойуу кыччатыллыбыта буоллаҕына суруйар наадата суох.",
        "file-thumbnail-no": "Билэ аата мантан саҕаланар <strong>$1</strong>.\nАрааһа ойуу кыра куоппуйата быһыылаах ''(миниатюра)''.\nБу ойуу толору барыйаана баар буоллаҕына ону манна суруй, эбэтэр аатын уларыт.",
        "fileexists-forbidden": "Маннык ааттаах билэ баар, хат суруллар кыаҕа суох.\n\nСин биир бу билэни киллэриэххин баҕарар буоллаххына төннөн атыннык ааттаа. [[File:$1|thumb|center|$1]]",
        "filedelete-maintenance": "Көрүү-истии үлэтин кэмигэр билэлэри сотуу уонна төннөрүү быстах кэмҥэ тохтотулунна.",
        "filedelete-maintenance-title": "Билэни сотор табыллыбата",
        "mimesearch": "MIME көрдөөһүн",
-       "mimesearch-summary": "Бу сирэй MIME көрүҥнээх фильтрдааһыны көҥүллүүр. Киллэрии: contenttype/subtype, холобур <code>image/jpeg</code>.",
+       "mimesearch-summary": "Бу сирэй билэлэри MIME көрүҥнэринэн наардыыры хааччыйар. Киллэрии: contenttype/subtype, холобур <code>image/jpeg</code>.",
        "mimetype": "MIME көрүҥэ:",
        "download": "хачайдаан ылыы",
        "unwatchedpages": "Ким да кэтээбэт сирэйдэрэ",
        "randomincategory-invalidcategory": "\"$1\" диэн категория суох эбит.",
        "randomincategory-nopages": "Бу категорияҕа [[:Category:$1]] киирэр ыстатыйалар суохтар.",
        "randomincategory-category": "Категория:",
+       "randomincategory-legend": "Категория түбэспиччэ ыстатыйата",
        "randomredirect": "Түбэспиччэ утаарыы",
        "randomredirect-nopages": "Бу аат далыгар($1) көһөрөр ыйынньыктар суохтар.",
        "statistics": "Статистика",
        "delete-warning-toobig": "Бу сирэй уларыылара уһун историялаах, хас да ($1) {{PLURAL:$1|хат көрүүлээх|хат көрүүлэрдээх}}. Маны соттоххуна, {{SITENAME}} билэтин тиһигин алдьатыан сөп; салгыыр буоллаххына сэрэнэн үлэлээ.",
        "deleting-backlinks-warning": "'''Сэрэтии.''' Сотоору гынар сирэйгэр [[Special:WhatLinksHere/{{FULLPAGENAME}}|атын сирэйдэр]] сигэнэллэр эбит.",
        "rollback": "Уруккутугар төннөр",
-       "rollback_short": "Төннөрүү",
        "rollbacklink": "төннөр",
        "rollbacklinkcount": "$1 көннөрүүнү суох гын",
        "rollbacklinkcount-morethan": "$1 элбэх көннөрүүнү суох гын",
        "import-logentry-interwiki": "биикилэр ыккардыларынааҕы $1",
        "import-logentry-interwiki-detail": "барыта $2 барылтан $1 барыл",
        "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 test suite",
        "tooltip-pt-userpage": "Кыттааччы быһыытынан тус сирэйиҥ",
        "tooltip-pt-anonuserpage": "Билигин киирбит IP-м сирэйэ",
        "tooltip-pt-mytalk": "Кэпсэтэр-ырытар сириҥ",
index e2566eb..8401963 100644 (file)
        "last": "pric",
        "page_first": "prima",
        "page_last": "ùrtima",
-       "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",
+       "histlegend": "Pû cunfruntu 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 cancillati",
        "histfirst": "i cchiu' vecchî",
        "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-no-diff": "Nun si po' talïari stu cunfruntu tra virsioni pirchì na revisioni fu <strong>cancillata</strong>.\nSi ponnu a' vìdiri li dittagghî ntô [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} riggistru dî cancillazzioni].",
        "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.",
        "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",
+       "compareselectedversions": "Cunfrunta li virsioni scigghiuti",
        "showhideselectedversions": "Cancia la visibbilità dî virsioni scigghiuti",
        "editundo": "annulla",
        "diff-empty": "(Nudda diffirenza)",
        "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-hashes": "Nun fu' pussìbbili ottèniri l'hash dî file pi' fari lu cunfruntu.",
        "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\".",
        "tags-active-no": "No",
        "tags-edit": "cancia",
        "tags-hitcount": "$1 {{PLURAL:$1|canciamentu|canciamenti}}",
-       "comparepages": "Cunfronta pàggini",
+       "comparepages": "Cunfrunta pàggini",
        "compare-page1": "Pàggina 1",
        "compare-page2": "Pàggina 2",
        "compare-rev1": "Virsioni 1",
        "compare-rev2": "Virsioni 2",
-       "compare-submit": "Cunfronta",
+       "compare-submit": "Cunfrunta",
        "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.",
index 754767d..8f5acaa 100644 (file)
        "prefs-personal": "Podatki o uporabniku",
        "prefs-rc": "Zadnje spremembe",
        "prefs-watchlist": "Spisek nadzorov",
+       "prefs-editwatchlist": "Uredi spisek nadzorov",
+       "prefs-editwatchlist-label": "Uredite vnose na svojem spisku nadzorov:",
+       "prefs-editwatchlist-edit": "Preglejte in odstranite naslove s svojega spiska nadzorov",
+       "prefs-editwatchlist-raw": "Uredite gol spisek nadzorov",
+       "prefs-editwatchlist-clear": "Počistite svoj spisek nadzorov",
        "prefs-watchlist-days": "Število dni za prikaz na spisku nadzorov:",
        "prefs-watchlist-days-max": "Največ $1 {{PLURAL:$1|dan|dneva|dni}}",
        "prefs-watchlist-edits": "Število urejanj za prikaz na razširjenem spisku nadzorov:",
index 1e645cc..9d2c85e 100644 (file)
@@ -25,7 +25,8 @@
                        "Михајло Анђелковић",
                        "לערי ריינהארט",
                        "아라",
-                       "Nemo bis"
+                       "Nemo bis",
+                       "Aktron"
                ]
        },
        "tog-underline": "Подвлачење веза:",
        "content-model-text": "чист текст",
        "content-model-javascript": "јаваскрипт",
        "content-model-css": "CSS",
+       "content-json-empty-object": "Празан објекат",
        "expensive-parserfunction-warning": "'''Упозорење:''' ова страница садржи превише позива за рашчлањивање.\n\nТребало би да има мање од $2 {{PLURAL:$2|позив|позива|позива}}, а сада има $1.",
        "expensive-parserfunction-category": "Странице с превише позива за рашчлањивање",
        "post-expand-template-inclusion-warning": "'''Упозорење:''' величина укљученог шаблона је превелика.\nНеки шаблони неће бити укључени.",
        "prefs-personal": "Профил",
        "prefs-rc": "Скорашње измене",
        "prefs-watchlist": "Списак надгледања",
+       "prefs-editwatchlist": "Уређивање списка надгледања",
+       "prefs-editwatchlist-label": "Уређивање списка:",
+       "prefs-editwatchlist-edit": "Уреди списак",
+       "prefs-editwatchlist-raw": "Уреди сиров списак",
+       "prefs-editwatchlist-clear": "Испразни списак",
        "prefs-watchlist-days": "Број дана у списку надгледања:",
        "prefs-watchlist-days-max": "Највише $1 {{PLURAL:$1|дан|дана|дана}}",
        "prefs-watchlist-edits": "Највећи број измена у проширеном списку надгледања:",
        "action-viewmywatchlist": "преглед вашег списак надгледања",
        "action-viewmyprivateinfo": "прегледање ваших личних података",
        "action-editmyprivateinfo": "уређивање ваших личних података",
+       "action-managechangetags": "прављење и/или брисање ознака из базе података",
        "nchanges": "$1 {{PLURAL:$1|измена|измене|измена}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|измена од ваше последње посете}}",
        "enhancedrc-history": "историја",
        "import": "Увоз страница",
        "importinterwiki": "Међувики увоз",
        "import-interwiki-text": "Изаберите вики и наслов странице за увоз.\nДатуми и имена уредника ће бити сачувани.\nСве радње при увозу с других викија су забележене у [[Special:Log/import|дневнику увоза]].",
+       "import-interwiki-sourcewiki": "Изворна вики:",
+       "import-interwiki-sourcepage": "Изворна страница:",
        "import-interwiki-history": "Копирај све верзије историје за ову страницу",
        "import-interwiki-templates": "Укључи све шаблоне",
        "import-interwiki-submit": "Увези",
        "javascripttest": "Јаваскрипт тест",
        "javascripttest-pagetext-noframework": "Ова страница је резервисана за извршавање јаваскрипт тестова.",
        "javascripttest-pagetext-unknownframework": "Непознати радни оквир „$1“.",
+       "javascripttest-pagetext-unknownaction": "Непозната радња „$1“.",
        "javascripttest-pagetext-frameworks": "Изаберите један од следећих радних оквира: $1",
        "javascripttest-pagetext-skins": "Изаберите с којом темом желите да покренете пробу:",
        "javascripttest-qunit-intro": "Погледајте [$1 документацију за тестирање] на mediawiki.org.",
        "watchlistedit-clear-legend": "Испразни списак надгледања",
        "watchlistedit-clear-explain": "Сви наслови ће бити уклоњени из вашег списка надгледања.",
        "watchlistedit-clear-titles": "Наслови:",
-       "watchlistedit-clear-submit": "Испразни списак надгледања (Ово је трајно!)",
+       "watchlistedit-clear-submit": "Испразни списак надгледања (Ово је неповратно!)",
        "watchlistedit-clear-done": "Ваш списак надгледања је испражњен.",
        "watchlistedit-clear-removed": "{{PLURAL:$1|1 наслов је уклоњен|$1 наслова су уклоњена|$1 наслова је уклоњено}}:",
        "watchlistedit-too-many": "Има превише страница за приказ овде.",
        "version-ext-colheader-description": "Опис",
        "version-ext-colheader-credits": "Аутори",
        "version-license-title": "Лиценца за $1",
+       "version-license-not-found": "За ову екстензију није нађена информација о лиценци.",
        "version-poweredby-credits": "Овај вики покреће '''[https://www.mediawiki.org/ Медијавики]''', ауторска права © 2001-$1 $2.",
        "version-poweredby-others": "остали",
        "version-poweredby-translators": "translatewiki.net преводиоци",
        "tags-active-no": "Не",
        "tags-edit": "уреди",
        "tags-hitcount": "$1 {{PLURAL:$1|измена|измене|измена}}",
+       "tags-create-heading": "Нова ознака",
+       "tags-create-already-exists": "Ознака „$1“ већ постоји.",
+       "tags-create-warnings-below": "Правите нову ознаку, желите ли да наставите?",
+       "tags-delete-title": "Брисање ознака",
+       "tags-delete-explanation-initial": "Бришете ознаку „$1“ из базе података.",
+       "tags-activate-title": "Активирање ознака",
+       "tags-activate-question": "Активирате ознаку „$1“.",
+       "tags-activate-not-allowed": "Није могуће активирати ознаку „$1“.",
+       "tags-activate-not-found": "Ознака „$1“ не постоји.",
+       "tags-deactivate-title": "Деактивирање ознака",
        "comparepages": "Упоређивање страница",
        "compare-page1": "Страница 1",
        "compare-page2": "Страница 2",
        "logentry-upload-upload": "$1 је {{GENDER:$2|послао|послала}} $3",
        "logentry-upload-overwrite": "$1 је {{GENDER:$2|послао|послала}} нову верзију $3",
        "logentry-upload-revert": "$1 је {{GENDER:$2|послао|послала}} $3",
+       "logentry-managetags-create": "$1 је {{GENDER:$2|направио|направила}} ознаку „$4“",
+       "logentry-managetags-delete": "$1 је {{GENDER:$2|обрисао|обрисала}} ознаку „$4“ (уклоњена је из $5 {{PLURAL:$5|измене или дневника|измена и/или дневника}})",
+       "logentry-managetags-activate": "$1 је {{GENDER:$2|активирао|активирала}} ознаку „$4“ за употребу од стране корисника и ботова",
+       "logentry-managetags-deactivate": "$1 је {{GENDER:$2|деактивирао|деактивирала}} ознаку „$4“ за употребу од стране корисника и ботова",
        "rightsnone": "(нема)",
        "revdelete-summary": "опис измене",
        "feedback-bugornote": "Ако сте спремни да детаљно опишете технички проблем, онда [$1 пријавите грешку].\nУ супротном, послужите се једноставним обрасцем испод. Ваш коментар ће стајати на страници „[$3 $2]“, заједно с корисничким именом и прегледачем који користите.",
        "duration-millennia": "$1 {{PLURAL:$1|миленијум|миленијума|миленијума}}",
        "rotate-comment": "Слика је ротирана за $1° у смеру казаљке на сату",
        "limitreport-cputime-value": "$1 {{PLURAL:$1|секунда|секунд|секунди}}",
+       "limitreport-walltime": "Коришћење у реалном времену",
        "limitreport-walltime-value": "$1 {{PLURAL:$1|секунда|секунди}}",
        "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|бајт|бајта|бајтова}}",
        "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|бајт|бајта|бајтова}}",
index 2747efe..d0342f1 100644 (file)
        "watchlistedit-clear-legend": "Isprazni 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-submit": "Isprazni spisak nadgledanja (Ovo je nepovratno!)",
        "watchlistedit-clear-done": "Vaš spisak nadgledanja je ispražnjen.",
        "watchlistedit-clear-removed": "{{PLURAL:$1|1 naslov je uklonjen|$1 naslova su uklonjena|$1 naslova je uklonjeno}}:",
        "watchlistedit-too-many": "Ima previše stranica za prikaz ovde.",
index 7d729fb..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.",
        "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 6a5cb68..242c943 100644 (file)
@@ -61,7 +61,9 @@
                        "Abbedabb",
                        "Platinawolf",
                        "Albinomamba",
-                       "Stens51"
+                       "Stens51",
+                       "Boom",
+                       "Marfuas"
                ]
        },
        "tog-underline": "Stryk under länkar:",
        "prefsnologintext2": "Var god logga in för att ändra dina inställningar.",
        "prefs-skin": "Utseende",
        "skin-preview": "Förhandsvisning",
-       "datedefault": "Ovidkommande",
+       "datedefault": "Ingen preferens",
        "prefs-labs": "Testfunktioner",
        "prefs-user-pages": "Användarsidor",
        "prefs-personal": "Mitt konto",
        "prefs-rc": "Senaste ändringar",
        "prefs-watchlist": "Bevakningslista",
+       "prefs-editwatchlist": "Redigera bevakningslistan",
+       "prefs-editwatchlist-label": "Redigera poster på din bevakningslista:",
+       "prefs-editwatchlist-edit": "Visa och ta bort titlar på din bevakningslista",
+       "prefs-editwatchlist-raw": "Redigera bevakningslistan i råformat",
+       "prefs-editwatchlist-clear": "Rensa din bevakningslista",
        "prefs-watchlist-days": "Antal dygn som skall visas i bevakningslistan:",
        "prefs-watchlist-days-max": "Maximalt $1 {{PLURAL:$1|dag|dygn}}",
        "prefs-watchlist-edits": "Maximalt antal redigeringar som visas i utökad bevakningslista:",
        "prefs-help-signature": "Kommentarer på diskussionssidor ska signeras med \"<nowiki>~~~~</nowiki>\", vilket konverteras till din signatur och tidpunkt.",
        "badsig": "Det är något fel med råsignaturen, kontrollera HTML-koden.",
        "badsiglength": "Din signatur är för lång.\nDen får inte vara längre än $1 {{PLURAL:$1|tecken|tecken}}.",
-       "yourgender": "Hur vill du bli adresserad?",
-       "gender-unknown": "Jag föredrar att inte specificera",
+       "yourgender": "Hur vill du att andra refererar till dig?",
+       "gender-unknown": "Jag föredrar att inte uppge det",
        "gender-male": "Han redigerar wikisidor",
        "gender-female": "Hon redigerar wikisidor",
        "prefs-help-gender": "Denna inställning är valfri.\nProgramvaran använder detta värde för att adressera dig till andra med rätt genus. Denna information kommer att vara offentlig.",
        "prefs-displayrc": "Visningsalternativ",
        "prefs-displaywatchlist": "Visningalternativ",
        "prefs-tokenwatchlist": "Nyckel",
-       "prefs-diffs": "Skillnader",
+       "prefs-diffs": "Versiondifferenser",
        "prefs-help-prefershttps": "Ändringar av denna inställning börjar gälla nästa gång du loggar in",
        "prefswarning-warning": "Du har gjort ändringar i dina inställningarna som inte har sparats ännu.\nOm du lämnar denna sida utan att klicka på \"$1\" kommer dina inställningar inte att uppdateras.",
        "prefs-tabs-navigation-hint": "Tips: Du kan använda vänster och höger piltangenterna för att navigera mellan flikarna i listan flikar.",
        "right-suppressionlog": "Se privata loggar",
        "right-block": "Blockera andra användare från att redigera",
        "right-blockemail": "Blockera användare från att skicka e-post",
-       "right-hideuser": "Blockera ett användarnamn och dölja det från allmänheten",
+       "right-hideuser": "Blockera ett användarnamn och dölj det från allmänheten",
        "right-ipblock-exempt": "Kan redigera från blockerade IP-adresser",
        "right-proxyunbannable": "Kan redigera från blockerade proxyer",
        "right-unblockself": "Avblockera sig själv",
        "right-override-export-depth": "Exportera sidor inklusive länkade sidor till ett djup på 5",
        "right-sendemail": "Skicka e-post till andra användare",
        "right-passwordreset": "Visa e-postmeddelanden med lösenordsåterställning",
+       "right-managechangetags": "Skapa och radera [[Special:Tags|taggar]] från databasen",
        "newuserlogpage": "Logg över nya användare",
        "newuserlogpagetext": "Detta är en logg över nya användarkonton.",
        "rightslog": "Användarrättighetslogg",
        "rightslogtext": "Detta är en logg över ändringar av användares rättigheter.",
-       "action-read": "läsa denna sida",
+       "action-read": "läs denna sida",
        "action-edit": "redigera denna sida",
        "action-createpage": "skapa sidor",
        "action-createtalk": "skapa diskussionssidor",
        "action-viewmyprivateinfo": "visa din privata information",
        "action-editmyprivateinfo": "redigera din privata information",
        "action-editcontentmodel": "ändra innehållsmodellen för en sida",
+       "action-managechangetags": "skapa och radera taggar från databasen",
        "nchanges": "$1 {{PLURAL:$1|ändring|ändringar}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|sedan senaste besöket}}",
        "enhancedrc-history": "historik",
        "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",
        "filehist-comment": "Kommentar",
        "imagelinks": "Filanvändning",
        "linkstoimage": "Följande {{PLURAL:$1|sida|$1 sidor}} länkar till den här filen:",
-       "linkstoimage-more": "Mer änr {{PLURAL:$1|en sida|$1 sidor}} länkar till den här filen.\nFöljande lista visar bara {{PLURAL:$1|den första sidan|de $1 första sidorna}} som länkar till filen.\nDet finns en [[Special:WhatLinksHere/$2|fullständig lista]].",
+       "linkstoimage-more": "Mer än {{PLURAL:$1|en sida|$1 sidor}} länkar till den här filen.\nFöljande lista visar bara {{PLURAL:$1|den första sidan|de $1 första sidorna}} som länkar till filen.\nDet finns en [[Special:WhatLinksHere/$2|fullständig lista]].",
        "nolinkstoimage": "Inga sidor länkar till den här filen.",
        "morelinkstoimage": "Visa [[Special:WhatLinksHere/$1|fler länkar]] till den här filen.",
        "linkstoimage-redirect": "$1 (filomdirigering) $2",
        "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)",
        "tags-tag": "Märkesnamn",
        "tags-display-header": "Utseende på listor över ändringar",
        "tags-description-header": "Full beskrivning av betydelse",
+       "tags-source-header": "Källa",
        "tags-active-header": "Aktiv?",
        "tags-hitcount-header": "Märkta ändringar",
+       "tags-actions-header": "Handlingar",
        "tags-active-yes": "Ja",
        "tags-active-no": "Nej",
+       "tags-source-extension": "Definieras av ett tillägg",
+       "tags-source-manual": "Används manuellt av användare och robotar",
+       "tags-source-none": "Används inte längre",
        "tags-edit": "redigera",
+       "tags-delete": "radera",
+       "tags-activate": "aktivera",
+       "tags-deactivate": "inaktivera",
        "tags-hitcount": "$1 {{PLURAL:$1|ändring|ändringar}}",
+       "tags-manage-no-permission": "Du har inte behörighet att hantera förändringstaggar.",
+       "tags-create-heading": "Skapa en ny tag",
+       "tags-create-explanation": "Som standard, kommer nyskapade taggar att bli tillgängliga för användning av användare och botar.",
+       "tags-create-tag-name": "Taggnamn:",
+       "tags-create-reason": "Anledning:",
+       "tags-create-submit": "Skapa",
+       "tags-create-no-name": "Du måste ange ett taggnamn.",
+       "tags-create-invalid-chars": "Taggnamn får inte innehålla kommatecken (<code>,</code>) eller snedstreck (<code>/</code>).",
+       "tags-create-invalid-title-chars": "Taggnamn får inte innehålla tecken som inte kan användas i sidtitlar.",
+       "tags-create-already-exists": "Taggen \"$1\" finns redan.",
+       "tags-create-warnings-above": "Följande {{PLURAL:$2|varning |varningar}} stöttes på när du försöker skapa etiketten \" $1 \":",
+       "tags-create-warnings-below": "Vill du fortsätta att skapa taggen?",
+       "tags-delete-title": "Radera tagg",
+       "tags-delete-explanation-initial": "Du är på väg att ta bort taggen \"$1\" från databasen.",
+       "tags-delete-explanation-in-use": "Den kommer att tas bort från {{PLURAL:$2|$2 sidversioner eller loggposter|alla $2 sidversioner och/eller loggposter}} som den för närvarande används på.",
+       "tags-delete-explanation-warning": "Denna åtgärd är <strong>oåterkallelig</strong> och <strong>kan inte ångras</strong>, inte ens av databasadministratörer. Var säker på att detta är den tagg du vill radera.",
+       "tags-delete-explanation-active": "<strong>Taggen\" $1 \" är fortfarande aktiv, och kommer att fortsätta att appliceras i framtiden.</strong> För att hindra detta, gå till den eller de platser där taggen är inställd att användas, och inaktivera den där.",
+       "tags-delete-reason": "Anledning:",
+       "tags-delete-submit": "Radera denna tagg oåterkalleligen",
+       "tags-delete-not-allowed": "Tagg definierade med ett tillägg kan inte raderas utan att tillägget specifikt tillåter det.",
+       "tags-delete-not-found": "Taggen \"$1\" finns inte.",
+       "tags-delete-too-many-uses": "Taggen \"$1\" appliceras på mer än $2 {{PLURAL:$2|version|versioner}}, vilket innebär att den inte kan raderas.",
+       "tags-delete-warnings-after-delete": "Taggen \"$1\" raderades, men följande {{PLURAL:$2|varning|varningar}} inträffade:",
+       "tags-activate-title": "Aktivera tagg",
+       "tags-activate-question": "Du är på väg att aktivera taggen \"$1\".",
+       "tags-activate-reason": "Anledning:",
+       "tags-activate-not-allowed": "Det är inte möjligt att aktivera taggen \"$1\".",
+       "tags-activate-not-found": "Taggen \"$1\" finns inte.",
+       "tags-activate-submit": "Aktivera",
+       "tags-deactivate-title": "Inaktivera tagg",
+       "tags-deactivate-question": "Du är på väg att inaktivera taggen \"$1\".",
+       "tags-deactivate-reason": "Anledning:",
+       "tags-deactivate-not-allowed": "Det är inte möjligt att inaktivera taggen \"$1\".",
+       "tags-deactivate-submit": "Inaktivera",
        "comparepages": "Jämför sidor",
        "compare-page1": "Sida 1",
        "compare-page2": "Sida 2",
        "logentry-upload-upload": "$1 {{GENDER:$2|laddade upp}} $3",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|laddade upp}} en ny version av $3",
        "logentry-upload-revert": "$1 {{GENDER:$2|laddade upp}} $3",
+       "log-name-managetags": "Tagghanterings logg",
+       "log-description-managetags": "Denna sida innehåller administrativa [[Special:Tags|märke]]srelaterade uppgifter. Loggen innehåller bara åtgärder som utförts manuellt av en administratör; märken kan skapas eller raderas av wikins mjukvara utan att en post registreras i loggen.",
+       "logentry-managetags-create": "$1 {{GENDER:$2|skapade}} taggen \"$4\"",
+       "logentry-managetags-delete": "$1 {{GENDER:$2|raderade}} taggen \"$4\" (borttagen från $5 {{PLURAL:$5|version eller loggpost|versioner och/eller loggposter}})",
+       "logentry-managetags-activate": "$1 {{GENDER:$2|aktiverade}} taggen \"$4\" för användning av användare och botar.",
+       "logentry-managetags-deactivate": "$1 {{GENDER:$2|inaktiverade}} taggen \"$4\" för användning av användare och botar.",
        "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 lämna 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 00766b7..30cd690 100644 (file)
        "permalink": "Link do tyj wersyje zajty",
        "print": "Drukuj",
        "view": "Podglůnd",
+       "view-foreign": "Uobejrzij we {{grammar:MS.lp|$1}}",
        "edit": "Sprowjej",
        "create": "Stwůrz",
+       "create-local": "Wkludź lokalny uopis",
        "editthispage": "Sprowjej ta zajta",
        "create-this-page": "Stwůrz ta zajta",
        "delete": "Wyćep",
        "otherlanguages": "We inkszych godkach",
        "redirectedfrom": "(Punkńyńto ze $1)",
        "redirectpagesub": "Zajta przekerowujůnco",
+       "redirectto": "Przekerowańy do:",
        "lastmodifiedat": "Ta zajta bůła uostatńo sprowjano $2, $1.",
        "viewcount": "W ta zajta filowano {{PLURAL:$1|tylko roz|$1 rozůw}}.",
        "protectedpage": "Zajta zawarto",
        "loginlanguagelabel": "Godka: $1",
        "suspicious-userlogout": "Polecyńe wylogowańo uostoło uodćepńynte skiż tygo co wyglůnda, aże uostoło posłane bez uszkodzůna przeglůndarka abo buforujůncy serwer proxy.",
        "createacct-another-realname-tip": "Wszkryflańy twojigo mjana a nazwiska ńy je końyczne.\nKej bydźesz chćoł je podoć, bydům użyte, coby dokůmyntowoć Twoje autorstwo.",
+       "pt-login": "Zaloguj śe",
+       "pt-createaccount": "Twůrz nowe kůnto",
        "php-mail-error-unknown": "Ńyznany feler we funkcyji mail()",
        "user-mail-no-addy": "Průba posłańo e‐brifa bez adresu uodbjorcy",
        "user-mail-no-body": "Bůła průba posłańo e-brifa uo blank abo krůtkim tekśće.",
        "preview": "Uobźyrańy",
        "showpreview": "Uobźyrej",
        "showdiff": "Pozdrzyj na půmjyńańy",
-       "anoneditwarning": "Ńy jeżeś terozki zalogowany. We gyszichće sprowjyń tyj zajty bydźe naszkryflůny twůj ausdruk IP.",
+       "anoneditwarning": "<strong>Dej pozůr:</strong> Ńy jeżeś zalogůwany. Twůj IP ausdruk bydźe bez wszyjskich widoczny eli zrobisz egal jako půmjana. Eli <strong>[$1 zalogůjesz śe]</strong> abo <strong>[$2 stworzisz kůnto]</strong>, Twoje půmjany bydům przipisane do kůnta, wroz ze inkszymi korzyśćůma.",
        "anonpreviewwarning": "Ńy jeżeś zalogowany. Twój IP ausdruk uostańy spamjyntany, eli ty bydźesz sprowjać zajte.",
        "missingsummary": "'''Pozůr:''' Ńy wprowadźůł żeś uopisu pomjyńań. Kej go ńy chcesz wprowadzać, naćiś knefel Spamjyntej jeszcze roz.",
        "missingcommenttext": "Wćepej kůmyntorz půńiżyj.",
        "suppressionlog": "Log schrůńyńć",
        "suppressionlogtext": "Půńiżyj je lista nojnowszych wyćepań a zawarć s uwzglyndńyńym treśći schrůńůnej lo admińistratorůw. Coby przejrzeć lista teroźnych banůw a zawarć, uobezdrzij [[Special:BlockList|IP block list]].",
        "mergehistory": "Połůncz historyjo půmjyńań zajtůw",
-       "mergehistory-header": "Ta zajta dozwolo pouůnčyć historyje půmjyńań jydnyj zajty s inkšům, nowšům zajtům. Dej pozůr, coby sprawjyńy douo ćůnguo historyjo půmjyńań zajty w jeji historyji.",
-       "mergehistory-box": "Pouůnč historyjo sprowjyń dwůch zajtůw:",
-       "mergehistory-from": "Zajta zdřůduowo:",
+       "mergehistory-header": "Ta zajta moze skuplować gyszichta půmjan jednyj zajty ze gyszichtům inkszyj, nowszyj zajty.\nDej pozůr, co půmjany dali bydům mjoły historyczno ćůngłość edycyji zajty.",
+       "mergehistory-box": "Skupluj gyszichta sprowjyń dwůch zajtůw:",
+       "mergehistory-from": "Zdrzůdłowo zajta:",
        "mergehistory-into": "Zajta docelowo:",
-       "mergehistory-list": "Historyjo půmjyńań idźe pouůnčyć",
-       "mergehistory-merge": "Nastympujůnce půmjyńyńo zajty [[:$1]] idźe scalić s [[:$2]]. Uoznač w kolůmńy kropkům kero zmjana, uůnčńy s wčeśńijšymi, mo być scalůno. Užyće cajchůndzkůw uod nawigacyji kasuje wybůr we kolůmńy.",
-       "mergehistory-go": "Pokož půmjyńańo kere idźe scalić",
+       "mergehistory-list": "Gyszichta půmjyńań do śe skuplować",
+       "mergehistory-merge": "Nastympujůnce půmjyńyńo zajty [[:$1]] idźe scalić s [[:$2]]. Uoznocz we kolůmńy kropkům kero zmjana, wroz ze wcześńijszymi, mo być scalůno. Użyće linkůw uod nawigacyji kasuje wybůr we kolůmńy.",
+       "mergehistory-go": "Pokoż půmjyńańo kere idźe scalić",
        "mergehistory-submit": "Scal historyjo půmjyńań",
-       "mergehistory-empty": "Ńy mo historyje zmjan do scalyńa.",
-       "mergehistory-success": "$3 {{PLURAL:$3|pomjyńańe|pomjyńańa|pomjyńań}} w [[:$1]] ze sukcesym zostouo scalonych ze [[:$2]].",
-       "mergehistory-fail": "Ńy idźe scalić historyje půmjyńań. Zmjyń štalowańo parametrůw tyj uoperacyji.",
-       "mergehistory-no-source": "Ńy mo sam zajty zdřůduowyj $1.",
+       "mergehistory-empty": "Ńy mo historyje zmjan do scalyńo.",
+       "mergehistory-success": "$3 {{PLURAL:$3|pomjyńańe|pomjyńańa|pomjyńań}} we [[:$1]] ze sukcesym uostało scalonych ze [[:$2]].",
+       "mergehistory-fail": "Ńy idźe scalić historyje půmjyńań. Zmjyń sztalowańo parametrůw tyj uoperacyji.",
+       "mergehistory-no-source": "Ńy ma sam zajty zdrzůdłowyj $1.",
        "mergehistory-no-destination": "Ńy ma sam zajty docelowyj $1.",
-       "mergehistory-invalid-source": "Zajta zdřůduowo muśi mjeć poprowne mjano.",
-       "mergehistory-invalid-destination": "Zajta docelowo muśi mjeć poprowne mjano.",
-       "mergehistory-autocomment": "Historyjo [[:$1]] scalono ze [[:$2]]",
-       "mergehistory-comment": "Historyjo [[:$1]] pouůnčůno ze [[:$2]]: $3",
-       "mergehistory-same-destination": "Zajta zdřuduowo a docelowo ńy mogům być te same.",
+       "mergehistory-invalid-source": "Zajta zdrzůdłowo muśi mjeć poprawne mjano.",
+       "mergehistory-invalid-destination": "Zajta docelowo muśi mjeć poprawne mjano.",
+       "mergehistory-autocomment": "Historyjo [[:$1]] skuplowano ze [[:$2]]",
+       "mergehistory-comment": "Historyjo [[:$1]] skuplowano ze [[:$2]]: $3",
+       "mergehistory-same-destination": "Zajta zdrzůdłowo a docelowo ńy mogům być te same.",
        "mergehistory-reason": "Kůmyntorz:",
-       "mergelog": "Pouůnčůne",
+       "mergelog": "Skuplowane",
        "revertmerge": "Uodkupluj",
-       "mergelogpagetext": "PůÅ\84¾ej znojduje Å\9be lista uostatÅ\84ich pouůnÄ\8dyń historyji půmjyńań zajtůw.",
+       "mergelogpagetext": "PůÅ\84¼yj je lista uostatÅ\84ich kuplowań historyji půmjyńań zajtůw.",
        "history-title": "Gyszichta sprowjyń \"$1\"",
-       "difference-multipage": "(Porůwnańje zajt)",
+       "difference-multipage": "(Porůwnańy zajt)",
        "lineno": "Lińijo $1:",
        "compareselectedversions": "zrůwnej uobrane wersyje",
        "showhideselectedversions": "Ukoż/ukryj uobrane wersyje",
        "difference-missing-revision": "{{PLURAL:$2|Wersyjo|$2 wersyje|$2 wersyji}} #$1 zajty \"{{PAGENAME}}\" ńy {{PLURAL:$2|uostoła znaleźůno|uostoły znaleźůne|uostoło znaleźůnych}}. Zauobycz je to skiż starygo linky do wyćępanyj zajty. Powůd wyćepańa nojdźesz we [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rejerze].",
        "searchresults": "Wyńiki sznupańo",
        "searchresults-title": "Wyniki sznupańo za „$1”",
-       "titlematches": "Znejdźono we titlach:",
+       "titlematches": "Znolyźono we titlach:",
        "textmatches": "Znejdźono na zajtach:",
        "notextmatches": "Ńy znejdźono we tekście zajtůw",
        "prevn": "poprzedńe {{PLURAL:$1|$1}}",
-       "nextn": "nastympne {{PLURAL:$1|$1}}",
+       "nextn": "nostympne {{PLURAL:$1|$1}}",
        "prevn-title": "{{PLURAL:$1|Poprzedńi|Poprzedńe}} $1 {{PLURAL:$1|wyńik|wyńiki|wyńikůw}}",
-       "nextn-title": "{{PLURAL:$1|Dolszy|Dolsze|Dolszych}} $1 {{PLURAL:$1|wyńik|wyńiki|wyńikůw}}",
+       "nextn-title": "{{PLURAL:$1|Dalszy|Dalsze|Dalszych}} $1 {{PLURAL:$1|wyńik|wyńiki|wyńikůw}}",
        "shown-title": "Ukoż $1 {{PLURAL:$1|wynik|wyniki|wynikůw}} lo zajta",
        "viewprevnext": "Uobźyrej ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "'''Ńy ma zajty uo mjańy \"[[:$1]]\" na tyj wiki'''",
-       "searchmenu-new": "'''Stwůrz zajta „[[:$1|$1]]” na tyj wiki!'''",
+       "searchmenu-new": "<strong>Stwůrz zajta „[[:$1]]” na tyj wiki!</strong> {{PLURAL:$2|0=|Uobejrzij tyż zajta ze wyńikůma sznupańo.|Uobejrzij tyż wyńiki sznupańo.}}",
        "searchprofile-articles": "Zajty",
        "searchprofile-images": "Multimedyja",
        "searchprofile-everything": "Wszyjsko",
        "search-redirect": "(půnkńyńćy $1)",
        "search-section": "(tajla $1)",
        "search-suggest": "Myśloł żeś: $1 ?",
-       "search-interwiki-caption": "Śostřane projekty",
+       "search-interwiki-caption": "Śostrzane projekty",
        "search-interwiki-default": "$1 wyńiki:",
        "search-interwiki-more": "(wjyncyj)",
        "search-relatedarticle": "Podane",
        "searchrelated": "podane",
        "searchall": "wszyjske",
-       "showingresults": "To lista na keryj je {{PLURAL:$1|'''1''' wyńik|'''$1''' wyńikůw}}, počynojůnc uod nůmeru '''$2'''.",
+       "showingresults": "To lista na keryj je {{PLURAL:$1|'''1''' wyńik|'''$1''' wyńikůw}}, sztartujůnc uod nůmery '''$2'''.",
        "search-nonefound": "Ńy mo wynikůw, kere uodpadajům kryterjům zapytańo.",
        "powersearch-legend": "Sznupańy zaawansowane",
        "powersearch-ns": "Sznupej we przestrzyńach mjan:",
        "powersearch-toggleall": "Wszyjsko",
        "powersearch-togglenone": "żodno",
        "search-external": "Zewnyntrzne sznupańy",
-       "searchdisabled": "Šnupańy we {{GRAMMAR:MS.lp|{{SITENAME}}}} zostouo zawarte. Zańim go zouůnčům, možeš sprůbować šnupańo bez Google. Ino zauwaž, co informacyje uo treśći {{GRAMMAR:MS.lp|{{SITENAME}}}} můgům być we Google ńyakuratne.",
+       "searchdisabled": "Sznupańy we {{GRAMMAR:MS.lp|{{SITENAME}}}} uostoło zawarte. Ńim go uotworzům nazod, moges sprůbować sznupańo bez Google. Ino zauważ, co informacyje uo treśći {{GRAMMAR:MS.lp|{{SITENAME}}}} můgům być we Google ńyaktuelne.",
        "search-error": "Wystůmpjůł feler przi sznupańu: $1",
        "preferences": "Preferyncyje",
        "mypreferences": "Preferyncyje",
        "datedefault": "Důmyślny",
        "prefs-labs": "Funkcyje \"labs\"",
        "prefs-user-pages": "Zajty używaczy",
-       "prefs-personal": "Dane užytkowÅ\84ika",
+       "prefs-personal": "Dane używocza",
        "prefs-rc": "Ńydowno pomjyńane",
        "prefs-watchlist": "Pozůrlista",
-       "prefs-watchlist-days": "Ličba dńi widočnych na liśće artikli, na kere dowoš pozůr:",
+       "prefs-watchlist-days": "Liczba dńůw widocznych na liśće artikli, na kere dowosz pozůr:",
        "prefs-watchlist-days-max": "Max $1 {{PLURAL:$1|dźyń|dńi}}",
-       "prefs-watchlist-edits": "Ličba půmjyńań pokazywanych we rozšyřůnyj liśće artiklůw, na kere dowoš pozůr:",
+       "prefs-watchlist-edits": "Liczba půmjyńań pokozywanych we rozszyrzůnyj liśće artiklůw, na kere dowosz pozůr:",
        "prefs-watchlist-edits-max": "Maksymalno liczba: 1000",
        "prefs-watchlist-token": "ID pozůrlisty:",
        "prefs-misc": "Roztůmajte",
        "rows": "Wjyrsze:",
        "columns": "Kolůmny:",
        "searchresultshead": "Sznupańy",
-       "stub-threshold": "Maksymalny rozmjar artikla uoznačanygo kej <a href=\"#\" class=\"stub\">stub (kůnsek)</a>",
+       "stub-threshold": "Maksymalny rozmjar artikla uoznaczanygo kej <a href=\"#\" class=\"stub\">stub (kůnsek)</a>",
        "stub-threshold-disabled": "Uodymkńynte",
-       "recentchangesdays": "Ličba dńi do pokazańo we půmjyńanych na uostatku:",
+       "recentchangesdays": "Liczba dńůw do pokazańo we půmjyńanych na uostatku:",
        "recentchangesdays-max": "(maksymalńy $1 {{PLURAL:$1|dźyń|dńi}})",
        "recentchangescount": "Liczba pozycyji na liśće půmjyńanych na uostatku, we historyje zajtůw a zajtach rejerůw:",
        "prefs-help-recentchangescount": "Ze listům ńydawnych pomjyńan, gyszichta zajt a rejer.",
-       "savedprefs": "Twoje štalowańo we preferyncyjach zostouy naškryflane.",
+       "savedprefs": "Twoje sztalowańo we preferyncyjach zostoły naszkryflane.",
        "timezonelegend": "Czasowo sztrefa",
        "localtime": "Lokalny czas:",
        "timezoneuseserverdefault": "Użyj domyślnygo czasu serwera ($1)",
        "userrights-nodatabase": "Baza danych $1 ńy istńije abo ńy je lokalno.",
        "userrights-nologin": "Muśisz [[Special:UserLogin|zalůgować śe]] na kůnto admińistratora, coby nadować uprawńyńo użytkowńikům.",
        "userrights-notallowed": "Ńy mosz dostympu do nadawańo uprawńyń używaczom.",
-       "userrights-changeable-col": "Grupy, kere možeš wybrać",
-       "userrights-unchangeable-col": "Grupy, kerych ńy možeš wybrać",
+       "userrights-changeable-col": "Grupy, kere moges wybrać",
+       "userrights-unchangeable-col": "Grupy, kerych ńy moges wybrać",
        "group": "Grupa:",
        "group-user": "Używacze",
        "group-autoconfirmed": "Autůmatyczńy zatwjerdzůne używacze",
        "right-edit": "Sprowjej zajty",
        "right-createpage": "Utworzůne zajty (kere ńy sům zajtůma godki)",
        "right-createtalk": "Utworzůne zajty godki",
-       "right-createaccount": "Utwořůne nowe kůnta užytkowńikůw",
+       "right-createaccount": "Utworzůne nowe kůnta użytkowńikůw",
        "right-minoredit": "Uoznocz půmjyńańo kej drobne",
        "right-move": "Przećepane zajty",
        "right-move-subpages": "Przećep zajty wroz ze jejich podzajtůma",
        "right-move-rootuserpages": "Przekludzańy zajtůw uod użytkowńikůw",
-       "right-movefile": "Przećepańe plikůw",
+       "right-movefile": "Przećepowańy plikůw",
        "right-suppressredirect": "Ńy twůrz przekerowańo ze starygo mjana jak przećepujesz zajta",
        "right-upload": "Wćepane pliki",
-       "right-reupload": "Nadpisuj pliki kere sam juž sům wćepane",
-       "right-reupload-own": "Nadpisuj plik wćepany sam bez tygo somygo užytkowńika",
-       "right-reupload-shared": "Nadpisuj pliki ůmješčůne w repozytorjům dźelůnych plikůw na lokalnyj kopje",
+       "right-reupload": "Nadpisuj pliki kere sam już sům wćepane",
+       "right-reupload-own": "Nadpisuj plik wćepany sam bez tygo samygo użytkowńika",
+       "right-reupload-shared": "Nadpisuj pliki umjeszczůne we repozytorjům dźelůnych plikůw na lokalnyj kopje",
        "right-upload_by_url": "Wćepńij sam plik ze adresa URL",
-       "right-purge": "Wyčyść pamjyńć podrynčno do zajty za wyjůntkym zajty potwjerdzyńo",
+       "right-purge": "Wyczyść pamjyńć podrynczno do zajty za wyjůntkym zajty potwjerdzyńo",
        "right-autoconfirmed": "Sprowjej zajty zawarte lo ńyzalůgowanych",
-       "right-bot": "Traktuj kej proces autůmatyčny",
-       "right-nominornewtalk": "Wyuůnčyńy uopcyje powjadamjańo uo drobnych půmjyńańach na zajće godki",
-       "right-apihighlimits": "Užywej uograÅ\84\8dyń wjelgości we zapytańach do API",
+       "right-bot": "Traktuj kej proces autůmatyczny",
+       "right-nominornewtalk": "Wyłůnczyńy uopcyje powjadamjańo uo drobnych půmjyńańach na zajće godki",
+       "right-apihighlimits": "Używej uograÅ\84iczyń wjelgości we zapytańach do API",
        "right-writeapi": "Zapisuj bez interfejs API",
        "right-delete": "Wyćep zajty",
        "right-bigdelete": "Wyćep zajty s dugům historyjům půmjyńań",
        "right-browsearchive": "Sznupej za wyćepanymi zajtůma",
        "right-undelete": "Wćepej nazod wyćepano zajta",
        "right-suppressrevision": "Přyglůndańy i uodtwařańy sprowjyń schrůńůnych před admińistratorami",
-       "right-suppressionlog": "Pokož prywatne lůgi",
-       "right-block": "Zawjyrańy sprowjorzům możebnośći edytowańo",
-       "right-blockemail": "Zablokuj užytkowÅ\84ikowi wysyuańy e-brifůw",
+       "right-suppressionlog": "Pokoż prywatne lůgi",
+       "right-block": "Zawjyrańy sprowjorzům mogebnośći edytowańo",
+       "right-blockemail": "Zablokuj użytkowÅ\84ikowi posyÅ\82ańy e-brifůw",
        "right-hideuser": "Zablokuj mjano użytkowńika i schrůń to przed publicznym dostympym",
        "right-ipblock-exempt": "Uobejdź zawarća uod sprowjyń do IP, autozawarća i zawarća zakresůw",
-       "right-proxyunbannable": "Uobejdź autůmatyčne zawarća uod sprowjyń do proxy",
+       "right-proxyunbannable": "Uobejdź autůmatyczne zawarća uod sprowjyń do proxy",
        "right-protect": "Zmjyń poźůmy zawarć i sprowjej zawarte zajty",
        "right-editprotected": "Sprowjej zawarte zajty (ze zawarćym kaskadowym)",
-       "right-editinterface": "Sprowjej interfejs užytkowńika",
-       "right-editusercssjs": "Sprowjej pliki CSS i JS inkšych užytkowńikůw",
-       "right-editusercss": "Sprowjej pliki CSS inkšych užytkowńikůw",
+       "right-editinterface": "Sprowjej interfejs użytkowńika",
+       "right-editusercssjs": "Sprowjej pliki CSS i JS inkszych użytkowńikůw",
+       "right-editusercss": "Sprowjej pliki CSS inkszych użytkowńikůw",
        "right-edituserjs": "Sprowjej pliki JS inkšych užytkowńikůw",
-       "right-rollback": "Rewert drap sprawjyÅ\84o uostatÅ\84ygo užytkowÅ\84ika kery sprawjou dano zajta",
-       "right-markbotedits": "Uoznoč rewertowane sprawjyńo kej sprawjyńo botůw",
+       "right-rollback": "Rewert drap sprawjyÅ\84o uostatÅ\84ygo użytkowÅ\84ika kery sprowjoÅ\82 dano zajta",
+       "right-markbotedits": "Uoznocz rewertowane sprawjyńo kej sprawjyńo botůw",
        "right-noratelimit": "Ńy mo uograńičyń přepustowośći",
        "right-import": "Import zajtůw s inkšych Wiki",
        "right-importupload": "Import zajtůw ze wćepanygo plika",
-       "right-patrol": "Uoznoč sprowjyńo kej přezdřane",
+       "right-patrol": "Uoznocz sprowjyńo kej przezdrzane",
        "right-autopatrol": "Naštaluj na autůmatyčne uoznačańy sprowjyń kej přezdřane",
        "right-patrolmarks": "Podglůnd značnikůw patrolowańo pomjeńanych na uostatku – uoznačańo kej „sprawdzůne”",
        "right-unwatchedpages": "Pokož lista zajtůw na kere žodyn ńy dowo pozoru",
        "right-siteadmin": "Zawjerańy i uodmykańy bazy danych",
        "newuserlogpage": "Nowe użytkowniki",
        "newuserlogpagetext": "To je rejer uostatńo utworzůnych kůnt użytkowńikůw",
-       "rightslog": "Uprawńyńa",
+       "rightslog": "Uprawńyńo",
        "rightslogtext": "Rejer půmjyńań uprawńyń užytkowńikůw.",
        "action-read": "přeglůndańo tyj zajty",
        "action-edit": "sprowjańo tyj zajty",
-       "action-createpage": "twořyńo zajtůw",
-       "action-createtalk": "twořyńo zajtůw godki",
+       "action-createpage": "tworzyńo zajtůw",
+       "action-createtalk": "tworzyńo zajtůw godki",
        "action-createaccount": "utwořyńo tygo kůnta užytkowńika",
        "action-minoredit": "do uoznačyńo tygo sprowjyńo kej drobne půmjyńańe",
        "action-move": "přećepańe tyj zajty",
        "action-autopatrol": "uoznačyńo wuasnygo sprowjyńo kej „sprawdzonygo”",
        "action-unwatchedpages": "podglůndu listy zajtůw na kere ńikt ńy dowo pozoru",
        "action-mergehistory": "skuplowańo historyje sprowjyń tyj zajty",
-       "action-userrights": "sprowjańo uprowńyń wšyjstkich sprowjořy",
+       "action-userrights": "sprowjańo uprowńyń wszyjstkich sprowjorzy",
        "action-userrights-interwiki": "sprowjańo uprowńyń sprowjořy na inkšych witrynach wiki",
        "action-siteadmin": "zawarćo a uodymkńyńćo bazy danych",
        "nchanges": "$1 {{PLURAL:$1|pomjyńańe|pomjyńańa|pomjyńań}}",
+       "enhancedrc-history": "gyszichta",
        "recentchanges": "Ńydowno půmjyńane",
        "recentchanges-legend": "Uopcyje ńydowno půmjyńanych",
        "recentchanges-summary": "Ta zajta ukozuje gyszichta uostatńich půmjyńań na tyj wiki.",
        "recentchanges-label-minor": "To je ńywjelge sprowjyńy",
        "recentchanges-label-bot": "To sprowjyńy bůło zrobjůne uod bota",
        "recentchanges-label-unpatrolled": "To sprowjyńy ńy bůło jeszcze uowjerzůne",
+       "recentchanges-label-plusminus": "Půmjyńono mjara zajty we bajtach",
+       "recentchanges-legend-heading": "'''Legynda:'''",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (uobejrzij tyż [[Special:NewPages|lista nowych zajt]])",
        "rcnotefrom": "Půńiżej pokazano půmjyńańo zrobjůne pů <b>$2</b> (ńy wjyncyj kej <b>$1</b> pozycji).",
        "rclistfrom": "Ukoż půmjyńańa uod $3 $2",
        "rcshowhideminor": "$1 drobne půmjyńańa",
+       "rcshowhideminor-hide": "Schrůń",
        "rcshowhidebots": "$1 boty",
+       "rcshowhidebots-show": "Pokoż",
        "rcshowhideliu": "$1 zaregisztrowanych",
+       "rcshowhideliu-hide": "Schrůń",
        "rcshowhideanons": "$1 anůńimowych",
+       "rcshowhideanons-hide": "Schrůń",
        "rcshowhidepatr": "$1 uowjerzůne",
        "rcshowhidemine": "$1 uody mje sprowjůne",
+       "rcshowhidemine-hide": "Schrůń",
        "rclinks": "Ukoż uostatńe $1 sprowjyń bez uostatńe $2 dńi.<br />$3",
        "diff": "zmj.",
        "hist": "gysz.",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|dowajůncy pozůr užytkowńik|dowajůncych pozůr užytkowńikůw}}]",
        "rc_categories": "Uůgrańič do katygorii (oddźelej za půmocům \"|\")",
        "rc_categories_any": "Wšyskie",
+       "rc-change-size-new": "$1 {{PLURAL:$1|bajt|bajty|bajtůw}} po půmjyńyńu",
        "newsectionsummary": "/* $1 */ nowo tajla",
        "rc-enhanced-expand": "Pokoż szczygůły",
        "rc-enhanced-hide": "Schrůń detajle",
        "upload-preferred": "Zalecane formaty plikůw: $1.",
        "upload-prohibited": "Zakozane formaty plikůw: $1.",
        "uploadlogpage": "Wćepane sam",
-       "uploadlogpagetext": "PůÅ\84¾ej znojdowo Å\9be lista plikůw wÄ\87epanych na uostatku.\nPÅ\99elyź na zajta [[Special:NewFiles|galeryje nowych plikůw]], coby uobejzdÅ\99\87 pliki kej miÅ\84jatůrki.",
+       "uploadlogpagetext": "PůÅ\84¼yj jee lista plikůw wÄ\87epanych na uostatku.\nPrzelyź na zajta [[Special:NewFiles|galeryje nowych plikůw]], coby uobejzdrzeÄ\87 pliki kej miÅ\84atůrki.",
        "filename": "Mjano pliku",
        "filedesc": "Popis",
        "fileuploadsummary": "Uopis:",
        "upload-maxfilesize": "Maksymalny rozmior plika: $1",
        "watchthisupload": "Dowej pozůr na ta zajta",
        "filewasdeleted": "Plik uo takym mjańy juž bůu sam wćepany, ale zostou wyćepńjynty. Ńim wćepńeš go zaś, sprowdź $1.",
-       "filename-bad-prefix": "Mjano plika, kery wćepuješ, začyno śe uod '''\"$1\"''' &ndash; je to mjano nojčynśćy připisywane autůmatyčńy bez cyfrowe fotoaparaty, uůno ńy dowo žodnych informacyji uo zawartośći plika. Prošymy cobyś nadou plikowi inkše, lepij zrozůmjaue mjano.",
+       "filename-bad-prefix": "Mjano plika, kery wćepujesz, zaczyno śe uod '''\"$1\"''' &ndash; je to mjano nojczynśćy przipisywane autůmatyczńy bez cyfrowe fotoaparaty, a  ńy dowo uůno żodnych informacyji uo zawartośći plika. Proszymy cobyś nadoł plikowi inksze, lepij zrozůmjałe mjano.",
        "upload-success-subj": "Wćepańe plika udouo śe",
        "upload-proto-error": "Ńyprowidłowy protokůł",
        "upload-proto-error-text": "Zdalne přesůuańy plikůw wymago podańo adresu URL kery začyno śe na <code>http://</code> abo <code>ftp://</code>.",
        "filehist-comment": "Komyntorz",
        "imagelinks": "Używańy pliku",
        "linkstoimage": "{{PLURAL:$1|Tako zajta linkuje|Take zajty linkujům}} do tygo plika:",
-       "linkstoimage-more": "Wjyncyj jak $1 {{PLURAL:$1|zajta je adresowano|zajty sům adresowane|zajtůw je adresowanych}} do tygo plika.\nPůÅ\84¾Å¡o lista pokozuje yno {{PLURAL:$1|pjyrÅ¡y link|pjyrÅ¡e $1 linki|pjyrÅ¡ych $1 linkůw}} do tygo plika.\nDostympno je tyž [[Special:WhatLinksHere/$2|pouno lista]].",
+       "linkstoimage-more": "Wjyncyj jak $1 {{PLURAL:$1|zajta je adresowano|zajty sům adresowane|zajtůw je adresowanych}} do tygo plika.\nPůÅ\84¼szo lista pokozuje ino {{PLURAL:$1|pjyrszy link|pjyrsze $1 linki|pjyrszych $1 linkůw}} do tygo plika.\nDostympno je tyż [[Special:WhatLinksHere/$2|poÅ\82no lista]].",
        "nolinkstoimage": "Žodno zajta ńy je adrésowano do tygo plika.",
        "morelinkstoimage": "Pokož [[Special:WhatLinksHere/$1|wjyncy uodnośnikůw]] do tygo plika.",
        "duplicatesoffile": "{{PLURAL:$1|Nastympujůncy plik je kopjům|Nastympujůnce pliki sům kopjůma}} tygo plika:",
        "sharedupload": "Tyn plik je wćepńynty na $1 a inksze projekty tyż go mogům używać.",
        "sharedupload-desc-here": "Tyn plik śe nałoźi na $1 a idzie go użyć we inkszych projektach.\nNiżyj sům informacyje ze [$2 zajty popisu] tygo pliku.",
        "uploadnewversion-linktext": "Wćepńij nowšo wersyjo tygo plika",
+       "upload-disallowed-here": "Ńy moges nadpisać tygo plika.",
        "filerevert": "Přiwracańy $1",
        "filerevert-legend": "Přiwracańy poprzedńy wersje plika",
        "filerevert-intro": "Zamjeřoš přiwrůćić '''[[Media:$1|$1]]''' do wersje z [$4 $3, $2].",
        "allinnamespace": "Wszyjstke zajty (we przestrzyńi mjan $1)",
        "allpagessubmit": "Ukoż",
        "allpagesprefix": "Ukoż artikle s prefiksym:",
-       "allpagesbadtitle": "Podane mjano je felerne, zawjera prefiks mjyndzyprojektowy abo mjyndzyjynzykowy. Może uůne tyż zawjerać jako buchsztaba abo inksze znaki, kerych ńy wolno używać we mjanach.",
+       "allpagesbadtitle": "Podane mjano je felerne, zawjyro prefiks mjyndzyprojektowy abo mjyndzygodkow. Może uůne tyż zawjerać jako buchsztaba abo inksze znaki, kerych ńy wolno używać we mjanach.",
        "allpages-bad-ns": "{{GRAMMAR:MS.lp|{{SITENAME}}}} ńy mo przestrzyńi mjan „$1”.",
        "allpages-hide-redirects": "Ukoż pukńyńća",
        "categories": "Kategoryje",
        "delete-toobig": "Ta zajta mo fest dugo historyja sprowjyń, wjyncyj jak $1 {{PLURAL:$1|půmjyńańy|půmjyńańo|půmjyńań}}.\nJeij wyćepańy mogło by spowodować zakłucyńo we dźołańu {{GRAMMAR:D.lp|{{SITENAME}}}} a bez tůż zostało uograńiczůne.",
        "delete-warning-toobig": "Ta zajta mo fest dugo historia sprowjyń, wjyncy kej $1 {{PLURAL:$1|půmjyńeńe|půmjyńańo|půmjyńań}}.\nDej pozůr, bo jei wyćepańe może spowodować zakłůcyńo w pracy {{GRAMMAR:D.lp|{{SITENAME}}}}.",
        "rollback": "Wycofej sprowjyńe",
-       "rollback_short": "Cofej",
        "rollbacklink": "cofej",
        "rollbackfailed": "Ńy idźe wycofać sprowjyńo",
-       "cantrollback": "Ńy idże cofnůńć pomjyńeńo, sam je ino jedna wersyja tyi zajty.",
+       "cantrollback": "Ńy idże cofnůńć pomjyńyńo, sam je ino jedna wersyja tyi zajty.",
        "alreadyrolled": "Ńy idźe lů zajty [[:$1|$1]] cofnůńć uostatńygo pomjyńeńa, kere wykonoł [[User:$2|$2]] ([[User talk:$2|godka]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]).\nKto inkszy zdůnżůł już to zrobić abo wprowadźił własne poprowki do treśći zajty.\n\nAutorym ostatńygo pomjyńyńo je terozki [[User:$3|$3]] ([[User talk:$3|godka]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Sprowjyńe uopisano: „''$1''”.",
        "revertpage": "Wycofano sprowjyńe użytkowńika [[Special:Contributions/$2|$2]] ([[User talk:$2|godka]]). Autor prziwrůcůnej wersyji to [[User:$1|$1]].",
        "undelete-show-file-submit": "Ja",
        "namespace": "Raum mjan:",
        "invert": "Wybjer na uopy",
+       "tooltip-invert": "Uoznacz te pole, coby ukryć půmjany na zajtach we uobranych raumach mjan (a powjůnzanych ze ńimi inkszymi raumami mjan, eli uoznaczůno)",
+       "namespace_association": "powjůnzany raum mjan",
+       "tooltip-namespace_association": "Uoznacz te pole, coby uwzglyndńić zajty dyskusyji i tyjmy powjůnzane ze uobranymi raumami mjan",
        "blanknamespace": "(przodńo)",
        "contributions": "Ajnzac {{GENDER:$1|używocza|używoczki}}",
        "contributions-title": "Wkłod użytkowńika $1",
        "import-logentry-interwiki": "zaimportowou $1 užywajůnc transwiki",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|wersyja|wersyje|wersyji}} ze $2",
        "tooltip-pt-userpage": "Mojo perzůnalno zajta",
-       "tooltip-pt-anonuserpage": "Zajta užytkowÅ\84ika do adresu IP spod kerygo sprowjoÅ¡",
+       "tooltip-pt-anonuserpage": "Zajta użytkowÅ\84ika do adresu IP spod kerygo sprowjosz",
        "tooltip-pt-mytalk": "Mojo zajta dyskusyje",
-       "tooltip-pt-anontalk": "Godka užytkowÅ\84ika do adresu IP spod kerygo sprowjoÅ¡",
+       "tooltip-pt-anontalk": "Godka użytkowÅ\84ika do adresu IP spod kerygo sprowjosz",
        "tooltip-pt-preferences": "Moje preferyncyje",
        "tooltip-pt-watchlist": "Lista artiklůw, na kere dowosz pozůr",
        "tooltip-pt-mycontris": "Lista uody mje sprowjonych",
        "tooltip-pt-login": "Chćeli by my, cobyś śe nalogowoł, nale to ńy je powinne",
        "tooltip-pt-logout": "Uodloguj śe ze wiki",
+       "tooltip-pt-createaccount": "Namawjůmy do stworzyńo kůnta a zalogůwańo śa, atoli niy je to uobowjůnzkowe",
        "tooltip-ca-talk": "Dyskusyjo uo tym artiklu",
        "tooltip-ca-edit": "Mogesz sprowjać ta zajta. Podwjela spamjyntosz půmjyńańo, klikńij we knefel \"Uobźyrej\".",
        "tooltip-ca-addsection": "Przidej nowy temat",
        "tooltip-ca-history": "Storsze wersyje tyj zajty",
        "tooltip-ca-protect": "Zawřij ta zajta",
        "tooltip-ca-delete": "Wyćep ta zajta",
-       "tooltip-ca-undelete": "Přiwrůć wersyja tyi zajty spřed wyćepańo",
+       "tooltip-ca-undelete": "Prziwrůć wersyjo tyj zajty sprzed wyćepańo",
        "tooltip-ca-move": "Przećep ta zajta kaj indzij.",
        "tooltip-ca-watch": "Przidej artikel na pozůrlista",
        "tooltip-ca-unwatch": "Wyciep tyn artikel ze pozůrlisty",
        "tooltip-ca-nstab-main": "Uobźyrej zajta artikla",
        "tooltip-ca-nstab-user": "Ukoż perzůnalno zajta używocza",
        "tooltip-ca-nstab-media": "Uobejřij zajta artikla",
-       "tooltip-ca-nstab-special": "To je ekstra zajta. Ńy možeš jei sprowjać.",
+       "tooltip-ca-nstab-special": "To je ekstra zajta. Ńy moges jej sprowjać.",
        "tooltip-ca-nstab-project": "Uobejřij zajta projektu",
        "tooltip-ca-nstab-image": "Ukoż zajta grafiki",
        "tooltip-ca-nstab-mediawiki": "Zoboč komunikat systymowy",
        "tooltip-ca-nstab-template": "Uobźyrej muster",
        "tooltip-ca-nstab-help": "Pokož zajte s půmocą",
        "tooltip-ca-nstab-category": "Ukoż zajta kategoryje",
-       "tooltip-minoredit": "Uoznač ta zmjana za drobno",
+       "tooltip-minoredit": "Uoznacz ta zmjana za drobno",
        "tooltip-save": "Naszkryflej půmjyńańa",
        "tooltip-preview": "Ńiż naszkryflosz, uobźyrej efekt twojigo sprowjyńo.",
        "tooltip-diff": "Ukozuje twoje půmjyńańa we tekśće",
        "spambot_username": "MediaWiki – wyćepywańe spamu",
        "spam_reverting": "Přiwracańy uostatńij wersyji we kerej ńy bůuo linkůw do $1",
        "spam_blanking": "Wšyjstke wersyje zawjerouy uodnośńiki do $1. Čyščyńy zajty.",
+       "simpleantispam-label": "Filter antyspamowy.\n'''ŃY''' szrajbůj sam ńic!",
+       "pageinfo-toolboxlink": "Informacyjo uo tyj zajće",
        "markaspatrolleddiff": "uoznoč sprawjyńy kej „sprawdzůne”",
        "markaspatrolledtext": "Uoznoč tyn artikel kej „sprawdzůny”",
        "markedaspatrolled": "Sprawdzůne",
        "file-nohires": "Wjynksze wymjyry ńy sům dostympne",
        "svg-long-desc": "Plik SVG, nůminalńe $1 × $2 pixelůw, rozmior plika: $3",
        "show-big-image": "Pjyrwy wymjor",
+       "show-big-image-preview": "Mjara podglůndu – $1.",
+       "show-big-image-other": "{{PLURAL:$2|Inkszo rozdźelczość|Inksze rozdźelczośći}}: $1.",
+       "show-big-image-size": "$1 x $2 pikselůw",
        "newimages": "Galerjo nowych uobrozkůw",
        "imagelisttext": "Půnižyj na {{PLURAL:$1||posortowanyj $2}} liśće {{PLURAL:$1|znojdowo|znojdujům|znojdowo}} śe '''$1''' {{PLURAL:$1|plik|pliki|plikůw}}.",
        "newimages-summary": "Na tyj ekstra zajće prezyntowane sům uostatńo wćepńynte pliki.",
        "scarytranscludedisabled": "[Douůnčańy bez interwiki je wůuůnčůne]",
        "scarytranscludefailed": "[Ńy powjoduo śe pobrańy szablůna lů $1]",
        "scarytranscludetoolong": "[za dugo adresa URL]",
-       "deletedwhileediting": "'''Pozůr''': Ta zajta zostoła wyćepano po tym, jak żeś rozpoczůł jei sprowjańy!",
+       "deletedwhileediting": "'''Pozůr''': Ta zajta zostoła wyćepano po tym, jak żeś rozpoczůł jej sprowjańy!",
        "confirmrecreate": "Užytkowńik [[User:$1|$1]] ([[User talk:$1|godka]]) wyćepnůu tyn artikel po tym jak žeś rozpočůu(eua) jygo sprowjańe, podajůnc kej powůd wyćepańo:\n: ''$2''\nPotwjerdź chęć wćepańo nazod tygo artikla.",
        "recreate": "Wćepej nazod",
        "confirm_purge_button": "OK",
        "watchlistedit-normal-explain": "Půńiżyj mosz lista artikli na kere dowosz pozůr.\nCoby wyćepać z ńij jako zajta, zaznocz pole przi ńij i naćiś knefel „{{int:Watchlistedit-normal-submit}}”.\nMożesz tyż skorzistać ze [[Special:EditWatchlist/raw|tekstowygo sprowjorza listy artikli na kere dowosz pozůr]].",
        "watchlistedit-normal-submit": "Wyćep s listy",
        "watchlistedit-normal-done": "Z Twoi listy artikli na kere dowoš pozůr {{PLURAL:$1|zostoua wyćepano 1 zajta|zostouy wyćepane $1 zajty|zostouo wyćepanych $1 zajtůw}}:",
-       "watchlistedit-raw-title": "Tekstowy edytor listy artikli na kere dowoš pozůr",
+       "watchlistedit-raw-title": "Tekstowy edytor listy artikli na kere dowosz pozůr",
        "watchlistedit-raw-legend": "Tekstowy edytor listy artikli na kere dowoš pozůr",
        "watchlistedit-raw-explain": "Půńižy moš lista artikli na kere dowoš pozůr. W koždej lińii znojdowo śe titel jydnygo artikla. Lista možeš sprowjać dodajůnc nowe zajty i wyćepujůnc te kere na ńij sům. Jak skůńčyš, naćiś knefel „Uaktualńij lista zajtůw na kere dowům pozůr”.\nMožeš tyž [[Special:EditWatchlist|užyć standardowygo edytora]].",
        "watchlistedit-raw-titles": "Title:",
        "watchlisttools-view": "Pokož wažńijše pomjyńańo",
        "watchlisttools-edit": "Pokož i zmjyńoj pozorliste",
        "watchlisttools-raw": "Zmjyńoj surowo pozorlista",
-       "unknown_extension_tag": "Ńyznany značńik rozšeřyńo „$1”",
        "duplicate-defaultsort": "Pozůr: Zmjarkowanym kluczym sortowańo bydźe \"$2\" a zastůmpi uůn zawczasu używany klucz \"$1\".",
        "version": "Wersjo",
        "version-extensions": "Zainstalowane rozšeřyńa",
        "intentionallyblankpage": "Ta zajta nauůmyślńy uostoua śe pusto",
        "external_image_whitelist": "#Leave this line exactly as it is<pre>\n#Wstow půńiżyj tajle wyrażyń regularnych (jyno to, co znojduje śe mjyndzy //)\n#Wyrażyńa te uostanům przipasowane ku URL-ům zewnyntrznym (bezpostrzredńo linkowanych) grafik\n#Dopasowane URL-e zostanům wyśwjetlůne kej grafiki, w przećiwnym raźe bydźe pokozany yno link ku grafice\n#Lińje kere s anfanga majům # sům traktowane kej kůmyntorze\n\n#Put all regex fragments above this line. Leave this line exactly as it is</pre>",
        "tag-filter": "Filter [[Special:Tags|tagůw]]",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Uoznaczyńe|Uoznaczyńo}}]]: $2)",
+       "logentry-delete-delete": "$1 {{GENDER:$2|wyćepoł|wyćepała}} zajta $3",
        "revdelete-restricted": "naštaluj uograničyńo do administratorůw",
        "revdelete-unrestricted": "wycofej uograničyńo do administratorůw",
+       "logentry-newusers-create": "Kůnto {{GENDER:$2|używocza}} $1 uostało stworzůne",
        "rightsnone": "podstawowo",
        "revdelete-summary": "uopis pomjyńań",
+       "searchsuggest-search": "Sznupej",
        "expand_templates_ok": "OK"
 }
index a265a76..4fbfa96 100644 (file)
        "otherlanguages": "ఇతర భాషలలో",
        "redirectedfrom": "($1 నుండి మళ్ళించబడింది)",
        "redirectpagesub": "దారిమార్పు పేజీ",
+       "redirectto": "దారి మళ్ళింపు:",
        "lastmodifiedat": "ఈ పేజీలో చివరి మార్పు $1 న $2 కు జరిగింది.",
        "viewcount": "ఈ పేజీ {{PLURAL:$1|ఒక్క సారి|$1 సార్లు}} దర్శించబడింది.",
        "protectedpage": "సంరక్షణలోని పేజీ",
        "searchall": "అన్నీ",
        "showingresults": "#<strong>$2</strong> నుండి మొదలుకొని {{PLURAL:$1|</strong>ఒక్క</strong> ఫలితాన్ని|<strong>$1</strong> ఫలితాలను}} కింద చూపించాం.",
        "showingresultsinrange": "#<strong>$2</strong> నుండి  #<strong>$3</strong> వరకు ఉన్న ఫలితాల శ్రేణి నుండి {{PLURAL:$1|<strong>ఒక్క</strong> ఫలితం|<strong>$1</strong> ఫలితాల}} వరకు కింద చూపించాం.",
+       "search-showingresults": "{{PLURAL:$4|<strong>$3</strong>{{PLURAL:$3|కి|లో}} <strong>$1</strong> ఫలితం|<strong>$3</strong>లో <strong>$1 - $2</strong> ఫలితాలు}}",
        "search-nonefound": "మీ ప్రశ్నకి సరిపోలిన ఫలితాలేమీ లేవు.",
        "powersearch-legend": "నిశితమైన అన్వేషణ",
        "powersearch-ns": "ఈ పేరుబరుల్లో వెతుకు:",
        "delete-warning-toobig": "ఈ పేజీకి $1 {{PLURAL:$1|కూర్పుకు|కూర్పులకు}} మించిన, చాలా పెద్ద దిద్దుబాటు చరితం ఉంది. దాన్ని తొలగిస్తే {{SITENAME}}కి చెందిన డేటాబేసు కార్యాలకు ఆటంకం కలగొచ్చు; అప్రమత్తతో ముందుకుసాగండి.",
        "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 నుండి {{PLURAL:$1|ఒక కూర్పు|$1 కూర్పులు}}",
        "javascripttest": "జావాస్క్రిప్ట్ పరీక్ష",
-       "javascripttest-title": "$1 పరీక్షలు నడుస్తున్నాయి",
        "javascripttest-pagetext-noframework": "ఈ పేజీ JavaScript పరీక్షల కోసం ఉద్దేశించబడింది.",
        "javascripttest-pagetext-unknownframework": "తెలియని పరీక్షా ఫ్రేమ్‍వర్కు \"$1\".",
        "javascripttest-pagetext-frameworks": "కింది పరీక్షా ఫ్రేమ్‍వర్కులలో ఒకదాన్ని ఎంచుకోండి: $1",
index 152435f..c4e7449 100644 (file)
        "prefs-personal": "โพรไฟล์ผู้ใช้",
        "prefs-rc": "ปรับปรุงล่าสุด",
        "prefs-watchlist": "รายการเฝ้าดู",
+       "prefs-editwatchlist": "แก้ไขรายการเฝ้าดู",
+       "prefs-editwatchlist-label": "แก้ไขรายการในรายการเฝ้าดูของคุณ:",
+       "prefs-editwatchlist-edit": "ดูและลบชื่อเรื่องในรายการเฝ้าดูของคุณ",
+       "prefs-editwatchlist-raw": "แก้ไขรายการเฝ้าดูดิบ",
+       "prefs-editwatchlist-clear": "ลบล้างรายการเฝ้าดูของคุณ",
        "prefs-watchlist-days": "จำนวนวันที่แสดงในรายการเฝ้าดู:",
        "prefs-watchlist-days-max": "มากสุด $1 วัน",
        "prefs-watchlist-edits": "จำนวนการแก้ไขมากสุดที่แสดงในรายการเฝ้าดูขยาย:",
        "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 การเปลี่ยนแปลง",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|ตั้งแต่การเยี่ยมชมครั้งสุดท้าย}}",
        "enhancedrc-history": "ประวัติ",
        "pager-older-n": "เก่ากว่า $1",
        "suppress": "ผู้ดูแลประวัติ",
        "querypage-disabled": "หน้าพิเศษนี้ถูกปิดใช้งานด้วยเหตุผลด้านสมรรถภาพ",
+       "apihelp-no-such-module": "ไม่พบมอดูล \"$1\"",
        "booksources": "แหล่งหนังสือ",
        "booksources-search-legend": "ค้นหาแหล่งหนังสือ",
        "booksources-search": "ค้นหา",
        "deleteprotected": "คุณไม่สามารถลบหน้านี้เพราะถูกล็อก",
        "deleting-backlinks-warning": "'''คำเตือน:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|หน้าอื่น]]เชื่อมโยงมายังหรือดึงข้อมูลจากหน้าที่คุณกำลังจะลบ",
        "rollback": "ย้อนการแก้ไขกลับฉุกเฉิน",
-       "rollback_short": "ย้อนกลับฉุกเฉิน",
        "rollbacklink": "ย้อนกลับฉุกเฉิน",
        "rollbacklinkcount": "ย้อนกลับฉุกเฉิน $1 การแก้ไข",
        "rollbacklinkcount-morethan": "ย้อนกลับฉุกเฉินกว่า $1 การแก้ไข",
        "import-logentry-interwiki": "นำเข้าข้ามวิกิ $1 แล้ว",
        "import-logentry-interwiki-detail": "นำเข้า $1 {{PLURAL:$1|รุ่นการแก้ไข|รุ่นการแก้ไข}}จาก $2",
        "javascripttest": "การทดสอบจาวาสคริปต์",
-       "javascripttest-title": "กำลังดำเนินงานทดสอบ $1",
        "javascripttest-pagetext-noframework": "หน้านี้สงวนไว้สำหรับดำเนินงานการทดสอบจาวาสคริปต์",
        "javascripttest-pagetext-skins": "เลือกสกินที่จะดำเนินงานการทดสอบ:",
        "javascripttest-qunit-intro": "ดู[$1 เอกสารกำกับการทดสอบ]บน mediawiki.org",
        "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>",
        "compare-revision-not-exists": "รุ่นที่คุณระบุไม่มีอยู่",
        "dberr-problems": "ขออภัย เว็บไซต์นี้กำลังพบกับข้อผิดพลาดทางเทคนิค",
        "dberr-again": "กรุณารอสักครู่แล้วจึงโหลดใหม่",
-       "dberr-info": "(à¹\84มà¹\88สามารà¸\96à¸\95ิà¸\94à¸\95à¹\88อà¹\80à¸\8bิรà¹\8cà¸\9fà¹\80วอรà¹\8cà¸\90าà¸\99à¸\82à¹\89อมูลà¹\84à¸\94à¹\89: $1)",
-       "dberr-info-hidden": "(à¹\84มà¹\88สามารà¸\96à¸\95ิà¸\94à¸\95à¹\88อà¹\80à¸\8bิรà¹\8cà¸\9fà¹\80วอรà¹\8cฐานข้อมูล)",
+       "dberr-info": "(à¹\84มà¹\88สามารà¸\96à¹\80à¸\82à¹\89าà¸\96ึà¸\87à¸\90าà¸\99à¸\82à¹\89อมูล: $1)",
+       "dberr-info-hidden": "(à¹\84มà¹\88สามารà¸\96à¹\80à¸\82à¹\89าà¸\96ึà¸\87ฐานข้อมูล)",
        "dberr-usegoogle": "คุณสามารถลองสืบค้นผ่านกูเกิลในระหว่างนี้",
        "dberr-outofdate": "โปรดทราบว่าดัชนีเนื้อหาของเราในกูเกิลอาจล้าสมัยแล้ว",
        "dberr-cachederror": "นี่คือข้อมูลคัดลอกชั่วคราวของหน้าที่ร้องขอ และอาจไม่เป็นปัจจุบัน",
        "revdelete-uname-unhid": "ชื่อผู้ใช้ถูกแสดง",
        "revdelete-restricted": "เพิ่มการจำกัดกับผู้ดูแลระบบ",
        "revdelete-unrestricted": "ยกเลิกการจำกัดแก่ผู้ดูแลระบบ",
+       "logentry-merge-merge": "$1 {{GENDER:$2|รวม}} $3 เข้ากับ $4 (รุ่นถึง $5)",
        "logentry-move-move": "$1 ย้ายหน้า $3 ไปยัง $4",
        "logentry-move-move-noredirect": "$1 ย้ายหน้า $3 ไปยัง $4 โดยไม่สร้างหน้าเปลี่ยนทางตามมา",
        "logentry-move-move_redir": "$1 ย้ายหน้า $3 ไปยัง $4 ทับหน้าเปลี่ยนทาง",
        "logentry-move-move_redir-noredirect": "$1 ย้ายหน้า $3 ไปยัง $4 ทับหน้าเปลี่ยนทาง โดยไม่สร้างหน้าเปลี่ยนทางตามมา",
        "logentry-patrol-patrol": "$1 ทำเครื่องหมายว่ารุ่น $4 ของหน้า $3 ได้รับการตรวจสอบแล้ว",
        "logentry-patrol-patrol-auto": "$1 ทำเครื่องหมายโดยอัตโนมัติว่ารุ่น $4 ของหน้า $3 ได้รับการตรวจสอบแล้ว",
-       "logentry-newusers-newusers": "บัญชีผู้ใช้ $1 ถูกสร้างขึ้น",
+       "logentry-newusers-newusers": "บัญชีผู้ใช้ $1 ถูกสร้าง",
        "logentry-newusers-create": "บัญชีผู้ใช้ $1 ถูกสร้างขึ้น",
        "logentry-newusers-create2": "บัญชีผู้ใช้ $3 ถูกสร้างขึ้นโดย $1",
        "logentry-newusers-byemail": "บัญชีผู้ใช้ $3 ถูกสร้างขึ้นโดย $1 และส่งรหัสผ่านไปทางอีเมลแล้ว",
        "duration-decades": "$1 ทศวรรษ",
        "duration-centuries": "$1 ศตวรรษ",
        "duration-millennia": "$1 สหัสวรรษ",
+       "expandtemplates": "ขยายแม่แบบ",
        "expand_templates_output": "ผลลัพธ์",
        "expand_templates_ok": "ตกลง",
        "expand_templates_remove_comments": "นำส่วนความเห็นออก",
        "log-description-pagelang": "นี่คือปูมการเปลี่ยนภาษาหน้า",
        "logentry-pagelang-pagelang": "$1 เปลี่ยนภาษาของ $3 จาก $4 เป็น $5",
        "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-summary": "สถิติเกี่ยวกับประเภทไฟล์ที่อัปโหลด ซึ่งรวมเฉพาะรุ่นล่าสุดของไฟล์นั้น \nไม่รวมไฟล์รุ่นเก่าหรือที่ถูกลบแล้ว",
+       "mediastatistics-nbytes": "{{PLURAL:$1|$1 ไบต์}} ($2; $3%)",
+       "mediastatistics-table-count": "จำนวนไฟล์",
+       "mediastatistics-table-totalbytes": "ขนาดรวม",
+       "mediastatistics-header-unknown": "ไม่ทราบ",
+       "mediastatistics-header-drawing": "ภาพวาดเส้น (ภาพเวกเตอร์)",
+       "mediastatistics-header-audio": "เสียง",
+       "mediastatistics-header-video": "วิดีทัศน์"
 }
index e62c635..d026c49 100644 (file)
@@ -13,7 +13,8 @@
                        "tl.wikipedia.org sysops",
                        "לערי ריינהארט",
                        "아라",
-                       "Ianlopez1115"
+                       "Ianlopez1115",
+                       "Leeheonjin"
                ]
        },
        "tog-underline": "Pagsasalungguhit ng link:",
        "delete-toobig": "May isang malaking kasaysayan ng pagbabago ang pahinang ito, mahigit sa $1 {{PLURAL:$1|pagbabago|mga pagbabago}}.\nIpanagbabawal ang pagbura ng ganyang mga pahina upang maiwasan ang hindi sinasadyang pagantala/paggambala sa {{SITENAME}}.",
        "delete-warning-toobig": "May malaking kasaysayan ng pagbabago ang pahinang ito, mahigit sa $1 {{PLURAL:$1|pagbabago|mga pagbabago}}.\nMaaaring makagambala/makaabala sa pagpapatakbo sa kalipunan ng dato ng {{SITENAME}};\nmagpatuloy na may pagiingat.",
        "rollback": "Mga pagbabagong may kaugnayan sa pagpapagulong na pabalik sa (mas) dati",
-       "rollback_short": "Pagulunging pabalik sa (mas) dati",
        "rollbacklink": "pagulunging pabalik sa (mas) dati",
        "rollbacklinkcount": "pagulunging pabalik ang $1 {{PLURAL:$1|pagbabago|mga pagbabago}}",
        "rollbacklinkcount-morethan": "pagulunging pabalik ang mahigit sa $1 {{PLURAL:$1|pagbabago|mga pagbabago}}",
        "import-logentry-interwiki": "Na-i-transwiki na ang $1",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|pagbabago|mga pagbabago}} mula sa $2",
        "javascripttest": "Pagsubok sa JavaScript",
-       "javascripttest-title": "Pinatatakbo ang mga pagsubok ng $1",
        "javascripttest-pagetext-noframework": "Nakalaan ang pahinang ito para sa pagpapatakbo ng mga pagsubok ng JavaScript.",
        "javascripttest-pagetext-unknownframework": "Hindi napag-aalamang balangkas ng pagsubok na \"$1\".",
        "javascripttest-pagetext-frameworks": "Mangyaring pumili ng isa sa sumusunod na mga  balangkas na pangsubok: $1",
        "javascripttest-pagetext-skins": "Pumili ng isang pabalat na patatakbuhan ng mga pagsubok:",
        "javascripttest-qunit-intro": "Tingnan ang [$1 dokumentasyon ng pagsubok] sa mediawiki.org.",
-       "javascripttest-qunit-heading": "Pook na subukan ng QUnit ng JavaScript ng MediaWiki",
        "tooltip-pt-userpage": "Ang iyong pahina ng tagagamit",
        "tooltip-pt-anonuserpage": "Ang pahina ng tagagamit para sa IP na iyong binabago bilang",
        "tooltip-pt-mytalk": "Ang iyong pahina ng usapan",
        "tags-tag": "Tatakan ang pangalan",
        "tags-display-header": "Anyo sa ibabaw ng mga talaan ng pagbabago",
        "tags-description-header": "Buong paglalarawan ng kahulugan",
+       "tags-source-header": "Pinagmulan",
        "tags-hitcount-header": "Natatakang mga pagbabago",
+       "tags-actions-header": "Mga hakbang",
+       "tags-source-none": "Hindi na ginagamit pa",
        "tags-edit": "baguhin",
+       "tags-delete": "Burahin",
        "tags-hitcount": "$1 {{PLURAL:$1|pagbabago|mga pagbabago}}",
+       "tags-create-reason": "Dahilan:",
+       "tags-create-submit": "Lumikha/Lumalang",
+       "tags-activate-reason": "Dahilan:",
+       "tags-deactivate-reason": "Dahilan:",
        "comparepages": "Paghambingin ang mga pahina",
        "compare-page1": "Pahina 1",
        "compare-page2": "Pahina 2",
index fd4ea73..9da0024 100644 (file)
        "recentchanges-summary": "Yapılan en son değişiklikleri bu sayfadan izleyin.",
        "recentchanges-noresult": "Belirtilen kriterlere uyan herhangi bir değişiklik bulunamadı.",
        "recentchanges-feed-description": "Bu beslemede, viki'de yapılan en son değişiklikleri takip edin.",
-       "recentchanges-label-newpage": "Bu değişiklikle yeni bir sayfa oluşturuldu",
+       "recentchanges-label-newpage": "Bu değişiklikle [[Special:NewPages|yeni bir sayfa]] oluşturuldu",
        "recentchanges-label-minor": "Küçük değişiklik",
        "recentchanges-label-bot": "Bir bot tarafından yapılan değişiklik",
        "recentchanges-label-unpatrolled": "Bu değişiklik henüz gözlenmemiş",
        "recentchanges-label-plusminus": "Sayfa boyutundaki değişikliğin bayt bazında değeri",
        "recentchanges-legend-heading": "'''Gösterge:'''",
-       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ayrıca bakınız [[Special:NewPages|yeni sayfalar listesi]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}}",
        "rcnotefrom": "<strong>$2</strong> tarihinden itibaren yapılan değişiklikler aşağıdadır (en fazla <strong>$1</strong> tanesi gösterilmektedir).",
        "rclistfrom": "$3 $2 tarihinden itibaren yeni değişiklikleri göster",
        "rcshowhideminor": "Küçük değişiklikleri $1",
index 346bf8d..98dc382 100644 (file)
        "tog-hidepatrolled": "Тикшерелгән үзгәртүләр яңа үзгәртүләр исемлегеннән яшерелсен.",
        "tog-newpageshidepatrolled": "Тикшерелгән битләр яңа битләр исемлегеннән яшерелсен",
        "tog-extendwatchlist": "Соңгыларын гына түгел, ә барлык үзгәртүләрне эченә алган, киңәйтелгән күзәтү исемлеге",
-       "tog-usenewrc": "Соңгы үзгәртүләрдә һәм күзәтү исемлегендә үзгәрешләрне төркемләргә(JavaScript кирәк)",
+       "tog-usenewrc": "Соңгы үзгәртүләрдә һәм күзәтү исемлегендә үзгәрешләрне төркемләргә",
        "tog-numberheadings": "Атамалар автомат рәвештә номерлансын",
-       "tog-showtoolbar": "Үзгәртү вакытында коралларның өске панеле күрсәтелсен (JavaScript кирәк)",
-       "tog-editondblclick": "Битләргә ике чирттерү белән үзгәртү бите ачылсын (JavaScript кирәк)",
-       "tog-editsectiononrightclick": "Бүлек исеменә тычканның уң чирттермәсе белән төрткәч үзгәртү бите ачылсын (JavaScript кирәк)",
+       "tog-showtoolbar": "Үзгәртү вакытында коралларның өске панеле күрсәтелсен",
+       "tog-editondblclick": "Битләргә ике чирттерү белән үзгәртү бите ачылсын",
+       "tog-editsectiononrightclick": "Бүлек исеменә тычканның уң чирттермәсе белән төрткәч үзгәртү",
        "tog-watchcreations": "Мин төзегән битләр һәм йөкләгән файллар күзәтү исемлегемә өстәлсен",
        "tog-watchdefault": "Мин үзгәрткән битләр һәм файллар күзәтү исемлегемә өстәлсен",
        "tog-watchmoves": "Мин күчергән битләр һәм файллар күзәтү исемлегемә өстәлсен",
@@ -48,7 +48,7 @@
        "tog-shownumberswatching": "Битне күзәтү исемлекләренә өстәгән кулланучылар санын күрсәтелсен",
        "tog-oldsig": "Хәзерге имза:",
        "tog-fancysig": "Имзаның шәхси вики-билгеләмәсе (автоматик сылтамасыз)",
-       "tog-uselivepreview": "Тиз карап алу кулланылсын (JavaScript, эксперименталь)",
+       "tog-uselivepreview": "Тиз карап алуны куллану",
        "tog-forceeditsummary": "Үзгәртүләрне тасвирлау юлы тутырылмаган булса, кисәтү",
        "tog-watchlisthideown": "Минем үзгәртүләрем күзәтү исемлегеннән яшерелсен",
        "tog-watchlisthidebots": "Бот үзгәртүләре күзәтү исемлегеннән яшерелсен",
        "actions": "Хәрәкәт",
        "namespaces": "Исемнәр мәйданы",
        "variants": "Төрләр",
+       "navigation-heading": "Навигация",
        "errorpagetitle": "Хата",
        "returnto": "$1 битенә кайту.",
        "tagline": "{{SITENAME}} проектыннан",
        "permalink": "Даими сылтама",
        "print": "Бастыру",
        "view": "Карау",
+       "view-foreign": "$1 сәхифәсендә карау",
        "edit": "Үзгәртү",
        "edit-local": "Локаль тасвирламаны үзгәртергә",
        "create": "Төзү",
        "jumptonavigation": "навигация",
        "jumptosearch": "эзләү",
        "view-pool-error": "Гафу итегез, хәзерге вакытта серверлар буш түгел.\nБу битне карарга теләүчеләр артык күп.\nБу биткә соңрак керүегез сорала.\n\n$1",
+       "generic-pool-error": "Гафу итегез, хәзерге вакытта серверлар буш түгел.\nБу битне карарга теләүчеләр артык күп.\nБу биткә соңрак керүегез сорала.",
        "pool-timeout": "Кысылуның  вакыты узды",
        "pool-queuefull": "Сорауларны саклау  бите тулы",
        "pool-errorunknown": "Билгесез  хата",
        "hidetoc": "яшерү",
        "collapsible-collapse": "Төрү",
        "collapsible-expand": "Ачу",
+       "confirmable-yes": "Әйе",
+       "confirmable-no": "Юк",
        "thisisdeleted": "$1 карарга яки торгызырга телисезме?",
        "viewdeleted": "$1 карарга телисезме?",
        "restorelink": "{{PLURAL:$1|1=1 бетерелгән үзгәртүне|$1 бетерелгән үзгәртүне}}",
        "mycustomjsprotected": "Сезнең биттә JavaScript үзгәртергә хокукларыгыз юк.",
        "ns-specialprotected": "Махсус битләрне үзгәртеп булмый.",
        "titleprotected": "Бу исем белән бит ясау [[User:$1|$1]] тарафыннан тыелган.\nУл күрсәткән сәбәп: ''$2''.",
+       "exception-nologin": "Сез хисап язмагызга кермәгәнсез",
        "virus-badscanner": "Көйләү хатасы. Билгесез вируслар сканеры: ''$1''",
        "virus-scanfailed": "сканерлау хатасы ($1 коды)",
        "virus-unknownscanner": "билгесез антивирус:",
        "gotaccount": "Сез инде теркәлдегезме? '''$1'''.",
        "gotaccountlink": "Керү",
        "userlogin-resetlink": "Серсүзегезне оныттыгызмы?",
+       "userlogin-resetpassword-link": "Серсүзне алыштырыргамы?",
+       "userlogin-helplink2": "Керү буенча ярдәм",
+       "userlogin-createanother": "Башка хисап язмасы төзү",
+       "createacct-emailrequired": "Электрон почта юлламагыз",
+       "createacct-emailoptional": "Электрон почта юлламагыз (мәҗбүри түгел)",
+       "createacct-email-ph": "Электрон почта юлламагызны языгыз",
        "createaccountmail": "электрон почта аша",
        "createaccountreason": "Сәбәп:",
        "badretype": "Кертелгән серсүзләр бер үк түгел.",
        "revdelete-hide-user": "Үзгәртүченең исемен/IP адресын яшер",
        "revdelete-hide-restricted": "Мәгълүматлар идарәчеләрдән дә яшерелсен",
        "revdelete-radio-same": "(үзгәртмәү)",
-       "revdelete-radio-set": "Әйе",
-       "revdelete-radio-unset": "Юк",
+       "revdelete-radio-set": "Яшеренлек",
+       "revdelete-radio-unset": "Ð\9aÒ¯Ñ\80енүÑ\87Ó\99нлек",
        "revdelete-suppress": "Мәгълүматлар идарәчеләрдән дә яшерелсен",
        "revdelete-log": "Сәбәп:",
        "revdelete-submit": "{{PLURAL:$1|сайланылган версиягә}} кулланырга",
        "deletereasonotherlist": "Башка сәбәп",
        "deletereason-dropdown": "* Бетерүнең сәбәпләре\n** вандаллык\n** автор соравы буенча\n** автор хокукларын бозу",
        "delete-edit-reasonlist": "Сәбәпләр исемлеген үзгәртү",
-       "rollback_short": "Кире кайтару",
        "rollbacklink": "кире кайтару",
        "editcomment": "Үзгәртү өчен тасвир: \"''$1''\".",
        "revertpage": "[[Special:Contributions/$2|$2]] үзгәртүләре ([[User talk:$2|бәхәс]])  [[User:$1|$1]] юрамасына кадәр кире кайтарылды",
index dbc1968..1de26da 100644 (file)
@@ -55,7 +55,8 @@
                        "Piramidion",
                        "Andygol",
                        "Ypryima",
-                       "Purodha"
+                       "Purodha",
+                       "Green Zero"
                ]
        },
        "tog-underline": "Підкреслювання посилань:",
        "prefs-personal": "Особисті дані",
        "prefs-rc": "Сторінка нових редагувань",
        "prefs-watchlist": "Список спостереження",
+       "prefs-editwatchlist-edit": "Перегляд і видалення назв з вашого списку спостереження",
+       "prefs-editwatchlist-clear": "Очистити список спостереження",
        "prefs-watchlist-days": "Кількість днів, що відображаються у списку спостережень:",
        "prefs-watchlist-days-max": "Максимум $1 {{PLURAL:$1|день|дні|днів}}",
        "prefs-watchlist-edits": "Кількість редагувань для відображення у розширеному списку спостереження:",
        "thumbnail-temp-create": "Не вдалося створити тимчасовий файл мініатюри",
        "thumbnail-dest-create": "Не вдалося зберегти мініатюру до місця призначення",
        "thumbnail_invalid_params": "Помилковий параметр мініатюри",
+       "thumbnail_toobigimagearea": "Файл з розмірами більше, ніж $1",
        "thumbnail_dest_directory": "Неможливо створити цільову директорію",
        "thumbnail_image-type": "Тип зображення не підтримується",
        "thumbnail_gd-library": "Неповна конфігурація бібліотеки GD, відсутня функція $1",
        "javascripttest": "Тестування JavaScript",
        "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.",
        "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 користувача). Використання: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]],[[{{#Special:Redirect}}/revision/328429]] або [[{{#Special:Redirect}}/user/101]].",
index ca9b49c..c508fed 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": "پہلی ترمیم پر نمائش دکھاؤ",
        "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 f12520e..244f3e7 100644 (file)
        "view-foreign": "$1da koʻrish",
        "edit": "Tahrirlash",
        "create": "Yaratish",
+       "create-local": "Mahalliy tavsifini qoʻshish",
        "editthispage": "Ushbu sahifani tahrirlash",
        "create-this-page": "Ushbu sahifani yaratish",
        "delete": "O‘chirish",
        "undelete_short": "{{PLURAL:$1|bitta tahrir|$1 ta tahrir}}ni tiklash",
        "viewdeleted_short": "$1 ta oʻchirilgan tahrirni koʻrish",
        "protect": "Himoyalash",
-       "protect_change": "Oʻzgartirish",
+       "protect_change": "oʻzgartirish",
        "protectthispage": "Ushbu sahifani himoyalash",
        "unprotect": "Himoyadan chiqarish",
        "unprotectthispage": "Ushbu sahifaning himoyasini oʻzgaritish",
        "redirectedfrom": "($1dan yoʻnaltirildi)",
        "redirectpagesub": "Yoʻnaltiruvchi sahifa",
        "redirectto": "Qayta yoʻnaltirish:",
-       "lastmodifiedat": "Bu sahifa oxirgi marta $1 soat $2 da tahrirlangan.",
+       "lastmodifiedat": "Bu sahifa oxirgi marta $1, $2 da tahrirlangan.",
        "viewcount": "Bu sahifaga {{PLURAL:$1|bir marta|$1 marta}} murojaat qilingan.",
        "protectedpage": "Himoyalangan sahifa",
        "jumpto": "Oʻtish:",
        "pool-timeout": "Toʻsishni kutish vaqti tugadi",
        "pool-queuefull": "Soʻrovlar jamlanmasi toʻldi",
        "pool-errorunknown": "Nomaʼlum xato",
+       "poolcounter-usage-error": "Foydalanish xatosi: $1",
        "aboutsite": "{{SITENAME}} haqida",
        "aboutpage": "Project:Haqida",
        "copyright": "Keltirilgan maʼlumotlar $1 orqali tarqatilmoqda (agar aksinchasi koʻrsatilmagan boʻlsa).",
        "hidetoc": "yashirish",
        "collapsible-collapse": "Yigʻish",
        "collapsible-expand": "Yoyish",
+       "confirmable-confirm": "Aminmisiz?",
        "confirmable-yes": "Ha",
        "confirmable-no": "Yoʻq",
        "thisisdeleted": "$1ni koʻrib chiqasizmi yoki tiklaysizmi?",
        "filerenameerror": "Fayl nomini «$1»dan «$2»ga o‘zgartirish imkoni yoʻq.",
        "filedeleteerror": "\"$1\" faylini oʻchirib boʻlmadi.",
        "directorycreateerror": "\"$1\" papkasini yaratish imkoni yoʻq.",
+       "directoryreadonlyerror": "\"$1\" katalogi faqat oʻqish uchun moʻljallangan.",
        "filenotfound": "\"$1\" faylini topib boʻlmadi.",
        "unexpected": "Kutilmagan qiymat: \"$1\"=\"$2\".",
+       "formerror": "Xatolik: Formani jo‘natib bo‘lmadi.",
+       "badarticleerror": "Bu harakatni ushbu sahifada bajarib bo‘lmadi.",
        "cannotdelete-title": "\"$1\" sahifasini oʻchirib boʻlmadi.",
        "badtitle": "Notoʻgʻri sarlavha",
        "viewsource": "Manbasini koʻrish",
        "namespaceprotected": "Sizda '''$1''' nomfazosi sahifalarini tahrirlash huquqi yoʻq",
        "customcssprotected": "Sizda uchbu CSS sahifani tahrirlash huquqi yoʻq, chunki bu yerda boshqa foydalanuvchining shaxsiy moslamalari saqlanadi.",
        "customjsprotected": "Sizda uchbu JavaScript sahifani tahrirlash huquqi yoʻq, chunki bu yerda boshqa foydalanuvchining shaxsiy moslamalari saqlanadi.",
+       "mycustomjsprotected": "Sizda ushbu JavaScript sahifani tahrirlashga ruxsat mavjud emas.",
+       "myprivateinfoprotected": "Sizda shaxsiy maʻlumotlaringizni tahrirlashga ruxsat mavjud emas.",
+       "mypreferencesprotected": "Sizda afzalliklarni tahrirlashga ruxsat mavjud emas.",
        "ns-specialprotected": "\"{{ns:special}}\" nomfazosi sahifalari tahrirlanishi mumkin emas.",
        "exception-nologin": "Siz tizimda o'zingizni tanishtirmadingiz",
        "exception-nologin-text": "Bu sahifani koʻrish yoki soʻralgan amalni bajarish uchun tizimga kirishingiz lozim.",
        "yourname": "Foydalanuvchi nomi:",
        "userlogin-yourname": "Foydalanuvchi nomi",
        "userlogin-yourname-ph": "Foydalanuvchi nomingizni kiriting",
-       "createacct-another-username-ph": "Foydalanuvchi nomingizni kiriting",
+       "createacct-another-username-ph": "Foydalanuvchi nomini kiriting",
        "yourpassword": "Maxfiy soʻz:",
        "userlogin-yourpassword": "Maxfiy soʻz",
        "userlogin-yourpassword-ph": "Maxfiy soʻzni kiriting",
        "gotaccount": "Hisobingiz bormi? '''$1'''.",
        "gotaccountlink": "Kirish",
        "userlogin-resetlink": "Kirish maʻlumotlaringiz esdan chiqdimi?",
-       "userlogin-resetpassword-link": "Unutib qoʻydingizmi?",
+       "userlogin-resetpassword-link": "Maxfiy so‘zni unutib qoʻydingizmi?",
        "userlogin-helplink2": "Kirish uchun yordam",
        "userlogin-loggedin": "Siz {{GENDER:$1|$1}} nomi bilan kirgansiz.\nBoshqa hisob raqami orqali kirish uchun quyidagi formadan foydalaning.",
        "userlogin-createanother": "Boshqa hisob yaratish",
        "createacct-email-ph": "Elektron pochta manzilingizni kiriting",
        "createacct-another-email-ph": "Elektron pochta manzilini kiriting",
        "createaccountmail": "Tasodifan tanlab beriladigan vaqtinchalik maxfiy soʻzdan foydalanish (elektron pochta manzilingizga joʻnatiladi)",
+       "createacct-realname": "Haqiqiy ismi (ixtiyoriy)",
        "createaccountreason": "Sabab:",
        "createacct-reason": "Sabab",
        "createacct-reason-ph": "Nimaga yana boshqa hisob yaratyapsiz",
        "createacct-another-submit": "Boshqa hisob yaratish",
        "createacct-benefit-heading": "{{SITENAME}} Sizga oʻxshagan odamlar tomonidan yaratiladi",
        "createacct-benefit-body1": "tahrirlar soni",
-       "createacct-benefit-body2": "maqolalar soni",
+       "createacct-benefit-body2": "sahifalar soni",
        "createacct-benefit-body3": "soʻnggi paytdagi ishtirokchilar soni",
        "badretype": "Siz tomondan kiritilgan maxfiy so'zlar mos kelmayapti.",
+       "userexists": "Bunday foydalanuvchi nomi avvalroq yaratilgan. Iltimos, boshqa nom tanlang.",
        "loginerror": "Foydalanuvchini aniqlashda xatolik",
        "createacct-error": "Hisob yaratishda xatolik",
        "createaccounterror": "Hisob yozuvi yaratishning iloji yoʻq: $1",
        "wrongpasswordempty": "Maxfiy soʻz koʻrsatilmagan. Qaytadan urinib koʻring.",
        "mailmypassword": "Maxfiy soʻzni yangilash",
        "passwordremindertitle": "{{SITENAME}} uchun vaqtinchalik yangi maxfiy so'z",
+       "noemailcreate": "Siz haqiqiy elektron pochta manzilingizni taqdim qilishingiz kerak.",
        "mailerror": "$1 manziliga xat yuborishda xatolik",
        "emailauthenticated": "Elektron pochta manzilingiz $2, $3 da tasdiqlangan.",
        "emailconfirmlink": "Elektron pochta manzilingizni tasdiqlash",
        "pt-login-button": "Kirish",
        "pt-createaccount": "Hisob yaratish",
        "pt-userlogout": "Chiqish",
+       "php-mail-error-unknown": "PHPning mail() funksiyasida nomaʻlum xatolik.",
        "changepassword": "Maxfiy soʻzni oʻzgartirish",
        "resetpass_header": "Maxfiy soʻzni oʻzgartirish",
        "oldpassword": "Eski mahfiy so'z:",
        "resetpass_submit": "Maxfiy so'zni o'rnatish va kirish",
        "changepassword-success": "Maxfiy soʻzni oʻzgartirish muvaffaqiyatli oʻtdi!",
        "resetpass_forbidden": "Maxfiy so'z o'zgartirilishi mumkin emas",
+       "resetpass-no-info": "Siz ushbu sahifaga toʻgʻridan toʻgʻri kirishingiz uchun tizimga kirgan boʻlishingiz kerak.",
        "resetpass-submit-loggedin": "Maxfiy soʻzni oʻzgartirish",
        "resetpass-submit-cancel": "Bekor",
        "resetpass-temp-password": "Vaqtinchalik maxfiy soʻz",
        "passwordreset-text-one": "Mahfiy soʻzni tashlash uchun ushbu oynalarni toʻltiring.",
        "passwordreset-text-many": "{{PLURAL:$1|Quyidagi oynalardan birini toʻldirsangiz, elektron pochtangizga vaqtinchalik maxfiy soʻz joʻnatiladi.}}",
        "passwordreset-legend": "Maxfiy soʻzni yangilash",
+       "passwordreset-emaildisabled": "Email xususiyatlari ushbu vikida oʻchirib qoʻyilgan.",
        "passwordreset-username": "Foydalanuvchi nomi:",
        "passwordreset-domain": "Domen:",
        "passwordreset-capture": "Xatni koʻrmoqchimisiz?",
        "changeemail-oldemail": "Joriy elektron pochta manzili",
        "changeemail-newemail": "Elektron pochtaning yangi manzili",
        "changeemail-none": "(yoʻq)",
+       "changeemail-password": "Sizning {{SITENAME}}dagi maxfiy so‘zingiz:",
        "changeemail-submit": "Manzilni o'zgartirish",
+       "resettokens": "Kalitlaringizni yangilash",
+       "resettokens-legend": "Kalitlaringizni yangilash",
+       "resettokens-tokens": "Kalitlar:",
+       "resettokens-token-label": "$1 (joriy koʻrsatkich: $2)",
+       "resettokens-done": "Kalitlar yangilandi.",
+       "resettokens-resetbutton": "Belgilangan kalitlarni yangilash",
        "bold_sample": "Qalin matn",
        "bold_tip": "Qalin matn",
        "italic_sample": "Yotiq matn",
        "subject": "Mavzu/sarlavha",
        "minoredit": "Bu kichik tahrir",
        "watchthis": "Sahifani kuzatish",
-       "savearticle": "Saqlash",
+       "savearticle": "Saqla",
        "preview": "Ko‘rib chiqish",
        "showpreview": "Koʻrib chiqish",
-       "showdiff": "O‘zgarishlarni ko‘rsatish",
+       "showdiff": "Kiritilgan o‘zgarishlar",
        "anoneditwarning": "'''Diqqat:''' Siz tizimga kirmagansiz. Ushbu sahifa tarixida Sizning IP manzilingiz yozib qolinadi.",
        "missingcommenttext": "Iltimos sharh qoldiring.",
        "summary-preview": "Tavsif bunday koʻrinishda boʻladi:",
        "note": "'''Izoh:'''",
        "previewnote": "'''Bu shunchaki koʻrib chiqish.''' Oʻzgartirishlar hali saqlangani yoʻq!",
        "continue-editing": "tahrirlashni davom ettirish",
-       "editing": "$1 tahrirlanmoqda",
+       "session_fail_preview": "<strong>Afsuski, sizning tahriringiz texnik nosozlik yuzaga kelgani sabab saqlanmadi.</strong>\nIltimos, yana bir bor urinib koʻring.\nAgar shu xato yana takrorlansa, hisob yozuvingizdan [[Special:UserLogout|chiqishni amalga oshiring]] va qaytadan kiring.",
+       "session_fail_preview_html": "<strong>Afsuski, sizning tahriringiz texnik nosozlik yuzaga kelgani sabab saqlanmadi.</strong>\n\n<em>Chunki {{SITENAME}}da faqat HTMLdan foydalanish mumkin, JavaScript-hujumlardan saqlanish maqsadida koʻrib chiqish imkoniyati oʻchirib qoʻyilgan.</em>\n\n<strong>Agar foydali tahrir kiritmoqchi boʻlgan boʻlsangiz, yana bir bor urinib koʻring.</strong>\nAgar shundayam xato takrorlansa, hisob yozuvingizdan [[Special:UserLogout|chiqishni amalga oshiring]] va qaytadan kiring.",
+       "editing": "Tahrirlanmoqda — $1",
        "creating": "«$1» sahifasini yaratish",
-       "editingsection": "$1 tahrirlanmoqda (boʻlim)",
-       "editingcomment": "$1 tahrirlanmoqda (yangi mavzu)",
+       "editingsection": "Tahrirlanmoqda — $1 (boʻlimi)",
+       "editingcomment": "Yangi mavzu yaratilmoqda — $1",
        "editconflict": "Tahrirlash toʻqnashuvi: $1",
+       "explainconflict": "Sahifani tahrirlayotgan mahalingizda boshqa birov unga oʻzgarish kiritib ulgurdi.\nYuqoridagi tahrir oynasida sahifaning joriy matnini koʻrishingiz mumkin.\nPastdagida esa siz kiritgan oʻzgarishlar koʻrsatilgan.\nKiritmoqchi boʻlgan oʻzgarishlaringizni pastdagi oynadan yuqoridagiga oʻtkazing.\n«{{int:savearticle}}» tugmasini bossangiz <strong>faqat</strong> yuqoridagi matn saqlanadi.",
        "yourtext": "Sizning matningiz",
-       "editingold": "<strong>Ogohlantirish: Siz sahifaning eski nusxasini tahrirlayapsiz.</strong>\nUni shunday holicha saqlasangiz, keyingi nusxalardagi oʻzgarishlar yoʻqotiladi.",
+       "editingold": "<strong>Ogohlantirish: Siz sahifaning eski nusxasini tahrirlayapsiz.</strong> Uni 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!'''",
+       "protectedpagewarning": "<strong>Ogohlantirish: Ushbu sahifa himoyalangan boʻlib, faqat administratorlar tomonidan tahrirlanishi mumkin.</strong>\nQuyida himoyalash jurnalidagi oxirgi qayd keltirilgan:",
+       "semiprotectedpagewarning": "<strong>Izoh:</strong> Ushbu sahifa himoyalangan boʻlib, faqat roʻyxatdan oʻtgan foydalanuvchilar tomonidan tahrirlanishi mumkin. Quyida himoyalash jurnalidagi oxirgi qayd keltirilgan:",
        "templatesused": "Ushbu sahifada foydalanilgan {{PLURAL:$1|andoza|andozalar}}:",
        "templatesusedpreview": "Ushbu sahifada foydalanilgan {{PLURAL:$1|andoza|andozalar}}:",
        "templatesusedsection": "Ushbu bo'limda foydalanilgan {{PLURAL:$1|andoza|andozalar}}:",
        "sectioneditnotsupported-text": "Ushbu sahifada boʻlimlarni tahrirlash imkoniyati yoʻq.",
        "permissionserrors": "Ruxsat huquqida xato",
        "permissionserrorstext-withaction": "Sizda quyidagi {{PLURAL:$1|sabab|sabablar}}ga koʻra '''$2'''ga ruxsat mavjud emas:",
-       "recreate-moveddeleted-warn": "'''Diqqat: Siz avval yoʻqotilgan sahifani yana yaratmoqchisiz.'''\n\nBu sahifani yaratishda davom etishdan avval uning nega avval yoʻqotilgani bilan qiziqib koʻring.\nQulaylik uchun quyida yoʻqotilish qaydlari keltirilgan:",
+       "recreate-moveddeleted-warn": "<strong>Diqqat: Siz avval yoʻqotilgan sahifani qaytadan yaratmoqchisiz.</strong>\n\nU avval nega yoʻqotilgani bilan qiziqib koʻring.\nQuyida ushbu sahifaga oid yoʻqotish va koʻchirish qaydlari keltirilgan:",
        "moveddeleted-notice": "Bu sahifa oʻchirilgan.\nMaʼlumot uchun quyida oʻchirish va qayta nomlash jurnallaridan mos yozuvlar keltirilgan.",
        "log-fulllog": "Qaydlarni toʻliq koʻrish",
        "edit-conflict": "Tahrirlash toʻqnashuvi.",
        "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-success": "Tahrirni bekor qilish imkoniyati bor. Iltimos, solishtirish oynasini koʻrib chiqib, aynan shu oʻzgarishlarni bekor qilmoqchiligingizga ishonch hosil qiling va undan keyin «Saqla» tugmasini bosing.",
        "undo-summary": "[[Special:Contributions/$2|$2]] ([[User talk:$2|mun.]]) tomonidan qilingan $1-sonli tahrir qaytarildi",
+       "cantcreateaccounttitle": "Ro‘yxatdan o‘tib bo‘lmadi",
+       "cantcreateaccount-text": "[[User:$3|$3]] ushbu IP manzil (<strong>$1</strong>) orqali ro‘yxatdan o‘tishni bloklab qo‘ygan.\n\n$3 <em>$2</em>ni sabab qilib ko‘rsatdi",
+       "cantcreateaccount-range-text": "[[User:$3|$3]] '''$1''' sohaga tegishli IP manzillar, shu jumladan sizning IP manzilingiz ('''$4'''), orqali ro‘yxatdan o‘tishni bloklab qo‘ygan.\n\n$3 ''$2''ni sabab qilib ko‘rsatdi",
        "viewpagelogs": "Ushbu sahifaga doir qaydlarni koʻrsat",
        "nohistory": "Ushbu sahifa uchun oʻzgarishlar tarixi mavjud emas.",
        "currentrev": "Hozirgi koʻrinishi",
        "histlegend": "Farqlarni tanlash: solishtirish uchun kerakli radiobokslarni belgilang va '''{{int:compare-submit}}''' tugmasini bosing.<br />\nBu yerda: '''({{int:cur}})''' = hozirgi koʻrinish bilan farqi, '''({{int:last}})''' = avvalgi koʻrinish bilan farqi, '''{{int:minoreditletter}}''' = kichkina tahrir.",
        "history-fieldset-title": "Tarixni koʻrish",
        "history-show-deleted": "Faqat yoʻqotilganlari",
-       "histfirst": "Eng avvalgi",
-       "histlast": "Eng soʻnggi",
+       "histfirst": "eng eski",
+       "histlast": "eng yangi",
        "historysize": "({{PLURAL:$1|1 bayt|$1 bayt}})",
        "historyempty": "(boʻsh)",
        "history-feed-title": "Oʻzgarishlar tarixi",
        "history-feed-item-nocomment": "$1 $2 da",
        "rev-deleted-comment": "(tahrir izohi o'chirildi)",
        "rev-deleted-user": "(muallif nomi oʻchirilgan)",
-       "rev-deleted-event": "(qayd yozuvi o'chirildi)",
+       "rev-deleted-event": "(jurnal tafsilotlari o‘chirildi)",
        "rev-delundel": "koʻrsatish/yashirish",
        "rev-showdeleted": "koʻrsatish",
        "revdelete-show-file-submit": "Ha",
+       "revdelete-confirm": "Iltimos, haqiqatdan ham shu harakatni amalga oshirmoqchiligingizni, uning oqibatlarini tushunib turganingizni va harakatingiz [[{{MediaWiki:Policy-url}}|qoidalarga]] asosanlanganini tasdiqlang.",
        "revdelete-hide-text": "Sahifaning ushbu versiyasi matnini yashirish",
        "revdelete-radio-same": "(o'zgartirilmasin)",
        "revdelete-radio-set": "Ha",
        "mergehistory-reason": "Sabab:",
        "mergelog": "Birlashtirish qaydlari",
        "revertmerge": "Bo'lish",
-       "history-title": "$1 - oʻzgarishlar tarixi",
+       "history-title": "$1  oʻzgarishlar tarixi",
        "difference-title": "$1 — versiyalar orasidagi farq",
        "difference-title-multipage": "\"$1\" va \"$2\" sahifalar orasidagi farq",
        "difference-multipage": "(Sahifalar orasidagi farq)",
        "lineno": "Qator $1:",
-       "compareselectedversions": "Tanlangan versiyalarni solishtir",
-       "showhideselectedversions": "Tanlangan versiyalarni koʻrsatish/yashirish",
-       "editundo": "qaytarish",
+       "compareselectedversions": "Solishtirish",
+       "showhideselectedversions": "Oʻzgartirish",
+       "editundo": "bekor qilish",
        "searchresults": "Qidiruv natijalari",
        "searchresults-title": "\"$1\" uchun qidiruv natijalari",
        "titlematches": "Sahifalar nomlaridagi mos kelishlar",
        "preferences": "Moslamalar",
        "mypreferences": "Moslamalarim",
        "prefs-edits": "Tahrirlar soni:",
+       "prefsnologintext2": "Iltimos, moslamalarni oʻzgartirish uchun tizimga kiring.",
        "prefs-skin": "Tashqi ko‘rinishi",
        "skin-preview": "Ko‘rib chiqish",
        "datedefault": "Farqi yoʻq",
        "prefs-labs": "Tajribaviy imkoniyatlar",
        "prefs-user-pages": "Foydalanuvchi sahifalari",
        "prefs-personal": "Shaxsiy ma’lumotlar",
-       "prefs-rc": "Yangi o‘zgartirishlar",
+       "prefs-rc": "Yangi o‘zgarishlar",
        "prefs-watchlist": "Kuzatuv roʻyxati",
        "prefs-watchlist-days": "Kunlar soni:",
        "prefs-watchlist-days-max": "Maksimum $1 kun",
        "prefs-displayrc": "Tasvirlash moslamalari",
        "prefs-displaywatchlist": "Tasvirlash moslamalari",
        "prefs-diffs": "Versiyalar farqi",
-       "userrights-user-editname": "Foydalanuvchi nomingizni kiriting:",
-       "editusergroup": "Foydalanuvchi guruxlarni taxrirlash",
+       "userrights": "Foydalanuvchining huquqlarini boshqarish",
+       "userrights-user-editname": "Foydalanuvchi nomi:",
+       "editusergroup": "Guruhlardagi aʼzoligini oʻzgartirish",
        "userrights-groupsmember": "Aʼzolik:",
-       "userrights-groupsmember-auto": "Noaniq a'zo",
+       "userrights-groupsmember-auto": "Quyidagi guruhlarga kiradi:",
        "userrights-reason": "Sabab:",
        "userrights-changeable-col": "Siz o'zgartirishingiz mumkin bo'lgan guruhlar",
        "userrights-unchangeable-col": "Siz o'zgartira olmaydigan guruhlar",
        "action-deletedhistory": "ushbu sahifaning oʻchirilgan tarixini koʻrish",
        "action-sendemail": "elektron xatlar jo'natish",
        "nchanges": "$1 {{PLURAL:$1|oʻzgarish|oʻzgarishlar}}",
+       "enhancedrc-history": "tarix",
        "recentchanges": "Yangi oʻzgarishlar",
        "recentchanges-legend": "Yangi oʻzgarishlar moslamalari",
        "recentchanges-summary": "Bu sahifada siz {{SITENAME}}da sodir boʻlgan soʻnggi oʻzgarishlarni koʻrishingiz mumkin.",
        "recentchanges-label-plusminus": "Sahifa vazni qanchaga oʻzgargani (bayt)",
        "recentchanges-legend-heading": "'''Izoh:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|alohida roʻyxat]])",
-       "rcnotefrom": "Quyida <strong>$2</strong> dan keyin amalga oshirilgan oʻzgarishlar keltirilgan (oxirgi <strong>$1</strong> tasi)",
-       "rclistfrom": "$3, $2 dan keyingi oʻzgarishlarni koʻrsat",
+       "rcnotefrom": "Quyida <strong>$3, $4</strong> dan keyin sodir boʻlgan oʻzgarishlar koʻrsatilgan (oxirgi <strong>$1</strong> tasi).",
+       "rclistfrom": "$3, $2 dan keyin sodir boʻlgan oʻzgarishlarni koʻrsat",
        "rcshowhideminor": "Kichik tahrirlarni $1",
        "rcshowhideminor-show": "koʻrsat",
        "rcshowhideminor-hide": "yashir",
        "shared-repo": "umumiy fayllar saqlanadigan joy",
        "shared-repo-name-wikimediacommons": "Vikiombor",
        "filerevert-comment": "Sabab:",
+       "filedelete": "$1 — oʻchirish",
+       "filedelete-intro": "Siz ushbu faylni — <strong>[[Media:$1|$1]]</strong> va uning tarixini butunlay oʻchirib tashlamoqchi boʻlyapsiz.",
        "filedelete-comment": "Sabab:",
        "filedelete-submit": "O‘chirish",
+       "filedelete-reason-dropdown": "* Umumiy sabablar\n** mualliflik huquqlari buzilyapti\n** mavjud faylning nusxasi",
        "mimetype": "MIME-tur:",
        "download": "yuklash",
        "unusedtemplates": "Ishlatilinmagan andozalar",
        "statistics-pages": "Sahifalar",
        "statistics-pages-desc": "Ushbu vikidagi barcha sahifalar, jumladan munozara, yoʻnaltirish va hk.",
        "statistics-files": "Yuklangan fayllar",
-       "statistics-edits": "{{SITENAME}} qurilganidan beri qilingan tahrirlar",
-       "statistics-edits-average": "Sahifa boshiga tahrirlar",
+       "statistics-edits": "{{SITENAME}}dagi tahrirlarning umumiy soni",
+       "statistics-edits-average": "Oʻrtacha tahrirlar soni (sahifa boshiga)",
        "statistics-users": "Qayd etilgan [[Special:ListUsers|foydalanuvchilar]]",
        "statistics-users-active": "Faol foydalanuvchilar",
        "statistics-users-active-desc": "Oxirgi $1 kun ichida kamida bitta amal qilgan foydalanuvchilar",
        "alllogstext": "{{SITENAME}}dagi barcha jurnallar roʻyxati.\nNatijalarni jurnal nomi, foydalanuvchi nomi (harflar katta-kichikligi inobatga olinadi) yoki sahifa nomi boʻyicha saralashingiz mumkin.\n* Biror foydalanuvchi amalga oshirgan qaydni topish uchun uning foydalanuvchi nomini „Ijrochi“ oynasiga kiriting.\n* Biror foydalanuvchi yoki sahifaga nisbatan amalga oshirilgan qaydni topish uchun ulardan birining nomini „Moʻljal“ oynasiga kiriting.",
        "logempty": "Talabga mos yozuvlar mavjud emas.",
        "log-title-wildcard": "Shu matndan boshlanuvchi sarlavhalarni izlash",
+       "showhideselectedlogentries": "Tanlangan jurnal yozuvini oʻzgartirish",
        "allpages": "Barcha sahifalar",
        "nextpage": "Keyingi sahifa ($1)",
        "prevpage": "Avvalgi sahifa ($1)",
        "watchnologin": "Siz tizimda o'zingizni tanishtirmadingiz",
        "addwatch": "Kuzatuv ro'yxatiga qo'shish",
        "addedwatchtext": "\"[[:$1]]\" sahifasi sizning [[Special:Watchlist|kuzatuv roʻyxatingizga]] qoʻshildi. Bu sahifada va uning munozara sahifasida boʻladigan oʻzgarishlar u yerda koʻrsatiladi.",
-       "removewatch": "Kuzatuv ro'yxatidan o'chirish",
+       "removewatch": "Kuzatuv roʻyxatidan oʻchirish",
        "removedwatchtext": "\"[[:$1]]\" sahifasi [[Special:Watchlist|kuzatuv roʻyxatingizdan]] oʻchirildi.",
        "watch": "Kuzatish",
        "watchthispage": "Sahifani kuzatish",
        "notanarticle": "Maqola emas",
        "watchlist-details": "Sizning kuzatuv roʻyxatingizda hozirda {{PLURAL:$1|bitta sahifa|$1ta sahifa}} mavjud (munozara sahifalarini hisobga olmaganda).",
        "wlheader-showupdated": "Siz oxirgi marta kirganingizdan keyin oʻzgartirilgan sahifalar '''qalin''' yozuv bilan ajratib koʻrsatilgan.",
-       "wlnote": "Below {{PLURAL:$1|is the last change|are the last '''$1''' changes}} in the last {{PLURAL:$2|hour|'''$2''' hours}}, as of $3, $4.",
+       "wlnote": "Quyida oxirgi $2 soat ichida sodir boʻlgan {{PLURAL:$1|oxirgi oʻzgarish|<strong>$1</strong> ta oʻzgarishlar}} koʻrsatilgan. $3, $4.",
        "wlshowlast": "Oxirgi $1 soatdagi $2 kundagi tahrirlarni koʻrsatish",
        "watchlist-options": "Kuzatuv roʻyxati moslamalari",
        "watching": "Kuzatish...",
-       "unwatching": "Kuzatuv ro'yxatidan o'chirish...",
+       "unwatching": "Kuzatuv roʻyxatidan oʻchirilmoqda...",
        "enotif_reset": "Hammasini koʻrib chiqilgan deb belgilash",
        "enotif_impersonal_salutation": "{{SITENAME}} ishtirokchisi",
        "enotif_subject_deleted": "{{SITENAME}} loyihasining $1 nomli sahifasi foydalanuvchi {{gender:$2|$2}} tomonidan o‘chirildi",
        "enotif_body": "Hurmatli $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nO‘zgarish bo‘yicha qisqacha izoh: $PAGESUMMARY $PAGEMINOREDIT\n\nTahrirlovchiga murojaat qilish:\nel. pochta: $PAGEEDITOR_EMAIL\nviki: $PAGEEDITOR_WIKI\n\nAgar siz sahifaga o‘tib ko‘rmasangiz, u holda uning keyingi o‘zgarishlari bo‘yicha boshqa bildirish xabarlari kelmaydi. Siz, shuningdek o‘z kuzatuv ro‘yxatingizda barcha sahifalar uchun xabar berish moslamasini o‘chirishingiz mumkin.\n\n{{SITENAME}}ning xabar berish tizimi\n\n--\nXabar berish moslamalarini o‘zgartirish uchun quyidagi havola bo‘yicha o‘ting\n{{canonicalurl:{{#special:Preferences}}}}\n\nOʻz kuzatuv roʻyxatingiz moslamalarini o‘zgartirish uchun quyidagi havola bo‘yicha o‘ting\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nOʻz kuzatuv roʻyxatingizdan sahifani o‘chirish uchun quyidagi havola bo‘yicha o‘ting\n$UNWATCHURL\n\nQayta aloqa va yordam\n$HELPPAGE",
        "created": "yaratildi",
        "changed": "o‘zgartirildi",
-       "deletepage": "Sahifani o'chirish",
+       "deletepage": "Sahifani oʻchirish",
        "confirm": "Tasdiqlash",
        "excontent": "tarkibi: „$1“",
        "excontentauthor": "tarkibi: „$1“ (faqat bitta muallifi bor edi: „[[Special:Contributions/$2|$2]]“)",
        "exbeforeblank": "tozalashdan oldingi tarkibi: „$1“",
        "delete-confirm": "$1 — oʻchirish",
-       "delete-legend": "O‘chirish",
+       "delete-legend": "Sahifani o‘chirish",
+       "historywarning": "<strong>Diqqat:</strong> Siz oʻchirmoqchi boʻlayotgan sahifaning tarixida $1 ta {{PLURAL:$1|versiyasi}} bor:",
+       "confirmdeletetext": "Siz ushbu sahifani va uning tarixini butunlay oʻchirib tashlamoqchi boʻlyapsiz. Iltimos, [[Special:Whatlinkshere/{{FULLPAGENAMEE}}|bogʻlangan sahifalar]] bilan tanishib chiqishni unutmang.",
        "actioncomplete": "Bajarildi",
        "actionfailed": "Jarayon amalga oshmadi",
        "deletedtext": "\"$1\" yoʻqotildi.\nYaqinda sodir etilgan yoʻqotishlar uchun $2ni koʻring.",
        "dellogpagetext": "Quyida oxirgi yoʻqotish qaydlari keltirilgan",
        "deletionlog": "yoʻqotish qaydlari",
        "reverted": "Eski holiga keltirildi",
-       "deletecomment": "Sabab:",
+       "deletecomment": "Sababi:",
        "deleteotherreason": "Boshqa/qoʻshimcha sabab:",
        "deletereasonotherlist": "Boshqa sabab",
        "delete-edit-reasonlist": "Sabablar roʻyxatini tahrirlash",
-       "rollback": "Oʻzgarishlarni eski holiga keltirish",
-       "rollbacklink": "eski holiga keltirish",
+       "deleting-backlinks-warning": "'''Ogohlantirish:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Baʼzi bir sahifalar]] siz oʻchirmoqchi boʻlayotgan sahifaga bogʻlangan.",
+       "rollback": "Oʻzgarishlarni ortga qaytarish",
+       "rollbacklink": "ortga qaytarish",
        "rollbacklinkcount": "$1 ta tahrirni ortga qaytarish",
-       "rollbacklinkcount-morethan": "$1 {{PLURAL:$1| tadan koʻp tahrir}}ni eski holiga keltirish",
+       "rollbacklinkcount-morethan": "$1 tadan koʻp tahrirni ortga qaytarish",
        "rollbackfailed": "Eski holiga keltirishda xatolik",
        "revertpage": "[[Special:Contributions/$2|$2]] tahrirlari [[User:$1|$1]] versiyasiga qaytarildi",
        "sessionfailure-title": "Seansda xatolik",
        "protectlogpage": "Himoyalash qaydlari",
        "protectedarticle": "\"[[$1]]\" sahifasi himoyalandi",
-       "modifiedarticleprotection": "\"[[$1]]\" uchun himoyalash darajasini o'zgartirdi",
+       "modifiedarticleprotection": "\"[[$1]]\" sahifasining himoya darajasini oʻzgartirdi",
        "movedarticleprotection": "himoyalash moslamalarini \"[[$2]]\"dan \"[[$1]]\"ga o'tkazdi",
-       "protect-legend": "Himoya oʻrnatishni tasdiqlang",
+       "protect-title": "\"$1\" uchun himoya darajasini oʻrnatish",
+       "protect-legend": "Himoya oʻrnatish",
        "protectcomment": "Sabab:",
-       "protectexpiry": "Tugaydi:",
-       "protect-level-sysop": "Faqat administratorlar uchun",
+       "protectexpiry": "Muddati:",
+       "protect-unchain-permissions": "Qoʻshimcha moslamalarni yoqish",
+       "protect-text": "Bu yerda siz <strong>$1</strong> sahifasining himoya darajasini koʻrishingiz va oʻzgartishingiz mumkin.",
+       "protect-default": "Barcha foydalanuvchilar",
+       "protect-level-autoconfirmed": "Faqat roʻyxatdan oʻtgan foydalanuvchilar",
+       "protect-level-sysop": "Faqat administratorlar",
        "protect-summary-cascade": "pog‘onali",
        "protect-expiring-local": "$1da tugaydi",
        "protect-expiry-indefinite": "muddatsiz",
-       "protect-othertime": "Boshqa vaqt:",
-       "protect-othertime-op": "boshqa vaqt",
+       "protect-cascade": "Ushbu sahifaga bogʻlangan sahifalarni ham himoyalash (pogʻonali himoya)",
+       "protect-othertime": "Boshqa muddat:",
+       "protect-othertime-op": "boshqa muddat",
        "protect-existing-expiry": "Joriy tugash vaqti: $2, $3",
        "protect-otherreason": "Boshqa/qo‘shimcha sabab",
        "protect-otherreason-op": "Boshqa sabab",
-       "protect-edit-reasonlist": "Sabablar ro'yxatini tahrirlash",
+       "protect-edit-reasonlist": "Sabablar roʻyxatini tahrirlash",
        "protect-expiry-options": "1 soat:1 hours,1 kun:1 day,1 hafta:1 week,2 hafta:2 weeks,1 oy:1 month,3 oy:3 months,6 oy:6 months,1 yil:1 year,cheksiz:infinite",
        "restriction-type": "Huquqlar:",
        "restriction-level": "Ruxsat etilganlik darajasi:",
        "undeletelink": "ko‘rib chiqish/tiklash",
        "undeleteviewlink": "koʻrib chiqish",
        "undeleteinvert": "Tanlash tartibini almashtirish",
-       "undeletecomment": "Sabab:",
+       "undeletecomment": "Sababi:",
        "undelete-search-title": "O'chirilgan sahifalarni qidirish",
        "undelete-search-box": "O'chirilgan sahifalarni qidirish",
        "undelete-search-prefix": "Bundan boshlangan sahifalarni koʻrsatish:",
        "whatlinkshere": "Bu sahifaga bog'langan sahifalar",
        "whatlinkshere-title": "\"$1\"ga bogʻlangan sahifalar",
        "whatlinkshere-page": "Sahifa:",
-       "linkshere": "Quyidagi sahifalar '''[[:$1]]''' sahifasiga bog'langan:",
+       "linkshere": "Quyidagi sahifalar '''[[:$1]]''' sahifasiga bogʻlangan:",
        "nolinkshere": "'''[[:$1]]''' sahifasiga hech qaysi sahifa bog‘lanmagan.",
        "nolinkshere-ns": "Tanlangan nomfazoda '''[[:$1]]'''ga bog‘langan sahifalar mavjud emas.",
        "isredirect": "yoʻnaltiruvchi sahifa",
        "whatlinkshere-hideimages": "faylga havolalarini $1",
        "whatlinkshere-filters": "Filtrlar",
        "autoblockid": "Avtochetlashtirish #$1",
-       "block": "Foydalanuvchini muhosara qilish",
+       "block": "Foydalanuvchini chetlashtirish",
        "unblock": "Foydalanuvchiga yo'l ochish",
-       "blockip": "Foydalanuvchini chetlashtir",
-       "blockip-legend": "Foydalanuvchini muhosara qilish",
+       "blockip": "{{GENDER:$1|Foydalanuvchini}} chetlashtirish",
+       "blockip-legend": "Foydalanuvchini chetlashtirish",
        "ipaddressorusername": "IP-manzil yoki foydalanuvchi nomi:",
-       "ipbexpiry": "Tugaydi:",
+       "ipbexpiry": "Tugash muddati:",
        "ipbreason": "Sabab:",
        "ipbreason-dropdown": "* Chetlashtirishning odatiy sabablari\n** Yolgʻon maʼlumot kiritish\n** Sahifa matnini toʻliq oʻchirish\n** Tashqi saytlarga spam-havolalar\n** Maʼnosiz matn/axlat qoʻshish\n** Foydalanuvchilarga tahdid qilish, ularni taʼqib qilish\n** Bir nechta hisob yozuvlaridan oʻz manfaatlarida foydalanish\n** Nomaqbul foydalanuvchi nomi",
        "ipbsubmit": "Ushbu foydalanuvchini chetlashtirish",
-       "ipbother": "Boshqa vaqt:",
+       "ipbother": "Boshqa muddat:",
        "ipboptions": "2 soat:2 hours,1 kun:1 day,3 kun:3 days,1 hafta:1 week,2 hafta:2 weeks,1 oy:1 month,3 oy:3 months,6 oy:6 months,1 yil:1 year,cheksiz:infinite",
        "ipb-edit-dropdown": "Sabablar ro‘yxatini tahrirlash",
        "ipb-unblock-addr": "$1dan toʻsiqni olish",
        "ipblocklist-localblock": "Mahalliy chetlashtirish",
        "ipblocklist-otherblocks": "Boshqa {{PLURAL:$1|chetlashtirishlar}}",
        "infiniteblock": "muddatsiz",
-       "expiringblock": "$1 soat $2da tugaydi",
+       "expiringblock": "$1, $2 da tugaydi",
        "anononlyblock": "faqat anonimlar",
        "noautoblockblock": "avtochetlashtirish o‘chirilgan",
        "createaccountblock": "hisob yozuvi yaratish taqiqlangan",
        "blocklist-nousertalk": "o‘zining munozara sahifasini tahrirlay olmaydi",
        "ipblocklist-empty": "Toʻsiqlar roʻyxati boʻsh.",
        "blocklink": "chetlashtirish",
-       "unblocklink": "muhosarani (to'sishni) bekor qilish",
-       "change-blocklink": "Muhosarani (to'siqni) o'zgartirmoq",
+       "unblocklink": "toʻsiqni olib tashlash",
+       "change-blocklink": "toʻsiqni oʻzgartirish",
        "contribslink": "hissa",
        "emaillink": "e-maktub jo‘natish",
        "blocklogpage": "Chetlatish qaydlari",
        "move-watch": "Ushbu sahifani kuzatuv roʻyxatingizga qoʻshish",
        "movepagebtn": "Sahifani koʻchirish",
        "pagemovedsub": "Sahifa qayta nomlandi",
-       "movepage-moved": "'''\"$1\" nomli sahifa \"$2\" nomli sahifaga koʻchirildi'''",
+       "movepage-moved": "'''Sahifa nomi «$1»dan «$2»ga koʻchirildi'''",
        "movepage-moved-redirect": "Qayta yo‘naltirish yaratildi.",
        "movetalk": "Mos munozara sahifasini qayta nomlash",
        "move-subpages": "Ostsahifalarni ham qayta nomlash ($1 gacha)",
        "move-talk-subpages": "Munozara sahifasining ostsahifalarini ham qayta nomlash ($1 gacha)",
+       "movepage-page-moved": "Sahifa nomi «$1»dan «$2»ga koʻchirilgan edi.",
        "movelogpage": "Koʻchirish qaydlari",
        "movesubpage": "{{PLURAL:$1|Ostsahifa|Ostsahifalar}}",
        "movesubpagetext": "Ushbu sahifaning $1 ta ostsahifasi bor.",
        "delete_and_move_confirm": "Ha, ushbu sahifa o‘chirilsin",
        "fix-double-redirects": "Oldingi nomga yoʻnaltirishlarni toʻgʻrilash",
        "move-leave-redirect": "Qayta yoʻnaltirish qoldirish",
+       "protectedpagemovewarning": "<strong>Ogohlantirish:</strong> Ushbu sahifa himoyalangan boʻlib, faqat administratorlar uning nomini oʻzgartirishi mumkin. Quyida himoyalash jurnalidagi oxirgi qayd keltirilgan:",
+       "semiprotectedpagemovewarning": "<strong>Izoh:</strong> Ushbu sahifa himoyalangan boʻlib, faqat roʻyxatdan oʻtgan foydalanuvchilar uning nomini oʻzgartirishi mumkin.\nQuyida himoyalash jurnalidagi oxirgi qayd keltirilgan:",
        "move-over-sharedrepo": "== Fayl allaqachon mavjud ==\nUmumiy omborda [[:$1]] mavjud. Faylning bu nomga qayta nomlanishi faylning umumiy omborda to‘silishiga olib keladi.",
        "export": "Sahifalar eksporti",
        "export-submit": "Eksport",
        "pageinfo-edits": "Jami tahrirlar soni",
        "pageinfo-toolboxlink": "Sahifa haqida maʼlumot",
        "pageinfo-redirectsto": "Qayta yoʻnaltirish",
+       "markaspatrolledtext": "Bu sahifani tekshirilgan deb belgilash",
        "patrol-log-page": "Patrullash qaydlari",
        "previousdiff": "← Avvalgi tahrir",
        "nextdiff": "Keyingi tahrir →",
        "logentry-delete-delete": "$1 $3 sahifasini {{GENDER:$2|oʻchirdi}}",
        "logentry-move-move": "$1 $3 sahifasini $4ga koʻchirdi",
        "logentry-move-move-noredirect": "$1 $3 sahifasini $4ga {{GENDER:$2|koʻchirdi}}",
+       "logentry-move-move_redir": "$1 sahifa nomini $3dan $4ga yoʻnaltirish ustidan {{GENDER:$2|koʻchirdi}}",
+       "logentry-move-move_redir-noredirect": "$1 sahifa nomini $3dan $4ga yoʻnaltirish ustidan {{GENDER:$2|koʻchirdi}} va yoʻnaltirish qoldirmadi",
        "logentry-patrol-patrol-auto": "$1 $3 sahifasining $4 versiyasini avtomatik patrulladi",
        "logentry-newusers-newusers": "$1 hisob yozuvi {{GENDER:$2|yaratildi}}",
        "logentry-newusers-create": "$1 hisob yozuvi {{GENDER:$2|yaratildi}}",
index 5fee5e9..76b05b3 100644 (file)
@@ -26,7 +26,8 @@
                        "לערי ריינהארט",
                        "아라",
                        "Tranquanganh",
-                       "Max20091"
+                       "Max20091",
+                       "Dinhxuanduyet"
                ]
        },
        "tog-underline": "Gạch chân liên kết:",
        "prefs-personal": "Thông tin cá nhân",
        "prefs-rc": "Thay đổi gần đây",
        "prefs-watchlist": "Theo dõi",
+       "prefs-editwatchlist": "Sửa các trang tôi theo dõi",
+       "prefs-editwatchlist-label": "Chỉnh sửa các mục trong danh sách theo dõi của bạn:",
+       "prefs-editwatchlist-edit": "Xem và xoá các tiêu đề trong danh sách theo dõi của bạn",
+       "prefs-editwatchlist-raw": "Sửa danh sách theo dõi dạng thô",
+       "prefs-editwatchlist-clear": "Xóa sạch danh sách theo dõi của bạn",
        "prefs-watchlist-days": "Số ngày hiển thị trong danh sách theo dõi:",
        "prefs-watchlist-days-max": "Tối đa $1 ngày",
        "prefs-watchlist-edits": "Số lần sửa đổi tối đa trong danh sách theo dõi mở rộng:",
        "right-override-export-depth": "Xuất trang kèm theo các trang được liên kết đến với độ sâu tối đa là 5",
        "right-sendemail": "Gửi thư điện tử cho thành viên khác",
        "right-passwordreset": "Xem các thư điện tử đặt lại mật khẩu",
+       "right-managechangetags": "Tạo và xóa [[Special:Tags|thẻ]] từ cơ sở dữ liệu",
        "newuserlogpage": "Nhật trình mở tài khoản",
        "newuserlogpagetext": "Đây là danh sách những tài khoản thành viên mở lên gần đây.",
        "rightslog": "Nhật trình cấp quyền thành viên",
        "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",
+       "action-managechangetags": "tạo và xóa các thẻ từ cơ sở dữ liệu",
        "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)",
        "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",
        "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]].",
        "tags-tag": "Tên thẻ",
        "tags-display-header": "Hiển thị trên danh sách thay đổi",
        "tags-description-header": "Mô tả ý nghĩa đầy đủ",
+       "tags-source-header": "Nguồn gốc",
        "tags-active-header": "Có kích hoạt?",
        "tags-hitcount-header": "Các thay đổi được ghi thẻ",
+       "tags-actions-header": "Tác vụ",
        "tags-active-yes": "Kích hoạt",
        "tags-active-no": "Vô hiệu",
+       "tags-source-extension": "Xác định bởi một mở rộng",
+       "tags-source-manual": "Áp dụng thủ công bởi người dùng và bot",
+       "tags-source-none": "Không còn sử dụng",
        "tags-edit": "sửa",
+       "tags-delete": "xóa",
+       "tags-activate": "Kích hoạt",
+       "tags-deactivate": "vô hiệu",
        "tags-hitcount": "$1 {{PLURAL:$1|thay đổi|thay đổi}}",
+       "tags-manage-no-permission": "Bạn không có quyền hạn để quản lý các thẻ thay đổi.",
+       "tags-create-heading": "Tạo một thẻ mới",
+       "tags-create-explanation": "Theo mặc định, các thẻ mới được tạo ra sẽ được hợp lệ hóa để người dùng và các bot sử dụng.",
+       "tags-create-tag-name": "Tên thẻ:",
+       "tags-create-reason": "Lý do:",
+       "tags-create-submit": "Tạo mới",
+       "tags-create-no-name": "Bạn phải chỉ định một tên thẻ.",
+       "tags-create-invalid-chars": "Tên thẻ không được chứa dấu phẩy (<code>,</code>) hoặc dấu gạch chéo lên (<code>/</code>).",
+       "tags-create-invalid-title-chars": "Tên thẻ không được chứa các ký tự mà không thể được sử dụng trong tiêu đề của trang .",
+       "tags-create-already-exists": "Các từ khóa \"$1\" đã tồn tại.",
+       "tags-create-warnings-above": "{{PLURAL:$2| Cảnh báo}} sau gặp phải khi cố gắng để tạo ra các thẻ \"$1\":",
+       "tags-create-warnings-below": "Bạn có muốn tiếp tục tạo thẻ này?",
+       "tags-delete-title": "Xóa thẻ",
+       "tags-delete-explanation-initial": "Bạn muốn xóa thẻ \"$1\" từ cơ sở dữ liệu.",
+       "tags-delete-explanation-in-use": "Nó sẽ được gỡ bỏ từ {{PLURAL:$2|$2 mục sửa đổi hoặc mục đăng nhập|tất cả $2 bản sửa đổi và/hoặc đăng nhập các mục}} mà nó hiện đang áp dụng.",
+       "tags-delete-explanation-warning": "Hành động này là <strong>không thể đảo ngược</strong> và <strong>không thể hoàn tác</strong>, ngay cả bởi người quản trị cơ sở dữ liệu. Hãy chắc chắn đây là thẻ mà bạn muốn xóa.",
+       "tags-delete-reason": "Lý do:",
+       "tags-delete-submit": "Không thể phục hồi xóa thẻ này",
+       "tags-delete-not-allowed": "Thẻ được định nghĩa bởi một mở rộng không thể bị xóa trừ khi mở rộng đặc biệt cho phép điều đó xảy ra.",
+       "tags-delete-not-found": "Thẻ \"$1\" không tồn tại.",
+       "tags-delete-too-many-uses": "Từ khóa \"$1\" được áp dụng cho hơn $2 {{PLURAL:$2|phiên bản}}, có nghĩa là nó không thể bị xóa.",
+       "tags-activate-title": "Kích hoạt thẻ",
+       "tags-activate-question": "Bạn sắp sửa kích hoạt thẻ \"$1\".",
+       "tags-activate-reason": "Lý do:",
+       "tags-activate-not-allowed": "Không thể kích hoạt thẻ \"$1\".",
+       "tags-activate-not-found": "Thẻ \"$1\" không tồn tại.",
+       "tags-activate-submit": "Kích hoạt",
+       "tags-deactivate-title": "Vô hiệu thẻ",
+       "tags-deactivate-question": "Bạn sắp sửa vô hiệu thẻ \"$1\".",
+       "tags-deactivate-reason": "Lý do:",
+       "tags-deactivate-not-allowed": "Không thể vô hiệu hóa thẻ \"$1\".",
+       "tags-deactivate-submit": "Vô hiệu",
        "comparepages": "So sánh trang",
        "compare-page1": "Trang 1",
        "compare-page2": "Trang 2",
        "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.",
        "logentry-upload-upload": "$1 {{GENDER:$2}}đã tải lên $3",
        "logentry-upload-overwrite": "$1 {{GENDER:$2}}đã tải lên một phiên bản mới của $3",
        "logentry-upload-revert": "$1 {{GENDER:$2}}đã tải lên $3",
+       "log-name-managetags": "Danh sách quản lý thẻ",
+       "logentry-managetags-create": "$1 {{GENDER:$2| đã tạo}} thẻ \"$4\"",
+       "logentry-managetags-activate": "$1 {{GENDER:$2|đã kích hoạt}} tag \"$4\" để sử dụng bởi người dùng và các bot",
+       "logentry-managetags-deactivate": "$1 {{GENDER:$2|đã vô hiệu}} thẻ \"$4\" để sử dụng bởi người dùng và các bot",
        "rightsnone": "(không có)",
        "revdelete-summary": "tóm lược sửa đổi",
        "feedback-bugornote": "Nếu bạn đã sẵn sàng để miêu tả các chi tiết của một vấn đề kỹ thuật, xin vui lòng [$1 báo cáo lỗi].\nNếu không thì bạn có thể điền biểu mẫu đơn giản ở dưới. Lời ghi của bạn sẽ được đăng lên trang “[$3 $2]”, cùng với tên người dùng và trình duyệt của bạn.",
index 7b70bb8..7541c02 100644 (file)
@@ -8,7 +8,8 @@
                        "Reedy",
                        "Smeira",
                        "לערי ריינהארט",
-                       "아라"
+                       "아라",
+                       "Rachmat.Wahidi"
                ]
        },
        "tog-underline": "Dislienükön yümis:",
        "delete-toobig": "Pad at labon redakamajenotemi lunik ({{PLURAL:$1|revid|revids}} plu $1).\nMoükam padas somik pemiedükon ad vitön däropami pö {{SITENAME}}.",
        "delete-warning-toobig": "Pad at labon jenotemi lunik: {{PLURAL:$1|revid|revids}} plu $1.\nPrudö! Moükam onik ba osäkädükon jäfidi nünodema: {{SITENAME}}.",
        "rollback": "Sädunön redakamis",
-       "rollback_short": "Sädunön vali",
        "rollbacklink": "sädunön vali",
        "rollbackfailed": "Sädunam no eplöpon",
        "cantrollback": "Redakam no kanon pasädunön; keblünan lätik binon lautan teik pada at.",
        "protectedarticle": "ejelon padi: „[[$1]]“",
        "modifiedarticleprotection": "evotükon jelanivodi pada: „[[$1]]“",
        "unprotectedarticle": "esäjelon padi: \"[[$1]]\"",
-       "movedarticleprotection": "moved protection settings from „[[$2]]“ to „[[$1]]“",
+       "movedarticleprotection": "mengubah pengaturan perlindungan dari „[[$2]]“ ke „[[$1]]“",
        "protect-title": "lonon jelanivodi pada: „$1“",
        "prot_1movedto2": "[[$1]] petopätükon lü [[$2]]",
        "protect-legend": "Fümedolös jeli",
index b68fe15..f23dfee 100644 (file)
@@ -7,57 +7,57 @@
                        "아라"
                ]
        },
-       "tog-underline": "Заалһиг татас татх:",
-       "tog-hideminor": "ШидÑ\80Ó\99 Ñ\81олÑ\8cлһна Ñ\81еÑ\82күлд Ð±Ð°Ò» Ñ\85үвÑ\80лһиг Ð±Ñ\83лÑ\82Ñ\83лх",
-       "tog-hidepatrolled": "Шидрә сольлһна сеткүлд шүүсн хүврлһиг бултулх",
-       "tog-newpageshidepatrolled": "Шин халхна сеткүләс шүүсн хүврлһиг бултулх",
-       "tog-extendwatchlist": "Хар шидрә сольлһн биш, цуг сольлһн үзүлдг, өргдүлсн шинҗллһнә сеткүл",
+       "tog-underline": "Заалһиг татасллһн:",
+       "tog-hideminor": "Ð\91аһ Ñ\8fÑ\81вÑ\80 Ð¾Ñ\82Ñ\85н Ñ\8fÑ\81вÑ\80 Ñ\81едкүлÓ\99Ñ\81 Ð½Ñ\83Ñ\83х",
+       "tog-hidepatrolled": "Шүүсн ясвр отхн ясвр седкүләс нуух",
+       "tog-newpageshidepatrolled": "Шүүсн халхс отхн ясвр седкүләс нуух",
+       "tog-extendwatchlist": "Һанц отхн биш хамг ясврта өргн оврхин седкүл",
        "tog-usenewrc": "Ясрулсн шидрә сольлһна сеткүл олзлх (JavaScript кергтә)",
-       "tog-numberheadings": "То-диг Ñ\87икÓ\99н Ð´Ð°Ð°х",
-       "tog-showtoolbar": "Ð\9eÑ\80а Ð·ÐµÑ\80-зев Ò¯Ð·Ð»Ñ\85 (JavaScript ÐºÐµÑ\80гÑ\82Ó\99)",
-       "tog-editondblclick": "Давхр индстлһар чиклх (JavaScript кергтә)",
-       "tog-editsectiononrightclick": "ҺаÑ\80Ñ\87ига Ð±Ð°Ñ\80Ñ\83н Ð¸Ð½Ð´Ñ\81Ñ\82лһаÑ\80 Ñ\85үвиг Ñ\87иклÑ\85 (JavaScript ÐºÐµÑ\80гÑ\82Ó\99)",
-       "tog-watchcreations": "Ð\91и Ñ\8dвÑ\80Ó\99ннÑ\8c Ð½ÐµÐ¼Ð³Ð´Ñ\81н Ñ\85алÑ\85Ñ\81 Ñ\88инÒ\97ллһнÓ\99 Ñ\81еÑ\82күлд немх",
-       "tog-watchdefault": "Ð\91и Ñ\8dвÑ\80Ó\99ннÑ\8c Ñ\87иклÑ\81н Ñ\85алÑ\85Ñ\81 Ñ\88инÒ\97ллһнÓ\99 Ñ\81еÑ\82күлд немх",
-       "tog-watchmoves": "Ð\91и Ñ\8dвÑ\80Ó\99ннÑ\8c ÐºÓ©Ð½Ð´Ñ\81н Ñ\85алÑ\85Ñ\81 Ñ\88инÒ\97ллһнÓ\99 Ñ\81еÑ\82күлд немх",
-       "tog-watchdeletion": "Ð\91и Ñ\8dвÑ\80Ó\99ннÑ\8c Ò»Ð°Ñ\80Ò»Ñ\81н Ñ\85алÑ\85Ñ\81 Ñ\88инÒ\97ллһнÓ\99 Ñ\81еÑ\82күлд немх",
-       "tog-minordefault": "ЦÑ\83г Ñ\81олÑ\8cлһн Ð±Ð°Ò» Ñ\87инÑ\80Ñ\82Ó\99 Ñ\82ааÑ\81н Ð±Ð¾Ð»Ñ\83лх",
-       "tog-previewontop": "СолÑ\8cлһна Ñ\82еегин өмн хәләвр үзүлх",
-       "tog-previewonfirst": "СолÑ\8cÑ\85ла, Ñ\85Ó\99лÓ\99вÑ\80 Ò¯Ð·Ò¯Ð»Ñ\85.",
-       "tog-enotifwatchlistpages": "ШинÒ\97лÑ\81н Ñ\85алÑ\85 Ñ\81олÑ\8cÑ\85ла, Ð½Ð°Ð½Ð´ e-mail Ð±Ð¸Ñ\87г Ð¹Ð¾Ð²Ñ\83лх",
-       "tog-enotifusertalkpages": "Мини ухалвр халх сольхла, нанд e-mail бичг йовулх",
-       "tog-enotifminoredits": "Ð\91аһ Ñ\81олÑ\8cлһн Ð±Ð¾Ð»Ð² Ñ\87игн Ð±Ð¾Ð»Ñ\85ла, Ð½Ð°Ð½Ð´ e-mail Ð±Ð¸Ñ\87г Ð¹Ð¾Ð²Ñ\83лх",
-       "tog-enotifrevealaddr": "Ð\9cини e-mail Ñ\85айг Ð·Ó\99ңгллһнÓ\99 бичгт үзүлх",
-       "tog-shownumberswatching": "ТеÑ\80 Ñ\85алÑ\85 Ñ\88инÒ\97лдг Ð´ÐµÐ¼Ð½Ñ\87нÑ\80ин то үзүлх",
-       "tog-oldsig": "Ð\91Ó\99Ó\99дг Ñ\82Ó\99вÑ\81н Ò»Ð°Ñ\80на Ñ\85Ó\99лÓ\99вр:",
-       "tog-fancysig": "ЭвÑ\80Ó\99н Ñ\82Ó\99вÑ\81н Ò»Ð°Ñ\80на Ð±Ð¸ÐºÐ¸ Ñ\82емдлһн (авÑ\82о Ð·Ð°Ð°Ð»Ò»Ñ\82а Ñ\83га)",
-       "tog-uselivepreview": "Шамдһа Ñ\85Ó\99лÓ\99вÑ\80 Ð¾Ð»Ð·Ð»Ñ\85 (JavaScript ÐºÐµÑ\80гÑ\82Ó\99, Ð°Ð¼Ñ\81лһн)",
-       "tog-forceeditsummary": "УÑ\87Ñ\80\83Ñ\82Ñ\85 Ñ\85ооÑ\81н Ð±Ó\99Ó\99Ñ\85лÓ\99 медүлх",
-       "tog-watchlisthideown": "ШинÒ\97ллһнÓ\99 Ñ\81еÑ\82күлд Ð¼Ð¸Ð½Ð¸ Ñ\81олÑ\8cлһиг Ð±Ñ\83лÑ\82Ñ\83лх",
-       "tog-watchlisthidebots": "ШинÒ\97ллһнÓ\99 Ñ\81еÑ\82күлд ÐºÓ©Ð´Ð»Ð²Ñ\80ин Ñ\81олÑ\8cлһиг Ð±Ñ\83лÑ\82Ñ\83лх",
-       "tog-watchlisthideminor": "ШинÒ\97ллһнÓ\99 Ñ\81еÑ\82күлд Ð±Ð°Ò» Ñ\81олÑ\8cлһиг Ð±Ñ\83лÑ\82Ñ\83лх",
-       "tog-watchlisthideliu": "ШинÒ\97ллһнÓ\99 Ñ\81еÑ\82күлд Ð´ÐµÐ¼Ð½Ñ\87нÑ\80ин Ñ\81олÑ\8cлһиг Ð±Ñ\83лÑ\82Ñ\83лх",
-       "tog-watchlisthideanons": "ШинÒ\97ллһнÓ\99 Ñ\81еÑ\82күлд Ð´Ð°Ð»Ð´Ñ\83Ñ\80ин Ñ\81олÑ\8cлһиг Ð±Ñ\83лÑ\82Ñ\83лх",
-       "tog-watchlisthidepatrolled": "Шинҗллһнә сеткүлд шүүсн сольлһиг бултулх",
-       "tog-ccmeonemails": "Миниһәр талдан демнчнрт йовулсн бичглә әдл буулһавр нанд йовулх",
-       "tog-diffonly": "Йилһәнә хөөн халхиг бичә үзүлх",
-       "tog-showhiddencats": "Ð\91Ñ\83лÑ\82Ñ\83лсн әәшлүд үзүлх",
-       "tog-norollbackdiff": "Ð¥Ó\99Ñ\80Ò¯ ÐºÐµÑ\85лÓ\99 Ð¹Ð¸Ð»Ò»Ó\99н Ð±Ð¸Ñ\87Ó\99 үзүлх",
-       "underline-always": "Даңгин болх",
+       "tog-numberheadings": "ЭвÑ\80Ó\99Ñ\80 Ò»Ð°Ñ\80Ñ\86г Ñ\82ойглх",
+       "tog-showtoolbar": "ЯÑ\81вÑ\80ин Ð·ÐµÐ²Ñ\81г Ò¯Ð·Ò¯Ð»Ñ\85",
+       "tog-editondblclick": "Давхр шавдлһар халх ясх",
+       "tog-editsectiononrightclick": "ҺаÑ\80Ñ\86г Ð±Ð°Ñ\80Ñ\83н Ñ\88авдÑ\81аÑ\80 Ñ\81алвÑ\80 Ñ\87иклÑ\85",
+       "tog-watchcreations": "Ð\9cини Ð±Ò¯Ñ\82Ó\99Ñ\81н Ñ\85алÑ\85Ñ\81 Ð±Ð¾Ð»Ð½ Ð¾Ñ\80Ñ\83лÑ\81н Ð±Ð¾Ð¾Ð¼Ð³Ñ\83д Ð¾Ð²Ñ\80Ñ\85ин Ñ\81едкүлд немх",
+       "tog-watchdefault": "Ð\9cини Ñ\8fÑ\81Ñ\81н Ñ\85алÑ\85Ñ\81 Ð±Ð¾Ð»Ð½ Ð±Ð¾Ð¾Ð¼Ð³Ñ\83д Ð¾Ð²Ñ\80Ñ\85ин Ñ\81едкүлд немх",
+       "tog-watchmoves": "Ð\9cини Ð·Ó©Ó©Ñ\81н Ñ\85алÑ\85Ñ\81 Ð±Ð¾Ð»Ð½ Ð±Ð¾Ð¾Ð¼Ð³Ñ\83д Ð¾Ð²Ñ\80Ñ\85ин Ñ\81едкүлд немх",
+       "tog-watchdeletion": "Ð\9cини Ó\99Ñ\80лһÑ\81н Ñ\85алÑ\85Ñ\81 Ð±Ð¾Ð»Ð½ Ð±Ð¾Ð¾Ð¼Ð³Ñ\83д Ð¾Ð²Ñ\80Ñ\85ин Ñ\81едкүлд немх",
+       "tog-minordefault": "Хамг Ñ\8fÑ\81вÑ\80 Ð±Ð°Ò» Ñ\88иг Ñ\82ааÑ\80Ñ\81аÑ\80 Ñ\82емдглх",
+       "tog-previewontop": "ЯÑ\81вÑ\80ин Ñ\85Ó\99Ó\99Ñ\80Ñ\86г өмн хәләвр үзүлх",
+       "tog-previewonfirst": "ЯÑ\81вÑ\80Ñ\82 Ð¾Ð´Ñ\85ла, Ñ\85Ó\99лÓ\99вÑ\80 Ò¯Ð·Ò¯Ð»Ñ\85",
+       "tog-enotifwatchlistpages": "Ð\9eвÑ\80Ñ\81н Ñ\85алÑ\85 Ð°Ð»Ñ\8c Ð±Ð¾Ð¾Ð¼Ð³ Ñ\8fÑ\81гдÑ\85ла, e-mail Ð±Ð¸Ñ\87гÓ\99Ñ\80 Ð¼ÐµÐ´Ò¯лх",
+       "tog-enotifusertalkpages": "Мини меткән халх ясгдхла, e-mail бичгәр медүлх",
+       "tog-enotifminoredits": "ХалÑ\85 Ð±Ð¾Ð»Ð½ Ð±Ð¾Ð¾Ð¼Ð³ Ð±Ð°Ò»Ð°Ñ\80 Ñ\87игн Ñ\8fÑ\81гдÑ\85ла, e-mail Ð±Ð¸Ñ\87гÓ\99Ñ\80 Ð¼ÐµÐ´Ò¯лх",
+       "tog-enotifrevealaddr": "Ð\9cини e-mail Ñ\85айг Ð¼ÐµÐ´Ò¯Ð»Ð²Ñ\80 бичгт үзүлх",
+       "tog-shownumberswatching": "Ð\9eвÑ\80дг Ð´ÐµÐ¼Ð½Ó\99Ñ\87ин то үзүлх",
+       "tog-oldsig": "Ð\91Ó\99Ó\99гÑ\87 Ñ\82Ó\99вÑ\81н Ò»Ð°р:",
+       "tog-fancysig": "Ð\9eнÑ\86 Ñ\82Ó\99вÑ\81н Ò»Ð°Ñ\80ин Ð²Ð¸ÐºÐ¸ Ñ\8dÑ\80Ó\99 (Ñ\8dвÑ\80Ó\99н Ð·Ð°Ð°Ð»Ò»Ð³Ð¾)",
+       "tog-uselivepreview": "Ð\9eÑ\80Ñ\87н Ñ\85Ó\99лÓ\99вÑ\80 ÐºÐµÑ\80глÑ\85",
+       "tog-forceeditsummary": "ЯÑ\81вÑ\80ин Ò¯Ð½Ð´Ñ\81н Ñ\85ооÑ\81на Ñ\82Ñ\83Ñ\81к медүлх",
+       "tog-watchlisthideown": "Ð\9cини Ñ\8fÑ\81вÑ\80 Ð¾Ð²Ñ\80Ñ\85ин Ñ\81едкүлÓ\99Ñ\81 Ð½Ñ\83Ñ\83х",
+       "tog-watchlisthidebots": "Ð\9aөдлгÑ\87ин Ñ\8fÑ\81вÑ\80 Ð¾Ð²Ñ\80Ñ\85ин Ñ\81едкүлÓ\99Ñ\81 Ð½Ñ\83Ñ\83х",
+       "tog-watchlisthideminor": "Ð\91аһ Ñ\8fÑ\81вÑ\80 Ð¾Ð²Ñ\80Ñ\85ин Ñ\81едкүлÓ\99Ñ\81 Ð½Ñ\83Ñ\83х",
+       "tog-watchlisthideliu": "Ð\91Ò¯Ñ\80Ñ\82кгдÑ\81н Ð´ÐµÐ¼Ð½Ó\99Ñ\87нÑ\80ин Ñ\8fÑ\81вÑ\80 Ð¾Ð²Ñ\80Ñ\85ин Ñ\81едкүлÓ\99Ñ\81 Ð½Ñ\83Ñ\83х",
+       "tog-watchlisthideanons": "Ð\9dеÑ\80го Ð´ÐµÐ¼Ð½Ó\99Ñ\87нÑ\80ин Ñ\8fÑ\81вÑ\80 Ð¾Ð²Ñ\80Ñ\85ин Ñ\81едкүлÓ\99Ñ\81 Ð½Ñ\83Ñ\83х",
+       "tog-watchlisthidepatrolled": "Шүүгдсн ясвр оврхин седкүләс нуух",
+       "tog-ccmeonemails": "Мини бус демнәчт йовулсн бичгин дүрлвр нанд йовулх",
+       "tog-diffonly": "Йилһәнә дор халхин дотр эс үзүлх",
+       "tog-showhiddencats": "Ð\9dÑ\83Ñ\83сн әәшлүд үзүлх",
+       "tog-norollbackdiff": "Ð\91Ñ\83Ñ\86аÑ\81на Ñ\85өөн Ð¹Ð¸Ð»Ò»Ó\99н Ñ\8dÑ\81 үзүлх",
+       "underline-always": "Даң",
        "underline-never": "Кезәчн болшго",
-       "underline-default": "Хәләгчин таасн",
-       "editfont-style": "ЧикллһнÓ\99 Ñ\86ааÑ\81на Ò¯Ð·Ð³-кевин Ñ\8fнз:",
-       "editfont-default": "Хәләлгчин көгәс",
-       "editfont-monospace": "Ð\94аңгин Ñ\83Ñ\83дмÑ\82а Ò¯Ð·Ð³-кев",
-       "editfont-sansserif": "Онь уга үзг-кев",
-       "editfont-serif": "Оньта үзг-кев",
-       "sunday": "Нарн",
-       "monday": "Сарң",
-       "tuesday": "Мигмр",
-       "wednesday": "Үлмҗ",
-       "thursday": "Пүрвә",
-       "friday": "Басң",
-       "saturday": "Бембә",
+       "underline-default": "Харагчин көг керглх",
+       "editfont-style": "ЯÑ\81вÑ\80ин Ñ\82еегк Ð±Ð°Ñ\80 Ò¯Ð·Ð³Ð¸Ð½ Ñ\82Ó©Ñ\80л:",
+       "editfont-default": "Харагчин көгәс",
+       "editfont-monospace": "Ð\9dегдмл Ñ\8dÒ£Ñ\82Ó\99 Ð±Ð°Ñ\80 Ò¯Ð·Ð³",
+       "editfont-sansserif": "Онь уга бар үзг",
+       "editfont-serif": "Оньта бар үзг",
+       "sunday": "Нарн өдр",
+       "monday": "Сарң өдр",
+       "tuesday": "Мигмр өдр",
+       "wednesday": "Үлмҗ өдр",
+       "thursday": "Пүрвә өдр",
+       "friday": "Басң өдр",
+       "saturday": "Бембә өдр",
        "sun": "Нрн",
        "mon": "Срң",
        "tue": "Мгр",
        "nov": "Үкр",
        "dec": "Бар",
        "pagecategories": "{{PLURAL:$1|1=Әәшл|Әәшлүд}}",
-       "category_header": "«$1» Ó\99Ó\99Ñ\88лд Ð±Ó\99Ó\99дг халхс",
-       "subcategories": "Ð\91аһаÑ\80 әәшлүд",
-       "category-media-header": "«$1» Ó\99Ó\99Ñ\88лд Ð±Ó\99Ó\99дг боомгуд",
-       "category-empty": "''Тер әәшл хоосн болҗана.''",
-       "hidden-categories": "{{PLURAL:$1|1=Ð\91Ñ\83лÑ\82Ñ\83лÑ\81н Ó\99Ó\99Ñ\88л|Ð\91Ñ\83лÑ\82Ñ\83лсн әәшлүд}}",
-       "hidden-category-category": "Ð\91Ñ\83лÑ\82Ñ\83лсн әәшлүд",
-       "category-subcat-count": "{{PLURAL:$2|ТеÑ\80 Ó\99Ó\99Ñ\88л Ñ\8dн Ò»Ð°Ð½Ñ\86Ñ\85н Ð±Ð°Ò»Ð°Ñ\80 Ó\99Ó\99Ñ\88лÑ\82Ó\99.|{{PLURAL:$1|$1 Ð±Ð°Ò»Ð°Ñ\80 Ó\99Ó\99Ñ\88л Ò¯Ð·Ò¯Ð»Ð²|$1 Ð±Ð°Ò»Ð°Ñ\80 Ó\99Ó\99Ñ\88лүд|$1 Ð±Ð°Ò»Ð°Ñ\80 Ó\99Ó\99Ñ\88лүд Ò¯Ð·Ò¯Ð»Ð²}} $2 Ñ\83Ñ\82 Ñ\82Ñ\83Ñ\80Ñ\88дан Ò¯Ð·Ò¯Ð»Ð².}}",
-       "category-subcat-count-limited": "ТеÑ\80 Ó\99Ó\99Ñ\88лд {{PLURAL:$1|1=нег Ð±Ð°Ò»Ð°Ñ\80 Ó\99Ó\99Ñ\88л|$1 Ð±Ð°Ò»Ð°Ñ\80 Ó\99Ó\99Ñ\88лүд}} Ð±Ð¾Ð»Ò\97ана.",
-       "category-article-count": "{{PLURAL:$2|ТеÑ\80 Ó\99Ó\99Ñ\88л Ò»Ð°Ð½Ñ\86Ñ\85н Ñ\85алÑ\85Ñ\82а.|{{PLURAL:$1|$1 Ñ\85алÑ\85Ñ\81иг Ò¯Ð·Ò¯Ð»Ð²|$1 Ñ\85алÑ\85иг Ò¯Ð·Ò¯Ð»Ð²|$1 Ñ\85алÑ\85Ñ\81иг Ò¯Ð·Ò¯Ð»Ð²}}, $2 Ñ\83Ñ\82 Ñ\82Ñ\83Ñ\80Ñ\88дан.}}",
-       "category-article-count-limited": "ТеÑ\80 Ó\99Ó\99Ñ\88лд {{PLURAL:$1|1=нег Ñ\85алÑ\85|$1 Ñ\85алÑ\85Ñ\81}} Ð±Ð¾Ð»Ò\97ана.",
-       "category-file-count": "{{PLURAL:$2|ТеÑ\80 Ó\99Ó\99Ñ\88лд Ò»Ð°Ð½Ñ\86Ñ\85н Ñ\85алÑ\85 Ð±Ð¾Ð»Ò\97ана.|ТеÑ\80үнÓ\99Ñ\81 {{PLURAL:$1|1=нег Ð±Ð¾Ð¾Ð¼Ð³ Ò¯Ð·Ò¯Ð»Ñ\81н|$1 Ð±Ð¾Ð¾Ð¼Ð³Ñ\83д Ò¯Ð·Ò¯Ð»Ñ\81н}} $2 Ñ\83Ñ\82 Ñ\82Ñ\83Ñ\80Ñ\88дан.}}",
-       "category-file-count-limited": "Эн {{PLURAL:$1|1=боомг|$1 Ð±Ð¾Ð¾Ð¼Ð³Ñ\83д}} Ñ\82еÑ\80 Ó\99Ó\99Ñ\88лд Ð±Ð¾Ð»Ò\97ана.",
-       "listingcontinuesabbrev": "(цааранднь)",
-       "index-category": "Ð\98ндекÑ\81Ñ\81н халхс",
-       "noindex-category": "Ð\98ндекÑ\81Ñ\81н Ð±Ð¸Ñ\88 халхс",
-       "about": "ТодлÒ\97 Ð±ичлһн",
+       "category_header": "«$1» Ó\99Ó\99Ñ\88лк халхс",
+       "subcategories": "Ð\9aүүкн әәшлүд",
+       "category-media-header": "«$1» Ó\99Ó\99Ñ\88лк боомгуд",
+       "category-empty": "<em>Эн әәшлд одахн халх аль боомг уга.</em>",
+       "hidden-categories": "{{PLURAL:$1|1=Ð\9dÑ\83Ñ\83Ñ\81н Ó\99Ó\99Ñ\88л|Ð\9dÑ\83Ñ\83сн әәшлүд}}",
+       "hidden-category-category": "Ð\9dÑ\83Ñ\83сн әәшлүд",
+       "category-subcat-count": "{{PLURAL:$2|Эн Ó\99Ó\99Ñ\88лд Ò»Ð°Ð½Ñ\86Ñ\85н ÐºÒ¯Ò¯ÐºÐ½ Ó\99Ó\99Ñ\88л.|Эн Ó\99Ó\99Ñ\88лд {{PLURAL:$1|$1 ÐºÒ¯Ò¯ÐºÐ½ Ó\99Ó\99Ñ\88л|$1 ÐºÒ¯Ò¯ÐºÐ½ Ó\99Ó\99Ñ\88л|$1 ÐºÒ¯Ò¯ÐºÐ½ Ó\99Ó\99Ñ\88л}} $2 Ñ\82ооһаÑ\81.}}",
+       "category-subcat-count-limited": "Эн Ó\99Ó\99Ñ\88лд {{PLURAL:$1|$1 ÐºÒ¯Ò¯ÐºÐ½ Ó\99Ó\99Ñ\88л|$1 ÐºÒ¯Ò¯ÐºÐ½ Ó\99Ó\99Ñ\88л}} Ð±Ó\99Ó\99нÓ\99.",
+       "category-article-count": "{{PLURAL:$2|Эн Ó\99Ó\99Ñ\88лд Ò»Ð°Ð½Ñ\86Ñ\85н Ñ\85алÑ\85Ñ\82а.|Эн {{PLURAL:$1|$1 Ñ\85алÑ\85 Ñ\8dн Ó\99Ó\99Ñ\88лд|$1 Ñ\85алÑ\85 Ñ\8dн Ó\99Ó\99Ñ\88лд|$1 Ñ\85алÑ\85 Ñ\8dн Ó\99Ó\99Ñ\88лд}}, $2 Ñ\82ооһаÑ\81.}}",
+       "category-article-count-limited": "Ð\9eÑ\80Ñ\87н Ó\99Ó\99Ñ\88лд {{PLURAL:$1|1=нег Ñ\85алÑ\85|$1 Ñ\85алÑ\85}} Ð±Ó\99Ó\99нÓ\99.",
+       "category-file-count": "{{PLURAL:$2|Эн Ó\99Ó\99Ñ\88лд Ò»Ð°Ð½Ñ\86Ñ\85н Ñ\85алÑ\85 Ð±Ó\99Ó\99нÓ\99.|Эн Ó\99Ó\99Ñ\88лд {{PLURAL:$1|1=нег Ð±Ð¾Ð¾Ð¼Ð³|$1 Ð±Ð¾Ð¾Ð¼Ð³Ñ\83д}} $2 Ñ\82ооһаÑ\81.}}",
+       "category-file-count-limited": "Ð\9eÑ\80Ñ\87н Ó\99Ó\99Ñ\88лд Ñ\8dн {{PLURAL:$1|боомг|$1 Ð±Ð¾Ð¾Ð¼Ð³Ñ\83д}} Ð±Ó\99Ó\99нÓ\99.",
+       "listingcontinuesabbrev": "(залһан)",
+       "index-category": "Ð\9aелкгдм халхс",
+       "noindex-category": "Ð\9aелкгдÑ\88го халхс",
+       "about": "Ð\91ичлһн",
        "article": "Зүүл",
-       "newwindow": "(Ñ\88ин Ñ\82еÑ\80зд)",
-       "cancel": "Уга ÐºÐµх",
-       "moredotdotdot": "ЦааÑ\80анднь...",
-       "mypage": "Ð\9cини Ñ\8dвÑ\80Ó\99 Ñ\85алх",
-       "mytalk": "Ð\9aүүндлһн Ð±Ó\99Ó\99Ñ\80м",
-       "anontalk": "IP хайгна күндллһн",
-       "navigation": "Ð\9eÑ\80м Ð¼ÐµÐ´Ð»Ò»Ð½",
+       "newwindow": "(Ñ\88ин Ñ\86оңÑ\85Ñ\82)",
+       "cancel": "Ð\91Ñ\83Ñ\86х",
+       "moredotdotdot": "Ð\9dань...",
+       "mypage": "Ð¥алх",
+       "mytalk": "Ð\9cеÑ\82кÓ\99н",
+       "anontalk": "Эн IP хайгин меткән",
+       "navigation": "Ð\90йлл",
        "and": "&#32;болн",
-       "qbfind": "Ð¥Ó\99Ó\99лһн",
-       "qbbrowse": "Ð\93Ò¯Ò¯Ò»Ó\99д Ñ\85әләх",
-       "qbedit": "Чиклх",
-       "qbpageoptions": "ТеÑ\80 халх",
-       "qbmyoptions": "Тана халхс",
-       "faq": "Юм Ð±Ð¸",
-       "faqpage": "Project:Юм Ð±Ð¸",
-       "actions": "Үүлд",
-       "namespaces": "Ð\9dеÑ\80нÓ\99 Ñ\83Ñ\81",
-       "variants": "СÑ\83ңһлÑ\82Ñ\81",
+       "qbfind": "Ð¥Ó\99Ó\99вÑ\80",
+       "qbbrowse": "Ð¥әләх",
+       "qbedit": "ЯÑ\81х",
+       "qbpageoptions": "Эн халх",
+       "qbmyoptions": "Ð\9cини халхс",
+       "faq": "СÑ\83Ñ\80мһа Ñ\81Ñ\83Ñ\80вÑ\80",
+       "faqpage": "Project:СÑ\83Ñ\80мһа Ñ\81Ñ\83Ñ\80вÑ\80",
+       "actions": "Үүлдвр",
+       "namespaces": "Ð\9dеÑ\80нÓ\99 Ñ\82Ó©Ñ\80л",
+       "variants": "ХүвлвÑ\80",
        "errorpagetitle": "Эндү",
-       "returnto": "«$1» Ñ\82ал Ñ\85Ó\99Ñ\80Ò¯ Ð¸Ñ\80х.",
-       "tagline": "{{grammar:genitive|{{SITENAME}}}} гидг һазрас өггцн",
-       "help": "ЦÓ\99Ó\99лһлһн",
-       "search": "Ð¥Ó\99Ó\99лһн",
-       "searchbutton": "Хәәлһн",
-       "go": "Ор",
-       "searcharticle": "Ор",
-       "history": "тууҗ",
+       "returnto": "«$1» Ñ\82ал Ñ\85Ó\99Ñ\80Ò¯ Ð¾Ð´х.",
+       "tagline": "{{SITENAME}} талас",
+       "help": "Ð\94Ó©Ò£",
+       "search": "Ð¥Ó\99Ó\99вÑ\80",
+       "searchbutton": "Хәәх",
+       "go": "Одх",
+       "searcharticle": "Одх",
+       "history": "Халхин тууҗ",
        "history_short": "Тууҗ",
-       "updatedmarker": "мини шидрә орлһна хөөн шинрүлсн",
+       "updatedmarker": "мини отхн орсна хөөн шинрүлсн",
        "printableversion": "Барин бәәдл",
        "permalink": "Даңгин заалһ",
        "print": "Барлх",
-       "edit": "Чиклх",
+       "edit": "ЯÑ\81х",
        "create": "Бүтәх",
-       "editthispage": "Эн халхиг чиклх",
-       "create-this-page": "Эн халхиг бүтәх",
-       "delete": "Һарһх",
-       "deletethispage": "Эн халхиг һарһх",
-       "undelete_short": "$1 {{PLURAL:$1|сольлһиг|сольлһиг|сольлһиг}} босхҗ тохрар",
+       "editthispage": "Эн халх ясх",
+       "create-this-page": "Эн халх бүтәх",
+       "delete": "Әрлһх",
+       "deletethispage": "Эн халх әрлһх",
+       "undelete_short": "{{PLURAL:$1|Нег ясвр|$1 ясвр|ясвр}} босхх",
        "protect": "Харсх",
        "protect_change": "сольх",
-       "protectthispage": "Эн халхиг харсх",
-       "unprotect": "Харсх уга",
-       "unprotectthispage": "ТеÑ\80 Ñ\85алÑ\85иг Ñ\85аÑ\80Ñ\81Ñ\85 Ñ\83га",
+       "protectthispage": "Эн халх харсх",
+       "unprotect": "Харслт сольх",
+       "unprotectthispage": "Эн Ñ\85алÑ\85ин Ñ\85аÑ\80Ñ\81лÑ\82 Ñ\81олÑ\8cÑ\85",
        "newpage": "Шин халх",
-       "talkpage": "ТеÑ\80 Ñ\85алÑ\85ин Ñ\82Ñ\83Ñ\81к ÐºÐµÐ»х",
+       "talkpage": "Эн Ñ\85алÑ\85 Ð¼ÐµÑ\82клдх",
        "talkpagelinktext": "Меткән",
-       "specialpage": "Ð\9aөдлÑ\85нÓ\99 халх",
-       "personaltools": "ЭвÑ\80Ó\99н Ð·ÐµÑ\80-зев",
-       "articlepage": "Зүүл үзх",
+       "specialpage": "ШиÑ\88лң халх",
+       "personaltools": "ТÑ\83Ñ\81лң Ð·ÐµÐ²Ñ\81г",
+       "articlepage": "Зүүл хәләх",
        "talk": "Меткән",
        "views": "Хәләврүд",
-       "toolbox": "Зер-зев",
-       "userpage": "Демнчна халх үзх",
-       "projectpage": "Төсвин халх үзх",
-       "imagepage": "Боомгин халх үзх",
-       "mediawikipage": "Зәңгин халх үзх",
-       "templatepage": "Кевләр халх үзх",
-       "viewhelppage": "ЦÓ\99Ó\99лһлһиг Ñ\83зх",
-       "categorypage": "Әәшлин халх үзх",
+       "toolbox": "Зевсг",
+       "userpage": "Демнәчнә халх хәләх",
+       "projectpage": "Төсвин халх хәләх",
+       "imagepage": "Боомгин халх хәләх",
+       "mediawikipage": "Зәңгин халх хәләх",
+       "templatepage": "Кевләрин халх хәләх",
+       "viewhelppage": "Ð\94өңгин Ñ\85алÑ\85 Ñ\85Ó\99лÓ\99х",
+       "categorypage": "Әәшлин халх хәләх",
        "viewtalkpage": "Меткән халх узх",
-       "otherlanguages": "Талдан келәр",
-       "redirectedfrom": "($1 гидг һазрас авч одсмн)",
-       "redirectpagesub": "Ð\90вÑ\87 Ð¾Ð´дг халх",
-       "lastmodifiedat": "ТеÑ\80 Ñ\85алÑ\85 Ñ\8dн Ñ\86агÑ\82 Ñ\81үл Ñ\87иклÓ\99д Ð±Ð¾Ð»Ò\97: $2, $1.",
-       "viewcount": "ТеÑ\80 Ñ\85алÑ\85д $1 {{PLURAL:$1|дÓ\99кÒ\97|дÓ\99кÒ\97|дÓ\99кÒ\97}} Ð¾Ñ\80Ò\97.",
+       "otherlanguages": "Ð\91Ñ\83Ñ\81 келәр",
+       "redirectedfrom": "($1 талас туусн)",
+       "redirectpagesub": "ТÑ\83Ñ\83дг халх",
+       "lastmodifiedat": "Эн Ñ\85алÑ\85ин Ð¾Ñ\82Ñ\85н Ñ\81олÑ\8cÑ\81н: $2, $1.",
+       "viewcount": "Эн Ñ\85алÑ\85Ñ\82 {{PLURAL:$1|нег Ð´Ó\99кÒ\97|$1 Ð´Ó\99кÒ\97}} Ñ\85андла.",
        "protectedpage": "Харссн халх",
-       "jumpto": "Ð\98Ñ\80х тал:",
-       "jumptonavigation": "Һазр медлһн",
-       "jumptosearch": "Ñ\85Ó\99Ó\99лһн",
-       "view-pool-error": "Гемим тәвтн, ода серверүд хар-хату көдлмштә.\nДегд дала күн тер халх үзхәр бәәнә.\nБуйн болтха, бәәҗәһәд дәкәд арһ хәәтн.\n\n$1",
-       "aboutsite": "{{SITENAME}} тускар",
-       "aboutpage": "Project:ТодлÒ\97 Ð±ичлһн",
-       "copyright": "Өггцн $1 йоста орҗ болм",
-       "copyrightpage": "{{ns:project}}:Ð\91иÑ\87Ñ\81н ÐºÒ¯Ò¯Ð½Ó\99 зөв",
-       "currentevents": "Ода болсн йовдл",
-       "currentevents-url": "Project:Ода болсн йовдл",
-       "disclaimers": "Дааврас эс зөвшәрлһн",
-       "disclaimerpage": "Project:Даарас эс зөвшәрлһн",
-       "edithelp": "ЧикллһнÓ\99 дөң",
+       "jumpto": "Ð\9eдх тал:",
+       "jumptonavigation": "айлл",
+       "jumptosearch": "Ñ\85Ó\99Ó\99вÑ\80",
+       "view-pool-error": "Гем тәвтн, ода серверуд күндрҗәнә.\nДегд олн халх хәләх сурлт орв.\nБуйн болтха, күләһәд халхт хандх седвәр бәән давттн.\n\n$1",
+       "aboutsite": "{{SITENAME}} туск",
+       "aboutpage": "Project:Ð\91ичлһн",
+       "copyright": "Бус эс гихлә, дотр $1 зөвшәрләр орлһта.",
+       "copyrightpage": "{{ns:project}}:Ð\97окÑ\8aÑ\8fÑ\87ин зөв",
+       "currentevents": "Өдгәк йовдл",
+       "currentevents-url": "Project:Өдгәк йовдл",
+       "disclaimers": "Даавран буцлт",
+       "disclaimerpage": "Project:Даавран буцлт",
+       "edithelp": "ЯÑ\81вÑ\80ин дөң",
        "mainpage": "Нүр халх",
        "mainpage-description": "Нүр халх",
        "policy-url": "Project:Бодлһн",
-       "portal": "Ð\91Ò¯Ñ\80дÓ\99Ñ\86ин хург",
-       "portal-url": "Project:Ð\91Ò¯Ñ\80дÓ\99Ñ\86ин хург",
-       "privacy": "Нууцин бодлһн",
-       "privacypage": "Project:Нууцин бодлһн",
-       "badaccess": "Зөвәнә эндү",
-       "badaccess-group0": "Та сурсн үүл кеҗ болшго.",
-       "badaccess-groups": "Эн Ò¯Ò¯Ð» Ò»Ð°Ð½Ñ\86Ñ\85н {{PLURAL:$2|1=багаÑ\81|багÑ\83даÑ\81}} $1 ÐºÐµÒ\97 Ñ\87адна.",
+       "portal": "Ð\9dииÑ\86Ó\99нÓ\99 хург",
+       "portal-url": "Project:Ð\9dииÑ\86Ó\99нÓ\99 хург",
+       "privacy": "Нуултын бодлһн",
+       "privacypage": "Project:Нуултын бодлһн",
+       "badaccess": "Зөвшәлин эндү",
+       "badaccess-group0": "Та сурсн үүлдврән күцәҗ болшгот.",
+       "badaccess-groups": "СанÑ\81н Ò¯Ò¯Ð»Ð´Ð²Ñ\80 Ò»Ð°Ð½Ñ\86 Ñ\8dн {{PLURAL:$2|багин|багмÑ\83дÑ\8bн}} Ð´ÐµÐ¼Ð½Ó\99Ñ\87нÑ\80 ÐºÒ¯Ñ\86Ó\99Ò\97 Ñ\87адна: $1",
        "versionrequired": "MediaWiki'н $1 һарц кергтә",
-       "versionrequiredtext": "Тер халх олзхар, MediaWiki'н $1 һарц кергтә.\n[[Special:Version|Һарца халх]] хәләтн.",
-       "ok": "Тиим",
-       "retrievedfrom": "\"$1\" гидг халхас йовулсн",
-       "youhavenewmessages": "Та $1та бәәнәт ($2).",
-       "youhavenewmessagesmulti": "Таньд $1 деер шин зәңг ирсн бәәнә.",
-       "editsection": "чиклх",
-       "editold": "чиклх",
-       "viewsourceold": "ишиг үзх",
-       "editlink": "чиклх",
-       "viewsourcelink": "ишиг хәләх",
-       "editsectionhint": "«$1» гидг хүвиг чиклх",
+       "versionrequiredtext": "Эн халх керглхәр, MediaWiki'н $1 һарц кергтә.\n[[Special:Version|Һарцин халх]] хәләтн.",
+       "ok": "Не",
+       "retrievedfrom": "\"$1\" халхас авсн",
+       "youhavenewmessages": "Танд $1 бәәнә ($2).",
+       "newmessageslinkplural": "шин зәңг",
+       "youhavenewmessagesmulti": "Танд $1 деер шин зәңг бәәнә.",
+       "editsection": "ясх",
+       "editold": "ясх",
+       "viewsourceold": "иш код хәләх",
+       "editlink": "ясх",
+       "viewsourcelink": "иш код хәләх",
+       "editsectionhint": "«$1» салвр ясх",
        "toc": "Һарг",
        "showtoc": "үзүлх",
-       "hidetoc": "бÑ\83лÑ\82Ñ\83лх",
-       "thisisdeleted": "$1 гүүһәд хәләхү аль хәрүлхү?",
-       "viewdeleted": "$1 үзүлхү?",
-       "restorelink": "{{PLURAL:$1|1=$1 һарһсн сольлһн|$1 һарһсн сольлһн}}",
-       "feedlinks": "ТеÑ\80 Ð±Ó\99Ó\99длÑ\82Ó\99",
-       "feed-invalid": "Ð\91Ñ\83Ñ\80Ñ\83 Ð±Ð¸Ñ\87гдлһнÓ\99 Ñ\82өлÓ\99 Ñ\81үвин Ñ\8fнз.",
-       "feed-unavailable": "СиндикаÑ\86ин Ñ\81үв Ð¾Ñ\80лһÑ\82а Ð±Ð¸Ñ\88",
-       "site-rss-feed": "$1 — RSS-зәңг",
-       "site-atom-feed": "$1 — Atom-зәңг",
-       "page-rss-feed": "«$1» — RSS-зәнгллһн",
-       "page-atom-feed": "«$1» â\80\94 Atom Ð·Ó\99нгллһн",
-       "red-link-title": "$1 (халх бәәшго)",
+       "hidetoc": "нÑ\83Ñ\83х",
+       "thisisdeleted": "$1 хәләхий аль босххий?",
+       "viewdeleted": "$1 хәләхий?",
+       "restorelink": "{{PLURAL:$1|нег әрлһсн ясвр|$1 әрлһсн ясвр}}",
+       "feedlinks": "Ð\9aÒ¯Ñ\81м:",
+       "feed-invalid": "Ð\91Ñ\83Ñ\80Ñ\83 Ð·Ð°ÐºÑ\8aÑ\8fлһÑ\85 Ñ\86Ñ\83вгин Ñ\82Ó©Ñ\80л.",
+       "feed-unavailable": "Ð\9dегдÑ\81н ÐºÒ¯Ñ\81м Ð¾Ñ\80лһго",
+       "site-rss-feed": "$1 — RSS күсм",
+       "site-atom-feed": "$1 — Atom күсм",
+       "page-rss-feed": "«$1» — RSS күсм",
+       "page-atom-feed": "«$1» â\80\94 Atom ÐºÒ¯Ñ\81м",
+       "red-link-title": "$1 (халх уга)",
        "nstab-main": "Зүүл",
-       "nstab-user": "Демнч",
-       "nstab-media": "Ð\90һаÑ\80ин халх",
-       "nstab-special": "Ð\9aөдлÑ\85нÓ\99 халх",
+       "nstab-user": "Демнәч",
+       "nstab-media": "Ð\91оомгин халх",
+       "nstab-special": "ШиÑ\88лң халх",
        "nstab-project": "Төслин халх",
        "nstab-image": "Боомг",
        "nstab-mediawiki": "Зәңг",
        "nstab-template": "Кевләр",
-       "nstab-help": "ЦÓ\99Ó\99лһлһн",
+       "nstab-help": "Ð\94Ó©Ò£",
        "nstab-category": "Әәшл",
-       "nosuchaction": "Иим үүл бәәшго",
-       "nosuchactiontext": "URL'д Ð±Ð¸Ñ\87Ñ\81н Ò¯Ò¯Ð» Ð±Ñ\83Ñ\80Ñ\83 Ð±Ð¾Ð»Ò\97ана.\nТа URL Ð±Ð¸Ñ\87Ó\99д Ñ\8dндү ÐºÐµÒ\97 Ð±Ð¾Ð»Ð²Ð·Ð° Ð°Ð»Ñ\8c Ð±Ñ\83Ñ\80Ñ\83 Ð·Ð°Ð°Ð»Ò»Ð°Ñ\81 Ð´Ð°Ñ\85Ò\97.\nÐ\94Ó\99кÓ\99д, Ñ\82еÑ\80 Ð¹Ð¾Ð²Ð´Ð» {{SITENAME}} Ñ\82Ó©Ñ\81лин Ñ\8dндү Ð±Ð¾Ð»Ð²Ð·Ð°.",
-       "nosuchspecialpage": "Иим көдлхнә халх бәәшго",
-       "nospecialpagetext": "<strong>Та сурсн көдлхнә халх бәәшго.</strong>\n\nЧик көдлхнә халхин буулһавр: [[Special:SpecialPages|{{int:specialpages}}]].",
+       "nosuchaction": "Иим үүлдвр уга",
+       "nosuchactiontext": "URL'д Ð·Ð°Ð°Ñ\81н Ò¯Ò¯Ð»Ð´Ð²Ñ\80 Ð±Ñ\83Ñ\80Ñ\83.\nТа URL Ð¾Ñ\80Ñ\83лад Ñ\8dндүÑ\80Ñ\81н Ð°Ð»Ñ\8c Ð±Ñ\83Ñ\80Ñ\83 Ð·Ð°Ð°Ð»Ò»Ð°Ñ\80 Ð¾Ð´Ñ\81н Ð¼Ð°Ò»Ð´.\nÐ\94Ó\99кÓ\99д, Ñ\8dн {{SITENAME}} Ñ\82Ó©Ñ\81лин Ñ\8dндү Ð¼Ð°Ò»Ð´.",
+       "nosuchspecialpage": "Иим шишлң халх уга",
+       "nospecialpagetext": "<strong>Тана сурсн шишлң халх уга.</strong>\n\nБәәдг шишлң халхин бүрткл: [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "Эндү",
-       "databaseerror": "Өггцнә базин эндү",
-       "missing-article": "Өггцнә халһлд сурсн халхин бичг олв уга. Эн халх олх йоста: \"$1\" нертә $2.\n\nТер йовдл һарһсн халхна тууҗин өңгрсн заалһиг дахлһна арһ болад бәәнә.\n\nЭс гиҗ, тиим болх зөвтә, та заклһна теткүлин эндүһиг олв.\nБуйн болтха, URL заалһ бичәд, тер йовдлин туск [[Special:ListUsers/sysop|закрачд]] келтн.",
-       "missingarticle-rev": "($1 тойгта халхна янз)",
-       "missingarticle-diff": "(йилһән: $1, $2)",
-       "internalerror": "Ð\94оÑ\82Ñ\80нÑ\8c эндү",
-       "internalerror_info": "Ð\94оÑ\82Ñ\80нÑ\8c эндү: $1",
-       "filerenameerror": "Боомгин нериг «$1»-с «$2» болһн сольҗ чаддго",
-       "filedeleteerror": "«$1» боомг һарһҗ чаддго.",
-       "unexpected": "Таалһта уга кемҗә: «$1» = «$2».",
-       "badtitle": "Буру нернь",
-       "badtitletext": "Сурсн нерн буру, хоосн, аль му бичсн келн хоорнд нертә. Тиим чигн биз, нерн зөв уга үзгтә.",
-       "viewsource": "Ишиг хәләх",
+       "databaseerror": "То-дигин саңгин эндү",
+       "missing-article": "То-дигин саңт сурсн «$1» халхин $2 олх йоста бичг олсн уга.\n\nТиим заңта йовдл әрлһсн халхна тууҗин хуучрсн заалһар одх седвәрәр һардг авъяста.\n\nКемр эн учр биш, та көтлврин теткүлин эндү олсн бәәдлтәт.\nБуйн болтха, эн URL зааҗ, эн йовдлын туск [[Special:ListUsers/sysop|закрачт]] келтн.",
+       "missingarticle-rev": "(№ $1 һарц)",
+       "missingarticle-diff": "(Ð\99илһән: $1, $2)",
+       "internalerror": "Ð\94оÑ\82Ñ\80к эндү",
+       "internalerror_info": "Ð\94оÑ\82Ñ\80к эндү: $1",
+       "filerenameerror": "Боомгин нер «$1» талас «$2» болһҗ болмҗго",
+       "filedeleteerror": "«$1» боомг әрлһҗ болмҗго.",
+       "unexpected": "Таарго кемҗән: «$1» = «$2».",
+       "badtitle": "Болшго нернь",
+       "badtitletext": "Сурсн халхин нерн буру, хоосн, аль буру бичсн келн хоорндк аль вики хоорндк нерн. Нернд болшго темдгүд керглсн маһд.",
+       "viewsource": "Иш код хәләх",
        "actionthrottled": "Хурдна заг",
-       "ns-specialprotected": "ШиÑ\88лң Ñ\85алÑ\85 Ñ\87иклÑ\81н Ð±Ó\99Ó\99Ñ\85 болшго.",
-       "virus-unknownscanner": "медгдго антивирус:",
+       "ns-specialprotected": "ШиÑ\88лң Ñ\85алÑ\85 Ñ\8fÑ\81Ñ\87 болшго.",
+       "virus-unknownscanner": "медснго антивирус:",
        "logouttext": "'''Та һарад бәәнәт.'''\n\nТа {{SITENAME}} гидг ормиг нертә уга олзлҗ чаднат, аль та <span class='plainlinks'>[$1 дәкәд орҗ]</span> цацу аль талдан нертә чаднат.\nЗәрм халхс цааранднь та ода чигн орсн мет үзүлҗ чаддг тускар темдглтн (та хәләчин санлиг цеврлтл).",
-       "yourname": "Демнчна нернь:",
+       "yourname": "Демнәчнә нерн:",
        "yourpassword": "Нууц үг:",
-       "yourpasswordagain": "Нууц үгиг давтн:",
+       "yourpasswordagain": "Нууц үг давтн:",
        "remembermypassword": "Намаг эн тоолдврд тодлх ($1 {{PLURAL:$1|1=өдрт|өдрмүдт}} икәр биш)",
        "yourdomainname": "Тана домен:",
        "login": "Орлһн",
-       "nav-login-createaccount": "ХаÑ\80Ò»Ñ\85 / Ð±Ð¸Ñ\87гдлһн ÐºÐµх",
-       "userlogin": "Орх аль бичгдлһиг бүтәх",
-       "userloginnocreate": "ХаÑ\80Ò»х",
+       "nav-login-createaccount": "Ð\9eÑ\80Ñ\85/бүÑ\80Ñ\82кгдх",
+       "userlogin": "Орх/бүрткгдх",
+       "userloginnocreate": "Ð\9eÑ\80х",
        "logout": "Һарх",
        "userlogout": "Һарх",
-       "notloggedin": "Та орв биш",
-       "nologin": "Бичгдлһта уга? '''$1'''.",
-       "nologinlink": "Ð\91иÑ\87гдлһиг бүтәх",
-       "createaccount": "Ð\91иÑ\87гдлһиг бүтәх",
-       "gotaccount": "Бичгдлһтә? '''$1'''.",
-       "gotaccountlink": "ХаÑ\80Ò»тн",
+       "notloggedin": "Та орсн уга",
+       "nologin": "Бичгдлһгот? '''$1'''.",
+       "nologinlink": "Ð\91иÑ\87гдлһн бүтәх",
+       "createaccount": "Ð\91иÑ\87гдлһн бүтәх",
+       "gotaccount": "Бичгдлһтәт? '''$1'''.",
+       "gotaccountlink": "Ð\9eÑ\80тн",
        "createaccountmail": "электрона улаһар",
        "userexists": "Эн нер олзлдг юмн.\nБуйн болтха, талдан нернь автн.",
        "loginerror": "Орлһна эндү",
-       "createaccounterror": "Ð\91иÑ\87гдлһиг Ð±Ò¯Ñ\82Ó\99Ñ\85 Ð±Ð¾Ð»Ñ\88го: $1",
-       "noname": "Та Ð·Ó©Ð²Ñ\82Ó\99 Ð´ÐµÐ¼Ð½Ñ\87на Ð½ÐµÑ\80нÑ\8c Ð±Ð¸Ñ\87в уга.",
+       "createaccounterror": "Ð\91иÑ\87гдлһн Ð±Ò¯Ñ\82Ó\99Ò\97 Ð±Ð¾Ð»Ð¼Ò\97го: $1",
+       "noname": "Та Ð·Ó©Ð²Ñ\88Ó\99Ñ\81н Ð´ÐµÐ¼Ð½Ó\99Ñ\87нÓ\99 Ð½ÐµÑ\80 Ð·Ð°Ð°Ñ\81н уга.",
        "loginsuccesstitle": "Йовудта орлһн",
-       "loginsuccess": "''' Тадн ода «$1» нертә {{SITENAME}} гидг нерәдлһтә төсвд бәәнәт.'''",
-       "nosuchuser": "«$1» Ð³Ð¸Ð´Ð³ Ð½ÐµÑ\80Ó\99длһÑ\82Ó\99 Ð´ÐµÐ¼Ð½Ñ\87 Ð±Ó\99Ó\99Ñ\88го.\nÐ\94емнÑ\87на Ð½ÐµÑ\80Ñ\82 Ð±Ð°Ò» Ð±Ð¾Ð»Ð½ Ð¸Ðº Ò¯Ð·Ð³Ò¯Ð´ Ó\99дл Ð±Ð¸Ñ\88 Ð±Ð¾Ð»Ð½Ð°.\n«<nowiki>$1</nowiki>» Ð³Ð¸Ð´Ð³ Ð½ÐµÑ\80Ó\99длһÑ\82Ó\99 Ð´ÐµÐ¼Ð½Ñ\87 Ð±Ó\99Ó\99Ñ\88го.\nÐ\91иÑ\87лһиг Ñ\88Ò¯Ò¯Ñ\82н Ð°Ð»Ñ\8c [[Special:UserLogin/signup|бигÑ\87длһиг бүтәтн]].",
-       "nosuchusershort": "«$1» Ð³Ð¸Ð´Ð³ Ð½ÐµÑ\80Ó\99длһÑ\82Ó\99 Ð´ÐµÐ¼Ð½Ñ\87 Ð±Ó\99Ó\99Ñ\88го.\nÐ\91иÑ\87лһиг шүүтн.",
-       "nouserspecified": "Та демнчна нернь бичх йостав.",
-       "login-userblocked": "ТеÑ\80 Ð´ÐµÐ¼Ð½Ñ\87 Ð±Ò¯Ñ\81лÑ\81н, Ñ\85аÑ\80һад Ð¾Ñ\80Ò\97 Ð±Ð¾Ð»Ñ\88го Ð±Ó\99Ó\99нÓ\99.",
-       "wrongpassword": "Та буру нууц үг бичв.\nДәкәд арһ хәәтн.",
-       "wrongpasswordempty": "Та хоосн нууц үгиг бичв.\nДәкәд арһ хәәтн.",
+       "loginsuccess": "<strong>Та ода «$1» нертә {{SITENAME}} төсвд бәәнәт.</strong>",
+       "nosuchuser": "«$1» Ð½ÐµÑ\80Ñ\82Ó\99 Ð´ÐµÐ¼Ð½Ó\99Ñ\87 Ñ\83га.\nÐ\94емнÓ\99Ñ\87нÓ\99 Ð½ÐµÑ\80нд Ð±Ð°Ò» Ð±Ð¾Ð»Ð½ Ñ\82ом Ò¯Ð·Ð³Ò¯Ð´ Ó\99дл Ð±Ð¸Ñ\88.\nЧик Ð±Ð¸Ñ\87Ñ\81н Ñ\88Ò¯Ò¯Ñ\82н Ð°Ð»Ñ\8c [[Special:UserLogin/signup|бигÑ\87длһн бүтәтн]].",
+       "nosuchusershort": "«$1» Ð½ÐµÑ\80Ñ\82Ó\99 Ð´ÐµÐ¼Ð½Ó\99Ñ\87 Ñ\83га.\nЧик Ð±Ð¸Ñ\87Ñ\81н шүүтн.",
+       "nouserspecified": "Та демнәчнә нер заах йоста.",
+       "login-userblocked": "Эн Ð´ÐµÐ¼Ð½Ó\99Ñ\87 Ð±Ò¯Ñ\81лÑ\81н, Ð¾Ñ\80Ò\97 Ð±Ð¾Ð»Ñ\88го.",
+       "wrongpassword": "Та буру нууц үг бичвт.\nДәкәд сөртн.",
+       "wrongpasswordempty": "Та хоосн нууц үг бичвт.\nДәкәд сөртн.",
        "passwordtooshort": "Нууц үг баһар биш $1 {{PLURAL:$1|үзгтә|үзгүдта|үзгүдта}} бәәх йоста.",
-       "password-name-match": "Нууц үг денмнчна нертә әдл биш бәәх йоста.",
+       "password-name-match": "Нууц үг денмнәчнә нерәс бус бәәх йоста.",
        "mailmypassword": "Шин нууц үгиг E-mail бичгәр йовулҗ",
        "emailauthenticated": "Тана e-mail хайг $2 өдрт, $3 цагт батлсн.",
-       "accountcreated": "Бичгдллһн бүтәв.",
+       "accountcreated": "Бичгдлһн бүтәв.",
        "loginlanguagelabel": "Келн: $1",
-       "changepassword": "Нууц үгиг сольҗ",
-       "resetpass_header": "Бичгдллһнә нууц үгиг сольх",
+       "changepassword": "Нууц үг сольлһн",
+       "resetpass_header": "Бичгдлһнә нууц үг сольх",
        "oldpassword": "Көгшн нууц үг:",
        "newpassword": "Шин нууц үг:",
-       "retypenew": "Шин нууц үгиг дәкәд бичтн:",
+       "retypenew": "Шин нууц үг дәкәд бичтн:",
        "changepassword-success": "Тана нууц үгиг йовудта сольв! Та ода орнат...",
-       "resetpass-submit-loggedin": "Нууц үгиг сольх",
-       "resetpass-submit-cancel": "Уга ÐºÐµх",
+       "resetpass-submit-loggedin": "Нууц үг сольх",
+       "resetpass-submit-cancel": "Ð\91Ñ\83Ñ\86х",
        "bold_sample": "Тарһн бичг",
        "bold_tip": "Тарһн бичг",
        "italic_sample": "Өкәсн бичг",
        "italic_tip": "Өкәсн бичг",
-       "link_sample": "Ð\97аалһна нерн",
-       "link_tip": "Өвр заалһ",
-       "extlink_sample": "http://www.example.com Ð·Ð°Ð°Ð»Ò»Ð½Ð° Ð½ÐµÑ\80нÑ\8c",
-       "extlink_tip": "Һаза заалһ (http:// гидг эклц бичә мартн)",
-       "headline_sample": "Толһа нерн",
-       "headline_tip": "Дү толһа нерн",
-       "nowiki_sample": "Энд темдглһтә уга бичгиг бичтн",
-       "nowiki_tip": "Ð\91ики Ñ\82емдглһиг басх",
-       "image_tip": "Ð\9eÑ\80Ñ\86Ñ\83лсн боомг",
-       "media_tip": "Боомгин заалһ",
-       "sig_tip": "Тана тәвсн һар цагин темдгтә",
-       "hr_tip": "Кевтдг татасн (дундин бәәдлтә олзлтн)",
-       "summary": "Учр-утх:",
-       "subject": "Төр/нерәдлһн:",
-       "minoredit": "Ð\91аһ Ñ\87икллһн",
-       "watchthis": "ШинÒ\97лх",
-       "savearticle": "Хадһлх",
+       "link_sample": "Ð\97аалһин нерн",
+       "link_tip": "Дотрк заалһ",
+       "extlink_sample": "http://www.example.com Ð·Ð°Ð°Ð»Ò»Ð¸Ð½ Ò»Ð°Ñ\80Ñ\86г",
+       "extlink_tip": "Һазак заалһ (http:// эклвр бичә мартн)",
+       "headline_sample": "Һарцгин бичәсн",
+       "headline_tip": "Дү һарцг",
+       "nowiki_sample": "Энд кевлүлх кергго бичәсн орултн",
+       "nowiki_tip": "Ð\92ики ÐºÐµÐ²Ð»Ò¯Ð»Ð»Ñ\82 басх",
+       "image_tip": "Углсн боомг",
+       "media_tip": "Боомгур заалһ",
+       "sig_tip": "Тана тәвсн һар цаг хойр",
+       "hr_tip": "Кевтә татасн (нигтәр биш керглтн)",
+       "summary": "Үндсн:",
+       "subject": "Төр/һарцг:",
+       "minoredit": "Ð\91аһ Ñ\8fÑ\81вÑ\80",
+       "watchthis": "Эн Ñ\85алÑ\85 Ð¾Ð²Ñ\80х",
+       "savearticle": "ХалÑ\85 Ñ\85адһлÑ\85",
        "preview": "Хәләвр",
        "showpreview": "Хәләвр",
-       "showdiff": "Ð\99илһән",
+       "showdiff": "Ð\9aеÑ\81н Ð¹илһән",
        "anoneditwarning": "'''Урдаснь зәңг:''' та орв биш.\nТадна IP хайг эн халхна чикллһнә сеткүлд бичҗ авх.",
-       "summary-preview": "Эн учр-утхта болх:",
-       "subject-preview": "ТеÑ\80 Ò»Ð°Ñ\80Ñ\87иг болх:",
-       "blockedtitle": "Демнч бүслгдәд бәәнә.",
-       "loginreqlink": "харһх",
-       "accmailtitle": "Ð\9dÑ\83Ñ\83Ñ\86 Ò¯Ð³Ñ\82Ó\99 Ð±Ð¸Ñ\87г Ð¹Ð¾Ð²Ñ\83лла.",
+       "summary-preview": "Эн үндсн болх:",
+       "subject-preview": "Эн Ò»Ð°Ñ\80Ñ\86г болх:",
+       "blockedtitle": "Демнәч бүслгдсн",
+       "loginreqlink": "орх",
+       "accmailtitle": "Ð\9dÑ\83Ñ\83Ñ\86 Ò¯Ð³Ñ\82Ó\99 Ð±Ð¸Ñ\87г Ð¹Ð¾Ð²Ñ\83лгдв",
        "newarticle": "(Шин)",
-       "newarticletext": "Та Ð·Ð°Ð°Ð»Ò»Ð¸Ð³ Ð´Ð°Ñ\85ад Ð±Ó\99Ó\99дг Ñ\83га Ñ\85алÑ\85д Ð¸Ñ\80в.\nТеÑ\80үг Ð±Ò¯Ñ\82Ó\99Ò\97 Ð±Ð¾Ð»Ñ\85ла, Ð´Ð¾Ñ\80аһаÑ\80 Ñ\82еÑ\80зд Ð±Ð¸Ñ\87Ñ\82н (дÓ\99кÓ\99д Ó©Ð³Ð³Ñ\86нÓ\99 Ñ\82өлÓ\99 [$1 Ñ\82Ó\99Ó\99лвÑ\80] Ñ\85Ó\99лÓ\99Ñ\82н).\nТа Ñ\8dн Ò»Ð°Ð·Ñ\80Ñ\82 Ñ\8dндүһÓ\99Ñ\80 Ð±Ó\99Ó\99Ñ\85лÓ\99, '''Ð¥Ó\99Ñ\80Ò¯''' Ð´Ð°Ñ\80Ñ\86иг дартн.",
-       "noarticletext": "Эн халх хоосн. Та [[Special:Search/{{PAGENAME}}|эн нернә сананд орулһна хәәх]] , <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} бүртклин бичгт хәәх], аль '''[{{fullurl:{{FULLPAGENAME}}|action=edit}} бүтәх]'''</span>.",
+       "newarticletext": "Та Ð·Ð°Ð°Ð»Ò»Ð°Ñ\80 Ð¾Ð´Ð°Ñ\85н Ñ\83га Ñ\85алÑ\85Ñ\82 Ð¾Ð´Ð².\nҮүниг Ð±Ò¯Ñ\82Ó\99Ñ\85Ó\99Ñ\80, Ð´Ð¾Ñ\80к Ñ\86оңÑ\85Ñ\82 Ð±Ð¸Ñ\87Ó\99Ñ\81н Ð¾Ñ\80Ñ\83лÑ\82н (Ñ\82одÑ\80Ñ\85а [$1 Ð´Ó©Ò£Ð³Ð¸Ð½ Ñ\85алÑ\85] Ñ\85Ó\99лÓ\99Ñ\82н).\nТа Ñ\8dнд Ñ\8dндүһÓ\99Ñ\80 Ð¾Ð´Ð»Ñ\85лаÑ\82, Ñ\85аÑ\80агÑ\87ин '''Ð¥Ó\99Ñ\80Ò¯''' Ñ\82овÑ\80Ñ\83н дартн.",
+       "noarticletext": "Эн халх одахн хоосн. Та [[Special:Search/{{PAGENAME}}|эн нернә дурдлһн хәәҗ]] , <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ирлцәтә седкүлин бичгдл хәәҗ], аль '''[{{fullurl:{{FULLPAGENAME}}|action=edit}} иим нертә халх бүтәҗ]''' чаднат</span>.",
        "clearyourcache": "'''Оньган өгтн:''' Кесн сольлһн үзхәр, тана хәләлгчин кеш цеврүлтн: '''Mozilla / Firefox''': ''Ctrl+Shift+R'', '''IE:''' ''Ctrl+F5'', '''Safari''': ''Cmd+Shift+R'', '''Konqueror''': ''F5'', '''Opera''': ''Tools→Preferences'' менүһәс.",
        "usercssyoucanpreview": "'''Селвг:''' тана шин CSS боомг шүүҗ хадһлар, «{{int:showpreview}}» товч олзлтн.",
        "userjsyoucanpreview": "'''Селвг:''' тана шин JS боомг шүүҗ хадһлар, «{{int:showpreview}}» товч олзлтн.",
        "previewnote": "'''Эн мел хәләвр бәәдг тускар тодлтн.'''\nТана сольлһн ода чигн хадһлсн уга!",
        "previewconflict": "Тер хәләвр деегүрк чикллһнә теегт бәәдг бичг хадлһҗ бичсн мет үзүлнә.",
        "session_fail_preview": "'''Гемим тәвтн, сервер тана сольлһта даңдад болв. Юнгад гихлә, тана харһлһна медүллһн геев.\nБуйн болтха, дәкәд арһ хәәтн.\nТер эндү давтхла, [[Special:UserLogout|һартн]] тегәд бас харһтн.'''",
-       "editing": "Чикллһн: $1",
-       "editingsection": "«$1» гидг халхна чикллһн (хүв)",
-       "editconflict": "ЧикллһнÓ\99 керүл: $1",
-       "yourtext": "Тана бичсн",
+       "editing": "ЯÑ\81вÑ\80: $1",
+       "editingsection": "«$1» ясвр (салвр)",
+       "editconflict": "ЯÑ\81вÑ\80ин керүл: $1",
+       "yourtext": "Тана бичәсн",
        "yourdiff": "Йилһән",
        "copyrightwarning": "Буйн болтха, цуг өгүллһн {{SITENAME}} төлә $2 гидг закаһар кесн, тоолсн бәәдг тускар тодлтн (Дәкәд өггцд төлә $1 хәләтн).  Та тана бичсн чилклсн аль делгрңсн бәәҗ седхлә биш, эн ормд бичә бичтн.<br /> Дәкәд та маднд эн эврәнь бичсн, күмн әмтнә хазас аль цацу сул медснәс бәәдг үгән өгнәт. '''Зөвән авхла уга, харссн бичсн күүнә көдлмш бичә тәвтн!'''",
        "copyrightwarning2": "Буйн болтха, цуг өгүллһн {{SITENAME}} төлә чиклсн аль һарһсн бәәдг чадта тускар тодлтн.  Та тана бичсн чилклсн аль делгрңсн бәәҗ седхлә биш, эн ормд бичә бичтн.<br /> Дәкәд та маднд эн эврәнь бичсн, күмн әмтнә хазас аль цацу сул медснәс бәәдг үгән өгнәт ($1 хәләтн). '''Зөвән авхла уга, харссн бичсн күүнә көдлмш бичә тәвтн!'''",
        "template-semiprotected": "(зәрм харссн)",
        "hiddencategories": "Эн халх тер $1 {{PLURAL:$1|бултулсн әәшләс|бултулсн әәшлүдәс|бултулсн әәшлүдәс}}:",
        "permissionserrorstext-withaction": "Та $2 кеҗ болшго. Юнгад гихлә, эн {{PLURAL:$1|1=учрар|учрар}}:",
-       "edit-conflict": "ЧикллһнÓ\99 керүл.",
+       "edit-conflict": "ЯÑ\81вÑ\80ин керүл.",
        "parser-template-loop-warning": "Зуран бүтү нүдлв: [[$1]]",
-       "viewpagelogs": "ТеÑ\80 Ñ\85алÑ\85на Ñ\81еÑ\82күлдүд Ò¯Ð·Ò¯Ð»х",
-       "currentrev-asof": "Ода болсн янз ($1)",
-       "revisionasof": "Тер цагин янз: $1",
-       "previousrevision": "← Урдк янз",
-       "nextrevision": "Дарук янз →",
-       "currentrevisionlink": "Ð\9eда Ð±Ð¾Ð»Ñ\81н Ñ\8fнз",
+       "viewpagelogs": "Эн Ñ\85алÑ\85ин Ñ\81едкүлүд Ñ\85Ó\99лÓ\99х",
+       "currentrev-asof": "$1 һарц",
+       "revisionasof": "$1 һарц",
+       "previousrevision": "← Урдк һарц",
+       "nextrevision": "Дарук һарц →",
+       "currentrevisionlink": "Ð\91Ó\99Ó\99гÑ\87 Ò»Ð°Ñ\80Ñ\86",
        "cur": "ода",
        "next": "дарук",
        "last": "урдк",
        "page_first": "түрүн",
-       "page_last": "кенз",
-       "histlegend": "Тәәлвр: (ода) — одачн янзас йилһән; (урдк) — урдк янзас йилһән; '''б''' — баһ сольлһн",
-       "history-fieldset-title": "Тууҗиг хәләх",
-       "histfirst": "ЭÑ\80Ñ\82",
-       "histlast": "ШидÑ\80Ó\99",
+       "page_last": "оÑ\82Ñ\85н",
+       "histlegend": "Һарцин суңһвр: дүңнх сансн халхин һарцс суңһад, Enter аль дорк товрун дартн.<br />\nТәәлвр: <strong>({{int:cur}})</strong> — отхн һарцас йилһән, <strong>({{int:last}})</strong> — урдк һарцас йилһән, <strong>{{int:minoreditletter}}</strong> — баһ ясвр.",
+       "history-fieldset-title": "Тууҗ хәләх",
+       "histfirst": "маÑ\88 Ñ\85Ñ\83Ñ\83Ñ\87н",
+       "histlast": "маÑ\88 Ñ\88ин",
        "historyempty": "(хоосн)",
-       "rev-delundel": "үзүлÑ\85±Ñ\83лÑ\82Ñ\83лх",
+       "rev-delundel": "үзүлÑ\85½Ñ\83Ñ\83х",
        "rev-showdeleted": "үзүлх",
        "revdelete-show-file-submit": "Тиим",
-       "revdelete-radio-set": "ЭÑ\8d",
-       "revdelete-radio-unset": "Уга",
-       "revdel-restore": "Үзгдллһиг сольх",
-       "pagehist": "ХалÑ\85на тууҗ",
-       "revdelete-otherreason": "Талдан/дÓ\99кÓ\99д учр:",
+       "revdelete-radio-set": "Ð\9dÑ\83Ñ\83гдÑ\81н",
+       "revdelete-radio-unset": "Үзгдмл",
+       "revdel-restore": "үзгдмл сольх",
+       "pagehist": "ХалÑ\85ин тууҗ",
+       "revdelete-otherreason": "Ð\91Ñ\83Ñ\81/немгÑ\87 учр:",
        "mergehistory-reason": "Учр:",
        "revertmerge": "Хувах",
-       "history-title": "$1 — сольлһна тууҗ",
+       "history-title": "«$1» ясврин тууҗ",
        "lineno": "$1 мөр:",
        "compareselectedversions": "Суңһсн янзс әдлцүлх",
-       "editundo": "уга кех",
-       "searchresults": "Ð¥Ó\99Ó\99лһнÓ\99 Ð°Ñ\88Ñ\83д",
-       "searchresults-title": "Хәәлһнә ашуд \"$1\" төлә",
-       "notextmatches": "Әдл бичг халхд уга",
+       "editundo": "буцх",
+       "searchresults": "Ð¥Ó\99Ó\99вÑ\80ин Ð°Ñ\88",
+       "searchresults-title": "«$1» хәәврин аш",
+       "notextmatches": "Халхсин бичәснд ирлцән уга",
        "prevn": "урдк {{PLURAL:$1|$1}}",
        "nextn": "дарук {{PLURAL:$1|$1}}",
-       "viewprevnext": "Ð\93Ò¯Ò¯Ò»Ó\99д Ñ\85әләх ($1 {{int:pipe-separator}} $2) ($3)",
+       "viewprevnext": "Ð¥әләх ($1 {{int:pipe-separator}} $2) ($3)",
        "searchprofile-articles": "Зүүлс",
        "searchprofile-images": "Үзгдл-соңсвр",
-       "searchprofile-everything": "ЦÑ\83һаÑ\80",
-       "searchprofile-articles-tooltip": "$1 Ð³Ð¸Ð´Ð³ Ð·Ò¯Ò¯Ð»Ð´ хәәх",
+       "searchprofile-everything": "Хамг",
+       "searchprofile-articles-tooltip": "$1 Ð´Ð¾Ñ\82Ñ\80 хәәх",
        "searchprofile-images-tooltip": "Боомг хәәх",
-       "search-result-size": "$1 ({{PLURAL:$2|$2 үг|$2 үгмүд|$2 үгмүд}})",
-       "search-redirect": "(авч одлһн $1)",
-       "search-section": "($1 хүв)",
-       "search-suggest": "Та эниг таанат: $1 ?",
-       "search-interwiki-caption": "Садта проектмуд",
-       "search-interwiki-default": "$1 ашуд:",
-       "search-interwiki-more": "(дÓ\99кÓ\99д)",
-       "searchall": "Ñ\86Ñ\83г",
-       "powersearch-legend": "Ð\9aÒ¯Ñ\87н Ñ\85Ó\99Ó\99лһн",
-       "powersearch-ns": "Эн Ð½ÐµÑ\80нÓ\99 Ñ\83 Ð´Ð¾Ñ\82Ñ\80ан хәәх:",
+       "search-result-size": "$1 ({{PLURAL:$2|$2 үг|$2 үг|$2 үг}})",
+       "search-redirect": "(туудг $1)",
+       "search-section": "(«$1» салвр)",
+       "search-suggest": "Тана таасн маһд: $1",
+       "search-interwiki-caption": "Садта төслүд",
+       "search-interwiki-default": "$1 талас аш:",
+       "search-interwiki-more": "(нанÑ\8c)",
+       "searchall": "Ñ\85амг",
+       "powersearch-legend": "Ð\9dÓ\99Ñ\80н Ñ\85Ó\99Ó\99вÑ\80",
+       "powersearch-ns": "Эн Ð½ÐµÑ\80нÓ\99 Ñ\82Ó©Ñ\80лд хәәх:",
        "powersearch-togglenone": "Уга",
-       "preferences": "Ð\94Ñ\83Ñ\80ллһн",
-       "mypreferences": "Көгүд",
-       "prefs-edits": "ЧикллһнÓ\99 то:",
-       "prefs-skin": "Ð¥Ñ\83вÑ\86нÑ\8c",
+       "preferences": "Ð\9aөгмүд",
+       "mypreferences": "Көгмүд",
+       "prefs-edits": "ЯÑ\81вÑ\80ин то:",
+       "prefs-skin": "Ð\91Ó\99Ó\99дл",
        "skin-preview": "Хәләвр",
-       "datedefault": "Келхлә уга",
-       "prefs-personal": "Демнчна көгүд",
-       "prefs-rc": "ШидÑ\80Ó\99 Ñ\81олÑ\8cлһн",
-       "prefs-watchlist": "ШинÒ\97ллһнÓ\99 Ñ\81еÑ\82күл",
+       "datedefault": "Көг уга",
+       "prefs-personal": "Демнәчна то-диг",
+       "prefs-rc": "Ð\9eÑ\82Ñ\85н Ñ\8fÑ\81вÑ\80",
+       "prefs-watchlist": "Ð\9eвÑ\80Ñ\85ин Ñ\81едкүл",
        "prefs-watchlist-days": "Шинҗллһнә седкүлд үзүлсн ик гисн өдрин то:",
-       "prefs-watchlist-days-max": "Maximum $1 {{PLURAL:$1|1=day|days}}",
-       "prefs-misc": "Талдан",
-       "prefs-resetpass": "Нууц угиг сольҗ",
-       "prefs-email": "E-mail'ын көгүд",
+       "prefs-watchlist-days-max": "$1 {{PLURAL:$1|өдрәс|өдрәс}} удан биш",
+       "prefs-misc": "Ð\91Ñ\83Ñ\81",
+       "prefs-resetpass": "Нууц үг сольх",
+       "prefs-email": "E-mail'ин көгмүд",
        "prefs-rendering": "Һазад бәәдл",
        "saveprefs": "Хадһлх",
-       "restoreprefs": "ЦÑ\83г Ñ\8dклÑ\86ин ÐºÓ©Ð³Ò¯Ð´Ð¸Ð³ Ð±Ð¾Ñ\81Ñ\85Ò\97 Ñ\82оÑ\85Ñ\80аÑ\80",
-       "prefs-editing": "Чикллһн",
+       "restoreprefs": "Хамг Ñ\82ааÑ\80Ñ\81н ÐºÓ©Ð³ Ð±Ð¾Ñ\81Ñ\85Ñ\85 (Ñ\86Ñ\83г Ñ\81алвÑ\80)",
+       "prefs-editing": "ЯÑ\81вÑ\80",
        "rows": "Мөрд:",
        "columns": "Бахд:",
        "savedprefs": "Тана көгүдиг хадһлв.",
-       "timezonelegend": "ЧаÑ\81ин бүс:",
-       "localtime": "Бәәрн һазра цаг:",
-       "timezoneuseserverdefault": "Серверинь олзлх",
-       "timezoneuseoffset": "Талдан (көндллһн заатн)",
+       "timezonelegend": "Цагин бүс:",
+       "localtime": "Бәәрн цаг:",
+       "timezoneuseserverdefault": "Серверин көг керглх",
+       "timezoneuseoffset": "Ð\91Ñ\83Ñ\81 (көндллһн заатн)",
        "servertime": "Серверин цаг:",
-       "guesstimezone": "Хәләлгчәс авх",
-       "timezoneregion-africa": "Априк",
+       "guesstimezone": "Харагчасавх",
+       "timezoneregion-africa": "Африк",
        "timezoneregion-america": "Америк",
        "timezoneregion-antarctica": "Антарктик",
        "timezoneregion-arctic": "Арктик",
        "timezoneregion-atlantic": "Атлантин дала",
        "timezoneregion-australia": "Австрал",
        "timezoneregion-europe": "Европ",
-       "timezoneregion-indian": "ЭнеÑ\82екгин дала",
+       "timezoneregion-indian": "Эндкг дала",
        "timezoneregion-pacific": "Номһн дала",
        "allowemail": "Талдан демнчнрәс ирсн e-mail бичг зөвшәрх",
-       "prefs-searchoptions": "Ð¥Ó\99Ó\99лһнÓ\99 ÐºÓ©Ð³",
+       "prefs-searchoptions": "Ð¥Ó\99Ó\99вÑ\80",
        "prefs-namespaces": "Нернә ус",
        "prefs-custom-css": "Онц CSS",
        "prefs-custom-js": "Онц JS",
-       "prefs-emailconfirm-label": "E-mail Ð±Ð°Ñ\82лһн:",
+       "prefs-emailconfirm-label": "E-mail Ð»Ð°Ð²Ð»Ð»Ñ\82:",
        "youremail": "E-mail хайг:",
-       "username": "Демнчна нер:",
-       "prefs-memberingroups": "{{PLURAL:$1|1=Багин|Багдудин}} хүв:",
+       "username": "Демнәчнә нерн:",
+       "prefs-memberingroups": "{{PLURAL:$1|Багин|Багмудын}} гешүн:",
        "prefs-registration": "Темдглҗ  бүртклһнә цаг:",
        "yourrealname": "Үнн нерн:",
        "yourlanguage": "Бәәдлин келн:",
        "yournick": "Тәвсн һар:",
        "prefs-help-signature": "Меткән халхна бичсн бичгт «<nowiki>~~~~</nowiki>» немәд һаран тәвх кергтә. Тер үзгүд тана тәвсн һарт болн цагин бичлгт болулх.",
-       "yourgender": "Ð\9aииÑ\81н:",
-       "gender-unknown": "Бичсн уга",
-       "gender-male": "Эр",
-       "gender-female": "Эм",
+       "yourgender": "ЯмÑ\80 Ð±Ð¸Ñ\87лһн Ð´ÐµÐµÑ\80Ñ\88Ó\99нÓ\99Ñ\82?",
+       "gender-unknown": "Би эс заахар деершәнәв",
+       "gender-male": "Эн вики халхс ясна (эр)",
+       "gender-female": "Эн Ð²Ð¸ÐºÐ¸ Ñ\85алÑ\85Ñ\81 Ñ\8fÑ\81на (Ñ\8dм)",
        "prefs-help-gender": "Эн дәкәд бәәдг: чик күндллһн тоолвртар төлә. Эн өггцн цуг әмтнә болх.",
        "email": "E-mail хайг",
        "prefs-help-realname": "Үнн нернь та эврә дурар бичнәт. Бичлхлә, эн тәвсн һарт элзлдг бәәх.",
        "prefs-help-email": "E-mail хайг та эврә дурар бичнәт. Бичхлә, тадн шин түлкүр үгиг бичгәр йовулсн өгҗ чаднат (мартхла).",
        "prefs-info": "Һол медә",
        "prefs-i18n": "Олн орни бәәлһн",
-       "prefs-signature": "Тәвсн һаран",
-       "prefs-advancedediting": "Ð\94Ó\99кÓ\99д ÐºÓ©Ð³Ò¯Ð´",
-       "prefs-advancedrc": "Ð\94Ó\99кÓ\99д ÐºÓ©Ð³Ò¯Ð´",
-       "prefs-advancedrendering": "Ð\94Ó\99кÓ\99д ÐºÓ©Ð³Ò¯Ð´",
-       "prefs-advancedsearchoptions": "Ð\94Ó\99кÓ\99д ÐºÓ©Ð³Ò¯Ð´",
-       "prefs-advancedwatchlist": "Ð\94Ó\99кÓ\99д ÐºÓ©Ð³Ò¯Ð´",
+       "prefs-signature": "Тәвсн һар",
+       "prefs-advancedediting": "Ð\99иÑ\80ңкÓ\99 ÐºÓ©Ð³",
+       "prefs-advancedrc": "Ð\9dÓ\99Ñ\80н ÐºÓ©Ð³",
+       "prefs-advancedrendering": "Ð\9dÓ\99Ñ\80н ÐºÓ©Ð³",
+       "prefs-advancedsearchoptions": "Ð\9dÓ\99Ñ\80н ÐºÓ©Ð³",
+       "prefs-advancedwatchlist": "Ð\9dÓ\99Ñ\80н ÐºÓ©Ð³",
        "prefs-diffs": "Йилһәс",
        "userrights-reason": "Учр:",
        "group": "Баг:",
-       "group-user": "Демнчнр",
+       "group-user": "Демнәчнр",
        "group-autoconfirmed": "Эврә батлсн демнчнр",
        "group-bot": "Көдлврүд",
        "group-sysop": "Закрачуд",
        "group-bureaucrat": "Нойнчуд",
        "group-all": "(цуг)",
-       "group-user-member": "Ð\94емнч",
-       "group-autoconfirmed-member": "Эврә батлсн демнчнр",
-       "group-bot-member": "Ð\9aөдлвÑ\80",
-       "group-sysop-member": "Ð\97акрач",
-       "group-bureaucrat-member": "Ð\9dойнч",
+       "group-user-member": "демнÓ\99ч",
+       "group-autoconfirmed-member": "эврә лавлсн демнәч",
+       "group-bot-member": "көдлгÑ\87",
+       "group-sysop-member": "закрач",
+       "group-bureaucrat-member": "нойнч",
        "grouppage-user": "{{ns:project}}:Демнч",
-       "grouppage-autoconfirmed": "{{ns:project}}:ЭвÑ\80Ó\99 Ð±Ð°Ñ\82лсн демнчнр",
-       "grouppage-bot": "{{ns:project}}:Ð\9aөдлвÑ\80үд",
+       "grouppage-autoconfirmed": "{{ns:project}}:ЭвÑ\80Ó\99 Ð»Ð°Ð²лсн демнчнр",
+       "grouppage-bot": "{{ns:project}}:Ð\9aөдлгÑ\87үд",
        "grouppage-sysop": "{{ns:project}}:Закрачуд",
        "grouppage-bureaucrat": "{{ns:project}}:Нойнчуд",
-       "newuserlogpage": "Бичгдлһнә сеткүл",
-       "rightslog": "Демнчна зөвәнә сеткүл",
-       "action-edit": "эн халхиг чиклх",
-       "nchanges": "$1 {{PLURAL:$1|1=сольлһн|сольлһн}}",
-       "recentchanges": "ШидÑ\80Ó\99 Ñ\81олÑ\8cлһн",
-       "recentchanges-legend": "ШидÑ\80Ó\99 Ñ\81олÑ\8cлһна ÐºÓ©Ð³Ò¯Ð´",
-       "recentchanges-summary": "Эн цагин дараһар бичсн шидрә сольлһн",
-       "recentchanges-feed-description": "Эн Ð·Ó\99ңгллһд Ñ\88идÑ\80Ó\99 Ñ\85үвÑ\80һд Ñ\88инÒ\97лх.",
-       "recentchanges-label-newpage": "ТеÑ\80 Ò¯Ò¯Ð»Ó\99р шин халх бүтәв",
-       "recentchanges-label-minor": "Эн Ð±Ð°Ò» Ñ\87инÑ\80Ñ\82Ó\99 Ñ\81олÑ\8cлһн",
-       "recentchanges-label-bot": "Эн Ñ\81олÑ\8cлһн ÐºÓ©Ð´Ð»Ð²Ñ\80 (Ñ\80обоÑ\82) ÐºÐµÑ\85в",
-       "recentchanges-legend-newpage": "$1 — шин халх",
-       "rclistfrom": "ТеÑ\80 Ñ\86агаÑ\81 Ð°Ð²Ð½ Ñ\81олÑ\8cлһн үзүлх: $3 $2.",
-       "rcshowhideminor": "баһ Ñ\87икллһиг $1",
-       "rcshowhidebots": "көдлвÑ\80үдиг $1",
-       "rcshowhideliu": "демнчнриг $1",
-       "rcshowhideanons": "нер уга демнчнриг $1",
-       "rcshowhidemine": "мини Ñ\87икллһиг $1",
-       "rclinks": "Ð\9aенз $1 Ñ\81олÑ\8cлһн, ÐºÐµÐ½Ð· $2 өдрмүдт үзүлх<br />$3",
+       "newuserlogpage": "Бичгдлһнә седкүл",
+       "rightslog": "Демнәчна зөвин седкүл",
+       "action-edit": "эн халх ясх",
+       "nchanges": "$1 ясвр",
+       "recentchanges": "Ð\9eÑ\82Ñ\85н Ñ\8fÑ\81вÑ\80",
+       "recentchanges-legend": "Ð\9eÑ\82Ñ\85н Ñ\8fÑ\81вÑ\80ин ÐºÓ©Ð³",
+       "recentchanges-summary": "Энд цагин дараһар бичсн отхн ясвр.",
+       "recentchanges-feed-description": "Эн ÐºÒ¯Ñ\81мд Ð²Ð¸ÐºÐ¸Ð½ Ð¾Ñ\82Ñ\85н Ñ\8fÑ\81вÑ\80 Ð¾Ð²Ñ\80х.",
+       "recentchanges-label-newpage": "Эн Ñ\8fÑ\81вÑ\80ар шин халх бүтәв",
+       "recentchanges-label-minor": "Эн Ð±Ð°Ò» Ñ\87инÑ\80Ñ\82Ó\99 Ñ\8fÑ\81вÑ\80",
+       "recentchanges-label-bot": "Эн Ñ\8fÑ\81вÑ\80 ÐºÓ©Ð´Ð»Ð³Ñ\87 (боÑ\82) ÐºÐµв",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|list of new pages]] чигн хәләтн)",
+       "rclistfrom": "Эн Ñ\86агаÑ\81 Ð°Ð²Ð½ Ñ\8fÑ\81вÑ\80 үзүлх: $3 $2.",
+       "rcshowhideminor": "баһ Ñ\8fÑ\81вÑ\80 $1",
+       "rcshowhidebots": "көдлгÑ\87үд $1",
+       "rcshowhideliu": "$1 бүрткгдсн демнәч",
+       "rcshowhideanons": "нерго демнәчнр $1",
+       "rcshowhidemine": "мини Ñ\8fÑ\81вÑ\80 $1",
+       "rclinks": "Ð\9eÑ\82Ñ\85н $1 Ñ\8fÑ\81вÑ\80, Ñ\81үл $2 өдрмүдт үзүлх<br />$3",
        "diff": "йилһ",
        "hist": "тууҗ",
-       "hide": "бÑ\83лÑ\82Ñ\83лх",
-       "show": "Ò¯зүлх",
+       "hide": "Ð\9dÑ\83Ñ\83х",
+       "show": "Ò®зүлх",
        "minoreditletter": "б",
        "newpageletter": "Ш",
        "boteditletter": "к",
-       "newsectionsummary": "/* $1 */ Ð¨Ð¸Ð½ Ñ\85үв",
-       "rc-enhanced-expand": "ТодÑ\80Ñ\85аÑ\81иг Ò¯Ð·Ò¯Ð»Ñ\85 (JavaScript ÐºÐµÑ\80гÑ\82Ó\99)",
-       "rc-enhanced-hide": "Тодрхасиг бултулх",
-       "recentchangeslinked": "Садн Ñ\87икллһн",
-       "recentchangeslinked-feed": "Садта чикллһн",
-       "recentchangeslinked-toolbox": "Садта чикллһн",
-       "recentchangeslinked-title": "$1 садта сольлһн",
+       "newsectionsummary": "/* $1 */ Ð¨Ð¸Ð½ Ñ\81алвÑ\80",
+       "rc-enhanced-expand": "Ð\9dÓ\99Ñ\80н Ñ\83Ñ\87Ñ\80 Ò¯Ð·Ò¯Ð»Ñ\85",
+       "rc-enhanced-hide": "Тодрха нуух",
+       "recentchangeslinked": "Садн Ñ\8fÑ\81вÑ\80",
+       "recentchangeslinked-feed": "Садн ясвр",
+       "recentchangeslinked-toolbox": "Садн ясвр",
+       "recentchangeslinked-title": "$1 садн ясвр",
        "recentchangeslinked-summary": "Эн тер халх заалдг халхсин (аль тер янзин халхсин) шидрә сольлһн.\nТана [[Special:Watchlist|шинҗллһнә сеткүлин]] халхс '''тарһн''' бичәтә.",
-       "recentchangeslinked-page": "ХалÑ\85на Ð½ÐµÑ\80нÑ\8c:",
-       "recentchangeslinked-to": "Зөрүһәр, эн халхд заалдг халхсин хүврлһиг үзүлх",
-       "upload": "Боомгиг тәвх",
-       "uploadbtn": "Боомгиг тәвх",
-       "uploadnologintext": "Та [[Special:UserLogin|Ñ\85аÑ\80Ò»Ñ\85]] кергтә.",
+       "recentchangeslinked-page": "ХалÑ\85ин Ð½ÐµÑ\80н:",
+       "recentchangeslinked-to": "Зөрүһәр, эн халхт заалдг халхсин ясвр үзүлх",
+       "upload": "Боомг тәвх",
+       "uploadbtn": "Боомг тәвх",
+       "uploadnologintext": "Ð\91оомг Ð¾Ñ\80Ñ\83лÑ\85аÑ\80 $1 кергтә.",
        "uploaderror": "Тәвллһнә эндү",
        "uploadlogpage": "Тәвллһнә сеткүл",
-       "filename": "Ð\91оомгна нернь",
+       "filename": "Ð\91оомгин нернь",
        "filedesc": "Учр-утх",
        "fileuploadsummary": "Учр-утх:",
        "savefile": "Хадһлх",
        "filehist-datetime": "Өдр/цаг",
        "filehist-thumb": "Зураллһн",
        "filehist-thumbtext": "$1 янзин зураллһн",
-       "filehist-user": "Демнч",
+       "filehist-user": "Демнәч",
        "filehist-dimensions": "Юмна кир",
        "filehist-comment": "Аҗгллһн",
-       "imagelinks": "Боомгд заалһуд",
-       "linkstoimage": "{{PLURAL:$1|Эн $1 халх|Эн $1 халхс|Эн $1 халхс}} тер боомгд заалдг бәәнә:",
+       "imagelinks": "Боомг керглән",
+       "linkstoimage": "Эн $1 халх эн боомгур заана:",
        "sharedupload": "Эн боомг $1 ормас. Териг талдан төсвд олзлҗ болх.",
        "uploadnewversion-linktext": "Тер боомгин шин һарц тәвх",
        "randompage": "Уршг зүүл",
        "statistics-edits-average": "Халхарн сольлһна то",
        "statistics-users": "Бичгдлһтә [[Special:ListUsers|демнчнр]]",
        "statistics-users-active": "Үүлтә демнчнр",
-       "statistics-users-active-desc": "{{PLURAL:$1|$1 өдрт|$1 өдрмүдт|$1 өдрмүдт}} болв чигн үүл кесн демнчнр",
-       "brokenredirects-edit": "Ñ\87иклх",
+       "statistics-users-active-desc": "Сүл $1 өдрт үүлдвр кесн демнчәнр",
+       "brokenredirects-edit": "Ñ\8fÑ\81х",
        "brokenredirects-delete": "һарһх",
-       "nbytes": "$1 {{PLURAL:$1|байд|байдуд|байдуд}}",
-       "nmembers": "$1 {{PLURAL:$1|мөч|мөчин|мөчүд}}",
+       "nbytes": "$1 байт",
+       "nmembers": "$1 гешүн",
        "prefixindex": "Цуг халхс эн эклцтә",
        "newpages": "Шин халхс",
        "move": "Көндәх",
        "movethispage": "Эн халхд шин нер аль шин орм өгх",
-       "pager-newer-n": "{{PLURAL:$1|1=шинәр 1|шинәр $1}}",
-       "pager-older-n": "{{PLURAL:$1|1=көгшәр 1|көгшәр $1}}",
+       "pager-newer-n": "$1 нань шин",
+       "pager-older-n": "$1 нань хуучн",
        "booksources": "Дегтрин делгүрс",
        "booksources-search-legend": "Дегтр туск хәәх",
        "log": "Сеткүлс",
        "allpagesto": "Энд асрлһиг зогсх:",
        "allarticles": "Цуг халхс",
        "allpagessubmit": "Орх",
-       "linksearch": "Һаза заалһуд",
+       "linksearch": "Һазад заалһ хәәвр",
        "listgrouprights-members": "(мөчүдин сеткүл)",
        "emailuser": "Энд E-mail йовулх",
-       "watchlist": "ШинÒ\97ллһнÓ\99 Ñ\81еÑ\82күл",
-       "mywatchlist": "ШинÒ\97ллһнÓ\99 Ñ\81еÑ\82күл",
-       "addedwatchtext": "«[[:$1]]» гидг нерәдлһтә халх тана [[Special:Watchlist|шинҗллһнә сеткүлд]] немв.\nТегәд тер халхна болн терүнә ухалврин сольлһн энд шиҗлсн болх. Эн халх '''тарһн'' үзгәр [[Special:RecentChanges|шидрә сольлһна]] халхд бичсн (амр умшхар) болх.",
+       "watchlist": "Ð\9eвÑ\80Ñ\85ин Ñ\81едкүл",
+       "mywatchlist": "Ð\9eвÑ\80Ñ\85ин Ñ\81едкүл",
+       "addedwatchtext": "«[[:$1]]» халх тана [[Special:Watchlist|оврхин седкүлд]] немв.\nЭн халхин болн үүнә меткән халхин ирх сольлһн энд бүрктх.",
        "removedwatchtext": "«[[:$1]]» халх тана [[Special:Watchlist|шинҗллһнә сеткүләс]] һарһв.",
        "watch": "Шинҗлх",
        "watchthispage": "Эн халхиг шинҗлх",
        "unwatch": "Шинҗлх биш",
-       "watchlist-details": "$1 {{PLURAL:$1|халх|халхс|халхс}} ухалвр угаһар тана шиҗллһнә сеткүлд.",
-       "wlshowlast": "Ð\9aенз $1 Ñ\87аÑ\81д $2 Ó©Ð´Ñ\80Ñ\82  үзүлх",
+       "watchlist-details": "Тана оврхин седкүлд меткәнә халхас бус $1 халх.",
+       "wlshowlast": "Сүл $1 Ñ\86агин $2 Ó©Ð´Ñ\80ин Ñ\82Ñ\83Ñ\80Ñ\88к үзүлх",
        "watchlist-options": "Шинҗллһнә сеткүлин көгүд",
        "watching": "Шинҗллһнә бүтлклд немлһн...",
        "unwatching": "Шинҗлһнә бүрткләс һарһлһн...",
        "deletecomment": "Учр:",
        "deleteotherreason": "Талдан аль дәкәд учр:",
        "deletereasonotherlist": "Талдан учр",
-       "rollback_short": "Хәрүллһн",
        "rollbacklink": "хәрүлх",
        "protectlogpage": "Харсллһна сеткүл",
        "protectedarticle": "«[[$1]]» халхиг харсв",
        "protect-default": "Цуг демнчнрд зөвән өгҗ",
        "protect-fallback": "$1 зөв кергтә",
        "protect-level-autoconfirmed": "Шин болн нер уга демнчнрас харсх",
-       "protect-level-sysop": "Дарһас һанцхн",
+       "protect-level-sysop": "Һанц закрачт зөвшәл",
        "protect-summary-cascade": "каскад",
        "protect-expiring": "$1 (UTC) гидг цагт өңгрнә",
        "protect-cascade": "Халхсиг эн халхд дотр харсх (каскад)",
        "namespace": "Нернә у:",
        "invert": "Зөрү суңһлт",
        "blanknamespace": "(Һол)",
-       "contributions": "Демнчна өгүллһн",
+       "contributions": "Демнәчнә тәвц",
        "contributions-title": "$1 демнчна тус",
-       "mycontris": "Ð\9cини Ð´ÐµÐ¼Ð½Ð»Ò»Ð½",
-       "contribsub2": "$1 төлә ($2)",
+       "mycontris": "ТÓ\99вÑ\86",
+       "contribsub2": "{{GENDER:$3|$1}} тәвц ($2)",
        "uctop": "(отхн)",
        "month": "Эн сарас (болн эртәр):",
        "year": "Эн җиләс (болн эртәр):",
index b8f9930..5ff81b7 100644 (file)
        "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> or <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "'''אזהרה:''' דער בלאט אנטהאלט צופיל טייערע פארזירער רופן.\n\nער דארף האבן ווינציגער פון  $2 {{PLURAL:$2|רוף|רופן}}, אבער אצינד {{PLURAL:$1|איז דא $1 רוף|זענען דא $1 רופן}}.",
        "expensive-parserfunction-category": "בלעטער מיט צופֿיל טייערע פאַרזער פֿונקציאן רופֿן",
        "post-expand-template-inclusion-warning": "'''אכטונג:''' איינגעשלאסענע מוסטערן אין דעם בלאט זענען צו גרויס.\nטייל מוסטערן וועלן נישט ווערן איינגעשלאסן.",
        "prefs-personal": "באַניצער פראָפֿיל",
        "prefs-rc": "לעצטע ענדערונגען",
        "prefs-watchlist": "אויפפאסונג ליסטע",
+       "prefs-editwatchlist": "רעדאַקטירן די אויפֿפאַסונג ליסטע",
+       "prefs-editwatchlist-label": "רעדאקטירן ארטיקלען אויף אײַער אויפפאסונג־ליסטע:",
+       "prefs-editwatchlist-raw": "רעדאַקטירן די רויע אויפֿפאַסונג ליסטע",
+       "prefs-editwatchlist-clear": "ליידיגן אייער אויפפאסונג ליסטע",
        "prefs-watchlist-days": "טעג צו ווייזן אין דער אויפפאסונג ליסטע:",
        "prefs-watchlist-days-max": "העכסטן $1 {{PLURAL:$1|טאג|טעג}}",
        "prefs-watchlist-edits": "מאַקסימום נומער פון נײַע ענדערונגען צו ווייַזן אין פֿאַרברייטערטער אויפֿפאַסונג ליסטע:",
        "action-viewmywatchlist": "באקוקן אײַער אויפֿפאסונג ליסטע",
        "action-viewmyprivateinfo": "באקוקן אײַער פריוואטע אינפארמאציע",
        "action-editmyprivateinfo": "רעדאקטירן אײַער פריוואטע אינפארמאציע",
+       "action-managechangetags": "שאפן און אויסמעקן טאגן פון דער דאטנבאזע",
        "nchanges": "{{PLURAL:$1|ענדערונג|$1 ענדערונגען}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|זײַט לעצטן וויזיט}}",
        "enhancedrc-history": "היסטאריע",
        "undelete-show-file-submit": "יא",
        "namespace": "נאמענטייל:",
        "invert": "ווײַז אַלע אויסער די",
+       "tooltip-whatlinkshere-invert": "מארקירט דאס קעסטל צו באהאלטן לינקען פון בלעטער אינעם אויסגעקליבענעם נאמענטייל.",
        "namespace_association": "אָנגעבונדענער נאָמענטייל",
        "tooltip-namespace_association": "צייכנט דאס קעסטל כדי איינשליסן דעם שמועס אדער סוביעקט נאמענטייל וואס געהערט צום אויסגעקליבענעם נאמענטייל",
        "blanknamespace": "(הויפט)",
        "ipbexpiry": "אויסגיין:",
        "ipbreason": "אורזאַך:",
        "ipbreason-dropdown": "* פֿארשפרייטע בלאקירן סיבות\n** ארײַנלייגן פֿאלשע אינפֿארמאציע\n** אויסמעקן אינהאַלט פֿון בלעטער\n** פֿארפֿלייצן לינקען צו דרויסנדיקע ערטער\n** ארײַנלייגן שטותים/טאָטעריש אין בלעטער\n** סטראשעט און שטערט\n** קרומבאניצן מערערע קאנטעס\n** באַניצער נאָמען פראבלעמאַטיש",
+       "ipb-hardblock": "פארמיידן אריינלאגירטע באניצער פון רעדאקטירן פון דעם IP־אדרעס",
        "ipbcreateaccount": "פֿאַרמײַדן שאַפֿן קאנטעס",
        "ipbemailban": "פֿארמײַדן באַניצער פון שיקן ע־פאסט",
        "ipbenableautoblock": "אויטאמאַטיש בלאקירן דעם לעצטן IP אַדרעס פֿ\nפֿון דעם באַניצער, און אַבי וועלכן IP אַדרעס ער פרובירט צו ניצן",
        "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 פעלט",
        "javascripttest": "JavaScript טעסט",
        "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.",
index a30ca90..9b1f21e 100644 (file)
        "tog-hideminor": "隐藏最近更改中的小编辑",
        "tog-hidepatrolled": "隐藏最近更改中的已巡查编辑",
        "tog-newpageshidepatrolled": "隐藏新页面列表中的已巡查页面",
-       "tog-extendwatchlist": "扩展监视列表以显示所有更改,而不仅限于最近更改",
+       "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-watchcreations": "添加我创建的页面和我上传的文件至我的监视列表",
+       "tog-watchdefault": "添加我编辑的页面和文件至我的监视列表",
+       "tog-watchmoves": "添加我移动的页面和文件至我的监视列表",
+       "tog-watchdeletion": "添加我删除的页面和文件至我的监视列表",
+       "tog-watchrollback": "添加我执行过回退的页面至我的监视列表",
+       "tog-minordefault": "默认标记所有编辑为小编辑",
        "tog-previewontop": "在编辑框上方显示预览",
        "tog-previewonfirst": "首次编辑时显示预览",
        "tog-enotifwatchlistpages": "当我的监视列表中的页面或文件更改时发送电子邮件通知我",
        "category_header": "分类“$1”中的页面",
        "subcategories": "子分类",
        "category-media-header": "分类“$1”中的媒体文件",
-       "category-empty": "<em>本分类目前没有包含任何页面或媒体文件。</em>",
+       "category-empty": "<em>本分类目前不含有任何页面或媒体文件。</em>",
        "hidden-categories": "{{PLURAL:$1|隐藏分类}}",
        "hidden-category-category": "隐藏分类",
        "category-subcat-count": "{{PLURAL:$2|本分类只有以下子分类。|本分类有以下$1个子分类,共有$2个子分类。}}",
        "category-subcat-count-limited": "本分类有以下{{PLURAL:$1|子分类|$1个子分类}}。",
-       "category-article-count": "{{PLURAL:$2|æ\9c¬å\88\86ç±»å\8fªå\8c\85å\90«ä»¥ä¸\8b页é\9d¢ã\80\82\9c¬å\88\86类中å\8c\85å\90«ä»¥ä¸\8b$1个页é\9d¢,共$2个页面。}}",
-       "category-article-count-limited": "当前分类包含以下$1个页面。",
-       "category-file-count": "{{PLURAL:$2|æ\9c¬å\88\86ç±»å\8fªå\8c\85å\90«ä»¥ä¸\8bä¸\80个æ\96\87件ã\80\82\9c¬å\88\86ç±»å\8c\85å\90«ä»¥ä¸\8b$1个æ\96\87件,共$2个文件。}}",
-       "category-file-count-limited": "当前分类包含以下$1个文件。",
+       "category-article-count": "{{PLURAL:$2|æ\9c¬å\88\86ç±»å\8fªå\90«æ\9c\89以ä¸\8b页é\9d¢ã\80\82|以ä¸\8b{{PLURAL:$1|页é\9d¢|$1个页é\9d¢}}å±\9eäº\8eæ\9c¬å\88\86ç±»,共$2个页面。}}",
+       "category-article-count-limited": "以下{{PLURAL:$1|页面|$1个页面}}属于当前分类。",
+       "category-file-count": "{{PLURAL:$2|æ\9c¬å\88\86ç±»å\8fªå\90«æ\9c\89以ä¸\8bæ\96\87件ã\80\82|以ä¸\8b{{PLURAL:$1|æ\96\87件|$1个æ\96\87件}}å±\9eäº\8eæ\9c¬å\88\86ç±»,共$2个文件。}}",
+       "category-file-count-limited": "以下{{PLURAL:$1|文件|$1个文件}}属于当前分类。",
        "listingcontinuesabbrev": "续",
        "index-category": "已索引页面",
        "noindex-category": "不可索引页面",
        "namespaces": "命名空间",
        "variants": "变种",
        "navigation-heading": "导航菜单",
-       "errorpagetitle": "错误",
+       "errorpagetitle": "出错",
        "returnto": "返回至$1。",
        "tagline": "来自{{SITENAME}}",
        "help": "帮助",
        "searcharticle": "前往",
        "history": "页面历史",
        "history_short": "历史",
-       "updatedmarker": "已于我上次访问之后更新",
+       "updatedmarker": "更新于我上次访问后",
        "printableversion": "打印版本",
        "permalink": "固定链接",
        "print": "打印",
        "deletethispage": "删除本页",
        "undeletethispage": "还原本页",
        "undelete_short": "还原$1次编辑",
-       "viewdeleted_short": "查看$1个已删除的编辑",
+       "viewdeleted_short": "查看{{PLURAL:$1|$1个被删除的编辑}}",
        "protect": "保护",
        "protect_change": "更改",
        "protectthispage": "保护本页",
        "userpage": "查看用户页面",
        "projectpage": "查看项目页面",
        "imagepage": "查看文件页面",
-       "mediawikipage": "查看息页面",
+       "mediawikipage": "查看息页面",
        "templatepage": "查看模板页面",
        "viewhelppage": "查看帮助页面",
        "categorypage": "查看分类页面",
        "mainpage": "首页",
        "mainpage-description": "首页",
        "policy-url": "Project:方针",
-       "portal": "社区门户",
+       "portal": "社区主页",
        "portal-url": "Project:社区门户",
        "privacy": "隐私政策",
-       "privacypage": "Project:é\9a\90ç§\81æ\9d\83æ\94¿ç­\96",
+       "privacypage": "Project:隐私政策",
        "badaccess": "权限错误",
        "badaccess-group0": "不允许您执行您所请求的操作。",
        "badaccess-groups": "您所请求的操作仅限于{{PLURAL:$2|该|这些}}用户组的用户使用:$1",
        "nstab-special": "特殊页面",
        "nstab-project": "项目页面",
        "nstab-image": "文件",
-       "nstab-mediawiki": "息",
+       "nstab-mediawiki": "息",
        "nstab-template": "模板",
        "nstab-help": "帮助页面",
        "nstab-category": "分类",
        "nosuchaction": "无此操作",
-       "nosuchactiontext": "URLæ\89\80æ\8c\87å®\9aç\9a\84æ\93\8dä½\9cæ\97 æ\95\88ã\80\82ä½ æ\89\80è¾\93å\85¥ç\9a\84URLå\9c°å\9d\80å\8f¯è\83½æ\9c\89误ï¼\8cæ\88\96æ\98¯ä½¿ç\94¨äº\86é\94\99误ç\9a\84é\93¾æ\8e¥ã\80\82è¿\99ä¹\9få\8f¯è\83½è¡¨ç¤º{{SITENAME}}æ\89\80使ç\94¨è½¯ä»¶ä¹\8b中存在漏洞。",
+       "nosuchactiontext": "URLæ\8c\87å®\9aç\9a\84æ\93\8dä½\9cæ\97 æ\95\88ã\80\82æ\82¨å\8f¯è\83½è¾\93å\85¥äº\86é\94\99误ç\9a\84URLå\9c°å\9d\80ï¼\8cæ\88\96æ\98¯ç\82¹å\87»äº\86é\94\99误ç\9a\84é\93¾æ\8e¥ã\80\82è¿\99ä¹\9få\8f¯è\83½è¡¨æ\98\8e{{SITENAME}}使ç\94¨ç\9a\84软件存在漏洞。",
        "nosuchspecialpage": "此特殊页面不存在",
-       "nospecialpagetext": "<strong>您请求了一个无效的特殊页面。</strong>\n\n在[[Special:SpecialPages|{{int:specialpages}}]]可以找到有效的特殊页面的列表。",
-       "error": "错误",
+       "nospecialpagetext": "<strong>您请求了一个无效的特殊页面。</strong>\n\n有效的特殊页面的列表可以在[[Special:SpecialPages|{{int:specialpages}}]]找到。",
+       "error": "出错",
        "databaseerror": "数据库错误",
        "databaseerror-text": "出现数据库查询错误。这可能表示软件中存在漏洞。",
        "databaseerror-textcl": "出现数据库查询错误。",
        "databaseerror-function": "函数:$1",
        "databaseerror-error": "错误:$1",
        "laggedslavemode": "'''警告:'''页面中可能没有包含最近的更新。",
-       "readonly": "数据库锁定",
-       "enterlockreason": "请输入锁定原因,包括预计解锁的时间",
-       "readonlytext": "数据库当前被锁定,不能添加新条目或进行其他修改,锁定可能是因为例行的数据库维护,完成后即可恢复正常。\n\n锁定数据库的管理员提供的解释:$1",
+       "readonly": "数据库锁定",
+       "enterlockreason": "请输入锁定的原因,这包括预计解除锁定的时间",
+       "readonlytext": "数据库当前被锁定,不能添加新条目或进行其他修改,锁定可能是因为例行的数据库维护,完成后即可恢复正常。\n\n锁定数据库的管理员提供的解释:$1",
        "missing-article": "数据库找不到预期的页面文字:“$1”$2。\n\n这通常是由于点击了链向旧有差异或历史的链接,而原有版本已被删除导致的。\n\n如果情况不是这样,您可能找到了软件的一个内部错误。请记录下URL地址,并向[[Special:ListUsers/sysop|管理员]]报告。",
        "missingarticle-rev": "(版本#:$1)",
        "missingarticle-diff": "(差异:$1,$2)",
        "nosuchusershort": "没有名为“$1”的用户。请检查你的拼写。",
        "nouserspecified": "你必须指定用户名。",
        "login-userblocked": "该用户已被封禁,禁止登录。",
-       "wrongpassword": "输入的密码错误。请重试。",
+       "wrongpassword": "输入的密码错误。请重试。",
        "wrongpasswordempty": "密码输入为空。请重试。",
        "passwordtooshort": "您的密码至少需要$1个字符。",
        "password-name-match": "您的密码必须和您的用户名不相同。",
        "italic_tip": "斜体文字",
        "link_sample": "链接文字",
        "link_tip": "内部链接",
-       "extlink_sample": "http://www.example.com é\93¾æ\8e¥æ\96\87å­\97",
+       "extlink_sample": "http://www.example.com é\93¾æ\8e¥æ \87é¢\98",
        "extlink_tip": "外部链接(加前缀 http://)",
        "headline_sample": "大标题文字",
        "headline_tip": "2级标题",
        "editingcomment": "编辑“$1”(新段落)",
        "editconflict": "编辑冲突:$1",
        "explainconflict": "其他用户在你开始编辑后更改了该页面。上面的文字区含有该页面当前的文字。下面的文字区显示你的更改。你必须把你的更改合并至现有文字。'''只有'''当你单击“{{int:savearticle}}”后,上面的文字区中的文字才会被保存。",
-       "yourtext": "的文字",
+       "yourtext": "的文字",
        "storedversion": "已保存的版本",
        "nonunicodebrowser": "'''警告:您的浏览器不兼容Unicode编码。'''这里有一个工作区将使您能安全地编辑页面:非ASCII字符将以十六进制编码方式出现在编辑框中。",
        "editingold": "'''警告:你正在编辑的是本页面的旧版本。'''如果你保存该编辑,该版本后的所有更改都会丢失。",
        "copyrightwarning": "请注意您对{{SITENAME}}的所有贡献都被认为是在$2下发布,请查看在$1的细节。\n如果您不希望您的文字被任意修改和再散布,请不要提交。<br />\n您同时也要向我们保证您所提交的内容是您自己所作,或得自一个不受版权保护或相似自由的来源。\n'''不要在未获授权的情况下发表!'''<br />",
        "copyrightwarning2": "请注意,您对{{SITENAME}}的所有贡献都可能被其他贡献者编辑,修改或删除。如果您不希望您的文字被任意修改和再散布,请不要提交。<br />\n您同时也要向我们保证您所提交的内容是您自己所作,或得自一个不受版权保护或相似自由的来源(参阅$1的细节)。'''不要在未获授权的情况下发表!'''",
        "longpageerror": "'''错误:您所提交的文本长度有{{PLURAL:$1|1|$1}}KB,这大于{{PLURAL:$2|1|$2}}KB的最大值。'''\n因此,该文本无法保存。",
-       "readonlywarning": "警告:数据库被锁定以进行维护,所以您目前将无法保存您的修改。'''您或许希望将本段文字先剪贴并保存到文本文件,并在稍后进行修改。\n\n锁定数据库的管理员有如下解释:$1",
+       "readonlywarning": "<strong>警告:数据库被锁定以进行维护,所以您目前将无法保存您的编辑。</strong>您可能希望将您的文本复制粘贴到一个文本文档并保存它,以便稍后更改。\n\n锁定数据库的管理员有如下解释:$1",
        "protectedpagewarning": "'''警告:本页面已被保护,只有拥有管理员权限的用户可以编辑。'''下面提供最后的日志条目以供参考:",
        "semiprotectedpagewarning": "'''注意:'''本页面已被保护,只有注册用户可以编辑。下面提供最后的日志条目以供参考:",
        "cascadeprotectedwarning": "<strong>警告:</strong>本页面已经被保护,只有拥有管理员权限的用户可以编辑,因为它包含于以下启用连锁保护的{{PLURAL:$1|页面}}中:",
        "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次呼叫。",
-       "expensive-parserfunction-category": "页面中有太多耗费的语法功能呼叫",
+       "expensive-parserfunction-category": "有过多高开销解析器函数调用的页面",
        "post-expand-template-inclusion-warning": "'''警告:'''包含模板大小过大。\n一些模板将不会包含。",
        "post-expand-template-inclusion-category": "模板包含上限已经超过的页面",
        "post-expand-template-argument-warning": "<strong>警告:</strong>本页面包含至少一个模板参数有过大扩展大小。这些参数会被略过。",
        "prefs-personal": "用户资料",
        "prefs-rc": "最近更改",
        "prefs-watchlist": "监视列表",
+       "prefs-editwatchlist": "编辑监视列表",
+       "prefs-editwatchlist-label": "编辑您的监视列表中的记录:",
+       "prefs-editwatchlist-edit": "查看和移除您的监视列表中的标题",
+       "prefs-editwatchlist-raw": "编辑原始监视列表",
+       "prefs-editwatchlist-clear": "清空您的监视列表",
        "prefs-watchlist-days": "监视列表中显示的天数:",
        "prefs-watchlist-days-max": "最多$1天",
        "prefs-watchlist-edits": "在扩展监视列表中显示的更改的最大数目:",
        "right-override-export-depth": "导出页面,包括最多5层链接",
        "right-sendemail": "发送电子邮件给其他用户",
        "right-passwordreset": "查看密码重置电子邮件",
+       "right-managechangetags": "从数据库创建和删除[[Special:Tags|标签]]",
        "newuserlogpage": "用户创建日志",
        "newuserlogpagetext": "这是用户创建的日志。",
        "rightslog": "用户权限日志",
        "action-viewmyprivateinfo": "查看您的私人信息",
        "action-editmyprivateinfo": "编辑你的私人信息",
        "action-editcontentmodel": "编辑页面的内容模型",
+       "action-managechangetags": "创建和从数据库中删除标签",
        "nchanges": "$1次更改",
        "enhancedrc-since-last-visit": "{{PLURAL:$1|上次访问后}}$1个",
        "enhancedrc-history": "历史",
        "uploadstash-nofiles": "你没有被隐藏的文件。",
        "uploadstash-badtoken": "该操作执行失败,可能是因为你的编辑凭证已过期。请重试。",
        "uploadstash-errclear": "清除文件不成功。",
-       "uploadstash-refresh": "更新文件清单",
+       "uploadstash-refresh": "更新文件列表",
        "invalid-chunk-offset": "无效区块偏移量",
        "img-auth-accessdenied": "拒绝访问",
        "img-auth-nopathinfo": "PATH_INFO缺失。\n您的服务器尚未设置传送该信息。\n它可能基于CGI,因而不支持img_auth。\n请参见 [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization 图片授权]。",
        "namespace": "名字空间:",
        "invert": "反选",
        "tooltip-invert": "请选择该框以隐藏指定名字空间(及相关名字空间,若被选择)的页面更改",
+       "tooltip-whatlinkshere-invert": "勾选此框以隐藏来自选定名字空间内页面的链接。",
        "namespace_association": "关联的名字空间",
        "tooltip-namespace_association": "选中此复选框可包括与选定名字空间相关的讨论页或子页面",
        "blanknamespace": "(主)",
        "tags-tag": "标签名称",
        "tags-display-header": "更改列表中的表现形式",
        "tags-description-header": "完整含义说明",
+       "tags-source-header": "来源",
        "tags-active-header": "是否活跃?",
        "tags-hitcount-header": "标记的更改数",
+       "tags-actions-header": "操作",
        "tags-active-yes": "是",
        "tags-active-no": "否",
+       "tags-source-extension": "由一个扩展定义",
+       "tags-source-manual": "可被用户和机器人手动应用",
+       "tags-source-none": "不再被使用",
        "tags-edit": "编辑",
+       "tags-delete": "删除",
+       "tags-activate": "激活",
+       "tags-deactivate": "取消激活",
        "tags-hitcount": "$1个更改",
+       "tags-manage-no-permission": "您没有权限管理更改标签。",
+       "tags-create-heading": "创建一个新标签",
+       "tags-create-explanation": "默认情况下,新创建的标签将可供用户和机器人使用。",
+       "tags-create-tag-name": "标签名称:",
+       "tags-create-reason": "原因:",
+       "tags-create-submit": "创建",
+       "tags-create-no-name": "您必须指定一个标签名称。",
+       "tags-create-invalid-chars": "标签名称必须不包含逗号(<code>,</code>)或正斜线(<code>/</code>)。",
+       "tags-create-invalid-title-chars": "标签名称不得含有无法在网页标题中使用的字符。",
+       "tags-create-already-exists": "“$1”标签已存在。",
+       "tags-create-warnings-above": "下列{{PLURAL:$2|警告}}是尝试创建“$1”标签时遇到的:",
+       "tags-create-warnings-below": "您希望继续创建此标签吗?",
+       "tags-delete-title": "删除标签",
+       "tags-delete-explanation-initial": "您即将从数据库中删除“$1”标签。",
+       "tags-delete-explanation-in-use": "它将从{{PLURAL:$2|所有$2个修订版本和/或日志记录}}移除至当前应用它的地方。",
+       "tags-delete-explanation-warning": "此操作是<strong>不可逆转</strong>且<strong>不可撤销</strong>的,即使是数据库管理员。请确定这是您希望删除的标签。",
+       "tags-delete-explanation-active": "<strong>“$1”标签仍处于激活状态,且在今后将被继续应用。</strong>要停止此情况继续发生,前往添加此标签的位置,并在那里将它停用。",
+       "tags-delete-reason": "原因:",
+       "tags-delete-submit": "不可逆转地删除此标签",
+       "tags-delete-not-allowed": "扩展定义的标签不能被删除,除非该扩展明确允许。",
+       "tags-delete-not-found": "标签“$1”不存在。",
+       "tags-delete-too-many-uses": "“$1”标签已应用到超过$2个修订版本,这意味着它不能被删除。",
+       "tags-delete-warnings-after-delete": "标签“$1”已成功删除,但遇到了以下{{PLURAL:$2|警告}}:",
+       "tags-activate-title": "激活标签",
+       "tags-activate-question": "您将要激活标签“$1”。",
+       "tags-activate-reason": "原因:",
+       "tags-activate-not-allowed": "不可能激活“$1”标签。",
+       "tags-activate-not-found": "标签“$1”不存在。",
+       "tags-activate-submit": "激活",
+       "tags-deactivate-title": "取消激活标签",
+       "tags-deactivate-question": "您将要取消激活标签“$1”。",
+       "tags-deactivate-reason": "原因:",
+       "tags-deactivate-not-allowed": "无法取消激活标签“$1”。",
+       "tags-deactivate-submit": "取消激活",
        "comparepages": "对比页面",
        "compare-page1": "页面1",
        "compare-page2": "页面2",
        "logentry-upload-upload": "$1{{GENDER:$2|上传}}$3",
        "logentry-upload-overwrite": "$1{{GENDER:$2|上传}}$3的新版本",
        "logentry-upload-revert": "$1{{GENDER:$2|上传}}$3",
+       "log-name-managetags": "标签管理日志",
+       "log-description-managetags": "此页面列出有关[[Special:Tags|标签]]的管理任务。该日志仅包含管理员手工进行的操作;wiki软件可能创建或删除标签而未在此日志中留下记录。",
+       "logentry-managetags-create": "$1{{GENDER:$2|创建了}}标签“$4”",
+       "logentry-managetags-delete": "$1 {{GENDER:$2|删除了}}“$4”标签(已从$5个{{PLURAL:$5|修订版本和/或日志条目}}中移除)",
+       "logentry-managetags-activate": "$1 {{GENDER:$2|激活了}}“$4”标签供用户和机器人使用",
+       "logentry-managetags-deactivate": "$1 {{GENDER:$2|停用了}}“$4”标签供用户和机器人使用",
        "rightsnone": "(无)",
        "revdelete-summary": "编辑摘要",
        "feedback-bugornote": "如果你准备好详细描述一个技术问题,请[$1 报告bug]。或者你可以使用下面的简单表格。你的评论将被添加至页面“[$3 $2]”,附有你的用户名。",
index 677fba7..d232da4 100644 (file)
                        "LNDDYL",
                        "Cathypilot0117",
                        "NigelSoft",
-                       "EagerLin"
+                       "EagerLin",
+                       "Cbliu"
                ]
        },
        "tog-underline": "底線標示連結:",
-       "tog-hideminor": "在近期變更隱藏小編輯",
+       "tog-hideminor": "隱藏近期變更中的小修訂",
        "tog-hidepatrolled": "隱藏近期變更中巡查過的編輯",
        "tog-newpageshidepatrolled": "隱藏新頁面清單中巡查過的頁面",
        "tog-extendwatchlist": "展開監視清單顯示包含最近以外的所有變更",
        "mytalk": "對話",
        "anontalk": "此 IP 位址的對話頁面",
        "navigation": "導覽",
-       "and": "&#32;å\8f\8a&#32;",
+       "and": "&#32;å\92\8c&#32;",
        "qbfind": "尋找",
        "qbbrowse": "瀏覽",
        "qbedit": "編輯",
        "qbpageoptions": "此頁面",
        "qbmyoptions": "我的頁面",
-       "faq": "常見問",
+       "faq": "常見問",
        "faqpage": "Project:FAQ",
        "actions": "動作",
        "namespaces": "命名空間",
        "disclaimers": "免責聲明",
        "disclaimerpage": "Project:General disclaimer",
        "edithelp": "編輯説明",
-       "mainpage": "頁",
-       "mainpage-description": "頁",
+       "mainpage": "頁",
+       "mainpage-description": "頁",
        "policy-url": "Project:Policy",
        "portal": "社群入口",
        "portal-url": "Project:Community portal",
        "privacy": "隱私政策",
-       "privacypage": "Project:Privacy policy",
+       "privacypage": "Project:隱私政策",
        "badaccess": "權限錯誤",
        "badaccess-group0": "系統不允許您執行這項操作。",
        "badaccess-groups": "您請求的操作只有{{PLURAL:$2|這個|這些}}群組的使用者能使用:$1",
        "nosuchusershort": "查無使用者 \"$1\",\n請檢查您拼寫是否正確。",
        "nouserspecified": "您必須指定一個使用者名稱。",
        "login-userblocked": "這位使用者已被封鎖,不允許登入。",
-       "wrongpassword": "您輸入的密碼有錯誤,請再嘗試一次。",
+       "wrongpassword": "您輸入的密碼錯誤,請再試一次。",
        "wrongpasswordempty": "輸入的密碼是空的。\n請再試一次。",
        "passwordtooshort": "您的密碼至少需要 $1 個字元。",
        "password-name-match": "您的密碼不可以跟使用者名稱相同。",
        "nowiki_tip": "忽略 Wiki 格式化語法",
        "image_sample": "範例.jpg",
        "image_tip": "附加檔案",
+       "media_sample": "範例.ogg",
        "media_tip": "檔案連結",
        "sig_tip": "您的簽名與日期時間",
        "hr_tip": "水平線 (少用)",
        "prefs-personal": "使用者基本資料",
        "prefs-rc": "近期變更",
        "prefs-watchlist": "監視清單",
+       "prefs-editwatchlist": "編輯監視清單",
+       "prefs-editwatchlist-label": "編輯在您監視清單上的項目:",
+       "prefs-editwatchlist-edit": "檢視與移除在您監視清單上的標題",
+       "prefs-editwatchlist-raw": "編輯原始監視清單",
+       "prefs-editwatchlist-clear": "清除您的監視清單",
        "prefs-watchlist-days": "監視清單中顯示的天數:",
        "prefs-watchlist-days-max": "最多 $1 {{PLURAL:$1|天}}",
        "prefs-watchlist-edits": "展開監視清單中顯示的變更數量上限:",
        "right-override-export-depth": "匯出頁面包含連結內容,深度上限為 5 層",
        "right-sendemail": "傳送電子郵件給其他使用者",
        "right-passwordreset": "檢視重設密碼電子郵件",
+       "right-managechangetags": "建立並自資料庫移除[[Special:Tags|標籤]]",
        "newuserlogpage": "建立使用者日誌",
        "newuserlogpagetext": "此為建立使用者的日誌。",
        "rightslog": "使用者權限日誌",
        "action-viewmyprivateinfo": "檢視您的個人資訊",
        "action-editmyprivateinfo": "編輯您的個人資訊",
        "action-editcontentmodel": "編輯頁面的內容模型",
+       "action-managechangetags": "建立並自資料庫移除標籤",
        "nchanges": "$1 次變更",
        "enhancedrc-since-last-visit": "自上次訪問已有 $1",
        "enhancedrc-history": "歷史",
        "listduplicatedfiles": "重複檔案清單",
        "listduplicatedfiles-summary": "此清單中包含最新版本的檔案與其他檔案重複的清單,本清單只顯示本地檔案。",
        "listduplicatedfiles-entry": "[[:File:$1|$1]] 有[[$3|其他 $2 個重複檔案]]。",
-       "unusedtemplates": "æ\9cªä½¿ç\94¨ç\9a\84樣板",
+       "unusedtemplates": "æ\9cªä½¿ç\94¨ç\9a\84模板",
        "unusedtemplatestext": "此頁面列出所有於 {{ns:template}} 命名空間下未被其他頁面引用的模板。\n在刪除前,仍需檢查是否有連結這些模板的其他頁面。",
        "unusedtemplateswlh": "其他連結",
        "randompage": "隨機頁面",
        "export-addnstext": "使用命名空間新增頁面:",
        "export-addns": "新增",
        "export-download": "儲存為檔案",
-       "export-templates": "å\8c\85å\90«æ¨£板",
+       "export-templates": "å\8c\85å\90«æ¨¡板",
        "export-pagelinks": "包含連結的頁面深度:",
        "allmessages": "系統訊息",
        "allmessagesname": "名稱",
        "import-interwiki-sourcewiki": "來源 Wiki:",
        "import-interwiki-sourcepage": "來源頁面:",
        "import-interwiki-history": "複製此頁的所有歷史修訂",
-       "import-interwiki-templates": "å\8c\85å\90«æ\89\80æ\9c\89樣板",
+       "import-interwiki-templates": "å\8c\85å\90«æ\89\80æ\9c\89模板",
        "import-interwiki-submit": "匯入",
        "import-interwiki-namespace": "目標命名空間:",
        "import-interwiki-rootpage": "目標根頁面 (選填):",
        "javascripttest": "JavaScript 測試",
        "javascripttest-pagetext-noframework": "此頁面保留用來作為 JavaScript 測試使用。",
        "javascripttest-pagetext-unknownframework": "不明的測試 Framework \"$1\"。",
-       "javascripttest-pagetext-unknownaction": "未知操作「$1」。",
+       "javascripttest-pagetext-unknownaction": "不明操作 \"$1\"。",
        "javascripttest-pagetext-frameworks": "請選擇下列一種測試 Framework:$1",
        "javascripttest-pagetext-skins": "選擇執行測試的外觀:",
        "javascripttest-qunit-intro": "請參考 mediawiki.org 的 [$1 測試說明文件]。",
        "tooltip-search": "搜尋 {{SITENAME}}",
        "tooltip-search-go": "若與此名稱相符的頁面存在,前往該頁面",
        "tooltip-search-fulltext": "搜尋使用此文字的頁面",
-       "tooltip-p-logo": "前往頁",
+       "tooltip-p-logo": "前往頁",
        "tooltip-n-mainpage": "前往主頁",
-       "tooltip-n-mainpage-description": "前往頁",
+       "tooltip-n-mainpage-description": "前往頁",
        "tooltip-n-portal": "關於本專案、您可以做什麼、哪裡可以找到您需要的事物",
        "tooltip-n-currentevents": "於最新動態中尋找背景資訊",
        "tooltip-n-recentchanges": "列出此 Wiki 中的近期變更清單",
        "tooltip-ca-nstab-project": "檢視專案頁面",
        "tooltip-ca-nstab-image": "檢視檔案頁面",
        "tooltip-ca-nstab-mediawiki": "檢視系統訊息",
-       "tooltip-ca-nstab-template": "檢è¦\96樣板",
+       "tooltip-ca-nstab-template": "檢è¦\96模板",
        "tooltip-ca-nstab-help": "檢視說明頁面",
        "tooltip-ca-nstab-category": "檢視分類頁面",
        "tooltip-minoredit": "標記為小修訂",
        "exif-samplesperpixel": "像素數量",
        "exif-planarconfiguration": "資料排列",
        "exif-ycbcrsubsampling": "黃色轉洋紅二次抽樣比率",
-       "exif-ycbcrpositioning": "亮度與彩度偏移",
+       "exif-ycbcrpositioning": "亮度與彩度位置",
        "exif-xresolution": "水平解析度",
        "exif-yresolution": "垂直解析度",
        "exif-stripoffsets": "影像資料位置",
        "exif-objectcycle-b": "上午與下午",
        "exif-gpsdirection-t": "真實方向",
        "exif-gpsdirection-m": "地磁方向",
-       "exif-ycbcrpositioning-1": "置中",
-       "exif-ycbcrpositioning-2": "聯合選址",
+       "exif-ycbcrpositioning-1": "中間",
+       "exif-ycbcrpositioning-2": "同時取樣",
        "exif-dc-contributor": "貢獻者",
        "exif-dc-coverage": "時間或空間性介質範圍",
        "exif-dc-date": "日期",
        "confirmemail_invalidated": "已取消電子郵件位址確認",
        "invalidateemail": "取消電子郵件確認",
        "scarytranscludedisabled": "[Interwiki 轉換代碼不可用]",
-       "scarytranscludefailed": "[樣板 $1 讀取失敗]",
+       "scarytranscludefailed": "[模板 $1 讀取失敗]",
        "scarytranscludefailed-httpstatus": "[樣板 $1 讀取失敗:HTTP $2]",
        "scarytranscludetoolong": "[URL 過長]",
        "deletedwhileediting": "<strong>警告:</strong>此頁在您開始編輯之後已經被刪除﹗",
        "tags": "有效變更標籤",
        "tag-filter": "[[Special:Tags|標籤]]搜尋:",
        "tag-filter-submit": "搜尋",
-       "tag-list-wrapper": "([[Special:Tags|標籤]]:$2)",
+       "tag-list-wrapper": "([[Special:Tags|$1 個標籤]]:$2)",
        "tags-title": "標籤",
        "tags-intro": "此頁面列出所有可用來標示編輯內容的標籤以及這些標籤所代表的意思。",
        "tags-tag": "標籤名稱",
        "tags-display-header": "在變更日誌中顯示的方式",
        "tags-description-header": "意義完整的說明",
+       "tags-source-header": "來源",
        "tags-active-header": "開啟?",
        "tags-hitcount-header": "已標記的變更",
+       "tags-actions-header": "操作",
        "tags-active-yes": "是",
        "tags-active-no": "否",
+       "tags-source-extension": "由擴充套件定義",
+       "tags-source-manual": "由使用者與機器人手動套用",
+       "tags-source-none": "不再使用",
        "tags-edit": "編輯",
+       "tags-delete": "刪除",
+       "tags-activate": "啟動",
+       "tags-deactivate": "停用",
        "tags-hitcount": "$1 次變更",
+       "tags-manage-no-permission": "您沒有權限管理變更標籤。",
+       "tags-create-heading": "建立新標籤",
+       "tags-create-explanation": "在預設情況下,新建立的標籤可被使用者及機器人使用。",
+       "tags-create-tag-name": "標籤名稱:",
+       "tags-create-reason": "原因:",
+       "tags-create-submit": "建立",
+       "tags-create-no-name": "您必須指定一個標籤名稱。",
+       "tags-create-invalid-chars": "標籤名稱不可包含逗號 (<code>,</code>) 或斜線 (<code>/</code>)。",
+       "tags-create-already-exists": "標籤 \"$1\" 已存在。",
+       "tags-create-warnings-below": "您是否要繼續建立標籤?",
+       "tags-delete-title": "刪除標籤",
+       "tags-delete-explanation-initial": "您正要從資料庫刪除標籤 \"$1\"。",
+       "tags-delete-reason": "原因:",
+       "tags-delete-submit": "無法取消刪除此標籤",
+       "tags-delete-not-found": "標籤 \"$1\" 不存在。",
+       "tags-activate-title": "啟動標籤",
+       "tags-activate-question": "您正要啟動標籤 \"$1\"。",
+       "tags-activate-reason": "原因:",
+       "tags-activate-not-allowed": "無法啟動標籤 \"$1\"。",
+       "tags-activate-not-found": "標籤 \"$1\" 不存在。",
+       "tags-activate-submit": "啟動",
+       "tags-deactivate-title": "停用標籤",
+       "tags-deactivate-question": "您正要停用標籤 \"$1\"。",
+       "tags-deactivate-reason": "原因:",
+       "tags-deactivate-not-allowed": "無法停用標籤 \"$1\"。",
+       "tags-deactivate-submit": "停用",
        "comparepages": "比較頁面",
        "compare-page1": "第 1 頁",
        "compare-page2": "第 2 頁",
        "logentry-upload-upload": "$1 {{GENDER:$2|已上傳}} $3",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|上傳了}}新版本的 $3",
        "logentry-upload-revert": "$1 {{GENDER:$2|已上傳}} $3",
+       "log-name-managetags": "標籤管理日誌",
+       "log-description-managetags": "此頁面列出與[[Special:Tags|標籤]]相關的管理工作項目。 在日誌中僅包含由管理員手動所做的操作;被 Wiki 軟體所建立或刪除的標籤項目,不會記錄在此日誌中",
        "rightsnone": "(無)",
        "revdelete-summary": "編輯摘要",
        "feedback-bugornote": "如果您準備要詳細描述一個技術問題,請至 [$1 回報問題]。\n或您可以使用以下的簡易表單回報問題,您的使用者名稱與評論將被新增到頁面 \"[$3 $2]\"。",
        "limitreport-ppgeneratednodes": "預處理器產生節點次數",
        "limitreport-postexpandincludesize": "展開後的引用大小",
        "limitreport-postexpandincludesize-value": "$1/$2 個{{PLURAL:$2|位元組}}",
-       "limitreport-templateargumentsize": "樣板參數大小",
+       "limitreport-templateargumentsize": "模板參數大小",
        "limitreport-templateargumentsize-value": "$1/$2 個{{PLURAL:$2|位元組}}",
        "limitreport-expansiondepth": "最高展開深度",
        "limitreport-expensivefunctioncount": "高消耗解析器函數次數",
index 755a249..40627a2 100644 (file)
@@ -61,6 +61,10 @@ $namespaceAliases = array(
        'Gambar_Pembicaraan'    => NS_FILE_TALK,
 );
 
+$magicWords = array(
+       'redirect'                  => array( '0', '#PUPINAH', '#ALIH', '#REDIRECT' ),
+);
+
 $specialPageAliases = array(
        'Activeusers'               => array( 'UreuëngNguiUdép' ),
        'Allmessages'               => array( 'BanDumPeusan' ),
@@ -68,35 +72,34 @@ $specialPageAliases = array(
        'Allpages'                  => array( 'DapeutaLaman' ),
        'Ancientpages'              => array( 'TeunuléhAwai' ),
        'Badtitle'                  => array( 'NanBrôk' ),
-       'Blankpage'                 => array( 'LamaSoh' ),
+       'Blankpage'                 => array( 'LamanSoh' ),
        'Block'                     => array( 'TheunUreuëngNgui' ),
-       'Booksources'               => array( 'Ne_kitab' ),
-       'BrokenRedirects'           => array( 'Peuninah_reuloh' ),
-       'Categories'                => array( 'Dapeuta_kawan' ),
-       'ChangePassword'            => array( 'Gantoe_lageuem_rahsia' ),
-       'Confirmemail'              => array( 'Peunyo_surat-e' ),
-       'Contributions'             => array( 'Peuneugot_ureueng_nguy' ),
-       'CreateAccount'             => array( 'Peugot_nan' ),
-       'Deadendpages'              => array( 'On_mate' ),
-       'DeletedContributions'      => array( 'Peuneugot_nyang_geusampoh' ),
-       'DoubleRedirects'           => array( 'Peuninah_ganda' ),
-       'Emailuser'                 => array( 'Surat-e_ureueng_nguy' ),
-       'Export'                    => array( 'Peuteubiet' ),
-       'Fewestrevisions'           => array( 'Neuubah_paleng_dit' ),
-       'FileDuplicateSearch'       => array( 'Mita_beureukaih_saban' ),
-       'Filepath'                  => array( 'Neuduek_beureukaih' ),
-       'Import'                    => array( 'Peutamong' ),
-       'Invalidateemail'           => array( 'Peubateue_peusah_surat-e' ),
-       'BlockList'                 => array( 'Dapeuta_neutheun' ),
-       'LinkSearch'                => array( 'Mita_hubong' ),
-       'Listadmins'                => array( 'Dapeuta_ureueng_uroh' ),
-       'Listbots'                  => array( 'Dapeuta_bot' ),
-       'Listfiles'                 => array( 'Dapeuta_beureukaih' ),
-       'Listgrouprights'           => array( 'Dapeuta_khut_(hak)_kawan' ),
-       'Listredirects'             => array( 'Dapeuta_peuninah' ),
-       'Listusers'                 => array( 'Dapeuta_ureueng_nguy' ),
-       'Lockdb'                    => array( 'Gunci_basis_data' ),
-       'Log'                       => array( 'Ceunatat' ),
+       'Booksources'               => array( 'NèKitab' ),
+       'BrokenRedirects'           => array( 'PeuninahReuloh' ),
+       'Categories'                => array( 'DapeutaKawan' ),
+       'ChangePassword'            => array( 'GantoëLageuëmRahsia' ),
+       'Confirmemail'              => array( 'PeunyoSurat-e' ),
+       'Contributions'             => array( 'BeuneuriUreuëngNgui' ),
+       'CreateAccount'             => array( 'PeugötNan' ),
+       'Deadendpages'              => array( 'ÔnMaté' ),
+       'DeletedContributions'      => array( 'BeuneuriNyangGeusampôh' ),
+       'DoubleRedirects'           => array( 'PeuninahGanda' ),
+       'Emailuser'                 => array( 'Surat-eUreuëngNgui' ),
+       'Export'                    => array( 'Peuteubiët' ),
+       'Fewestrevisions'           => array( 'NeuubahPaléngDit' ),
+       'FileDuplicateSearch'       => array( 'MitaBeureukaihSaban' ),
+       'Filepath'                  => array( 'NeuduëkBeureukaih' ),
+       'Import'                    => array( 'Peutamöng' ),
+       'Invalidateemail'           => array( 'PeubateuëPeusahSurat-e' ),
+       'BlockList'                 => array( 'DapeutaTeuneuheun' ),
+       'LinkSearch'                => array( 'MitaPeunawôt' ),
+       'Listadmins'                => array( 'DapeutaUreuëngUrôh' ),
+       'Listbots'                  => array( 'DapeutaBot' ),
+       'Listfiles'                 => array( 'DapeutaBeureukaih' ),
+       'Listgrouprights'           => array( 'DapeutaHakKawan' ),
+       'Listredirects'             => array( 'DapeutaPeuninah' ),
+       'Listusers'                 => array( 'DapeutaUreuëngNgui' ),
+       'Lockdb'                    => array( 'GunciBasisData' ),
        'Lonelypages'               => array( 'On_hana_soe_po' ),
        'Longpages'                 => array( 'On_panyang' ),
        'MergeHistory'              => array( 'Riwayat_peusapat' ),
index 84eb922..7482841 100644 (file)
@@ -55,7 +55,6 @@ $magicWords = array(
        'numberofusers'             => array( '1', 'AANTALGEBRUIKERS', 'NUMBEROFUSERS' ),
        'numberofactiveusers'       => array( '1', 'AANTALAKTIEWEGEBRUIKERS', 'NUMBEROFACTIVEUSERS' ),
        'numberofedits'             => array( '1', 'AANTALWYSIGINGS', 'NUMBEROFEDITS' ),
-       'numberofviews'             => array( '1', 'AANTALKEERGESIEN', 'NUMBEROFVIEWS' ),
        'pagename'                  => array( '1', 'BLADSYNAAM', 'PAGENAME' ),
        'namespace'                 => array( '1', 'NAAMSPASIE', 'NAMESPACE' ),
        'talkspace'                 => array( '1', 'BESPREKINGSBLADSY', 'TALKSPACE' ),
@@ -96,14 +95,18 @@ $magicWords = array(
 $specialPageAliases = array(
        'Activeusers'               => array( 'AktieweGebruikers' ),
        'Allmessages'               => array( 'Stelselboodskappe', 'Alle_stelselboodskappe', 'Allestelselboodskappe', 'Boodskappe' ),
+       'AllMyUploads'              => array( 'AlMyOplaaie', 'AlMyLêers' ),
        'Allpages'                  => array( 'Alle_bladsye', 'Allebladsye' ),
        'Ancientpages'              => array( 'OuBladsye' ),
+       'Badtitle'                  => array( 'Slegtetitel' ),
        'Blankpage'                 => array( 'SkoonBladsy' ),
        'Block'                     => array( 'BlokIP' ),
        'Booksources'               => array( 'Boekbronne' ),
        'BrokenRedirects'           => array( 'Stukkende_aansture', 'Stukkendeaansture' ),
        'Categories'                => array( 'Kategorieë' ),
+       'ChangeEmail'               => array( 'VeranderEpos' ),
        'ChangePassword'            => array( 'HerstelWagwoord' ),
+       'ComparePages'              => array( 'VergelykBladsye' ),
        'Confirmemail'              => array( 'Bevestig_e-posadres', 'Bevestige-posadres', 'Bevestig_eposadres', 'Bevestigeposadres' ),
        'Contributions'             => array( 'Bydraes', 'Gebruikersbydraes' ),
        'CreateAccount'             => array( 'SkepRekening', 'MaakGebruiker' ),
@@ -117,6 +120,7 @@ $specialPageAliases = array(
        'Filepath'                  => array( 'Lêerpad' ),
        'Import'                    => array( 'Importeer' ),
        'Invalidateemail'           => array( 'OngeldigeEpos' ),
+       'JavaScriptTest'            => array( 'JavaScriptToets' ),
        'BlockList'                 => array( 'IPBlokLys' ),
        'LinkSearch'                => array( 'SkakelSoektog' ),
        'Listadmins'                => array( 'LysAdministrateurs' ),
@@ -133,7 +137,8 @@ $specialPageAliases = array(
        'MIMEsearch'                => array( 'MIME-soek', 'MIMEsoek', 'MIME_soek' ),
        'Mostcategories'            => array( 'MeesteKategorieë' ),
        'Mostimages'                => array( 'MeesteBeelde' ),
-       'Mostlinked'                => array( 'MeeteGeskakel' ),
+       'Mostinterwikis'            => array( 'MeesteInterwikis' ),
+       'Mostlinked'                => array( 'MeesteGeskakel' ),
        'Mostlinkedcategories'      => array( 'MeesGeskakeldeKategorieë' ),
        'Mostlinkedtemplates'       => array( 'MeesGeskakeldeSjablone' ),
        'Mostrevisions'             => array( 'MeesteWysigings' ),
@@ -142,8 +147,10 @@ $specialPageAliases = array(
        'MyLanguage'                => array( 'MyTaal' ),
        'Mypage'                    => array( 'MyBladsy' ),
        'Mytalk'                    => array( 'Mybespreking', 'Mybesprekings' ),
+       'Myuploads'                 => array( 'MyOplaaie', 'MyLêers' ),
        'Newimages'                 => array( 'Nuwe_beelde', 'Nuwebeelde', 'Nuwe_lêers', 'Nuwelêers' ),
        'Newpages'                  => array( 'Nuwe_bladsye', 'Nuwebladsye' ),
+       'PasswordReset'             => array( 'WagwoordHerstel' ),
        'Popularpages'              => array( 'PopulêreBladsye' ),
        'Preferences'               => array( 'Voorkeure' ),
        'Prefixindex'               => array( 'VoorvoegselIndeks' ),
@@ -153,6 +160,7 @@ $specialPageAliases = array(
        'Randomredirect'            => array( 'Lukrake_aanstuur', 'Lukrakeaanstuur' ),
        'Recentchanges'             => array( 'Onlangse_wysigings', 'Onlangsewysigings' ),
        'Recentchangeslinked'       => array( 'OnlangseVeranderingsMetSkakels', 'VerwanteVeranderings' ),
+       'Redirect'                  => array( 'Aanstuur' ),
        'Revisiondelete'            => array( 'WeergaweSkrap' ),
        'Search'                    => array( 'Soek' ),
        'Shortpages'                => array( 'KortBladsye' ),
@@ -177,7 +185,7 @@ $specialPageAliases = array(
        'Version'                   => array( 'Weergawe' ),
        'Wantedcategories'          => array( 'GesoekteKategorieë' ),
        'Wantedfiles'               => array( 'GesoekteLêers' ),
-       'Wantedpages'               => array( 'GesoekdeBladsye', 'GebreekteSkakels' ),
+       'Wantedpages'               => array( 'GesoekteBladsye', 'GebreekteSkakels' ),
        'Wantedtemplates'           => array( 'GesoekteSjablone' ),
        'Watchlist'                 => array( 'Dophoulys' ),
        'Whatlinkshere'             => array( 'Skakels_hierheen', 'Skakelshierheen' ),
index 3872f1c..7817990 100644 (file)
@@ -171,7 +171,6 @@ $magicWords = array(
        'numberofusers'             => array( '1', 'عدد_المستخدمين', 'NUMBEROFUSERS' ),
        'numberofactiveusers'       => array( '1', 'عدد_المستخدمين_النشطين', 'NUMBEROFACTIVEUSERS' ),
        'numberofedits'             => array( '1', 'عدد_التعديلات', 'NUMBEROFEDITS' ),
-       'numberofviews'             => array( '1', 'عدد_المشاهدات', 'NUMBEROFVIEWS' ),
        'pagename'                  => array( '1', 'اسم_الصفحة', 'PAGENAME' ),
        'pagenamee'                 => array( '1', 'عنوان_الصفحة', 'PAGENAMEE' ),
        'namespace'                 => array( '1', 'نطاق', 'NAMESPACE' ),
@@ -186,6 +185,7 @@ $magicWords = array(
        'subpagename'               => array( '1', 'اسم_الصفحة_الفرعي', 'SUBPAGENAME' ),
        'subpagenamee'              => array( '1', 'عنوان_الصفحة_الفرعي', 'SUBPAGENAMEE' ),
        'rootpagename'              => array( '1', 'جذر_اسم_الصفحة', 'ROOTPAGENAME' ),
+       'rootpagenamee'             => array( '1', 'عنوان_جذر_الصفحة', 'ROOTPAGENAMEE' ),
        'basepagename'              => array( '1', 'اسم_الصفحة_الأساسي', 'BASEPAGENAME' ),
        'basepagenamee'             => array( '1', 'عنوان_الصفحة_الأساسي', 'BASEPAGENAMEE' ),
        'talkpagename'              => array( '1', 'اسم_صفحة_النقاش', 'TALKPAGENAME' ),
@@ -261,6 +261,7 @@ $magicWords = array(
        'raw'                       => array( '0', 'خام:', 'RAW:' ),
        'displaytitle'              => array( '1', 'عرض_العنوان', 'DISPLAYTITLE' ),
        'rawsuffix'                 => array( '1', 'أر', 'آر', 'R' ),
+       'nocommafysuffix'           => array( '0', 'لا_سيب', 'NOSEP' ),
        'newsectionlink'            => array( '1', '__وصلة_قسم_جديد__', '__NEWSECTIONLINK__' ),
        'nonewsectionlink'          => array( '1', 'لا_وصلة_قسم_جديد__', '__NONEWSECTIONLINK__' ),
        'currentversion'            => array( '1', 'نسخة_حالية', 'CURRENTVERSION' ),
@@ -289,12 +290,15 @@ $magicWords = array(
        'numberingroup'             => array( '1', 'عدد_في_المجموعة', 'عدد_في_مجموعة', 'NUMBERINGROUP', 'NUMINGROUP' ),
        'staticredirect'            => array( '1', '__تحويلة_إستاتيكية__', '__تحويلة_ساكنة__', '__STATICREDIRECT__' ),
        'protectionlevel'           => array( '1', 'مستوى_الحماية', 'PROTECTIONLEVEL' ),
+       'cascadingsources'          => array( '1', 'مصادر_مضمنة', 'CASCADINGSOURCES' ),
        'formatdate'                => array( '0', 'تهيئة_التاريخ', 'تهيئة_تاريخ', 'formatdate', 'dateformat' ),
        'url_path'                  => array( '0', 'مسار', 'PATH' ),
        'url_wiki'                  => array( '0', 'ويكي', 'WIKI' ),
        'url_query'                 => array( '0', 'استعلام', 'QUERY' ),
        'defaultsort_noerror'       => array( '0', 'لاخطأ', 'noerror' ),
        'defaultsort_noreplace'     => array( '0', 'لاتستبدل', 'noreplace' ),
+       'displaytitle_noerror'      => array( '0', 'لا_خطأ', 'noerror' ),
+       'displaytitle_noreplace'    => array( '0', 'لااستبدال', 'noreplace' ),
        'pagesincategory_all'       => array( '0', 'كل', 'all' ),
        'pagesincategory_pages'     => array( '0', 'صفحات', 'pages' ),
        'pagesincategory_subcats'   => array( '0', 'تصنيفات_فرعية', 'subcats' ),
@@ -306,6 +310,7 @@ $specialPageAliases = array(
        'Allmessages'               => array( 'كل_الرسائل' ),
        'AllMyUploads'              => array( 'كل_ملفاتي' ),
        'Allpages'                  => array( 'كل_الصفحات' ),
+       'ApiHelp'                   => array( 'مساعدة_إيه_بي_آي' ),
        'Ancientpages'              => array( 'صفحات_قديمة' ),
        'Badtitle'                  => array( 'عنوان_سيئ' ),
        'Blankpage'                 => array( 'صفحة_فارغة' ),
@@ -321,6 +326,7 @@ $specialPageAliases = array(
        'CreateAccount'             => array( 'إنشاء_حساب' ),
        'Deadendpages'              => array( 'صفحات_نهاية_مسدودة' ),
        'DeletedContributions'      => array( 'مساهمات_محذوفة' ),
+       'Diff'                      => array( 'فرق' ),
        'DoubleRedirects'           => array( 'تحويلات_مزدوجة' ),
        'EditWatchlist'             => array( 'تعديل_قائمة_المراقبة' ),
        'Emailuser'                 => array( 'مراسلة_المستخدم' ),
@@ -339,11 +345,13 @@ $specialPageAliases = array(
        'Listfiles'                 => array( 'عرض_الملفات', 'قائمة_الملفات', 'قائمة_الصور' ),
        'Listgrouprights'           => array( 'عرض_صلاحيات_المجموعات', 'صلاحيات_مجموعات_المستخدمين' ),
        'Listredirects'             => array( 'عرض_التحويلات' ),
+       'ListDuplicatedFiles'       => array( 'عرض_الملفات_المكررة', 'عرض_تكرار_الملفات' ),
        'Listusers'                 => array( 'عرض_المستخدمين', 'قائمة_المستخدمين' ),
        'Lockdb'                    => array( 'غلق_قب' ),
        'Log'                       => array( 'سجل', 'سجلات' ),
        'Lonelypages'               => array( 'صفحات_وحيدة', 'صفحات_يتيمة' ),
        'Longpages'                 => array( 'صفحات_طويلة' ),
+       'MediaStatistics'           => array( 'إحصاءات_الميديا' ),
        'MergeHistory'              => array( 'دمج_التاريخ' ),
        'MIMEsearch'                => array( 'بحث_ميم' ),
        'Mostcategories'            => array( 'الأكثر_تصنيفا' ),
@@ -355,13 +363,14 @@ $specialPageAliases = array(
        'Mostrevisions'             => array( 'الأكثر_تعديلا' ),
        'Movepage'                  => array( 'نقل_صفحة' ),
        'Mycontributions'           => array( 'مساهماتي' ),
+       'MyLanguage'                => array( 'لغتي' ),
        'Mypage'                    => array( 'صفحتي' ),
        'Mytalk'                    => array( 'نقاشي' ),
-       'MyLanguage'                => array( 'لغتي' ),
        'Myuploads'                 => array( 'رفوعاتي' ),
        'Newimages'                 => array( 'ملفات_جديدة', 'صور_جديدة' ),
        'Newpages'                  => array( 'صفحات_جديدة' ),
        'PagesWithProp'             => array( 'صفحات_بخاصية' ),
+       'PageLanguage'              => array( 'لغة_الصفحة' ),
        'PasswordReset'             => array( 'إعادة_ضبط_كلمة_السر' ),
        'PermanentLink'             => array( 'وصلة_دائمة', 'رابط_دائم' ),
        'Popularpages'              => array( 'صفحات_مشهورة' ),
@@ -377,11 +386,13 @@ $specialPageAliases = array(
        'Redirect'                  => array( 'تحويل' ),
        'ResetTokens'               => array( 'إعادة_ضبط_المفاتيح' ),
        'Revisiondelete'            => array( 'حذف_مراجعة', 'حذف_نسخة' ),
+       'RunJobs'                   => array( 'تشغيل_الوظائف' ),
        'Search'                    => array( 'بحث' ),
        'Shortpages'                => array( 'صفحات_قصيرة' ),
        'Specialpages'              => array( 'صفحات_خاصة' ),
        'Statistics'                => array( 'إحصاءات' ),
        'Tags'                      => array( 'وسوم' ),
+       'TrackingCategories'        => array( 'تصنيفات_التتبع' ),
        'Unblock'                   => array( 'رفع_منع' ),
        'Uncategorizedcategories'   => array( 'تصنيفات_غير_مصنفة' ),
        'Uncategorizedimages'       => array( 'ملفات_غير_مصنفة', 'صور_غير_مصنفة' ),
index 09fd319..4d0b3db 100644 (file)
@@ -40,27 +40,35 @@ $namespaceAliases = array(
 $specialPageAliases = array(
        'Activeusers'               => array( 'يوزرات_نشطا' ),
        'Allmessages'               => array( 'كل_الرسايل' ),
+       'AllMyUploads'              => array( 'كل_مرفوعاتى', 'كل_فايلاتى' ),
        'Allpages'                  => array( 'كل_الصفح' ),
        'Ancientpages'              => array( 'صفح_قديمه' ),
+       'Badtitle'                  => array( 'عنوان_وحش' ),
        'Blankpage'                 => array( 'صفحه_فارضيه' ),
        'Block'                     => array( 'بلوك', 'بلوك_IP', 'بلوك_يوزر' ),
        'Booksources'               => array( 'مصادر_كتاب' ),
        'BrokenRedirects'           => array( 'تحويلات_مكسوره' ),
        'Categories'                => array( 'تصانيف' ),
+       'ChangeEmail'               => array( 'تغيير_الميل' ),
        'ChangePassword'            => array( 'تغيير_الپاسوورد', 'ظبط_الپاسوورد' ),
+       'ComparePages'              => array( 'مقارنه_الصفحات' ),
        'Confirmemail'              => array( 'تأكيد_الايميل' ),
        'Contributions'             => array( 'مساهمات' ),
        'CreateAccount'             => array( 'ابتدى_حساب' ),
        'Deadendpages'              => array( 'صفح_نهايه_مسدوده' ),
        'DeletedContributions'      => array( 'مساهمات_ممسوحه' ),
+       'Diff'                      => array( 'فرق' ),
        'DoubleRedirects'           => array( 'تحويلات_دوبل' ),
+       'EditWatchlist'             => array( 'تغيير_قايمه_المراقبه' ),
        'Emailuser'                 => array( 'ابعت_ايميل_لليوزر' ),
+       'ExpandTemplates'           => array( 'فرد-القوالب' ),
        'Export'                    => array( 'تصدير' ),
        'Fewestrevisions'           => array( 'اقل_مراجعات' ),
        'FileDuplicateSearch'       => array( 'تدوير_فايل_متكرر' ),
        'Filepath'                  => array( 'مسار_ملف' ),
        'Import'                    => array( 'استوراد' ),
        'Invalidateemail'           => array( 'تعطيل_الايميل' ),
+       'JavaScriptTest'            => array( 'تجربه_جافا_سكريبت' ),
        'BlockList'                 => array( 'ليستة_البلوك', 'بيّن_البلوك', 'ليستة_بلوك_IP' ),
        'LinkSearch'                => array( 'تدوير_اللينكات' ),
        'Listadmins'                => array( 'عرض_الاداريين' ),
@@ -77,6 +85,7 @@ $specialPageAliases = array(
        'MIMEsearch'                => array( 'تدوير_MIME' ),
        'Mostcategories'            => array( 'اكتر_تصانيف' ),
        'Mostimages'                => array( 'اكتر_فايلات_معمول_ليها_لينك', 'اكتر_فايلات', 'اكتر_صور' ),
+       'Mostinterwikis'            => array( 'اكتر_إنترويكى' ),
        'Mostlinked'                => array( 'اكتر_صفح_معمول_ليها_لينك' ),
        'Mostlinkedcategories'      => array( 'اكتر_تصانيف_معمول_ليها_لينك', 'اكتر_تصانيف_مستعمله' ),
        'Mostlinkedtemplates'       => array( 'اكتر_قوالب_معمول_ليها_لينك', 'اكتر_قوالب_مستعمله' ),
@@ -86,23 +95,33 @@ $specialPageAliases = array(
        'MyLanguage'                => array( 'اللغة_بتاعتى' ),
        'Mypage'                    => array( 'صفحتى' ),
        'Mytalk'                    => array( 'مناقشتى' ),
+       'Myuploads'                 => array( 'مرفوعاتى', 'فايلاتى' ),
        'Newimages'                 => array( 'فايلات_جديده', 'صور_جديده' ),
        'Newpages'                  => array( 'صفح_جديده' ),
+       'PagesWithProp'             => array( 'صفحات_بخاصيه' ),
+       'PageLanguage'              => array( 'لغه_الصفحه' ),
+       'PasswordReset'             => array( 'ضبط_الباسوورد' ),
+       'PermanentLink'             => array( 'وصله_دايمه' ),
        'Popularpages'              => array( 'صفح_مشهوره' ),
        'Preferences'               => array( 'تفضيلات' ),
        'Prefixindex'               => array( 'فهرس_بدايه' ),
        'Protectedpages'            => array( 'صفح_محميه' ),
        'Protectedtitles'           => array( 'عناوين_محميه' ),
        'Randompage'                => array( 'عشوائى', 'صفحه_عشوائيه' ),
+       'RandomInCategory'          => array( 'عشوائى_جوه_تصنيف' ),
        'Randomredirect'            => array( 'تحويله_عشوائيه' ),
        'Recentchanges'             => array( 'اخر_تعديلات' ),
        'Recentchangeslinked'       => array( 'اجدد_التغييرات_اللى_معمول_ليها_لينك', 'تغييرات_مرتبطه' ),
+       'Redirect'                  => array( 'تحويل' ),
+       'ResetTokens'               => array( 'ضبط_المفاتيح' ),
        'Revisiondelete'            => array( 'مسح_نسخه' ),
+       'RunJobs'                   => array( 'تشغيل_الوظايف' ),
        'Search'                    => array( 'تدوير' ),
        'Shortpages'                => array( 'صفح_قصيره' ),
        'Specialpages'              => array( 'صفح_مخصوصه' ),
        'Statistics'                => array( 'احصائيات' ),
        'Tags'                      => array( 'وسوم' ),
+       'TrackingCategories'        => array( 'تصنيفات_التتبع' ),
        'Unblock'                   => array( 'رفع_منع' ),
        'Uncategorizedcategories'   => array( 'تصانيف_مش_متصنفه' ),
        'Uncategorizedimages'       => array( 'فايلات_مش_متصنفه', 'صور_مش_متصنفه' ),
@@ -115,6 +134,7 @@ $specialPageAliases = array(
        'Unusedtemplates'           => array( 'قوالب_مش_مستعمله' ),
        'Unwatchedpages'            => array( 'صفح_مش_متراقبه' ),
        'Upload'                    => array( 'رفع' ),
+       'UploadStash'               => array( 'رفع_مخفى' ),
        'Userlogin'                 => array( 'دخول_اليوزر' ),
        'Userlogout'                => array( 'خروج_اليوزر' ),
        'Userrights'                => array( 'حقوق_اليوزر', 'ترقية_سيسوپ', 'ترقية_بوت' ),
@@ -130,11 +150,11 @@ $specialPageAliases = array(
 
 $magicWords = array(
        'redirect'                  => array( '0', '#تحويل', '#REDIRECT' ),
-       'notoc'                     => array( '0', '__لافهرس__', '__NOTOC__' ),
-       'nogallery'                 => array( '0', '__لامعرض__', '__NOGALLERY__' ),
+       'notoc'                     => array( '0', '__Ù\85Ù\86_غÙ\8aر_Ù\81Ù\87رس__', '__Ù\84اÙ\81Ù\87رس__', '__NOTOC__' ),
+       'nogallery'                 => array( '0', '__Ù\85Ù\86_غÙ\8aر_Ù\85عرض__', '__Ù\84اÙ\85عرض__', '__NOGALLERY__' ),
        'forcetoc'                  => array( '0', '__لصق_فهرس__', '__FORCETOC__' ),
        'toc'                       => array( '0', '__فهرس__', '__TOC__' ),
-       'noeditsection'             => array( '0', '__لاتحريرقسم__', '__NOEDITSECTION__' ),
+       'noeditsection'             => array( '0', '__Ù\85Ù\86_غÙ\8aر_تحرÙ\8aرÙ\82سÙ\85__', '__Ù\84اتحرÙ\8aرÙ\82سÙ\85__', '__NOEDITSECTION__' ),
        'currentmonth'              => array( '1', 'شهر_حالى', 'شهر_حالي2', 'شهر_حالي', 'CURRENTMONTH', 'CURRENTMONTH2' ),
        'currentmonth1'             => array( '1', 'شهر_حالي1', 'CURRENTMONTH1' ),
        'currentmonthname'          => array( '1', 'اسم_الشهر_الحالى', 'اسم_الشهر_الحالي', 'CURRENTMONTHNAME' ),
@@ -145,7 +165,7 @@ $magicWords = array(
        'currentdayname'            => array( '1', 'اسم_اليوم_الحالى', 'اسم_اليوم_الحالي', 'CURRENTDAYNAME' ),
        'currentyear'               => array( '1', 'عام_حالى', 'عام_حالي', 'CURRENTYEAR' ),
        'currenttime'               => array( '1', 'وقت_حالى', 'وقت_حالي', 'CURRENTTIME' ),
-       'currenthour'               => array( '1', 'ساعة_حالية', 'CURRENTHOUR' ),
+       'currenthour'               => array( '1', 'ساعه_حاليه', 'ساعة_حالية', 'CURRENTHOUR' ),
        'localmonth'                => array( '1', 'شهر_محلى', 'شهر_محلي2', 'شهر_محلي', 'LOCALMONTH', 'LOCALMONTH2' ),
        'localmonth1'               => array( '1', 'شهر_محلى1', 'شهر_محلي1', 'LOCALMONTH1' ),
        'localmonthname'            => array( '1', 'اسم_الشهر_المحلى', 'اسم_شهر_محلى', 'اسم_الشهر_المحلي', 'اسم_شهر_محلي', 'LOCALMONTHNAME' ),
@@ -156,36 +176,38 @@ $magicWords = array(
        'localdayname'              => array( '1', 'اسم_اليوم_المحلى', 'اسم_يوم_محلى', 'اسم_اليوم_المحلي', 'اسم_يوم_محلي', 'LOCALDAYNAME' ),
        'localyear'                 => array( '1', 'عام_محلى', 'عام_محلي', 'LOCALYEAR' ),
        'localtime'                 => array( '1', 'وقت_محلى', 'وقت_محلي', 'LOCALTIME' ),
-       'localhour'                 => array( '1', 'ساعة_محلية', 'LOCALHOUR' ),
+       'localhour'                 => array( '1', 'ساعه_محليه', 'ساعة_محلية', 'LOCALHOUR' ),
        'numberofpages'             => array( '1', 'عدد_الصفحات', 'NUMBEROFPAGES' ),
        'numberofarticles'          => array( '1', 'عدد_المقالات', 'NUMBEROFARTICLES' ),
        'numberoffiles'             => array( '1', 'عدد_الملفات', 'NUMBEROFFILES' ),
-       'numberofusers'             => array( '1', 'عدد_المستخدمين', 'NUMBEROFUSERS' ),
-       'numberofactiveusers'       => array( '1', 'عدد_المستخدمين_النشطين', 'NUMBEROFACTIVEUSERS' ),
+       'numberofusers'             => array( '1', 'عدد_اÙ\84Ù\8aÙ\88زرات', 'عدد_اÙ\84Ù\85ستخدÙ\85Ù\8aÙ\86', 'NUMBEROFUSERS' ),
+       'numberofactiveusers'       => array( '1', 'عدد_اÙ\84Ù\8aÙ\88زرات_اÙ\84Ù\86شطÙ\8aÙ\86', 'عدد_اÙ\84Ù\85ستخدÙ\85Ù\8aÙ\86_اÙ\84Ù\86شطÙ\8aÙ\86', 'NUMBEROFACTIVEUSERS' ),
        'numberofedits'             => array( '1', 'عدد_التعديلات', 'NUMBEROFEDITS' ),
-       'numberofviews'             => array( '1', 'عدد_المشاهدات', 'NUMBEROFVIEWS' ),
-       'pagename'                  => array( '1', 'اسم_الصفحة', 'PAGENAME' ),
-       'pagenamee'                 => array( '1', 'عنوان_الصفحة', 'PAGENAMEE' ),
+       'pagename'                  => array( '1', 'اسم_الصفحه', 'اسم_الصفحة', 'PAGENAME' ),
+       'pagenamee'                 => array( '1', 'عنوان_الصفحه', 'عنوان_الصفحة', 'PAGENAMEE' ),
        'namespace'                 => array( '1', 'نطاق', 'NAMESPACE' ),
        'namespacee'                => array( '1', 'عنوان_نطاق', 'NAMESPACEE' ),
-       'talkspace'                 => array( '1', 'نطاق_النقاش', 'TALKSPACE' ),
-       'talkspacee'                => array( '1', 'عنوان_النقاش', 'TALKSPACEE' ),
-       'subjectspace'              => array( '1', 'نطاق_الموضوع', 'نطاق_المقالة', 'SUBJECTSPACE', 'ARTICLESPACE' ),
-       'subjectspacee'             => array( '1', 'عنوان_نطاق_الموضوع', 'عنوان_نطاق_المقالة', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+       'namespacenumber'           => array( '1', 'عدد_نطاق', 'NAMESPACENUMBER' ),
+       'talkspace'                 => array( '1', 'نطاق_المناقشه', 'نطاق_النقاش', 'TALKSPACE' ),
+       'talkspacee'                => array( '1', 'عنوان_المناقشه', 'عنوان_النقاش', 'TALKSPACEE' ),
+       'subjectspace'              => array( '1', 'نطاق_الموضوع', 'نطاق_المقاله', 'نطاق_المقالة', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+       'subjectspacee'             => array( '1', 'عنوان_نطاق_الموضوع', 'عنوان_نطاق_المقاله', 'عنوان_نطاق_المقالة', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
        'fullpagename'              => array( '1', 'اسم_الصفحة_الكامل', 'اسم_صفحة_كامل', 'اسم_كامل', 'FULLPAGENAME' ),
-       'fullpagenamee'             => array( '1', 'عنوان_الصفحة_الكامل', 'عنوان_صفحة_كامل', 'عنوان_كامل', 'FULLPAGENAMEE' ),
-       'subpagename'               => array( '1', 'اسم_الصفحة_الفرعي', 'SUBPAGENAME' ),
-       'subpagenamee'              => array( '1', 'عنوان_الصفحة_الفرعى', 'عنوان_الصفحة_الفرعي', 'SUBPAGENAMEE' ),
-       'basepagename'              => array( '1', 'اسم_الصفحة_الأساسى', 'اسم_الصفحة_الأساسي', 'BASEPAGENAME' ),
-       'basepagenamee'             => array( '1', 'عنوان_الصفحة_الأساسى', 'عنوان_الصفحة_الأساسي', 'BASEPAGENAMEE' ),
-       'talkpagename'              => array( '1', 'اسم_صفحة_النقاش', 'TALKPAGENAME' ),
-       'talkpagenamee'             => array( '1', 'عنوان_صفحة_النقاش', 'TALKPAGENAMEE' ),
-       'subjectpagename'           => array( '1', 'اسم_صفحة_الموضوع', 'اسم_صفحة_المقالة', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
-       'subjectpagenamee'          => array( '1', 'عنوان_صفحة_الموضوع', 'عنوان_صفحة_المقالة', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
-       'msg'                       => array( '0', 'رسالة:', 'MSG:' ),
+       'fullpagenamee'             => array( '1', 'عنوان_الصفحه_الكامل', 'عنوان_صفحة_كامل', 'عنوان_كامل', 'عنوان_الصفحة_الكامل', 'FULLPAGENAMEE' ),
+       'subpagename'               => array( '1', 'اسم_الصفحه_الفرعي', 'اسم_الصفحة_الفرعي', 'SUBPAGENAME' ),
+       'subpagenamee'              => array( '1', 'عنوان_الصفحه_الفرعى', 'عنوان_الصفحه_الفرعي', 'عنوان_الصفحة_الفرعي', 'SUBPAGENAMEE' ),
+       'rootpagename'              => array( '1', 'جدر_اسم_الصفحه', 'جذر_اسم_الصفحة', 'ROOTPAGENAME' ),
+       'rootpagenamee'             => array( '1', 'عنوان_جدر_الصفحه', 'ROOTPAGENAMEE' ),
+       'basepagename'              => array( '1', 'اسم_الصفحه_الأساسى', 'اسم_الصفحة_الأساسي', 'BASEPAGENAME' ),
+       'basepagenamee'             => array( '1', 'عنوان_الصفحه_الأساسى', 'عنوان_الصفحة_الأساسي', 'BASEPAGENAMEE' ),
+       'talkpagename'              => array( '1', 'اسم_صفحه_المناقشه', 'اسم_صفحة_النقاش', 'TALKPAGENAME' ),
+       'talkpagenamee'             => array( '1', 'عنوان_صفحه_المناقشه', 'عنوان_صفحة_النقاش', 'TALKPAGENAMEE' ),
+       'subjectpagename'           => array( '1', 'اسم_صفحه_الموضوع', 'اسم_صفحه_المقاله', 'اسم_صفحة_الموضوع', 'اسم_صفحة_المقالة', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+       'subjectpagenamee'          => array( '1', 'عنوان_صفحه_الموضوع', 'عنوان_صفحه_المقاله', 'عنوان_صفحة_الموضوع', 'عنوان_صفحة_المقالة', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+       'msg'                       => array( '0', 'رساله:', 'رسالة:', 'MSG:' ),
        'subst'                     => array( '0', 'نسخ:', 'إحلال:', 'SUBST:' ),
        'safesubst'                 => array( '0', 'نسخ_آمن:', 'SAFESUBST:' ),
-       'msgnw'                     => array( '0', 'مصدر:', 'مصدر_قالب:', 'رسالة_بدون_تهيئة:', 'MSGNW:' ),
+       'msgnw'                     => array( '0', 'رسالة_من_غير_تهيئه:', 'رسالة_بدون_تهيئة:', 'MSGNW:' ),
        'img_thumbnail'             => array( '1', 'تصغير', 'مصغر', 'thumbnail', 'thumb' ),
        'img_manualthumb'           => array( '1', 'تصغير=$1', 'مصغر=$1', 'thumbnail=$1', 'thumb=$1' ),
        'img_right'                 => array( '1', 'يمين', 'right' ),
@@ -194,11 +216,12 @@ $magicWords = array(
        'img_width'                 => array( '1', '$1بك', '$1عن', '$1px' ),
        'img_center'                => array( '1', 'مركز', 'center', 'centre' ),
        'img_framed'                => array( '1', 'إطار', 'بإطار', 'framed', 'enframed', 'frame' ),
-       'img_frameless'             => array( '1', 'لاإطار', 'frameless' ),
-       'img_page'                  => array( '1', 'صفحة=$1', 'صفحة $1', 'صفحة_$1', 'page=$1', 'page $1' ),
-       'img_upright'               => array( '1', 'معدول', 'معدول=$1', 'معدول $1', 'معدول_$1', 'upright', 'upright=$1', 'upright $1' ),
+       'img_frameless'             => array( '1', 'من_غير_اطار', 'لاإطار', 'frameless' ),
+       'img_lang'                  => array( '1', 'لغه=$1', 'لغة=$1', 'lang=$1' ),
+       'img_page'                  => array( '1', 'صفح=$1', 'صفحه_$1', 'صفحة=$1', 'صفحة_$1', 'page=$1', 'page $1' ),
+       'img_upright'               => array( '1', 'معدول', 'معدول=$1', 'معدول_$1', 'upright', 'upright=$1', 'upright $1' ),
        'img_border'                => array( '1', 'حد', 'حدود', 'border' ),
-       'img_baseline'              => array( '1', 'خط_Ø£ساسى', 'خط_أساسي', 'baseline' ),
+       'img_baseline'              => array( '1', 'خط_اساسى', 'خط_أساسي', 'baseline' ),
        'img_sub'                   => array( '1', 'فرعى', 'فرعي', 'sub' ),
        'img_super'                 => array( '1', 'سوبر', 'سب', 'super', 'sup' ),
        'img_top'                   => array( '1', 'أعلى', 'top' ),
@@ -208,35 +231,41 @@ $magicWords = array(
        'img_text_bottom'           => array( '1', 'نص_أسفل', 'text-bottom' ),
        'img_link'                  => array( '1', 'وصلة=$1', 'رابط=$1', 'link=$1' ),
        'img_alt'                   => array( '1', 'بديل=$1', 'alt=$1' ),
+       'img_class'                 => array( '1', 'رتبه=$1', 'رتبة=$1', 'class=$1' ),
        'int'                       => array( '0', 'محتوى:', 'INT:' ),
        'sitename'                  => array( '1', 'اسم_الموقع', 'اسم_موقع', 'SITENAME' ),
        'ns'                        => array( '0', 'نط:', 'NS:' ),
        'nse'                       => array( '0', 'نطم:', 'NSE:' ),
        'localurl'                  => array( '0', 'مسار_محلى:', 'مسار_محلي:', 'LOCALURL:' ),
        'localurle'                 => array( '0', 'عنوان_المسار_المحلى:', 'عنوان_المسار_المحلي:', 'LOCALURLE:' ),
+       'articlepath'               => array( '0', 'مسار_المقاله', 'مسار_المقالة', 'ARTICLEPATH' ),
+       'pageid'                    => array( '0', 'رقم_صفحه', 'رقم_صفحة', 'PAGEID' ),
        'server'                    => array( '0', 'خادم', 'SERVER' ),
        'servername'                => array( '0', 'اسم_الخادم', 'SERVERNAME' ),
        'scriptpath'                => array( '0', 'مسار_السكريبت', 'مسار_سكريبت', 'SCRIPTPATH' ),
        'stylepath'                 => array( '0', 'مسار_الهيئة', 'STYLEPATH' ),
        'grammar'                   => array( '0', 'قواعد_اللغة:', 'GRAMMAR:' ),
        'gender'                    => array( '0', 'نوع:', 'GENDER:' ),
-       'notitleconvert'            => array( '0', '__Ù\84اتحÙ\88Ù\8aÙ\84_عÙ\86Ù\88اÙ\86__', '__Ù\84اتع__', '__NOTITLECONVERT__', '__NOTC__' ),
-       'nocontentconvert'          => array( '0', '__Ù\84اتحÙ\88Ù\8aÙ\84\85حتÙ\88Ù\89__', '__Ù\84اتÙ\85__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+       'notitleconvert'            => array( '0', '__Ù\85Ù\86_غÙ\8aرتحÙ\88Ù\8aÙ\84_عÙ\86Ù\88اÙ\86__', '__Ù\84اتع__', '__Ù\84اتحÙ\88Ù\8aÙ\84_عÙ\86Ù\88اÙ\86__', '__NOTITLECONVERT__', '__NOTC__' ),
+       'nocontentconvert'          => array( '0', '__Ù\85Ù\86_غÙ\8aر_تحÙ\88Ù\8aÙ\84\85حتÙ\88Ù\89__', '__Ù\84اتÙ\85__', '__Ù\84اتحÙ\88Ù\8aÙ\84\85حتÙ\88Ù\89__', '__NOCONTENTCONVERT__', '__NOCC__' ),
        'currentweek'               => array( '1', 'أسبوع_حالى', 'أسبوع_حالي', 'CURRENTWEEK' ),
        'currentdow'                => array( '1', 'يوم_حالى_مأ', 'يوم_حالي_مأ', 'CURRENTDOW' ),
        'localweek'                 => array( '1', 'أسبوع_محلى', 'أسبوع_محلي', 'LOCALWEEK' ),
        'localdow'                  => array( '1', 'يوم_محلى_مأ', 'يوم_محلي_مأ', 'LOCALDOW' ),
-       'revisionid'                => array( '1', 'رقم_المراجعة', 'REVISIONID' ),
-       'revisionday'               => array( '1', 'يوم_المراجعة', 'REVISIONDAY' ),
-       'revisionday2'              => array( '1', 'يوم_المراجعة2', 'REVISIONDAY2' ),
-       'revisionmonth'             => array( '1', 'شهر_المراجعة', 'REVISIONMONTH' ),
-       'revisionmonth1'            => array( '1', 'شهر_المراجعة1', 'REVISIONMONTH1' ),
-       'revisionyear'              => array( '1', 'عام_المراجعة', 'REVISIONYEAR' ),
-       'revisiontimestamp'         => array( '1', 'طابع_وقت_المراجعة', 'REVISIONTIMESTAMP' ),
-       'revisionuser'              => array( '1', 'مستخدم_المراجعة', 'REVISIONUSER' ),
+       'revisionid'                => array( '1', 'رقم_المراجعه', 'رقم_المراجعة', 'REVISIONID' ),
+       'revisionday'               => array( '1', 'يوم_المراجعه', 'يوم_المراجعة', 'REVISIONDAY' ),
+       'revisionday2'              => array( '1', 'يوم_المراجعه2', 'يوم_المراجعة2', 'REVISIONDAY2' ),
+       'revisionmonth'             => array( '1', 'شهر_المراجعه', 'شهر_المراجعة', 'REVISIONMONTH' ),
+       'revisionmonth1'            => array( '1', 'شهر_المراجعه1', 'شهر_المراجعة1', 'REVISIONMONTH1' ),
+       'revisionyear'              => array( '1', 'عام_المراجعه', 'عام_المراجعة', 'REVISIONYEAR' ),
+       'revisiontimestamp'         => array( '1', 'طابع_وقت_المراجعه', 'طابع_وقت_المراجعة', 'REVISIONTIMESTAMP' ),
+       'revisionuser'              => array( '1', 'مستخدم_المراجعه', 'مستخدم_المراجعة', 'REVISIONUSER' ),
+       'revisionsize'              => array( '1', 'حجم_المراجعه', 'حجم_المراجعة', 'REVISIONSIZE' ),
        'plural'                    => array( '0', 'جمع:', 'PLURAL:' ),
        'fullurl'                   => array( '0', 'عنوان_كامل:', 'FULLURL:' ),
        'fullurle'                  => array( '0', 'مسار_كامل:', 'FULLURLE:' ),
+       'canonicalurl'              => array( '0', 'عنوان_قاعده:', 'عنوان_قاعدة:', 'CANONICALURL:' ),
+       'canonicalurle'             => array( '0', 'مسار_قاعده:', 'مسار_قاعدة:', 'CANONICALURLE:' ),
        'lcfirst'                   => array( '0', 'عنوان_كبير:', 'LCFIRST:' ),
        'ucfirst'                   => array( '0', 'عنوان_صغير:', 'UCFIRST:' ),
        'lc'                        => array( '0', 'صغير:', 'LC:' ),
@@ -244,9 +273,10 @@ $magicWords = array(
        'raw'                       => array( '0', 'خام:', 'RAW:' ),
        'displaytitle'              => array( '1', 'عرض_العنوان', 'DISPLAYTITLE' ),
        'rawsuffix'                 => array( '1', 'أر', 'آر', 'R' ),
+       'nocommafysuffix'           => array( '0', 'من-غير_سيب', 'NOSEP' ),
        'newsectionlink'            => array( '1', '__وصلة_قسم_جديد__', '__NEWSECTIONLINK__' ),
-       'nonewsectionlink'          => array( '1', '__Ù\84ا_وصلة_قسم_جديد__', 'لا_وصلة_قسم_جديد__', '__NONEWSECTIONLINK__' ),
-       'currentversion'            => array( '1', 'نسخة_حالية', 'CURRENTVERSION' ),
+       'nonewsectionlink'          => array( '1', '__Ù\85Ù\86_غÙ\8aر_Ù\88صÙ\84Ø©_Ù\82سÙ\85_جدÙ\8aد__', 'Ù\85Ù\86_غÙ\8aر_وصلة_قسم_جديد__', 'لا_وصلة_قسم_جديد__', '__NONEWSECTIONLINK__' ),
+       'currentversion'            => array( '1', 'نسخه_حاليه', 'نسخة_حالية', 'CURRENTVERSION' ),
        'urlencode'                 => array( '0', 'كود_المسار:', 'URLENCODE:' ),
        'anchorencode'              => array( '0', 'كود_الأنكور', 'ANCHORENCODE' ),
        'currenttimestamp'          => array( '1', 'طابع_الوقت_الحالي', 'CURRENTTIMESTAMP' ),
@@ -260,6 +290,7 @@ $magicWords = array(
        'padleft'                   => array( '0', 'باد_يسار', 'PADLEFT' ),
        'padright'                  => array( '0', 'باد_يمين', 'PADRIGHT' ),
        'special'                   => array( '0', 'خاص', 'special' ),
+       'speciale'                  => array( '0', 'عنوان_خاص', 'speciale' ),
        'defaultsort'               => array( '1', 'ترتيب_قياسى:', 'ترتيب_افتراضى:', 'مفتاح_ترتيب_قياسى:', 'مفتاح_ترتيب_افتراضى:', 'ترتيب_تصنيف_قياسى:', 'ترتيب_تصنيف_افتراضى:', 'ترتيب_قياسي:', 'ترتيب_افتراضي:', 'مفتاح_ترتيب_قياسي:', 'مفتاح_ترتيب_افتراضي:', 'ترتيب_تصنيف_قياسي:', 'ترتيب_تصنيف_افتراضي:', 'ترتيب_غيابي:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
        'filepath'                  => array( '0', 'مسار_الملف:', 'FILEPATH:' ),
        'tag'                       => array( '0', 'وسم', 'tag' ),
@@ -268,13 +299,22 @@ $magicWords = array(
        'pagesize'                  => array( '1', 'حجم_الصفحة', 'PAGESIZE' ),
        'index'                     => array( '1', '__فهرسة__', '__INDEX__' ),
        'noindex'                   => array( '1', '__لافهرسة__', '__NOINDEX__' ),
-       'numberingroup'             => array( '1', 'عدد_فى_المجموعة', 'عدد_فى_مجموعة', 'عدد_في_المجموعة', 'عدد_في_مجموعة', 'NUMBERINGROUP', 'NUMINGROUP' ),
-       'staticredirect'            => array( '1', '__تحويلة_إستاتيكية__', '__تحويلة_ساكنة__', '__STATICREDIRECT__' ),
-       'protectionlevel'           => array( '1', 'مستوى_الحماية', 'PROTECTIONLEVEL' ),
-       'formatdate'                => array( '0', 'تهيئة_التاريخ', 'تهيئة_تاريخ', 'formatdate', 'dateformat' ),
+       'numberingroup'             => array( '1', 'عدد_فى_المجموعه', 'عدد_فى_مجموعه', 'عدد_في_المجموعه', 'عدد_في_مجموعة', 'عدد_في_المجموعة', 'NUMBERINGROUP', 'NUMINGROUP' ),
+       'staticredirect'            => array( '1', '__تحويله_إستاتيكيه__', '__تحويله_ساكنه__', '__تحويلة_إستاتيكية__', '__تحويلة_ساكنة__', '__STATICREDIRECT__' ),
+       'protectionlevel'           => array( '1', 'مستوى_الحمايه', 'مستوى_الحماية', 'PROTECTIONLEVEL' ),
+       'cascadingsources'          => array( '1', 'مصادر_متضمنه', 'CASCADINGSOURCES' ),
+       'formatdate'                => array( '0', 'تهيئه_التاريخ', 'تهيئه_تاريخ', 'تهيئة_التاريخ', 'تهيئة_تاريخ', 'formatdate', 'dateformat' ),
        'url_path'                  => array( '0', 'مسار', 'PATH' ),
        'url_wiki'                  => array( '0', 'ويكى', 'ويكي', 'WIKI' ),
        'url_query'                 => array( '0', 'استعلام', 'QUERY' ),
+       'defaultsort_noerror'       => array( '0', 'من_غير_غلط', 'لاخطأ', 'noerror' ),
+       'defaultsort_noreplace'     => array( '0', 'ماتستبدلش', 'لاتستبدل', 'noreplace' ),
+       'displaytitle_noerror'      => array( '0', 'لا_غلطه', 'noerror' ),
+       'displaytitle_noreplace'    => array( '0', 'لا_استبدال', 'noreplace' ),
+       'pagesincategory_all'       => array( '0', 'كل', 'all' ),
+       'pagesincategory_pages'     => array( '0', 'صفحات', 'pages' ),
+       'pagesincategory_subcats'   => array( '0', 'تصنيفات_فرعيه', 'تصنيفات_فرعية', 'subcats' ),
+       'pagesincategory_files'     => array( '0', 'فايلات', 'ملفات', 'files' ),
 );
 
 // (bug 16469) Override Eastern Arabic numberals, use Western
index 824242b..a584ba5 100644 (file)
@@ -49,6 +49,7 @@ $namespaceAliases = array(
 $specialPageAliases = array(
        'Block'                     => array( 'Bloquiar', 'BloquiarIP', 'BloquiarUsuariu' ),
        'Log'                       => array( 'Rexistru', 'Rexistros' ),
+       'Recentchanges'             => array( 'CambeosRecientes' ),
        'Search'                    => array( 'Gueta' ),
        'Statistics'                => array( 'Estadístiques' ),
 );
index d3e5134..ea64271 100644 (file)
 
 $fallback = 'ru';
 
+$specialPageAliases = array(
+       'Activeusers'               => array( 'ХІаракатчилъи_бугел_гІахьалчагІи' ),
+       'Allmessages'               => array( 'Системаялъулал_баян_кьеял' ),
+       'AllMyUploads'              => array( 'Киналго_дир_файлал' ),
+       'Allpages'                  => array( 'Киналго_гьумерал' ),
+       'Badtitle'                  => array( 'БукІине_бегьулареб_цІар' ),
+       'Blankpage'                 => array( 'ЧІобогояб_гьумер' ),
+       'Block'                     => array( 'Блокалада_лъезе' ),
+       'Booksources'               => array( 'ТІахьазул_иццал' ),
+       'BrokenRedirects'           => array( 'Рек-рекарал_цоги_бакІалде_руссинариял' ),
+       'Categories'                => array( 'Категориял' ),
+       'ChangeEmail'               => array( 'e-mail_хисизе', 'Почта_хисизе' ),
+       'ChangePassword'            => array( 'Балъгояб_рагІи_хисизе' ),
+       'ComparePages'              => array( 'Гьумеразул_дандекквей' ),
+       'Confirmemail'              => array( 'E-mail_битІухъ_гьаби', 'почта_битІухъ_гьаби' ),
+       'Contributions'             => array( 'Хазина' ),
+       'CreateAccount'             => array( 'Учёталъулаб_Хъвай-хъвагІай_гІуцІцІизе', 'ГІахьалчи_гІуцІцІизе', 'Регистрация_гьабизе' ),
+       'Deadendpages'              => array( 'Нух_къарал_гьумерал' ),
+       'DeletedContributions'      => array( 'Нахъе_гьабураб_хазина' ),
+       'Diff'                      => array( 'Хиса-басиял' ),
+       'DoubleRedirects'           => array( 'КІицІулго_цоги_бакІалде_руссинариял' ),
+       'EditWatchlist'             => array( 'Халкквеялъул_сияхІ_хисизабизе' ),
+       'Emailuser'                 => array( 'ГІахьалчиясухъе_кагъат', 'Кагъат_битІизе' ),
+       'ExpandTemplates'           => array( 'Шаблонал_кколе-кколелъуре_ккезари' ),
+       'Export'                    => array( 'КъватІибе_битІи', 'ЧIехьей' ),
+       'Fewestrevisions'           => array( 'КъанагІат_хиса-баси_гьарулел' ),
+       'FileDuplicateSearch'       => array( 'Релъарал_файлал_хъирщи' ),
+       'Filepath'                  => array( 'Файлалде_нух' ),
+       'Import'                    => array( 'Импорт' ),
+       'Invalidateemail'           => array( 'Адрес_битІухъ_гьаби_нахъ_чІвазе' ),
+       'JavaScriptTest'            => array( 'JavaScript_хІалбихьи' ),
+       'BlockList'                 => array( 'Блокалда_лъеялъул_сияхІ', 'Блокалда_лъеял' ),
+       'LinkSearch'                => array( 'Ссылкаби_хъирщи' ),
+       'Listbots'                  => array( 'Ботазул_сияхІ' ),
+       'Listfiles'                 => array( 'Файлазул_сияхІ', 'Суратазул_сияхІ' ),
+       'Listgrouprights'           => array( 'ГІахьалчагІазул_группабазул_ихтиярал', 'Группабазул_ихтияразул_сияхІ' ),
+       'Listredirects'             => array( 'Цоги_бакІалде_руссинабиязул_сияхІ' ),
+       'ListDuplicatedFiles'       => array( 'Релъарал_файлазул_сияхІ' ),
+       'Listusers'                 => array( 'ГІахьалчагІазул_сияхІ' ),
+       'Lockdb'                    => array( 'ХІБ_блокалда_лъезе', 'ХІужжабазул_база_блокалда_лъезе' ),
+       'Log'                       => array( 'Журналал', 'Журнал' ),
+       'Lonelypages'               => array( 'БатІатІурал_гьумерал' ),
+       'Longpages'                 => array( 'Халатал_гьумерал' ),
+       'MergeHistory'              => array( 'Тарихал_цо_гьари' ),
+       'MIMEsearch'                => array( 'MIME_ялдалъул_хъирщи' ),
+       'Mostcategories'            => array( 'Бищунго_категориял_цІикІкІарал' ),
+       'Mostimages'                => array( 'Бищунго_хІалтІизарулел_файлал' ),
+       'Mostinterwikis'            => array( 'Интервики-ссылкабазул_бищун_цІикІкІараб_къадар' ),
+       'Mostlinked'                => array( 'Бищунго_хІалтІизарулел_гьумерал' ),
+       'Mostlinkedcategories'      => array( 'Бищунго_хІалтІизарулел_категориял' ),
+       'Mostlinkedtemplates'       => array( 'Бищунго_хІалтІизарулел_шаблонал' ),
+       'Mostrevisions'             => array( 'Сверелазул_бищун_цІикІкІараб_къадар' ),
+       'Movepage'                  => array( 'Гьумералда_цІар_хисизабизе', 'ЦІар_хисизаби', 'ЦІар_хисизе' ),
+       'Mycontributions'           => array( 'Дир_хазина' ),
+       'MyLanguage'                => array( 'Дир_мацІ' ),
+       'Mypage'                    => array( 'Дир_гьумер' ),
+       'Mytalk'                    => array( 'Дир_бахІс' ),
+       'Myuploads'                 => array( 'Дица_жанире_цІарал_жал' ),
+       'Newimages'                 => array( 'ЦІиял_файлал' ),
+       'Newpages'                  => array( 'ЦІиял_гьумерал' ),
+       'PasswordReset'             => array( 'Сброс_пароля' ),
+       'PermanentLink'             => array( 'Даимаб_ссылка' ),
+       'Popularpages'              => array( 'Машгьурал_гьумерал' ),
+       'Preferences'               => array( 'Рекъезабиял' ),
+       'Prefixindex'               => array( 'ЦІаразул_бетІералде_бихьизаби' ),
+       'Protectedpages'            => array( 'ЦІунарал_гьумерал' ),
+       'Protectedtitles'           => array( 'ЦІунарал_цІарал' ),
+       'Randompage'                => array( 'Цебе_ккараб_гьумер', 'Цебе_ккараб' ),
+       'Randomredirect'            => array( 'Цебе_ккараб_цоги_бакІалде_руссинаби' ),
+       'Recentchanges'             => array( 'ЦІиял_хиса-басиял' ),
+       'Recentchangeslinked'       => array( 'Хурхинарурал_хиса-басиял' ),
+       'Revisiondelete'            => array( 'Хиса-баси_нахъе_бацІцІи' ),
+       'Search'                    => array( 'Хъирщи' ),
+       'Shortpages'                => array( 'Къокъал_гьумерал' ),
+       'Specialpages'              => array( 'Хассал_гьумерал' ),
+       'Statistics'                => array( 'Статистика' ),
+       'Tags'                      => array( 'ГІужал' ),
+       'Unblock'                   => array( 'Блокалдаса_бахъи' ),
+       'Uncategorizedcategories'   => array( 'Категориял_гьечІел_категориял' ),
+       'Uncategorizedimages'       => array( 'Категориял_гьечІел_файлал' ),
+       'Uncategorizedpages'        => array( 'Категориял_гьечІел_гьумерал' ),
+       'Uncategorizedtemplates'    => array( 'Категориял_гьечІе_шаблонал' ),
+       'Undelete'                  => array( 'ТІадбуссинабизе', 'ТІадбуссинаби' ),
+       'Unlockdb'                  => array( 'ХІБ_блокалдаса_бахъи' ),
+       'Unusedcategories'          => array( 'ХІалтІизаруларел_категориял' ),
+       'Unusedimages'              => array( 'ХІалтІизаруларел_файлал' ),
+       'Unusedtemplates'           => array( 'ХІалтІизаруларел_шаблонал' ),
+       'Upload'                    => array( 'Загрузка' ),
+       'UploadStash'               => array( 'Бахчараб_загрузка' ),
+       'Userlogin'                 => array( 'Жаниве_лъугьин' ),
+       'Userlogout'                => array( 'Сеанс_лъугІи', 'КъватІиве_лъугьин' ),
+       'Userrights'                => array( 'Ихтиярал_рилълъинари' ),
+       'Version'                   => array( 'Сверел', 'Версия' ),
+       'Wantedcategories'          => array( 'ХІажатал_категориял' ),
+       'Wantedfiles'               => array( 'ХІажатал_файлал' ),
+       'Wantedpages'               => array( 'ХІажатал_гьумерал' ),
+       'Wantedtemplates'           => array( 'ХІажатал_шаблонал' ),
+       'Watchlist'                 => array( 'Халкквеялъул_сияхІ' ),
+       'Whatlinkshere'             => array( 'Ссылкаби_гьанире' ),
+       'Withoutinterwiki'          => array( 'Интервики_гьечІого' ),
+);
index 6ff8220..5a2a7a0 100644 (file)
@@ -130,7 +130,6 @@ $magicWords = array(
        'numberofusers'             => array( '1', 'КОЛЬКАСЬЦЬ_УДЗЕЛЬНІКАЎ', 'NUMBEROFUSERS' ),
        'numberofactiveusers'       => array( '1', 'КОЛЬКАСЬЦЬ_АКТЫЎНЫХ_УДЗЕЛЬНІКАЎ', 'NUMBEROFACTIVEUSERS' ),
        'numberofedits'             => array( '1', 'КОЛЬКАСЬЦЬ_РЭДАГАВАНЬНЯЎ', 'NUMBEROFEDITS' ),
-       'numberofviews'             => array( '1', 'КОЛЬКАСЬЦЬ_ПРАГЛЯДАЎ', 'NUMBEROFVIEWS' ),
        'pagename'                  => array( '1', 'НАЗВА_СТАРОНКІ', 'PAGENAME' ),
        'pagenamee'                 => array( '1', 'НАЗВА_СТАРОНКІ_2', 'PAGENAMEE' ),
        'namespace'                 => array( '1', 'ПРАСТОРА_НАЗВАЎ', 'NAMESPACE' ),
index 3fb3606..afe608d 100644 (file)
@@ -150,7 +150,6 @@ $magicWords = array(
        'numberofusers'             => array( '1', 'БРОЙПОТРЕБИТЕЛИ', 'NUMBEROFUSERS' ),
        'numberofactiveusers'       => array( '1', 'БРОЙАКТИВНИПОТРЕБИТЕЛИ', 'NUMBEROFACTIVEUSERS' ),
        'numberofedits'             => array( '1', 'БРОЙРЕДАКЦИИ', 'NUMBEROFEDITS' ),
-       'numberofviews'             => array( '1', 'БРОЙПРЕГЛЕДИ', 'NUMBEROFVIEWS' ),
        'pagename'                  => array( '1', 'СТРАНИЦА', 'PAGENAME' ),
        'pagenamee'                 => array( '1', 'СТРАНИЦАИ', 'PAGENAMEE' ),
        'namespace'                 => array( '1', 'ИМЕННОПРОСТРАНСТВО', 'NAMESPACE' ),
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 e90797a..4c1962a 100644 (file)
@@ -27,6 +27,30 @@ $namespaceNames = array(
        NS_CATEGORY_TALK    => 'श्रेणी_वार्ता',
 );
 
+$specialPageAliases = array(
+       'Activeusers'               => array( 'सक्रिय_सदस्य' ),
+       'Allmessages'               => array( 'सारा_संदेस' ),
+       'Allpages'                  => array( 'सारा_पन्ना' ),
+       'Ancientpages'              => array( 'पुरान_पन्ना' ),
+       'Badtitle'                  => array( 'खराब_टाइटिल' ),
+       'Blankpage'                 => array( 'खाली_पन्ना' ),
+       'Categories'                => array( 'श्रेणी_सब' ),
+       'Contributions'             => array( 'योगदान' ),
+       'Export'                    => array( 'निर्यात' ),
+       'Import'                    => array( 'आयात' ),
+       'Log'                       => array( 'लॉग' ),
+       'Lonelypages'               => array( 'असंयुक्त' ),
+       'Longpages'                 => array( 'लम्बा_पन्ना' ),
+       'Mypage'                    => array( 'हमार_पन्ना' ),
+       'Mytalk'                    => array( 'हमार_बात' ),
+       'Newpages'                  => array( 'नया_पन्ना' ),
+       'Recentchangeslinked'       => array( 'तुरंत_भइल_परिवर्तन' ),
+       'Shortpages'                => array( 'छोटा_पन्ना' ),
+       'Specialpages'              => array( 'ख़ाश_पन्ना' ),
+       'TrackingCategories'        => array( 'बिनावर्गीकृत_श्रेणी' ),
+       'Uncategorizedpages'        => array( 'बिनावर्गीकृत' ),
+);
+
 $digitTransformTable = array(
        '0' => '०', # &#x0966;
        '1' => '१', # &#x0967;
@@ -39,4 +63,3 @@ $digitTransformTable = array(
        '8' => '८', # &#x096e;
        '9' => '९', # &#x096f;
 );
-
index 222399e..66cef9e 100644 (file)
@@ -115,7 +115,6 @@ $magicWords = array(
        'numberofusers'             => array( '1', 'NIVERAIMPLIJERIEN', 'NUMBEROFUSERS' ),
        'numberofactiveusers'       => array( '1', 'NIVERAIMPLIJERIENOBERIANT', 'NUMBEROFACTIVEUSERS' ),
        'numberofedits'             => array( '1', 'NIVERAZEGASEDENNOU', 'NUMBEROFEDITS' ),
-       'numberofviews'             => array( '1', 'NIVERALENNADENNOU', 'NUMBEROFVIEWS' ),
        'pagename'                  => array( '1', 'ANVPAJENN', 'PAGENAME' ),
        'pagenamee'                 => array( '1', 'ANVPAJENNSK', 'PAGENAMEE' ),
        'namespace'                 => array( '1', 'ESAOUENNANV', 'NAMESPACE' ),
index 57413ac..6fda808 100644 (file)
@@ -166,7 +166,6 @@ $magicWords = array(
        'numberofusers'             => array( '1', 'BROJKORISNIKA', 'NUMBEROFUSERS' ),
        'numberofactiveusers'       => array( '1', 'BROJAKTIVNIHKORISNIKA', 'NUMBEROFACTIVEUSERS' ),
        'numberofedits'             => array( '1', 'BROJPROMJENA', 'NUMBEROFEDITS' ),
-       'numberofviews'             => array( '1', 'BROJPREGLEDA', 'NUMBEROFVIEWS' ),
        'pagename'                  => array( '1', 'STRANICA', 'PAGENAME' ),
        'pagenamee'                 => array( '1', 'STRANICE', 'PAGENAMEE' ),
        'namespace'                 => array( '1', 'IMENSKIPROSTOR', 'NAMESPACE' ),
index 6cfb988..29c9a16 100644 (file)
@@ -60,7 +60,7 @@ $specialPageAliases = array(
        'LinkSearch'                => array( 'Enllaços_web', 'Busca_enllaços', 'Recerca_d\'enllaços_web' ),
        'Listadmins'                => array( 'Administradors' ),
        'Listbots'                  => array( 'Bots' ),
-       'Listfiles'                 => array( 'Imatges' ),
+       'Listfiles'                 => array( 'Imatges', 'Fitxers' ),
        'Listgrouprights'           => array( 'Drets_dels_grups_d\'usuaris' ),
        'Listredirects'             => array( 'Redireccions' ),
        'Listusers'                 => array( 'Usuaris' ),
@@ -80,7 +80,7 @@ $specialPageAliases = array(
        'Mycontributions'           => array( 'Contribucions_pròpies' ),
        'Mypage'                    => array( 'Pàgina_personal' ),
        'Mytalk'                    => array( 'Discussió_personal' ),
-       'Newimages'                 => array( 'Imatges_noves' ),
+       'Newimages'                 => array( 'Imatges_noves', 'Fitxers_nous' ),
        'Newpages'                  => array( 'Pàgines_noves' ),
        'Popularpages'              => array( 'Pàgines_populars' ),
        'Preferences'               => array( 'Preferències' ),
index fb61b4a..1bc4385 100644 (file)
@@ -46,7 +46,7 @@ $specialPageAliases = array(
        'Confirmemail'              => array( '確認電子郵件' ),
        'Contributions'             => array( '貢獻' ),
        'CreateAccount'             => array( '開賬戶' ),
-       'DeletedContributions'      => array( '刪其貢獻' ),
+       'DeletedContributions'      => array( '刪其貢獻' ),
        'DoubleRedirects'           => array( '雙重重定向' ),
        'EditWatchlist'             => array( '修改監視單' ),
        'Emailuser'                 => array( '共用戶發送電子郵件' ),
@@ -125,7 +125,7 @@ $specialPageAliases = array(
        'Wantedpages'               => array( '卜挃其頁面' ),
        'Wantedtemplates'           => array( '卜挃其模板' ),
        'Watchlist'                 => array( '監視單' ),
-       'Whatlinkshere'             => array( '乇鏈遘嚽塊' ),
+       'Whatlinkshere'             => array( '乇鏈遘嚽塊' ),
        'Withoutinterwiki'          => array( '無跨維基' ),
 );
 
index 2babb83..7ee29c1 100644 (file)
@@ -67,8 +67,9 @@ $namespaceGenderAliases = array();
 $specialPageAliases = array(
        'Activeusers'               => array( 'Жигара_декъашхой' ),
        'Allmessages'               => array( 'ГӀирса_хаамаш' ),
+       'AllMyUploads'              => array( 'Сан_массо_файлаш' ),
        'Allpages'                  => array( 'Массо_агӀонаш' ),
-       'Ancientpages'              => array( 'ЯззамаÑ\88_оÑ\86Ñ\83\82еÑ\80аÑ\85Ñ\8cÑ\86а_Ñ\82Ó\80аÑ\8cÑ\85Ñ\85Ñ\8cаÑ\80а_Ñ\82адаÑ\80_дина_долÑ\83' ),
+       'Ancientpages'              => array( 'ТÓ\80аÑ\8cÑ\85Ñ\8cаÑ\80леÑ\80аÑ\87Ñ\83\85енаÑ\86а_ниÑ\81бина_Ñ\8fззамаÑ\88' ),
        'Badtitle'                  => array( 'Хилийта_йиш_йоцу_цӀе' ),
        'Blankpage'                 => array( 'Еса_агӀо' ),
        'Block'                     => array( 'Блоктоха' ),
@@ -95,9 +96,9 @@ $specialPageAliases = array(
        'Invalidateemail'           => array( 'Адрес_бакъдар_юхадаккха' ),
        'JavaScriptTest'            => array( 'JavaScript_тестировать_ян' ),
        'BlockList'                 => array( 'Блоктоьхнарш' ),
-       'LinkSearch'                => array( 'Ð¥Ñ\8cажоÑ\80агаÑ\88_лаÑ\85аÑ\80' ),
+       'LinkSearch'                => array( 'Хьажоргаш_лахар' ),
        'Listadmins'                => array( 'Куьйгалхойн_могӀам' ),
-       'Listbots'                  => array( 'ШаболÑ\85_беÑ\87аÑ\80а_могӀам' ),
+       'Listbots'                  => array( 'Ð\91оÑ\82Ñ\82ийн_могӀам' ),
        'Listfiles'                 => array( 'Файлаш' ),
        'Listgrouprights'           => array( 'Декъашхойн_бакъонаш' ),
        'Listredirects'             => array( 'ДIасахьажоран_могIам' ),
@@ -110,8 +111,8 @@ $specialPageAliases = array(
        'MIMEsearch'                => array( 'MIME_чухула_лахар' ),
        'Mostcategories'            => array( 'Дуккха_категореш_тӀе_тоьхна_йолу_агӀонаш' ),
        'Mostimages'                => array( 'Массарел_дуккха_лелайо_файлаш' ),
-       'Mostinterwikis'            => array( 'Ð\94Ñ\83кÑ\85а_Ñ\8eкÑ\8aаÑ\80вики_Ñ\85Ñ\8cажоÑ\80агаÑ\88' ),
-       'Mostlinked'                => array( 'Ð\94Ñ\83ккÑ\85а_Ñ\85Ñ\8cажоÑ\80агаÑ\88\82Ó\80е_Ñ\82оÑ\8cÑ\85на_йолÑ\83_агÓ\80онаÑ\88' ),
+       'Mostinterwikis'            => array( 'Дукха_юкъарвики_хьажоргаш' ),
+       'Mostlinked'                => array( 'Дуккха_хьажоргаш_тӀе_тоьхна_йолу_агӀонаш' ),
        'Mostlinkedcategories'      => array( 'Дуккха_тӀе_хьажораш_йолу_категореш' ),
        'Mostlinkedtemplates'       => array( 'Массарел_дуккха_а_леладо_кепаш' ),
        'Mostrevisions'             => array( 'Сих_сиха_нисйина_йолу_агӀонаш' ),
@@ -124,7 +125,7 @@ $specialPageAliases = array(
        'Newimages'                 => array( 'Керла_файлаш' ),
        'Newpages'                  => array( 'Керла_агӀонаш' ),
        'PasswordReset'             => array( 'Пароль_кхоссар' ),
-       'PermanentLink'             => array( 'Ð\93Ñ\83Ñ\82Ñ\82аÑ\80леÑ\80а_Ñ\85Ñ\8cажоÑ\80аг' ),
+       'PermanentLink'             => array( 'Гуттарлера_хьажорг' ),
        'Popularpages'              => array( 'ГӀараяьлла_агӀонаш' ),
        'Preferences'               => array( 'ГӀирсаш' ),
        'Prefixindex'               => array( 'Хьалха_агӀонийн_цӀераш_хӀотто_еза' ),
@@ -134,11 +135,11 @@ $specialPageAliases = array(
        'Randomredirect'            => array( 'Цахууш_нисделла_дIасахьажор' ),
        'Recentchanges'             => array( 'Керла_нисдарш' ),
        'Recentchangeslinked'       => array( 'Кхуьнца_долу_нисдарш' ),
-       'Revisiondelete'            => array( 'Ð\94Ó\80адÑ\8fÑ\85на_ниÑ\81даÑ\80Ñ\88' ),
+       'Revisiondelete'            => array( 'Ð\9dиÑ\81даÑ\80_дÓ\80адаккÑ\85аÑ\80' ),
        'Search'                    => array( 'Лахар' ),
        'Shortpages'                => array( 'Боца_яззамаш' ),
        'Specialpages'              => array( 'Леррина_агӀонаш' ),
-       'Statistics'                => array( 'Ð\91Ñ\83Ñ\85еÑ\85Ñ\8cдеÑ\80г' ),
+       'Statistics'                => array( 'СÑ\82аÑ\82иÑ\81Ñ\82ика' ),
        'Tags'                      => array( 'Билгалонаш' ),
        'Unblock'                   => array( 'БлокдӀаяккхар' ),
        'Uncategorizedcategories'   => array( 'Категореш_йоцу_категореш' ),
@@ -162,24 +163,24 @@ $specialPageAliases = array(
        'Wantedtemplates'           => array( 'Оьшуш_йолу_кепаш' ),
        'Watchlist'                 => array( 'Тергаме_могӀам' ),
        'Whatlinkshere'             => array( 'Хьажоригаш_кхузе' ),
-       'Withoutinterwiki'          => array( 'ЮкÑ\8aаÑ\80вики_Ñ\85Ñ\8cажоÑ\80агаÑ\88_йоÑ\86Ñ\83_агÓ\80онаÑ\88' ),
+       'Withoutinterwiki'          => array( 'Юкъарвики_хьажоргаш_йоцу_агӀонаш' ),
 );
 
 $magicWords = array(
-       'redirect'                  => array( '0', '#дlасахьажайар\'', '\'#хьажайо\'', '\'#REDIRECT', '#перенаправление', '#перенапр', '#REDIRECT' ),
+       'redirect'                  => array( '0', '#дӀасахьажор\'', '\'#хьажайо\'', '\'#REDIRECT', '#перенаправление', '#перенапр', '#REDIRECT' ),
        'notoc'                     => array( '0', '__БАЦ_ЧУЛАЦАМ__', '__БАЦ_ЧУЛ__', '__БЕЗ_ОГЛАВЛЕНИЯ__', '__БЕЗ_ОГЛ__', '__NOTOC__' ),
        'nogallery'                 => array( '0', '__ЙАЦ_УЧЕ__', '__БЕЗ_ГАЛЕРЕИ__', '__NOGALLERY__' ),
        'forcetoc'                  => array( '0', '__ТlЕДУЬЛЛУ_ЧУЛАЦАМБАР__', '__ТlЕДУЬЛ_ЧУЛ__', '__ОБЯЗАТЕЛЬНОЕ_ОГЛАВЛЕНИЕ__', '__ОБЯЗ_ОГЛ__', '__FORCETOC__' ),
        'toc'                       => array( '0', '__ЧУЛАЦАМ__', '__ЧУЛ__', '__ОГЛАВЛЕНИЕ__', '__ОГЛ__', '__TOC__' ),
-       'noeditsection'             => array( '0', '__ЦÐ\90Ð\9cÐ\95Ð\93_РÐ\95Ð\94Ð\90Ð\9aÐ\9aÐ¥Ð\90\90Ð\93\9eÐ\9d__', '__БЕЗ_РЕДАКТИРОВАНИЯ_РАЗДЕЛА__', '__NOEDITSECTION__' ),
+       'noeditsection'             => array( '0', '__Ð\90Ð\93Ó\80Ð\9e_ТÐ\90_ЦÐ\90\95Ш__', '__БЕЗ_РЕДАКТИРОВАНИЯ_РАЗДЕЛА__', '__NOEDITSECTION__' ),
        'currentmonth'              => array( '1', 'КАРАРА_БУТТ', 'КАРАРА_БУТТ_2', 'ТЕКУЩИЙ_МЕСЯЦ', 'ТЕКУЩИЙ_МЕСЯЦ_2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
        'currentmonth1'             => array( '1', 'КАРАРА_БУТТ_1', 'ТЕКУЩИЙ_МЕСЯЦ_1', 'CURRENTMONTH1' ),
-       'currentmonthname'          => array( '1', 'КАРАРАЧУ_БЕТТА_ЦlЕ', 'НАЗВАНИЕ_ТЕКУЩЕГО_МЕСЯЦА', 'CURRENTMONTHNAME' ),
-       'currentmonthnamegen'       => array( '1', 'КАРАРАЧУ_БЕТТА_ЦlЕ_МУХ', 'НАЗВАНИЕ_ТЕКУЩЕГО_МЕСЯЦА_РОД', 'CURRENTMONTHNAMEGEN' ),
-       'currentmonthabbrev'        => array( '1', 'КАРАРАЧУ_БЕТТА_ЦlЕ_АБР', 'НАЗВАНИЕ_ТЕКУЩЕГО_МЕСЯЦА_АБР', 'CURRENTMONTHABBREV' ),
+       'currentmonthname'          => array( '1', 'КАРАРАЧУ_БЕТТА_ЦӀЕ', 'НАЗВАНИЕ_ТЕКУЩЕГО_МЕСЯЦА', 'CURRENTMONTHNAME' ),
+       'currentmonthnamegen'       => array( '1', 'КАРАРАЧУ_БЕТТА_ЦӀЕ_МУХ', 'НАЗВАНИЕ_ТЕКУЩЕГО_МЕСЯЦА_РОД', 'CURRENTMONTHNAMEGEN' ),
+       'currentmonthabbrev'        => array( '1', 'КАРАРАЧУ_БЕТТА_ЦӀЕ_АБР', 'НАЗВАНИЕ_ТЕКУЩЕГО_МЕСЯЦА_АБР', 'CURRENTMONTHABBREV' ),
        'currentday'                => array( '1', 'КАРАРА_ДЕ', 'ТЕКУЩИЙ_ДЕНЬ', 'CURRENTDAY' ),
        'currentday2'               => array( '1', 'КАРАРА_ДЕ_2', 'ТЕКУЩИЙ_ДЕНЬ_2', 'CURRENTDAY2' ),
-       'currentdayname'            => array( '1', 'КАРАРАЧУ_ДЕ_ЦlЕ', 'НАЗВАНИЕ_ТЕКУЩЕГО_ДНЯ', 'CURRENTDAYNAME' ),
+       'currentdayname'            => array( '1', 'КАРАРАЧУ_ДЕ_ЦӀЕ', 'НАЗВАНИЕ_ТЕКУЩЕГО_ДНЯ', 'CURRENTDAYNAME' ),
        'currentyear'               => array( '1', 'КАРАРА_ШО', 'ТЕКУЩИЙ_ГОД', 'CURRENTYEAR' ),
        'currenttime'               => array( '1', 'КАРАРА_ХАН', 'ТЕКУЩЕЕ_ВРЕМЯ', 'CURRENTTIME' ),
        'currenthour'               => array( '1', 'КАРАРА_САХЬТ', 'ТЕКУЩИЙ_ЧАС', 'CURRENTHOUR' ),
@@ -190,37 +191,36 @@ $magicWords = array(
        'localmonthabbrev'          => array( '1', 'МЕТТИГАН_БЕТТА_ЦlЕ_АБР', 'НАЗВАНИЕ_МЕСТНОГО_МЕСЯЦА_АБР', 'LOCALMONTHABBREV' ),
        'localday'                  => array( '1', 'МЕТТИГАН_ДЕ', 'МЕСТНЫЙ_ДЕНЬ', 'LOCALDAY' ),
        'localday2'                 => array( '1', 'МЕТТИГАН_ДЕ_2', 'МЕСТНЫЙ_ДЕНЬ_2', 'LOCALDAY2' ),
-       'localdayname'              => array( '1', 'МЕТТИГАН_ДЕ_ЦlЕ', 'НАЗВАНИЕ_МЕСТНОГО_ДНЯ', 'LOCALDAYNAME' ),
+       'localdayname'              => array( '1', 'МЕТТИГАН_ДЕ_ЦӀЕ', 'НАЗВАНИЕ_МЕСТНОГО_ДНЯ', 'LOCALDAYNAME' ),
        'localyear'                 => array( '1', 'МЕТТИГАН_ШО', 'МЕСТНЫЙ_ГОД', 'LOCALYEAR' ),
        'localtime'                 => array( '1', 'МЕТТИГАН_ХАН', 'МЕСТНОЕ_ВРЕМЯ', 'LOCALTIME' ),
        'localhour'                 => array( '1', 'МЕТТИГАН_САХЬТ', 'МЕСТНЫЙ_ЧАС', 'LOCALHOUR' ),
        'numberofpages'             => array( '1', 'АГlОНИЙ_ДУКХАЛЛА', 'КОЛИЧЕСТВО_СТРАНИЦ', 'NUMBEROFPAGES' ),
        'numberofarticles'          => array( '1', 'ЯЗЗАМАШИ_ДУКХАЛЛА', 'КОЛИЧЕСТВО_СТАТЕЙ', 'NUMBEROFARTICLES' ),
-       'numberoffiles'             => array( '1', 'ФÐ\90Ð\99Ð\9bÐ\90Ð\9dШÐ\98_ДУКХАЛЛА', 'КОЛИЧЕСТВО_ФАЙЛОВ', 'NUMBEROFFILES' ),
+       'numberoffiles'             => array( '1', 'ФÐ\90Ð\99Ð\9bÐ\98Ð\99Ð\9d_ДУКХАЛЛА', 'КОЛИЧЕСТВО_ФАЙЛОВ', 'NUMBEROFFILES' ),
        'numberofusers'             => array( '1', 'ДЕКЪАШХОЙ_ДУКХАЛЛА', 'КОЛИЧЕСТВО_УЧАСТНИКОВ', 'NUMBEROFUSERS' ),
        'numberofactiveusers'       => array( '1', 'ДУКХАЛЛА_ЖИГАРА_ДЕКЪАШХОЙ', 'КОЛИЧЕСТВО_АКТИВНЫХ_УЧАСТНИКОВ', 'NUMBEROFACTIVEUSERS' ),
-       'numberofedits'             => array( '1', 'НИСДАРШИЙ_ДУКХАЛЛА', 'КОЛИЧЕСТВО_ПРАВОК', 'NUMBEROFEDITS' ),
-       'numberofviews'             => array( '1', 'ХЬАЖАРИЙ_ДУКХАЛЛА', 'КОЛИЧЕСТВО_ПРОСМОТРОВ', 'NUMBEROFVIEWS' ),
-       'pagename'                  => array( '1', 'АГlОН_ЦlЕ', 'НАЗВАНИЕ_СТРАНИЦЫ', 'PAGENAME' ),
-       'pagenamee'                 => array( '1', 'АГlОН_ЦlЕ_2', 'НАЗВАНИЕ_СТРАНИЦЫ_2', 'PAGENAMEE' ),
-       'namespace'                 => array( '1', 'ЦlЕРИ_АНА', 'ПРОСТРАНСТВО_ИМЁН', 'NAMESPACE' ),
-       'namespacee'                => array( '1', 'ЦlЕРИ_АНА_2', 'ПРОСТРАНСТВО_ИМЁН_2', 'NAMESPACEE' ),
-       'talkspace'                 => array( '1', 'ДИЙЦАРШИ_АНА', 'ПРОСТРАНСТВО_ОБСУЖДЕНИЙ', 'TALKSPACE' ),
-       'talkspacee'                => array( '1', 'ДИЙЦАРШИ_АНА_2', 'ПРОСТРАНСТВО_ОБСУЖДЕНИЙ_2', 'TALKSPACEE' ),
-       'subjectspace'              => array( '1', 'ЯЗЗАМАШИ_АНА', 'ПРОСТРАНСТВО_СТАТЕЙ', 'SUBJECTSPACE', 'ARTICLESPACE' ),
-       'subjectspacee'             => array( '1', 'ЯЗЗАМАШИ_АНА_2', 'ПРОСТРАНСТВО_СТАТЕЙ_2', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
-       'fullpagename'              => array( '1', 'ЮЬЗЗИНА_АГlОН_ЦlЕ', 'ПОЛНОЕ_НАЗВАНИЕ_СТРАНИЦЫ', 'FULLPAGENAME' ),
-       'fullpagenamee'             => array( '1', 'ЮЬЗЗИНА_АГlОН_ЦlЕ_2', 'ПОЛНОЕ_НАЗВАНИЕ_СТРАНИЦЫ_2', 'FULLPAGENAMEE' ),
-       'subpagename'               => array( '1', 'АГlОН_КlЕЛАРА_ЦlЕ', 'НАЗВАНИЕ_ПОДСТРАНИЦЫ', 'SUBPAGENAME' ),
-       'subpagenamee'              => array( '1', 'АГlОН_КlЕЛАРА_ЦlЕ_2', 'НАЗВАНИЕ_ПОДСТРАНИЦЫ_2', 'SUBPAGENAMEE' ),
-       'basepagename'              => array( '1', 'АГlОН_ЦlЕРА_БУХ', 'ОСНОВА_НАЗВАНИЯ_СТРАНИЦЫ', 'BASEPAGENAME' ),
-       'basepagenamee'             => array( '1', 'АГlОН_ЦlЕРА_БУХ_2', 'ОСНОВА_НАЗВАНИЯ_СТРАНИЦЫ_2', 'BASEPAGENAMEE' ),
-       'talkpagename'              => array( '1', 'ДИЙЦАРЕ_АГlОН_ЦlЕ', 'НАЗВАНИЕ_СТРАНИЦЫ_ОБСУЖДЕНИЯ', 'TALKPAGENAME' ),
-       'talkpagenamee'             => array( '1', 'ДИЙЦАРЕ_АГlОН_ЦlЕ_2', 'НАЗВАНИЕ_СТРАНИЦЫ_ОБСУЖДЕНИЯ_2', 'TALKPAGENAMEE' ),
-       'subjectpagename'           => array( '1', 'АГlОН_ЯЗЗАМАН_ЦlЕ', 'НАЗВАНИЕ_СТРАНИЦЫ_СТАТЬИ', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
-       'subjectpagenamee'          => array( '1', 'АГlОН_ЯЗЗАМАН_ЦlЕ_2', 'НАЗВАНИЕ_СТРАНИЦЫ_СТАТЬИ_2', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+       'numberofedits'             => array( '1', 'НИСДАРИЙН_ДУКХАЛЛА', 'КОЛИЧЕСТВО_ПРАВОК', 'NUMBEROFEDITS' ),
+       'pagename'                  => array( '1', 'АГӀОН_ЦӀЕ', 'НАЗВАНИЕ_СТРАНИЦЫ', 'PAGENAME' ),
+       'pagenamee'                 => array( '1', 'АГӀОН_ЦӀЕ_2', 'НАЗВАНИЕ_СТРАНИЦЫ_2', 'PAGENAMEE' ),
+       'namespace'                 => array( '1', 'ЦӀЕРИЙН_АНА', 'ПРОСТРАНСТВО_ИМЁН', 'NAMESPACE' ),
+       'namespacee'                => array( '1', 'ЦӀЕРИЙН_АНА_2', 'ПРОСТРАНСТВО_ИМЁН_2', 'NAMESPACEE' ),
+       'talkspace'                 => array( '1', 'ДИЙЦАРИЙН_АНА', 'ПРОСТРАНСТВО_ОБСУЖДЕНИЙ', 'TALKSPACE' ),
+       'talkspacee'                => array( '1', 'ДИЙЦАРИЙН_АНА_2', 'ПРОСТРАНСТВО_ОБСУЖДЕНИЙ_2', 'TALKSPACEE' ),
+       'subjectspace'              => array( '1', 'ЯЗЗАМИЙН_АНА', 'ПРОСТРАНСТВО_СТАТЕЙ', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+       'subjectspacee'             => array( '1', 'ЯЗЗАМИЙН_АНА_2', 'ПРОСТРАНСТВО_СТАТЕЙ_2', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+       'fullpagename'              => array( '1', 'ЮЬЗЗИНА_АГӀОН_ЦӀЕ', 'ПОЛНОЕ_НАЗВАНИЕ_СТРАНИЦЫ', 'FULLPAGENAME' ),
+       'fullpagenamee'             => array( '1', 'ЮЬЗЗИНА_АГӀОН_ЦӀЕ_2', 'ПОЛНОЕ_НАЗВАНИЕ_СТРАНИЦЫ_2', 'FULLPAGENAMEE' ),
+       'subpagename'               => array( '1', 'АГӀОН_КӀЕЛАРА_ЦӀЕ', 'НАЗВАНИЕ_ПОДСТРАНИЦЫ', 'SUBPAGENAME' ),
+       'subpagenamee'              => array( '1', 'АГӀОН_КӀЕЛАРА_ЦӀЕ_2', 'НАЗВАНИЕ_ПОДСТРАНИЦЫ_2', 'SUBPAGENAMEE' ),
+       'basepagename'              => array( '1', 'АГӀОН_ЦӀЕРА_БУХ', 'ОСНОВА_НАЗВАНИЯ_СТРАНИЦЫ', 'BASEPAGENAME' ),
+       'basepagenamee'             => array( '1', 'АГӀОН_ЦӀЕРА_БУХ_2', 'ОСНОВА_НАЗВАНИЯ_СТРАНИЦЫ_2', 'BASEPAGENAMEE' ),
+       'talkpagename'              => array( '1', 'ДИЙЦАРЕ_АГӀОН_ЦӀЕ', 'НАЗВАНИЕ_СТРАНИЦЫ_ОБСУЖДЕНИЯ', 'TALKPAGENAME' ),
+       'talkpagenamee'             => array( '1', 'ДИЙЦАРЕ_АГӀОН_ЦӀЕ_2', 'НАЗВАНИЕ_СТРАНИЦЫ_ОБСУЖДЕНИЯ_2', 'TALKPAGENAMEE' ),
+       'subjectpagename'           => array( '1', 'АГӀОН_ЯЗЗАМАН_ЦӀЕ', 'НАЗВАНИЕ_СТРАНИЦЫ_СТАТЬИ', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+       'subjectpagenamee'          => array( '1', 'АГӀОН_ЯЗЗАМАН_ЦӀЕ_2', 'НАЗВАНИЕ_СТРАНИЦЫ_СТАТЬИ_2', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
        'msg'                       => array( '0', 'ХААМ:', 'СООБЩЕНИЕ:', 'СООБЩ:', 'MSG:' ),
-       'subst'                     => array( '0', 'ХlОТТОР:', 'ХlОТТ:', 'ПОДСТАНОВКА:', 'ПОДСТ:', 'SUBST:' ),
+       'subst'                     => array( '0', 'ХӀОТТОР:', 'ХӀОТТ:', 'ПОДСТАНОВКА:', 'ПОДСТ:', 'SUBST:' ),
        'msgnw'                     => array( '0', 'ВИКИ_ХААМ_БОЦАШ:', 'СООБЩ_БЕЗ_ВИКИ:', 'MSGNW:' ),
        'img_thumbnail'             => array( '1', 'жима', 'жимо', 'мини', 'миниатюра', 'thumbnail', 'thumb' ),
        'img_manualthumb'           => array( '1', 'жима=$1', 'жимо=$1', 'мини=$1', 'миниатюра=$1', 'thumbnail=$1', 'thumb=$1' ),
@@ -236,32 +236,32 @@ $magicWords = array(
        'img_border'                => array( '1', 'доза', 'граница', 'border' ),
        'img_baseline'              => array( '1', 'бух', 'основание', 'baseline' ),
        'img_sub'                   => array( '1', 'буха', 'под', 'sub' ),
-       'img_super'                 => array( '1', 'тlе', 'над', 'super', 'sup' ),
+       'img_super'                 => array( '1', 'тӀе', 'над', 'super', 'sup' ),
        'img_top'                   => array( '1', 'лакхахь', 'сверху', 'top' ),
        'img_text_top'              => array( '1', 'лакххьара-йоза', 'текст-сверху', 'text-top' ),
        'img_middle'                => array( '1', 'юккъе', 'посередине', 'middle' ),
        'img_bottom'                => array( '1', 'бухар', 'снизу', 'bottom' ),
        'img_text_bottom'           => array( '1', 'бухара-йоза', 'текст-снизу', 'text-bottom' ),
-       'img_link'                  => array( '1', 'Ñ\85Ñ\8cажоÑ\80иг=$1', 'Ñ\81Ñ\81Ñ\8bлка=$1', 'link=$1' ),
+       'img_link'                  => array( '1', 'хьажорг=$1', 'ссылка=$1', 'link=$1' ),
        'img_alt'                   => array( '1', 'альт=$1', 'alt=$1' ),
        'int'                       => array( '0', 'ЧУЬРА:', 'ВНУТР:', 'INT:' ),
        'sitename'                  => array( '1', 'МЕТТИГ_ЦlЕ', 'НАЗВАНИЕ_САЙТА', 'SITENAME' ),
        'ns'                        => array( '0', 'БО:', 'ПИ:', 'NS:' ),
        'nse'                       => array( '0', 'БОХЬ:', 'ПИК:', 'NSE:' ),
-       'localurl'                  => array( '0', 'ХlОТТАЕЛЛА_МЕТТИГ:', 'ЛОКАЛЬНЫЙ_АДРЕС:', 'LOCALURL:' ),
-       'localurle'                 => array( '0', 'ХlОТТАЕЛЛА_МЕТТИГ_2:', 'ЛОКАЛЬНЫЙ_АДРЕС_2:', 'LOCALURLE:' ),
+       'localurl'                  => array( '0', 'ХӀОТТАЕЛЛА_МЕТТИГ:', 'ЛОКАЛЬНЫЙ_АДРЕС:', 'LOCALURL:' ),
+       'localurle'                 => array( '0', 'ХӀОТТАЕЛЛА_МЕТТИГ_2:', 'ЛОКАЛЬНЫЙ_АДРЕС_2:', 'LOCALURLE:' ),
        'server'                    => array( '0', 'ГlУЛКХДИРИГ', 'СЕРВЕР', 'SERVER' ),
        'servername'                => array( '0', 'ГlУЛКХДЕЧУЬНА_ЦlЕ', 'НАЗВАНИЕ_СЕРВЕРА', 'SERVERNAME' ),
        'scriptpath'                => array( '0', 'НЕКЪ_ОЦ_МЕТТАКЕПА', 'ПУТЬ_К_СКРИПТУ', 'SCRIPTPATH' ),
-       'stylepath'                 => array( '0', 'ЙОМАНХАТl', 'ПУТЬ_К_СТИЛЮ', 'STYLEPATH' ),
+       'stylepath'                 => array( '0', 'ЙОМАНХАТӀ', 'ПУТЬ_К_СТИЛЮ', 'STYLEPATH' ),
        'grammar'                   => array( '0', 'ДОЖАР:', 'ПАДЕЖ:', 'GRAMMAR:' ),
        'gender'                    => array( '0', 'ВУ_ЙУ:', 'GENDER', 'ПОЛ:', 'GENDER:' ),
        'notitleconvert'            => array( '0', '__ХИЙЦАР_ДОЦУШ_КОЬРТЕ__', '__БЕЗ_ПРЕОБРАЗОВАНИЯ_ЗАГОЛОВКА__', '__NOTITLECONVERT__', '__NOTC__' ),
        'nocontentconvert'          => array( '0', '__ЙОЗА_ХИЙЦАР_ДОЦУШ__', '__БЕЗ_ПРЕОБРАЗОВАНИЯ_ТЕКСТА__', '__NOCONTENTCONVERT__', '__NOCC__' ),
-       'currentweek'               => array( '1', 'КАРАРА_КlИР', 'ТЕКУЩАЯ_НЕДЕЛЯ', 'CURRENTWEEK' ),
-       'currentdow'                => array( '1', 'КАРАРА_КlИРАН_ДЕ', 'ТЕКУЩИЙ_ДЕНЬ_НЕДЕЛИ', 'CURRENTDOW' ),
-       'localweek'                 => array( '1', 'МЕТТИГЕРА_КlИРА', 'МЕСТНАЯ_НЕДЕЛЯ', 'LOCALWEEK' ),
-       'localdow'                  => array( '1', 'МЕТТИГАН_КlИРАН_ДЕ', 'МЕСТНЫЙ_ДЕНЬ_НЕДЕЛИ', 'LOCALDOW' ),
+       'currentweek'               => array( '1', 'КАРАРА_КӀИРА', 'ТЕКУЩАЯ_НЕДЕЛЯ', 'CURRENTWEEK' ),
+       'currentdow'                => array( '1', 'КАРАРА_КӀИРАН_ДЕ', 'ТЕКУЩИЙ_ДЕНЬ_НЕДЕЛИ', 'CURRENTDOW' ),
+       'localweek'                 => array( '1', 'МЕТТИГЕРА_КӀИРА', 'МЕСТНАЯ_НЕДЕЛЯ', 'LOCALWEEK' ),
+       'localdow'                  => array( '1', 'МЕТТИГАН_КӀИРАН_ДЕ', 'МЕСТНЫЙ_ДЕНЬ_НЕДЕЛИ', 'LOCALDOW' ),
        'revisionid'                => array( '1', 'ЦУЬНА_БАШХО', 'ИД_ВЕРСИИ', 'REVISIONID' ),
        'revisionday'               => array( '1', 'ДЕ_БАШХО', 'ДЕНЬ_ВЕРСИИ', 'REVISIONDAY' ),
        'revisionday2'              => array( '1', 'ДЕ_БАШХО_2', 'ДЕНЬ_ВЕРСИИ_2', 'REVISIONDAY2' ),
@@ -279,8 +279,8 @@ $magicWords = array(
        'raw'                       => array( '0', 'ТАЙАНЗА:', 'НЕОБРАБ:', 'RAW:' ),
        'displaytitle'              => array( '1', 'ГАЙТА_КОЬРТАМОГl', 'ПОКАЗАТЬ_ЗАГОЛОВОК', 'DISPLAYTITLE' ),
        'rawsuffix'                 => array( '1', 'Т', 'Н', 'R' ),
-       'newsectionlink'            => array( '1', '__ХЬÐ\90Ð\96Ð\9eРÐ\90Ð\93\9eЦ_Ð\9aÐ\95РÐ\9bÐ\90ЧУ_Ð\94Ð\95Ð\9aЪÐ\90Ð\9d__', '__ССЫÐ\9bÐ\9aÐ\90\9dÐ\90\9dÐ\9eÐ\92ЫÐ\99_РÐ\90Ð\97Ð\94Ð\95Ð\9b__', '__NEWSECTIONLINK__' ),
-       'nonewsectionlink'          => array( '1', '__Ð\99Ð\9eЦÐ\90Ш_ХЬÐ\90Ð\96Ð\9eРÐ\90Ð\93\9eЦ_Ð\9aÐ\95РÐ\9bÐ\90ЧУ_Ð\94Ð\95Ð\9aЪÐ\90Ð\9d__', '__Ð\91Ð\95Ð\97_ССЫÐ\9bÐ\9aÐ\98\9dÐ\90\9dÐ\9eÐ\92ЫÐ\99_РÐ\90Ð\97Ð\94Ð\95Ð\9b__', '__NONEWSECTIONLINK__' ),
+       'newsectionlink'            => array( '1', '__ХЬАЖОРГ_ОЦ_КЕРЛАЧУ_ДЕКЪАН__', '__ССЫЛКА_НА_НОВЫЙ_РАЗДЕЛ__', '__NEWSECTIONLINK__' ),
+       'nonewsectionlink'          => array( '1', '__ЙОЦАШ_ХЬАЖОРГ_ОЦ_КЕРЛАЧУ_ДЕКЪАН__', '__БЕЗ_ССЫЛКИ_НА_НОВЫЙ_РАЗДЕЛ__', '__NONEWSECTIONLINK__' ),
        'currentversion'            => array( '1', 'ЙОЛШЙОЛУ_БАШХО', 'ТЕКУЩАЯ_ВЕРСИЯ', 'CURRENTVERSION' ),
        'urlencode'                 => array( '0', 'ИШАРЙИНА_МЕТТИГ:', 'ЗАКОДИРОВАННЫЙ_АДРЕС:', 'URLENCODE:' ),
        'anchorencode'              => array( '0', 'ИШАРЙАР_МЕТТИГАН', 'КОДИРОВАТЬ_МЕТКУ', 'ANCHORENCODE' ),
@@ -289,23 +289,23 @@ $magicWords = array(
        'directionmark'             => array( '1', 'ХЬАЖОЧЕ_ХААМ', 'НАПРАВЛЕНИЕ_ПИСЬМА', 'DIRECTIONMARK', 'DIRMARK' ),
        'language'                  => array( '0', '#МОТТ', '#ЯЗЫК:', '#LANGUAGE:' ),
        'contentlanguage'           => array( '1', 'МОТТ_ЧУЛАЦАМ', 'ЯЗЫК_СОДЕРЖАНИЯ', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
-       'pagesinnamespace'          => array( '1', 'АГlОНАШ_ОЦ_ЦlЕРАШКАХЬ:', 'СТРАНИЦ_В_ПРОСТРАНСТВЕ_ИМЁН:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+       'pagesinnamespace'          => array( '1', 'АГӀОНАШ_ОЦ_ЦӀЕРАШКАХЬ:', 'СТРАНИЦ_В_ПРОСТРАНСТВЕ_ИМЁН:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
        'numberofadmins'            => array( '1', 'КУЬГАЛХОЙ_ДУКХАЛЛА', 'КОЛИЧЕСТВО_АДМИНИСТРАТОРОВ', 'NUMBEROFADMINS' ),
        'formatnum'                 => array( '0', 'ТЕРАХЬАН_БАРАМХlОТТОР', 'ФОРМАТИРОВАТЬ_ЧИСЛО', 'FORMATNUM' ),
        'padleft'                   => array( '0', 'ЙУЗА_ХАРЦЕ', 'ЗАПОЛНИТЬ_СЛЕВА', 'PADLEFT' ),
        'padright'                  => array( '0', 'ЙУЗА_БАКЪЕ', 'ЗАПОЛНИТЬ_СПРАВА', 'PADRIGHT' ),
-       'special'                   => array( '0', 'белхан', 'гlуллакхан', 'служебная', 'special' ),
+       'special'                   => array( '0', 'белхан', 'гӀуллакхан', 'служебная', 'special' ),
        'defaultsort'               => array( '1', 'ЛИСТАР_ЦАХЬЕХОР', 'ДОГlА_ЛИСТАРАН', 'СОРТИРОВКА_ПО_УМОЛЧАНИЮ', 'КЛЮЧ_СОРТИРОВКИ', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
-       'filepath'                  => array( '0', 'Ð\9eЦ_Ð¥lУÐ\9cÐ\90Ð\9dТlЕ_НЕКЪ:', 'ПУТЬ_К_ФАЙЛУ:', 'FILEPATH:' ),
+       'filepath'                  => array( '0', 'ФÐ\90Ð\99Ð\9bÐ\90Ð\9d_ТÓ\80Е_НЕКЪ:', 'ПУТЬ_К_ФАЙЛУ:', 'FILEPATH:' ),
        'tag'                       => array( '0', 'къастам', 'къасто', 'къаст', 'метка', 'тег', 'тэг', 'tag' ),
-       'hiddencat'                 => array( '1', '__Ð\9aЪÐ\90Ð\99Ð\9bÐ\90Ð¥Ð\99Ð\9eÐ\9bУ_Ð\9aÐ\90Ð\94Ð\95Ð\93Ð\90Р__', '__СКРЫТАЯ_КАТЕГОРИЯ__', '__HIDDENCAT__' ),
-       'pagesincategory'           => array( '1', 'Ð\90Ð\93\9eÐ\9dÐ\90Ш_Ð\9eЦУ_Ð\9aÐ\90Ð\94Ð\95Ð\93Ð\90РШЧÐ\9eХЬ', 'СТРАНИЦ_В_КАТЕГОРИИ', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+       'hiddencat'                 => array( '1', '__Ð\9aЪÐ\90Ð\99Ð\9bÐ\90Ð¥Ð\90\99Ð\9eÐ\9bУ_Ð\9aÐ\90ТÐ\95Ð\93Ð\9eРÐ\98__', '__СКРЫТАЯ_КАТЕГОРИЯ__', '__HIDDENCAT__' ),
+       'pagesincategory'           => array( '1', 'Ð\9aÐ\90ТÐ\95Ð\93Ð\9eРÐ\98_ЧÐ\9eХЬ_Ð\90Ð\93Ó\80Ð\9eÐ\9dÐ\90Ш_', 'СТРАНИЦ_В_КАТЕГОРИИ', 'PAGESINCATEGORY', 'PAGESINCAT' ),
        'pagesize'                  => array( '1', 'АГlОН_БАРАМ', 'РАЗМЕР_СТРАНИЦЫ', 'PAGESIZE' ),
        'index'                     => array( '1', '__МЕТТИГТЕРАХЬ__', '__ИНДЕКС__', '__INDEX__' ),
        'noindex'                   => array( '1', '__МЕТТИГТЕРАХЬ_ЙОЦАШ__', '__БЕЗ_ИНДЕКСА__', '__NOINDEX__' ),
        'numberingroup'             => array( '1', 'ТЕРАХЬ_ОЦ_ТОБАНЦА', 'ЧИСЛО_В_ГРУППЕ', 'NUMBERINGROUP', 'NUMINGROUP' ),
-       'staticredirect'            => array( '1', '__Ð\91УХÐ\95ХЬÐ\94Ð\95РÐ\93\94\90СХЬÐ\90Ð\96Ð\90Ð\99Ð\90Р__', '__СТАТИЧЕСКОЕ_ПЕРЕНАПРАВЛЕНИЕ__', '__STATICREDIRECT__' ),
-       'protectionlevel'           => array( '1', 'ГlАРОЛЛИ_БАРАМ', 'УРОВЕНЬ_ЗАЩИТЫ', 'PROTECTIONLEVEL' ),
+       'staticredirect'            => array( '1', '__СТÐ\90ТÐ\98СТÐ\98Ð\9aÐ\98Ð\9d\94Ó\80Ð\90СХЬÐ\90Ð\96Ð\9eРÐ\93__', '__СТАТИЧЕСКОЕ_ПЕРЕНАПРАВЛЕНИЕ__', '__STATICREDIRECT__' ),
+       'protectionlevel'           => array( '1', 'ГӀАРОЛЛИ_БАРАМ', 'УРОВЕНЬ_ЗАЩИТЫ', 'PROTECTIONLEVEL' ),
        'formatdate'                => array( '0', 'терахьибарам', 'форматдаты', 'formatdate', 'dateformat' ),
        'url_path'                  => array( '0', 'ЙОМА', 'ПУТЬ', 'PATH' ),
        'url_wiki'                  => array( '0', 'ЧЕХКА', 'ВИКИ', 'WIKI' ),
index 6595543..a7267dd 100644 (file)
@@ -52,7 +52,7 @@ $specialPageAliases = array(
        'Booksources'               => array( 'سەرچاوەکانی_کتێب' ),
        'BrokenRedirects'           => array( 'ڕەوانکەرە_شکاوەکان' ),
        'Categories'                => array( 'پۆلەکان' ),
-       'ChangePassword'            => array( 'تێپەڕوشەگۆڕان،_تێپەڕەوشە_ڕێکخستنەوە' ),
+       'ChangePassword'            => array( 'تێپەڕوشەگۆڕان،ڕێکخستنەوەی_تێپەڕوشە' ),
        'Confirmemail'              => array( 'بڕواکردن_ئیمەیل' ),
        'Contributions'             => array( 'بەشدارییەکان' ),
        'CreateAccount'             => array( 'دروستکردنی_ھەژمار' ),
@@ -69,6 +69,7 @@ $specialPageAliases = array(
        'Log'                       => array( 'لۆگ' ),
        'Lonelypages'               => array( 'پەڕە_تاکەکان،_پەڕە_ھەتیوکراوەکان' ),
        'Longpages'                 => array( 'پەڕە_درێژەکان' ),
+       'MergeHistory'              => array( 'کردنەیەکی_مێژوو' ),
        'Mostcategories'            => array( 'زیاترین_پۆلەکان' ),
        'Mostimages'                => array( 'پەڕگەکانی_زیاترین_بەستەردراون،_زیاترین_پەڕگەکان،_زیاترین_وێنەکان' ),
        'Mostlinked'                => array( 'پەڕەکانی_زیاترین_بەستەردراون،_زیاترین_بەستەردراون' ),
@@ -78,7 +79,7 @@ $specialPageAliases = array(
        'Movepage'                  => array( 'گواستنەوەی_پەڕە' ),
        'Mycontributions'           => array( 'بەشدارییەکانم' ),
        'Mypage'                    => array( 'پەڕەکەم' ),
-       'Mytalk'                    => array( 'لێدوانەکانم' ),
+       'Mytalk'                    => array( 'لێدوانەکەم' ),
        'Newimages'                 => array( 'پەڕگە_نوێکان' ),
        'Newpages'                  => array( 'پەڕە_نوێکان' ),
        'Popularpages'              => array( 'پەڕە_ناودارەکان' ),
index 95f1719..e0848d0 100644 (file)
@@ -42,6 +42,7 @@ $specialPageAliases = array(
        'Allmessages'               => array( 'MediaWiki-Systemnachrichten', 'Systemnachrichten' ),
        'AllMyUploads'              => array( 'Alle_meine_Dateien' ),
        'Allpages'                  => array( 'Alle_Seiten' ),
+       'ApiHelp'                   => array( 'API-Hilfe' ),
        'Ancientpages'              => array( 'Älteste_Seiten' ),
        'Badtitle'                  => array( 'Ungültiger_Seitenname' ),
        'Blankpage'                 => array( 'Leerseite', 'Leere_Seite' ),
@@ -57,6 +58,7 @@ $specialPageAliases = array(
        'CreateAccount'             => array( 'Benutzerkonto_anlegen' ),
        'Deadendpages'              => array( 'Sackgassenseiten' ),
        'DeletedContributions'      => array( 'Gelöschte_Beiträge' ),
+       'Diff'                      => array( 'Unterschied' ),
        'DoubleRedirects'           => array( 'Doppelte_Weiterleitungen' ),
        'EditWatchlist'             => array( 'Beobachtungsliste_bearbeiten' ),
        'Emailuser'                 => array( 'E-Mail_senden', 'Mailen', 'E-Mail' ),
@@ -75,11 +77,13 @@ $specialPageAliases = array(
        'Listfiles'                 => array( 'Dateien', 'Dateiliste' ),
        'Listgrouprights'           => array( 'Gruppenrechte' ),
        'Listredirects'             => array( 'Weiterleitungen' ),
+       'ListDuplicatedFiles'       => array( 'Dateiduplikate' ),
        'Listusers'                 => array( 'Benutzer', 'Benutzerliste' ),
        'Lockdb'                    => array( 'Datenbank_sperren' ),
        'Log'                       => array( 'Logbuch' ),
        'Lonelypages'               => array( 'Verwaiste_Seiten' ),
        'Longpages'                 => array( 'Längste_Seiten' ),
+       'MediaStatistics'           => array( 'Medienstatistiken' ),
        'MergeHistory'              => array( 'Versionsgeschichten_vereinen' ),
        'MIMEsearch'                => array( 'MIME-Typ-Suche' ),
        'Mostcategories'            => array( 'Meistkategorisierte_Seiten' ),
@@ -98,6 +102,7 @@ $specialPageAliases = array(
        'Newimages'                 => array( 'Neue_Dateien' ),
        'Newpages'                  => array( 'Neue_Seiten' ),
        'PagesWithProp'             => array( 'Seiten_mit_Eigenschaften' ),
+       'PageLanguage'              => array( 'Seitensprache' ),
        'PasswordReset'             => array( 'Passwort_neu_vergeben' ),
        'PermanentLink'             => array( 'Permanenter_Link', 'Permalink' ),
        'Popularpages'              => array( 'Beliebteste_Seiten' ),
@@ -106,18 +111,20 @@ $specialPageAliases = array(
        'Protectedpages'            => array( 'Geschützte_Seiten' ),
        'Protectedtitles'           => array( 'Geschützte_Titel', 'Gesperrte_Titel' ),
        'Randompage'                => array( 'Zufällige_Seite' ),
-       'RandomInCategory'          => array( 'Zufällige_Seite_in_Kategorie' ),
+       'RandomInCategory'          => array( 'Zufällig_in_Kategorie' ),
        'Randomredirect'            => array( 'Zufällige_Weiterleitung' ),
        'Recentchanges'             => array( 'Letzte_Änderungen' ),
        'Recentchangeslinked'       => array( 'Änderungen_an_verlinkten_Seiten' ),
        'Redirect'                  => array( 'Weiterleitung' ),
        'ResetTokens'               => array( 'Tokens_zurücksetzen' ),
        'Revisiondelete'            => array( 'Versionslöschung' ),
+       'RunJobs'                   => array( 'Aufträge_ausführen' ),
        'Search'                    => array( 'Suche' ),
        'Shortpages'                => array( 'Kürzeste_Seiten' ),
        'Specialpages'              => array( 'Spezialseiten' ),
        'Statistics'                => array( 'Statistik' ),
        'Tags'                      => array( 'Markierungen' ),
+       'TrackingCategories'        => array( 'Tracking-Kategorien' ),
        'Unblock'                   => array( 'Freigeben' ),
        'Uncategorizedcategories'   => array( 'Nicht_kategorisierte_Kategorien' ),
        'Uncategorizedimages'       => array( 'Nicht_kategorisierte_Dateien' ),
@@ -178,7 +185,6 @@ $magicWords = array(
        'numberofusers'             => array( '1', 'BENUTZERANZAHL', 'NUMBEROFUSERS' ),
        'numberofactiveusers'       => array( '1', 'AKTIVE_BENUTZER', 'NUMBEROFACTIVEUSERS' ),
        'numberofedits'             => array( '1', 'BEARBEITUNGSANZAHL', 'NUMBEROFEDITS' ),
-       'numberofviews'             => array( '1', 'BETRACHTUNGEN', 'NUMBEROFVIEWS' ),
        'pagename'                  => array( '1', 'SEITENNAME', 'PAGENAME' ),
        'pagenamee'                 => array( '1', 'SEITENNAME_URL', 'PAGENAMEE' ),
        'namespace'                 => array( '1', 'NAMENSRAUM', 'NAMESPACE' ),
@@ -290,6 +296,7 @@ $magicWords = array(
        'numberingroup'             => array( '1', 'BENUTZER_IN_GRUPPE', 'NUMBERINGROUP', 'NUMINGROUP' ),
        'staticredirect'            => array( '1', '__PERMANENTE_WEITERLEITUNG__', '__STATICREDIRECT__' ),
        'protectionlevel'           => array( '1', 'SCHUTZSTATUS', 'PROTECTIONLEVEL' ),
+       'cascadingsources'          => array( '1', 'KASKADENQUELLEN', 'CASCADINGSOURCES' ),
        'formatdate'                => array( '0', 'DATUMSFORMAT', 'formatdate', 'dateformat' ),
        'url_path'                  => array( '0', 'PFAD', 'PATH' ),
        'url_query'                 => array( '0', 'ABFRAGE', 'QUERY' ),
index 70e4de3..445aba0 100644 (file)
@@ -54,87 +54,94 @@ $namespaceAliases = array(
 );
 
 $specialPageAliases = array(
-       'Activeusers'               => array( 'KarberéAktivi' ),
-       'Allmessages'               => array( 'MesaciPéro' ),
-       'AllMyUploads'              => array( 'DosyeyMı' ),
-       'Allpages'                  => array( 'PeriPéro' ),
-       'Ancientpages'              => array( 'PeKehani' ),
-       'Badtitle'                  => array( 'SernameyoXirab' ),
-       'Blankpage'                 => array( 'PeréVengi' ),
-       'Block'                     => array( 'Bloke', 'BlokeIP', 'BlokeyéKarberi' ),
-       'Booksources'               => array( 'Ã\87ımeyéKıtabi' ),
-       'BrokenRedirects'           => array( 'HetenayışoXırab' ),
+       'Activeusers'               => array( 'KarberêAktifi' ),
+       'Allmessages'               => array( 'MesaciPêro' ),
+       'AllMyUploads'              => array( 'BarkerdışêMıPêro', 'DosyeyêMıPêro' ),
+       'Allpages'                  => array( 'PeliPêro' ),
+       'Ancientpages'              => array( 'PeKehani' ),
+       'Badtitle'                  => array( 'SernameyoXırabın' ),
+       'Blankpage'                 => array( 'PelaVenge' ),
+       'Block'                     => array( 'KılitKe', 'IPyKılitKe', 'KarberiKılitKe' ),
+       'Booksources'               => array( 'Ã\87ımeyêKıtabi' ),
+       'BrokenRedirects'           => array( 'SerberdışêXırabıni' ),
        'Categories'                => array( 'Kategoriy' ),
-       'ChangeEmail'               => array( 'EpostaVurnayış' ),
-       'ChangePassword'            => array( 'ParolaBıvırn', 'ParolaResetk' ),
-       'ComparePages'              => array( 'PeraAteberd' ),
-       'Confirmemail'              => array( 'EpostaAraştk' ),
-       'Contributions'             => array( 'Dekerdışi' ),
-       'CreateAccount'             => array( 'HesabVıraz' ),
-       'Deadendpages'              => array( 'PeréMerdey' ),
-       'DeletedContributions'      => array( 'DekerdışékBesterneyayé' ),
-       'DoubleRedirects'           => array( 'HetenayışoDilet' ),
-       'EditWatchlist'             => array( 'VırnayışanéListeyaTemaşek' ),
-       'Emailuser'                 => array( 'EpostayaKarberi' ),
-       'ExpandTemplates'           => array( 'ŞablonaHerake' ),
-       'Export'                    => array( 'Ateberd' ),
-       'Fewestrevisions'           => array( 'TewrtaynRewizyoni' ),
-       'FileDuplicateSearch'       => array( 'KopyadosyaCigérayış', 'DiletdosyaCigérayış' ),
-       'Filepath'                  => array( 'RayaDosya', 'CayDosya' ),
-       'Import'                    => array( 'Azerek' ),
-       'Invalidateemail'           => array( 'EpostayaBetale' ),
-       'BlockList'                 => array( 'ListeyaBloki', 'ListeyaBlokan', 'ListeyaBlokeyéIPi' ),
-       'LinkSearch'                => array( 'GireCıgeyrayış' ),
-       'Listadmins'                => array( 'ListeyaHeténkaran' ),
-       'Listbots'                  => array( 'ListeyaBotan' ),
-       'Listfiles'                 => array( 'ListeyDosyayan', 'DosyayaListek', 'ListeyResiman' ),
-       'Listgrouprights'           => array( 'ListeyaHeqanéGruban', 'HeqéGrubéKarberan' ),
-       'Listredirects'             => array( 'ListeyaArézekerdışan' ),
-       'Listusers'                 => array( 'ListeyaKarberan', 'KarberaListek' ),
+       'ChangeEmail'               => array( 'EposteBıvurne' ),
+       'ChangePassword'            => array( 'ParolaBıvurne', 'ParolaEyarKe' ),
+       'ComparePages'              => array( 'PerranTêverşane' ),
+       'Confirmemail'              => array( 'EposteQebulKe' ),
+       'Contributions'             => array( 'İştıraki' ),
+       'CreateAccount'             => array( 'HesabVıraze' ),
+       'Deadendpages'              => array( 'PelêBêgırey' ),
+       'DeletedContributions'      => array( 'İştırakêEsteriyay' ),
+       'Diff'                      => array( 'Ferq' ),
+       'DoubleRedirects'           => array( 'SerberdışoDılet' ),
+       'EditWatchlist'             => array( 'ListaSeyrkerdışiBıvurne' ),
+       'Emailuser'                 => array( 'EposteBırışe' ),
+       'ExpandTemplates'           => array( 'ŞablonanHeraKe' ),
+       'Export'                    => array( 'BereTeber' ),
+       'Fewestrevisions'           => array( 'TewrŞenıkÇımraviyarnayışi' ),
+       'FileDuplicateSearch'       => array( 'CıgeyrayışêDosyayaKopyakerdiye', 'CıgeyrayışêDosyayaDılete' ),
+       'Filepath'                  => array( 'RayaDosya', 'CayêDosya' ),
+       'Import'                    => array( 'BiyaZerre' ),
+       'Invalidateemail'           => array( 'EposteyBıtexelne' ),
+       'JavaScriptTest'            => array( 'TestêJavaScripti' ),
+       'BlockList'                 => array( 'ListaKılitkerdışi', 'ListaKılitkerdışan', 'ListaKılitkerdışêIPyan' ),
+       'LinkSearch'                => array( 'CıgeyrayışêGırey' ),
+       'Listadmins'                => array( 'İdarekaranListeKe' ),
+       'Listbots'                  => array( 'BotanListeKe' ),
+       'Listfiles'                 => array( 'DosyeyanListeKe', 'ListaDosya', 'ListaResıman' ),
+       'Listgrouprights'           => array( 'HeqanêGrubanListeKe', 'HeqêGrubaKarberan' ),
+       'Listredirects'             => array( 'ListaSerberdışan' ),
+       'ListDuplicatedFiles'       => array( 'KopyayaListanêDosyeyan' ),
+       'Listusers'                 => array( 'ListaKarberan', 'KarberanListeKe' ),
        'Lockdb'                    => array( 'DBKilitk' ),
        'Log'                       => array( 'Qeyd', 'Qeydi' ),
-       'Lonelypages'               => array( 'PeréBéwayıri' ),
-       'Longpages'                 => array( 'PeréDergi' ),
-       'MergeHistory'              => array( 'VerénanPétewrke' ),
-       'MIMEsearch'                => array( 'NIMECıgeyrayış' ),
-       'Mostcategories'            => array( 'TewrvéşiKategoriyıni' ),
-       'Mostimages'                => array( 'DosyeyékeCırévéşiGreDeyayo' ),
-       'Mostinterwikis'            => array( 'TewrvéşiTeberwiki' ),
-       'Mostlinked'                => array( 'PerékeCırévéşiGreDeyayo' ),
-       'Mostlinkedcategories'      => array( 'KategoriyayékeCırévéşiGreDeyayo' ),
-       'Mostlinkedtemplates'       => array( 'ŞablonékeCırévéşiGreDeyayo' ),
-       'Mostrevisions'             => array( 'TewrvéşiRevizyon' ),
-       'Movepage'                  => array( 'PelerBeré' ),
-       'Mycontributions'           => array( 'DekerdenéMe' ),
-       'MyLanguage'                => array( 'ZıwaneMe' ),
-       'Mypage'                    => array( 'PeréMe' ),
-       'Mytalk'                    => array( 'VatenayışéMe' ),
-       'Myuploads'                 => array( 'BarkerdışéMe' ),
-       'Newimages'                 => array( 'DosyeyéNewey', 'ResiméNewey' ),
-       'Newpages'                  => array( 'PeréNewey' ),
-       'PasswordReset'             => array( 'ParolaResetkerdış' ),
-       'PermanentLink'             => array( 'GreyoDaimi' ),
-       'Popularpages'              => array( 'PeréPopuleri' ),
+       'Lonelypages'               => array( 'PelêBêwayıri' ),
+       'Longpages'                 => array( 'PelêDergi' ),
+       'MergeHistory'              => array( 'VerênanPêtewrKe' ),
+       'MIMEsearch'                => array( 'MIMECıgeyrayış' ),
+       'Mostcategories'            => array( 'TewrvêşiKategoriy' ),
+       'Mostimages'                => array( 'DosyeyêKeCırêvêşiGıredayiyê' ),
+       'Mostinterwikis'            => array( 'TewrvêşiTeberwikiy' ),
+       'Mostlinked'                => array( 'PelêKeCırêvêşiGıredayiyê' ),
+       'Mostlinkedcategories'      => array( 'KategoriyêKeCırêvêşiGıredayiyê' ),
+       'Mostlinkedtemplates'       => array( 'ŞablonêKeCırêvêşiGıredayiyê' ),
+       'Mostrevisions'             => array( 'TewrvêşiÇımraviyarnayışi' ),
+       'Movepage'                  => array( 'PeleBere' ),
+       'Mycontributions'           => array( 'İştırakêMı' ),
+       'MyLanguage'                => array( 'ZıwanêMı' ),
+       'Mypage'                    => array( 'PelaMı' ),
+       'Mytalk'                    => array( 'WerênayışêMı' ),
+       'Myuploads'                 => array( 'BarkerdışêMı' ),
+       'Newimages'                 => array( 'DosyeyêNewey', 'ResımêNewey' ),
+       'Newpages'                  => array( 'PelêNewey' ),
+       'PageLanguage'              => array( 'Zıwanê_Pele' ),
+       'PasswordReset'             => array( 'ParolaPeysereştış' ),
+       'PermanentLink'             => array( 'GıreyoDaimi' ),
+       'Popularpages'              => array( 'PelêPopuleri' ),
        'Preferences'               => array( 'Tercihi' ),
-       'Prefixindex'               => array( 'SerVerole' ),
-       'Protectedpages'            => array( 'PerékeStaryayé' ),
-       'Protectedtitles'           => array( 'SernameyékeStaryayé' ),
-       'Randompage'                => array( 'Raştameye', 'PelayakeRaştamé' ),
-       'RandomInCategory'          => array( 'KategoriyaXoseri' ),
-       'Randomredirect'            => array( 'HetenayışoRaştameye' ),
-       'Recentchanges'             => array( 'VırnayışéPeyéni' ),
-       'Recentchangeslinked'       => array( 'GreyéVırnayışéPeyénan' ),
-       'Redirect'                  => array( 'Hetenayış' ),
-       'Revisiondelete'            => array( 'RewizyoniBesterne' ),
+       'Prefixindex'               => array( 'VerbendZerrek' ),
+       'Protectedpages'            => array( 'PelêKeŞevekiyayiyé' ),
+       'Protectedtitles'           => array( 'SernameyêKeŞevekiyayiyê' ),
+       'Randompage'                => array( 'Raştameye', 'PelaRaştameyiye' ),
+       'RandomInCategory'          => array( 'KategoriyaRaştameyiye' ),
+       'Randomredirect'            => array( 'SerberdışoRaştameye' ),
+       'Recentchanges'             => array( 'VurnayışêPeyêni' ),
+       'Recentchangeslinked'       => array( 'GıreyêVurnayışêPeyênan' ),
+       'Redirect'                  => array( 'Serberdış' ),
+       'ResetTokens'               => array( 'SimgeyanPeyserberze' ),
+       'Revisiondelete'            => array( 'ÇımraviyarnayışiBestere' ),
+       'RunJobs'                   => array( 'KariBıgurene' ),
        'Search'                    => array( 'Cıgeyre' ),
-       'Shortpages'                => array( 'PeleyéKılmi' ),
-       'Specialpages'              => array( 'PeréBexsey' ),
+       'Shortpages'                => array( 'PelêKılmi' ),
+       'Specialpages'              => array( 'PelêXısusiy' ),
        'Statistics'                => array( 'İstatistiki' ),
        'Tags'                      => array( 'Etiketi' ),
+       'TrackingCategories'        => array( 'KategoriyêKeTeqibBenê' ),
        'Unblock'                   => array( 'BloqiWedarne' ),
        'Uncategorizedcategories'   => array( 'KategoriyayékeKategoriyanébiyé' ),
        'Uncategorizedimages'       => array( 'DosyeyékeKategoriyanébiyé' ),
-       'Uncategorizedpages'        => array( 'PeleyékeKategoriyanébiyé' ),
+       'Uncategorizedpages'        => array( 'PerreyékeKategoriyanébiyé' ),
        'Uncategorizedtemplates'    => array( 'ŞablonékeKategoriyanébiyé' ),
        'Undelete'                  => array( 'Peyserbiya' ),
        'Unlockdb'                  => array( 'DBKılitiAk' ),
@@ -150,10 +157,10 @@ $specialPageAliases = array(
        'Version'                   => array( 'Versiyon' ),
        'Wantedcategories'          => array( 'KategoriyayékeWazéné' ),
        'Wantedfiles'               => array( 'DosyeyékeWazéné' ),
-       'Wantedpages'               => array( 'PerékeWazéné' ),
+       'Wantedpages'               => array( 'PerrékeWazéné' ),
        'Wantedtemplates'           => array( 'ŞablonékeWazéné' ),
        'Watchlist'                 => array( 'ListeySeyran' ),
-       'Whatlinkshere'             => array( 'PerarêGre' ),
+       'Whatlinkshere'             => array( 'GreyNaySeraşıno' ),
        'Withoutinterwiki'          => array( 'Béİnterwiki' ),
 );
 
@@ -171,18 +178,18 @@ $magicWords = array(
        'currentmonthabbrev'        => array( '1', 'AŞMİYANEWKİKILMKERDIŞ', 'CURRENTMONTHABBREV' ),
        'currentday'                => array( '1', 'ROCENEWKİ', 'CURRENTDAY' ),
        'currentday2'               => array( '1', 'ROCENEWKİ2', 'CURRENTDAY2' ),
-       'currentdayname'            => array( '1', 'NAMEYÃ\8aROCENEWKİ', 'CURRENTDAYNAME' ),
+       'currentdayname'            => array( '1', 'NAMEYÃ\89ROCENEWKİ', 'CURRENTDAYNAME' ),
        'currentyear'               => array( '1', 'SERRENEWKİ', 'CURRENTYEAR' ),
        'currenttime'               => array( '1', 'DEMENEWKİ', 'CURRENTTIME' ),
        'currenthour'               => array( '1', 'SEHATNEWKİ', 'CURRENTHOUR' ),
        'localmonth'                => array( '1', 'WAREYAŞMİ', 'WAREYAŞMİ2', 'LOCALMONTH', 'LOCALMONTH2' ),
        'localmonth1'               => array( '1', 'WAREYAŞMİ1', 'LOCALMONTH1' ),
-       'localmonthname'            => array( '1', 'NAMEYÃ\8aWAREYAŞMİ', 'LOCALMONTHNAME' ),
-       'localmonthnamegen'         => array( '1', 'NAMEYWAREDÃ\8aAŞMİDACI', 'LOCALMONTHNAMEGEN' ),
+       'localmonthname'            => array( '1', 'NAMEYÃ\89WAREYAŞMİ', 'LOCALMONTHNAME' ),
+       'localmonthnamegen'         => array( '1', 'NAMEYWAREDÃ\89AŞMİDACI', 'LOCALMONTHNAMEGEN' ),
        'localmonthabbrev'          => array( '1', 'WAREYAŞMİKILMKERDIŞ', 'LOCALMONTHABBREV' ),
        'localday'                  => array( '1', 'WAREYROCE', 'LOCALDAY' ),
        'localday2'                 => array( '1', 'WAREYROCE2', 'LOCALDAY2' ),
-       'localdayname'              => array( '1', 'NAMEYÃ\8aWAREYROCE', 'LOCALDAYNAME' ),
+       'localdayname'              => array( '1', 'NAMEYÃ\89WAREYROCE', 'LOCALDAYNAME' ),
        'localyear'                 => array( '1', 'WAREYSERRE', 'LOCALYEAR' ),
        'localtime'                 => array( '1', 'WAREYDEME', 'LOCALTIME' ),
        'localhour'                 => array( '1', 'WAREYSEHAT', 'LOCALHOUR' ),
@@ -192,30 +199,31 @@ $magicWords = array(
        'numberofusers'             => array( '1', 'AMARİYAKARBERAN', 'NUMBEROFUSERS' ),
        'numberofactiveusers'       => array( '1', 'AMARİYAAKTİVKARBERAN', 'NUMBEROFACTIVEUSERS' ),
        'numberofedits'             => array( '1', 'AMARİYAVURNAYIŞAN', 'NUMBEROFEDITS' ),
-       'numberofviews'             => array( '1', 'AMARİYAMOCNAYIŞAN', 'NUMBEROFVIEWS' ),
        'pagename'                  => array( '1', 'NAMEYPELA', 'PAGENAME' ),
        'pagenamee'                 => array( '1', 'NAMEYPELAA', 'PAGENAMEE' ),
        'namespace'                 => array( '1', 'CANAME', 'NAMESPACE' ),
        'namespacee'                => array( '1', 'CANAMEE', 'NAMESPACEE' ),
        'namespacenumber'           => array( '1', 'AMARİYACANAME', 'NAMESPACENUMBER' ),
-       'talkspace'                 => array( '1', 'CAYÊWERÊNAYIŞİ', 'TALKSPACE' ),
-       'talkspacee'                => array( '1', 'CAYÊWERÊNAYIŞAN', 'TALKSPACEE' ),
-       'subjectspace'              => array( '1', 'CAYÊMESEL', 'CAYÊWESİQE', 'SUBJECTSPACE', 'ARTICLESPACE' ),
-       'subjectspacee'             => array( '1', 'CAYÊMESELAN', 'CAYÊWESİQAN', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
-       'fullpagename'              => array( '1', 'NAMEYPELAPÊRO', 'FULLPAGENAME' ),
-       'fullpagenamee'             => array( '1', 'NAMEYPELAPÊRON', 'FULLPAGENAMEE' ),
-       'subpagename'               => array( '1', 'NAMEYBINPELA', 'SUBPAGENAME' ),
-       'subpagenamee'              => array( '1', 'NAMEYBINPELAA', 'SUBPAGENAMEE' ),
-       'basepagename'              => array( '1', 'NAMEYSERPELA', 'BASEPAGENAME' ),
-       'basepagenamee'             => array( '1', 'NAMEYSERPELAA', 'BASEPAGENAMEE' ),
-       'talkpagename'              => array( '1', 'NAMEYPELAWERÊNAYIŞ', 'TALKPAGENAME' ),
-       'talkpagenamee'             => array( '1', 'NAMEYPELAWERÊNAYIŞAN', 'TALKPAGENAMEE' ),
-       'subjectpagename'           => array( '1', 'NAMEYPELAMESEL', 'NAMEYPELAWESİQE', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
-       'subjectpagenamee'          => array( '1', 'NAMEYPELAMESELER', 'NAMEYPELAQESİQER', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+       'talkspace'                 => array( '1', 'CAYÉVATENAYIŞİ', 'TALKSPACE' ),
+       'talkspacee'                => array( '1', 'CAYÉVATENAYIŞAN', 'TALKSPACEE' ),
+       'subjectspace'              => array( '1', 'CAYÉMESEL', 'CAYÉWESİQE', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+       'subjectspacee'             => array( '1', 'CAYÉMESELAN', 'CAYÉWESİQAN', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+       'fullpagename'              => array( '1', 'NAMEYPERERPÉRO', 'FULLPAGENAME' ),
+       'fullpagenamee'             => array( '1', 'NAMEYPERERPÉRON', 'FULLPAGENAMEE' ),
+       'subpagename'               => array( '1', 'NAMEYBINPERER', 'SUBPAGENAME' ),
+       'subpagenamee'              => array( '1', 'NAMEYBINPERERAN', 'SUBPAGENAMEE' ),
+       'rootpagename'              => array( '1', 'NAMEYRÉÇERDAPERER', 'ROOTPAGENAME' ),
+       'rootpagenamee'             => array( '1', 'NAMEYRÉÇERDAPERAN', 'ROOTPAGENAMEE' ),
+       'basepagename'              => array( '1', 'NAMEYESASPERER', 'BASEPAGENAME' ),
+       'basepagenamee'             => array( '1', 'NAMEYESASPERAN', 'BASEPAGENAMEE' ),
+       'talkpagename'              => array( '1', 'NAMEYPERAVATENAYIŞİ', 'TALKPAGENAME' ),
+       'talkpagenamee'             => array( '1', 'NAMEYPERAVATENAYIŞAN', 'TALKPAGENAMEE' ),
+       'subjectpagename'           => array( '1', 'NAMEYPERDAMESEL', 'NAMEYPERDAWESİQE', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+       'subjectpagenamee'          => array( '1', 'NAMEYPERDAMESELER', 'NAMEYPERDAWESİQER', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
        'msg'                       => array( '0', 'MSC', 'MSG:' ),
        'subst'                     => array( '0', 'KOPYAKE', 'ATEBERDE', 'SUBST:' ),
        'safesubst'                 => array( '0', 'EMELEYATEBERDE', 'SAFESUBST:' ),
-       'msgnw'                     => array( '0', 'MSJNW:', 'MSGNW:' ),
+       'msgnw'                     => array( '0', 'MSCNW:', 'MSGNW:' ),
        'img_thumbnail'             => array( '1', 'resmoqıckek', 'qıckek', 'thumbnail', 'thumb' ),
        'img_manualthumb'           => array( '1', 'resmoqıckek=$1', 'qıckek=$1', 'thumbnail=$1', 'thumb=$1' ),
        'img_right'                 => array( '1', 'raşt', 'right' ),
@@ -223,32 +231,35 @@ $magicWords = array(
        'img_none'                  => array( '1', 'çıniyo', 'none' ),
        'img_width'                 => array( '1', '$1pik', '$1piksel', '$1px' ),
        'img_center'                => array( '1', 'werte', 'miyan', 'center', 'centre' ),
-       'img_framed'                => array( '1', 'çerçeweya', 'çerçeweniyo', 'çerçewe', 'framed', 'enframed', 'frame' ),
-       'img_frameless'             => array( '1', 'bêçerçewe', 'frameless' ),
-       'img_page'                  => array( '1', 'pela=$1', 'pela_$1', 'page=$1', 'page $1' ),
+       'img_framed'                => array( '1', 'çerçeweyın', 'çerçewekerden', 'çerçewe', 'framed', 'enframed', 'frame' ),
+       'img_frameless'             => array( '1', 'béçerçewe', 'frameless' ),
+       'img_lang'                  => array( '1', 'zuwan=1$', 'lang=$1' ),
+       'img_page'                  => array( '1', 'pera=$1', 'pera_$1', 'page=$1', 'page $1' ),
        'img_upright'               => array( '1', 'disleg', 'disleg=$1', 'disleg_$1', 'upright', 'upright=$1', 'upright $1' ),
        'img_border'                => array( '1', 'sinor', 'border' ),
-       'img_baseline'              => array( '1', 'Sinorêerdi', 'baseline' ),
-       'img_sub'                   => array( '1', 'bın', 'sub' ),
-       'img_super'                 => array( '1', 'corên', 'cor', 'super', 'sup' ),
+       'img_baseline'              => array( '1', 'Sinoréerdi', 'baseline' ),
+       'img_sub'                   => array( '1', 'anvar', 'sub' ),
+       'img_super'                 => array( '1', 'corén', 'cor', 'super', 'sup' ),
        'img_top'                   => array( '1', 'gedug', 'top' ),
        'img_text_top'              => array( '1', 'gedug-metin', 'text-top' ),
        'img_middle'                => array( '1', 'merkez', 'middle' ),
        'img_bottom'                => array( '1', 'erd', 'bottom' ),
        'img_text_bottom'           => array( '1', 'erd-metin', 'text-bottom' ),
        'img_link'                  => array( '1', 'gre=$1', 'link=$1' ),
+       'img_alt'                   => array( '1', 'klik=$1', 'alt=$1' ),
+       'img_class'                 => array( '1', 'sınıf=$1', 'class=$1' ),
        'int'                       => array( '0', 'İNT:', 'INT:' ),
        'sitename'                  => array( '1', 'NAMEYSİTA', 'SITENAME' ),
        'ns'                        => array( '0', 'CN', 'NS:' ),
        'nse'                       => array( '0', 'CNV', 'NSE:' ),
        'localurl'                  => array( '0', 'LOKALGRE', 'LOCALURL:' ),
        'localurle'                 => array( '0', 'LOKALGREV', 'LOCALURLE:' ),
-       'articlepath'               => array( '0', 'SOPAWESİQAN', 'ARTICLEPATH' ),
-       'pageid'                    => array( '0', 'NIMREYPELA', 'PAGEID' ),
+       'articlepath'               => array( '0', 'SOPAPERAN', 'ARTICLEPATH' ),
+       'pageid'                    => array( '0', 'NIMREYPERER', 'PAGEID' ),
        'server'                    => array( '0', 'ARDEN', 'SERVER' ),
        'servername'                => array( '0', 'NAMEYARDEN', 'SERVERNAME' ),
        'scriptpath'                => array( '0', 'RAYASCRIPTİ', 'SCRIPTPATH' ),
-       'stylepath'                 => array( '0', 'TERZÃ\8aTEWRİ', 'STYLEPATH' ),
+       'stylepath'                 => array( '0', 'TERZÃ\89TEWRİ', 'STYLEPATH' ),
        'grammar'                   => array( '0', 'GRAMER:', 'GRAMMAR:' ),
        'gender'                    => array( '0', 'CİNSİYET:', 'GENDER:' ),
        'notitleconvert'            => array( '0', '__SERNAMEVURNAYIŞÇINO__', '__SVÇ__', '__NOTITLECONVERT__', '__NOTC__' ),
@@ -259,58 +270,59 @@ $magicWords = array(
        'localdow'                  => array( '1', 'WAREYROCAHEFTİ', 'LOCALDOW' ),
        'revisionid'                => array( '1', 'NIMREYREVİZYONİ', 'REVISIONID' ),
        'revisionday'               => array( '1', 'ROCAREVİZYONİ', 'REVISIONDAY' ),
-       'revisionday2'              => array( '1', 'ROCAREVİZYON1', 'REVISIONDAY2' ),
+       'revisionday2'              => array( '1', 'ROCAREVİZYON2', 'REVISIONDAY2' ),
        'revisionmonth'             => array( '1', 'AŞMAREVİZYONİ', 'REVISIONMONTH' ),
        'revisionmonth1'            => array( '1', 'AŞMAREVİZYONİ1', 'REVISIONMONTH1' ),
        'revisionyear'              => array( '1', 'SERRAREVİZYONİ', 'REVISIONYEAR' ),
-       'revisiontimestamp'         => array( '1', 'MELUMATÊREVİZYONÊDEMİ', 'REVISIONTIMESTAMP' ),
-       'revisionuser'              => array( '1', 'REVİZYONKARBER', 'REVISIONUSER' ),
+       'revisiontimestamp'         => array( '1', 'MALUMATAREVİZYONDADEMİ', 'REVISIONTIMESTAMP' ),
+       'revisionuser'              => array( '1', 'REVİZYONAKARBERİ', 'REVISIONUSER' ),
+       'revisionsize'              => array( '1', 'EBATAREVİZYONİ', 'REVISIONSIZE' ),
        'plural'                    => array( '0', 'ZAFEN:', 'PLURAL:' ),
-       'fullurl'                   => array( '0', 'GREPÊRO:', 'FULLURL:' ),
-       'fullurle'                  => array( '0', 'GREYOPÊRON:', 'FULLURLE:' ),
-       'canonicalurl'              => array( '0', 'GREYÃ\8aKANONİK:', 'CANONICALURL:' ),
+       'fullurl'                   => array( '0', 'GREHEME:', 'FULLURL:' ),
+       'fullurle'                  => array( '0', 'GREYHEME:', 'FULLURLE:' ),
+       'canonicalurl'              => array( '0', 'GREYÃ\89KANONİK:', 'CANONICALURL:' ),
        'canonicalurle'             => array( '0', 'GREYOKANONİK:', 'CANONICALURLE:' ),
        'lcfirst'                   => array( '0', 'KHİLK:', 'LCFIRST:' ),
        'ucfirst'                   => array( '0', 'BHİLK:', 'UCFIRST:' ),
        'lc'                        => array( '0', 'KH:', 'LC:' ),
        'uc'                        => array( '0', 'BH:', 'UC:' ),
-       'raw'                       => array( '0', 'XAM:', 'RAW:' ),
-       'displaytitle'              => array( '1', 'SERNAMİBIMOCNE', 'DISPLAYTITLE' ),
-       'newsectionlink'            => array( '1', '__GREYÃ\8aSERNAMEDÃ\8aNEWİ__', '__NEWSECTIONLINK__' ),
-       'nonewsectionlink'          => array( '1', '__GREYÃ\8aSERNAMEDÃ\8aNEWİÇINO__', '__NONEWSECTIONLINK__' ),
-       'currentversion'            => array( '1', 'VERSİYONÊNEWKİ', 'CURRENTVERSION' ),
-       'currenttimestamp'          => array( '1', 'WAREYSEHATÃ\8aNEWKİ', 'CURRENTTIMESTAMP' ),
-       'localtimestamp'            => array( '1', 'MALUMATÃ\8aWAREYSEHAT', 'LOCALTIMESTAMP' ),
+       'raw'                       => array( '0', 'TEZE:', 'RAW:' ),
+       'displaytitle'              => array( '1', 'SERNAMİBASNI', 'DISPLAYTITLE' ),
+       'newsectionlink'            => array( '1', '__GREYÃ\89SERNAMEDÃ\89NEWİ__', '__NEWSECTIONLINK__' ),
+       'nonewsectionlink'          => array( '1', '__GREYÃ\89SERNAMEDÃ\89NEWİÇINO__', '__NONEWSECTIONLINK__' ),
+       'currentversion'            => array( '1', 'VERSİYONVNEWKİ', 'CURRENTVERSION' ),
+       'currenttimestamp'          => array( '1', 'WAREYSEHATÃ\89NEWKİ', 'CURRENTTIMESTAMP' ),
+       'localtimestamp'            => array( '1', 'MALUMATÃ\89WAREYSEHAT', 'LOCALTIMESTAMP' ),
        'directionmark'             => array( '1', 'HETANIŞANKERDIŞ', 'HETNIŞAN', 'DIRECTIONMARK', 'DIRMARK' ),
-       'language'                  => array( '0', '#ZIWAN', '#LANGUAGE:' ),
-       'contentlanguage'           => array( '1', 'ZIWANÊESTİN', 'ZIWESTEN', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
-       'pagesinnamespace'          => array( '1', 'PELEYÊKECADÊNAMİDEYÊ', 'PELECN', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
-       'numberofadmins'            => array( '1', 'AMARİYAXİZMETKARAN', 'NUMBEROFADMINS' ),
+       'language'                  => array( '0', '#ZIWAN:', '#LANGUAGE:' ),
+       'contentlanguage'           => array( '1', 'ZUWANÉKESTÉ', 'ZUWESTEN', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+       'pagesinnamespace'          => array( '1', 'PERÉKCADÉNAMİDEYÉ', 'PELECN', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+       'numberofadmins'            => array( '1', 'AMARİYAADMİNAN', 'NUMBEROFADMINS' ),
        'formatnum'                 => array( '0', 'BABETNAYIŞ', 'FORMATNUM' ),
-       'padleft'                   => array( '0', 'ÇEPİPIRKE', 'PADLEFT' ),
-       'padright'                  => array( '0', 'RAŞTİPIRKE', 'PADRIGHT' ),
-       'special'                   => array( '0', 'xısusi', 'special' ),
-       'speciale'                  => array( '0', 'xısusiye', 'speciale' ),
+       'padleft'                   => array( '0', 'ÇEPİPIRK', 'PADLEFT' ),
+       'padright'                  => array( '0', 'RAŞTİPIRK', 'PADRIGHT' ),
+       'special'                   => array( '0', 'bağse', 'special' ),
+       'speciale'                  => array( '0', 'bağsiye', 'speciale' ),
        'defaultsort'               => array( '1', 'RATNAYIŞOHESBNAYIŞ', 'SIRMEYRATNAYIŞOHESBNAYIŞ', 'KATEGORİYARATNAYIŞOHESBNAYIŞ', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
        'filepath'                  => array( '0', 'RAYADOSYA:', 'FILEPATH:' ),
        'tag'                       => array( '0', 'etiket', 'tag' ),
        'hiddencat'                 => array( '1', '__KATEGORİYANIMITİ__', '__HIDDENCAT__' ),
-       'pagesincategory'           => array( '1', 'PELEYÊKEKATEGORİDEYÊ', 'KATDÊPELEY', 'PAGESINCATEGORY', 'PAGESINCAT' ),
-       'pagesize'                  => array( '1', 'EBATÊPELA', 'PAGESIZE' ),
+       'pagesincategory'           => array( '1', 'PERÉKKATEGORİDEYÉ', 'PERKATMİYAN', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+       'pagesize'                  => array( '1', 'EBATAPERER', 'PAGESIZE' ),
        'index'                     => array( '1', '__SERSIQ__', '__INDEX__' ),
        'noindex'                   => array( '1', '__SERSIQÇINYO__', '__NOINDEX__' ),
-       'numberingroup'             => array( '1', 'GRUBDEAMARE', 'AMARİYAGRUBER', 'NUMBERINGROUP', 'NUMINGROUP' ),
+       'numberingroup'             => array( '1', 'AMARİYAGRUBER', 'AMARGRUB', 'NUMBERINGROUP', 'NUMINGROUP' ),
        'staticredirect'            => array( '1', '__STATİKHETENAYIŞ__', '__STATICHETENAYIŞ__', '__STATICREDIRECT__' ),
-       'protectionlevel'           => array( '1', 'SEWİYEYÊSTARE', 'PROTECTIONLEVEL' ),
-       'formatdate'                => array( '0', 'demêformati', 'formatdate', 'dateformat' ),
+       'protectionlevel'           => array( '1', 'SEWİYEYASTARAN', 'PROTECTIONLEVEL' ),
+       'formatdate'                => array( '0', 'deméformati', 'formatdate', 'dateformat' ),
        'url_path'                  => array( '0', 'RAY', 'PATH' ),
        'url_wiki'                  => array( '0', 'WİKİ', 'WIKI' ),
        'url_query'                 => array( '0', 'PERSİYE', 'QUERY' ),
-       'defaultsort_noerror'       => array( '0', 'xırabinçıniya', 'noerror' ),
+       'defaultsort_noerror'       => array( '0', 'Ğırabinçıniya', 'noerror' ),
        'defaultsort_noreplace'     => array( '0', 'cewabçıniyo', 'noreplace' ),
-       'pagesincategory_all'       => array( '0', 'pêro', 'all' ),
-       'pagesincategory_pages'     => array( '0', 'peley', 'pages' ),
-       'pagesincategory_subcats'   => array( '0', 'bınkati', 'subcats' ),
+       'pagesincategory_all'       => array( '0', 'péro', 'all' ),
+       'pagesincategory_pages'     => array( '0', 'peri', 'pages' ),
+       'pagesincategory_subcats'   => array( '0', 'bınkatategori', 'subcats' ),
        'pagesincategory_files'     => array( '0', 'dosyey', 'files' ),
 );
 
index a6a64f6..0334344 100644 (file)
@@ -61,6 +61,7 @@ $namespaceAliases = array(
 $specialPageAliases = array(
        'Activeusers'               => array( 'ΕνεργοίΧρήστες' ),
        'Allmessages'               => array( 'ΌλαΤαΜηνύματα' ),
+       'AllMyUploads'              => array( 'ΌλαΤαΑρχείαΜου' ),
        'Allpages'                  => array( 'ΌλεςΟιΣελίδες' ),
        'Ancientpages'              => array( 'ΑρχαίεςΣελίδες' ),
        'Badtitle'                  => array( 'ΚακόςΤίτλος' ),
@@ -77,7 +78,9 @@ $specialPageAliases = array(
        'CreateAccount'             => array( 'ΔημιουργίαΛογαριασμού' ),
        'Deadendpages'              => array( 'ΑδιέξοδεςΣελίδες' ),
        'DeletedContributions'      => array( 'ΔιαγραμμένεςΣυνεισφορές' ),
+       'Diff'                      => array( 'Διαφορά' ),
        'DoubleRedirects'           => array( 'ΔιπλέςΑνακατευθύνσεις' ),
+       'EditWatchlist'             => array( 'ΕπεξεργασίαΛίσταςΠαρακολούθησης' ),
        'Emailuser'                 => array( 'EmailΧρήστη' ),
        'ExpandTemplates'           => array( 'ΕπέκτασηΠροτύπων' ),
        'Export'                    => array( 'Εξαγωγή' ),
@@ -111,15 +114,16 @@ $specialPageAliases = array(
        'MyLanguage'                => array( 'ΗΓλώσσαΜου' ),
        'Mypage'                    => array( 'ΗΣελίδαΜου' ),
        'Mytalk'                    => array( 'ΗΣυζήτησήΜου' ),
-       'Myuploads'                 => array( 'ΟιΕπιφορτώσειςΜου' ),
+       'Myuploads'                 => array( 'ΤαÎ\91Ï\81Ï\87είαÎ\9cοÏ\85', 'ΤαÎ\91νεβάÏ\83μαÏ\84άÎ\9cοÏ\85', 'Î\9fιÎ\95Ï\80ιÏ\86οÏ\81Ï\84Ï\8eÏ\83ειÏ\82Î\9cοÏ\85' ),
        'Newimages'                 => array( 'ΝέαΑρχεία', 'ΝέεςΕικόνες' ),
        'Newpages'                  => array( 'ΝέεςΣελίδες' ),
        'Popularpages'              => array( 'ΔημοφιλείςΣελίδες' ),
        'Preferences'               => array( 'Προτιμήσεις' ),
        'Prefixindex'               => array( 'ΕυρετήριοΠροθεμάτων' ),
        'Protectedpages'            => array( 'ΠροστατευμένεςΣελίδες' ),
-       'Protectedtitles'           => array( 'ΠροστετευμένοιΤίτλοι' ),
-       'Randompage'                => array( 'Τυχαία', 'ΤυχαίαΣελίδα' ),
+       'Protectedtitles'           => array( 'ΠροστατευμένοιΤίτλοι' ),
+       'Randompage'                => array( 'Τυχαία', 'ΤυχαίαΣελίδα', 'Τυχαίο' ),
+       'RandomInCategory'          => array( 'ΤυχαίαΣτηνΚατηγορία', 'ΤυχαίοΣτηνΚατηγορία' ),
        'Randomredirect'            => array( 'ΤυχαίαΑνακατεύθυνση' ),
        'Recentchanges'             => array( 'ΠρόσφατεςΑλλαγές' ),
        'Recentchangeslinked'       => array( 'ΣυνδεδεμένεςΠρόσφατεςΑλλαγές', 'ΣχετικέςΑλλαγές' ),
@@ -130,6 +134,7 @@ $specialPageAliases = array(
        'Specialpages'              => array( 'ΕιδικέςΣελίδες' ),
        'Statistics'                => array( 'Στατιστικά' ),
        'Tags'                      => array( 'Ετικέτες' ),
+       'TrackingCategories'        => array( 'ΚατηγορίεςΑνίχνευσης' ),
        'Uncategorizedcategories'   => array( 'ΑκατηγοριοποίητεςΚατηγορίες' ),
        'Uncategorizedimages'       => array( 'ΑκατηγοριοποίηταΑρχεία', 'ΑκατηγοριοποίητεςΕικόνες' ),
        'Uncategorizedpages'        => array( 'ΑκατηγοριοποίητεςΣελίδες' ),
@@ -140,7 +145,7 @@ $specialPageAliases = array(
        'Unusedimages'              => array( 'ΑχρησιμοποίηταΑρχεία' ),
        'Unusedtemplates'           => array( 'ΜηΧρησιμοποιούμεναΠρότυπα' ),
        'Unwatchedpages'            => array( 'ΜηΠαρακολουθούμενεςΣελίδες' ),
-       'Upload'                    => array( 'Επιφόρτωση' ),
+       'Upload'                    => array( 'Î\91νέβαÏ\83μα', 'Î\95Ï\80ιÏ\86Ï\8cÏ\81Ï\84Ï\89Ï\83η' ),
        'Userlogin'                 => array( 'ΣύνδεσηΧρήστη' ),
        'Userlogout'                => array( 'ΑποσύνδεσηΧρήστη' ),
        'Userrights'                => array( 'ΔικαιώματαΧρηστών' ),
@@ -189,7 +194,6 @@ $magicWords = array(
        'numberofusers'             => array( '1', 'ΑΡΙΘΜΟΣΧΡΗΣΤΩΝ', 'NUMBEROFUSERS' ),
        'numberofactiveusers'       => array( '1', 'ΕΝΕΡΓΟΙΧΡΗΣΤΕΣ', 'ΑΡΙΘΜΟΣΕΝΕΡΓΩΝΧΡΗΣΤΩΝ', 'NUMBEROFACTIVEUSERS' ),
        'numberofedits'             => array( '1', 'ΑΡΙΘΜΟΣΕΠΕΞΕΡΓΑΣΙΩΝ', 'NUMBEROFEDITS' ),
-       'numberofviews'             => array( '1', 'ΑΡΙΘΜΟΣΕΜΦΑΝΙΣΕΩΝ', 'NUMBEROFVIEWS' ),
        'pagename'                  => array( '1', 'ΟΝΟΜΑΣΕΛΙΔΑΣ', 'PAGENAME' ),
        'pagenamee'                 => array( '1', 'ΟΝΟΜΑΣΕΛΙΔΑΣΚ', 'PAGENAMEE' ),
        'namespace'                 => array( '1', 'ΠΕΡΙΟΧΗ', 'NAMESPACE' ),
index 05f3be8..e31710b 100644 (file)
@@ -184,7 +184,6 @@ $magicWords = array(
        'numberofusers'             => array( '1', 'NOMBRODEUZANTOJ', 'NUMBEROFUSERS' ),
        'numberofactiveusers'       => array( '1', 'NOMBRODEAKTIVAJUZANTOJ', 'NUMBEROFACTIVEUSERS' ),
        'numberofedits'             => array( '1', 'NOMBRODEREDAKTOJ', 'NUMBEROFEDITS' ),
-       'numberofviews'             => array( '1', 'NOMBRODEVIZITOJ', 'NUMBEROFVIEWS' ),
        'pagename'                  => array( '1', 'PAĜONOMO', 'PAGXONOMO', 'PAĜNOMO', 'PAGXNOMO', 'PAGENAME' ),
        'pagenamee'                 => array( '1', 'PAĜONOMOO', 'PAGXONOMOO', 'PAĜNOMOO', 'PAGXNOMOO', 'PAGENAMEE' ),
        'namespace'                 => array( '1', 'NOMSPACO', 'NAMESPACE' ),
index e872d4e..52e363c 100644 (file)
@@ -39,12 +39,12 @@ $namespaceGenderAliases = array(
 
 $specialPageAliases = array(
        'Activeusers'               => array( 'UsuariosActivos' ),
-       'Allmessages'               => array( 'TodosLosMensajes' ),
-       'AllMyUploads'              => array( 'TodasMisSubidas', 'TodosMisArchivos' ),
+       'Allmessages'               => array( 'TodosLosMensajes', 'Todos_los_mensajes' ),
+       'AllMyUploads'              => array( 'TodasMisSubidas', 'Todas_mis_subidas', 'TodosMisArchivos', 'Todos_mis_archivos' ),
        'Allpages'                  => array( 'Todas', 'Todas_las_páginas' ),
        'Ancientpages'              => array( 'PáginasAntiguas', 'Páginas_antiguas' ),
        'Badtitle'                  => array( 'Título_incorrecto' ),
-       'Blankpage'                 => array( 'PáginaEnBlanco', 'BlanquearPágina', 'Blanquear_página', 'Página_en_blanco' ),
+       'Blankpage'                 => array( 'Blanquear_página', 'PáginaEnBlanco', 'BlanquearPágina', 'Página_en_blanco' ),
        'Block'                     => array( 'Bloquear' ),
        'Booksources'               => array( 'FuentesDeLibros', 'Fuentes_de_libros' ),
        'BrokenRedirects'           => array( 'RedireccionesRotas', 'Redirecciones_rotas' ),
@@ -56,7 +56,7 @@ $specialPageAliases = array(
        'Contributions'             => array( 'Contribuciones' ),
        'CreateAccount'             => array( 'Crear_una_cuenta', 'CrearCuenta' ),
        'Deadendpages'              => array( 'PáginasSinSalida', 'Páginas_sin_salida' ),
-       'DeletedContributions'      => array( 'ContribucionesBorradas', 'Contribuciones_Borradas' ),
+       'DeletedContributions'      => array( 'ContribucionesBorradas', 'Contribuciones_borradas', 'Contribuciones_Borradas' ),
        'DoubleRedirects'           => array( 'RedireccionesDobles', 'Redirecciones_dobles' ),
        'EditWatchlist'             => array( 'EditarSeguimiento' ),
        'Emailuser'                 => array( 'Enviar_correo_electrónico', 'MandarEmailUsuario' ),
@@ -66,7 +66,8 @@ $specialPageAliases = array(
        'FileDuplicateSearch'       => array( 'BuscarArchivosDuplicados', 'Buscar_archivos_duplicados' ),
        'Filepath'                  => array( 'RutaDeArchivo', 'Ruta_de_archivo' ),
        'Import'                    => array( 'Importar' ),
-       'Invalidateemail'           => array( 'InvalidarEmail', 'Invalidar_correo_electrónico' ),
+       'Invalidateemail'           => array( 'Invalidar_correo_electrónico', 'InvalidarEmail' ),
+       'JavaScriptTest'            => array( 'PruebaJavaScript' ),
        'BlockList'                 => array( 'UsuariosBloqueados', 'Lista_de_usuarios_bloqueados' ),
        'LinkSearch'                => array( 'BúsquedaDeEnlaces', 'Búsqueda_de_enlaces' ),
        'Listadmins'                => array( 'ListaDeAdministradores', 'Lista_de_administradores' ),
@@ -83,6 +84,7 @@ $specialPageAliases = array(
        'MIMEsearch'                => array( 'BuscarPorMIME', 'Buscar_por_MIME' ),
        'Mostcategories'            => array( 'MásCategorizadas', 'Más_categorizadas' ),
        'Mostimages'                => array( 'MásImágenes', 'Con_más_imágenes' ),
+       'Mostinterwikis'            => array( 'MásInterwikis' ),
        'Mostlinked'                => array( 'MásEnlazados', 'Más_enlazados', 'MásEnlazadas' ),
        'Mostlinkedcategories'      => array( 'CategoríasMásUsadas', 'Categorías_más_usadas' ),
        'Mostlinkedtemplates'       => array( 'PlantillasMásUsadas', 'Plantillas_más_usadas' ),
@@ -103,7 +105,7 @@ $specialPageAliases = array(
        'Protectedpages'            => array( 'PáginasProtegidas', 'Páginas_protegidas' ),
        'Protectedtitles'           => array( 'TítulosProtegidos', 'Títulos_protegidos' ),
        'Randompage'                => array( 'Aleatoria', 'Aleatorio', 'Página_aleatoria' ),
-       'RandomInCategory'          => array( 'Aleatorio_en_categoría' ),
+       'RandomInCategory'          => array( 'Aleatorio_en_categoría', 'Aleatoria_en_categoría' ),
        'Randomredirect'            => array( 'RedirecciónAleatoria', 'Redirección_aleatoria' ),
        'Recentchanges'             => array( 'CambiosRecientes', 'Cambios_recientes' ),
        'Recentchangeslinked'       => array( 'CambiosEnEnlazadas', 'Cambios_en_enlazadas' ),
@@ -115,6 +117,7 @@ $specialPageAliases = array(
        'Specialpages'              => array( 'PáginasEspeciales', 'Páginas_especiales' ),
        'Statistics'                => array( 'Estadísticas' ),
        'Tags'                      => array( 'Etiquetas' ),
+       'TrackingCategories'        => array( 'CategoríasDeSeguimiento' ),
        'Unblock'                   => array( 'Desbloquear' ),
        'Uncategorizedcategories'   => array( 'CategoríasSinCategorizar', 'Categorías_sin_categorizar' ),
        'Uncategorizedimages'       => array( 'ImágenesSinCategorizar', 'Imágenes_sin_categorizar' ),
@@ -176,7 +179,6 @@ $magicWords = array(
        'numberofusers'             => array( '1', 'NÚMERODEUSUARIOS', 'NUMERODEUSUARIOS', 'NUMBEROFUSERS' ),
        'numberofactiveusers'       => array( '1', 'NÚMERODEUSUARIOSACTIVOS', 'NUMERODEUSUARIOSACTIVOS', 'NUMBEROFACTIVEUSERS' ),
        'numberofedits'             => array( '1', 'NÚMERODEEDICIONES', 'NUMERODEEDICIONES', 'NUMBEROFEDITS' ),
-       'numberofviews'             => array( '1', 'NÚMERODEVISTAS', 'NUMERODEVISTAS', 'NUMBEROFVIEWS' ),
        'pagename'                  => array( '1', 'NOMBREDEPAGINA', 'NOMBREDEPÁGINA', 'PAGENAME' ),
        'pagenamee'                 => array( '1', 'NOMBREDEPAGINAC', 'NOMBREDEPÁGINAC', 'PAGENAMEE' ),
        'namespace'                 => array( '1', 'ESPACIODENOMBRE', 'NAMESPACE' ),
@@ -208,13 +210,19 @@ $magicWords = array(
        'img_center'                => array( '1', 'centro', 'centrado', 'centrada', 'centrar', 'center', 'centre' ),
        'img_framed'                => array( '1', 'marco', 'enmarcado', 'enmarcada', 'framed', 'enframed', 'frame' ),
        'img_frameless'             => array( '1', 'sinmarco', 'sin_enmarcar', 'sinenmarcar', 'frameless' ),
+       'img_lang'                  => array( '1', 'idioma=$1', 'lang=$1' ),
        'img_page'                  => array( '1', 'pagina=$1', 'página=$1', 'pagina_$1', 'página_$1', 'page=$1', 'page $1' ),
        'img_border'                => array( '1', 'borde', 'border' ),
+       'img_top'                   => array( '1', 'arriba', 'top' ),
+       'img_middle'                => array( '1', 'medio', 'middle' ),
+       'img_bottom'                => array( '1', 'abajo', 'bottom' ),
        'img_link'                  => array( '1', 'vínculo=$1', 'vinculo=$1', 'enlace=$1', 'link=$1' ),
        'sitename'                  => array( '1', 'NOMBREDELSITIO', 'SITENAME' ),
        'ns'                        => array( '0', 'EN:', 'NS:' ),
        'localurl'                  => array( '0', 'URLLOCAL:', 'LOCALURL:' ),
        'localurle'                 => array( '0', 'URLLOCALC:', 'LOCALURLE:' ),
+       'articlepath'               => array( '0', 'RUTAARTÍCULO', 'RUTAARTICULO', 'ARTICLEPATH' ),
+       'pageid'                    => array( '0', 'IDDEPÁGINA', 'IDPÁGINA', 'IDDEPAGINA', 'IDPAGINA', 'PAGEID' ),
        'server'                    => array( '0', 'SERVIDOR', 'SERVER' ),
        'servername'                => array( '0', 'NOMBRESERVIDOR', 'SERVERNAME' ),
        'scriptpath'                => array( '0', 'RUTASCRIPT', 'RUTADESCRIPT', 'SCRIPTPATH' ),
@@ -231,9 +239,11 @@ $magicWords = array(
        'revisionday'               => array( '1', 'DIADEREVISION', 'DIAREVISION', 'DÍADEREVISIÓN', 'DÍAREVISIÓN', 'REVISIONDAY' ),
        'revisionday2'              => array( '1', 'DIADEREVISION2', 'DIAREVISION2', 'DÍADEREVISIÓN2', 'DÍAREVISIÓN2', 'REVISIONDAY2' ),
        'revisionmonth'             => array( '1', 'MESDEREVISION', 'MESDEREVISIÓN', 'MESREVISION', 'MESREVISIÓN', 'REVISIONMONTH' ),
+       'revisionmonth1'            => array( '1', 'MESDEREVISION1', 'MESDEREVISIÓN1', 'MESREVISION1', 'MESREVISIÓN1', 'REVISIONMONTH1' ),
        'revisionyear'              => array( '1', 'AÑODEREVISION', 'AÑODEREVISIÓN', 'AÑOREVISION', 'AÑOREVISIÓN', 'REVISIONYEAR' ),
        'revisiontimestamp'         => array( '1', 'MARCADEHORADEREVISION', 'MARCADEHORADEREVISIÓN', 'REVISIONTIMESTAMP' ),
        'revisionuser'              => array( '1', 'USUARIODEREVISION', 'USUARIODEREVISIÓN', 'REVISIONUSER' ),
+       'revisionsize'              => array( '1', 'TAMAÑODEREVISIÓN', 'TAMAÑODEREVISION', 'REVISIONSIZE' ),
        'fullurl'                   => array( '0', 'URLCOMPLETA:', 'FULLURL:' ),
        'fullurle'                  => array( '0', 'URLCOMPLETAC:', 'FULLURLE:' ),
        'canonicalurl'              => array( '0', 'URLCANONICA:', 'CANONICALURL:' ),
@@ -256,7 +266,10 @@ $magicWords = array(
        'pagesinnamespace'          => array( '1', 'PÁGINASENESPACIO', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
        'numberofadmins'            => array( '1', 'NÚMEROADMINIISTRADORES', 'NÚMEROADMINS', 'NUMEROADMINS', 'NUMEROADMINISTRADORES', 'NUMERODEADMINISTRADORES', 'NUMERODEADMINS', 'NÚMERODEADMINISTRADORES', 'NÚMERODEADMINS', 'NUMBEROFADMINS' ),
        'formatnum'                 => array( '0', 'FORMATONÚMERO', 'FORMATONUMERO', 'FORMATNUM' ),
+       'padleft'                   => array( '0', 'RELLENARIZQUIERDA', 'RELLENARIZQ', 'PADLEFT' ),
+       'padright'                  => array( '0', 'RELLENARDERECHA', 'RELLENARDER', 'PADRIGHT' ),
        'special'                   => array( '0', 'especial', 'special' ),
+       'speciale'                  => array( '0', 'especialc', 'speciale' ),
        'defaultsort'               => array( '1', 'ORDENAR:', 'CLAVEDEORDENPREDETERMINADO:', 'ORDENDECATEGORIAPREDETERMINADO:', 'ORDENDECATEGORÍAPREDETERMINADO:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
        'filepath'                  => array( '0', 'RUTAARCHIVO:', 'RUTARCHIVO:', 'RUTADEARCHIVO:', 'FILEPATH:' ),
        'tag'                       => array( '0', 'etiqueta', 'tag' ),
@@ -266,9 +279,16 @@ $magicWords = array(
        'index'                     => array( '1', '__INDEXAR__', '__INDEX__' ),
        'noindex'                   => array( '1', '__NOINDEXAR__', '__NOINDEX__' ),
        'numberingroup'             => array( '1', 'NÚMEROENGRUPO', 'NUMEROENGRUPO', 'NUMENGRUPO', 'NÚMENGRUPO', 'NUMBERINGROUP', 'NUMINGROUP' ),
-       'staticredirect'            => array( '1', '__REDIRECCIONESTATICA__', '__REDIRECCIÓNESTÁTICA__', '__STATICREDIRECT__' ),
-       'protectionlevel'           => array( '1', 'NIVELDEPROTECCIÓN', 'PROTECTIONLEVEL' ),
+       'staticredirect'            => array( '1', '__REDIRECCIÓNESTÁTICA__', '__REDIRECCIONESTATICA__', '__STATICREDIRECT__' ),
+       'protectionlevel'           => array( '1', 'NIVELDEPROTECCIÓN', 'NIVELDEPROTECCION', 'PROTECTIONLEVEL' ),
        'formatdate'                => array( '0', 'formatodefecha', 'formatearfecha', 'formatdate', 'dateformat' ),
+       'url_path'                  => array( '0', 'RUTA', 'PATH' ),
+       'url_query'                 => array( '0', 'BÚSQUEDA', 'QUERY' ),
+       'defaultsort_noreplace'     => array( '0', 'noreemplazar', 'noreplace' ),
+       'pagesincategory_all'       => array( '0', 'todo', 'all' ),
+       'pagesincategory_pages'     => array( '0', 'páginas', 'pages' ),
+       'pagesincategory_subcats'   => array( '0', 'subcategorías', 'subcats' ),
+       'pagesincategory_files'     => array( '0', 'archivos', 'files' ),
 );
 
 $datePreferences = false;
index e30b242..1aaabd6 100644 (file)
@@ -50,6 +50,7 @@ $specialPageAliases = array(
        'CreateAccount'             => array( 'Konto_loomine' ),
        'Deadendpages'              => array( 'Edasipääsuta_leheküljed' ),
        'DeletedContributions'      => array( 'Kustutatud_kaastöö' ),
+       'Diff'                      => array( 'Erin' ),
        'DoubleRedirects'           => array( 'Kahekordsed_ümbersuunamised' ),
        'EditWatchlist'             => array( 'Jälgimisloendi_redigeerimine' ),
        'Emailuser'                 => array( 'E-kirja_saatmine' ),
@@ -68,12 +69,13 @@ $specialPageAliases = array(
        'Listfiles'                 => array( 'Failide_loend' ),
        'Listgrouprights'           => array( 'Kasutajarühma_õigused' ),
        'Listredirects'             => array( 'Ümbersuunamised' ),
+       'ListDuplicatedFiles'       => array( 'Duplikaatfailide_loend' ),
        'Listusers'                 => array( 'Kasutajate_loend' ),
        'Lockdb'                    => array( 'Andmebaasi_lukustamine', 'Lukusta_andmebaas' ),
        'Log'                       => array( 'Logid' ),
        'Lonelypages'               => array( 'Viitamata_leheküljed' ),
        'Longpages'                 => array( 'Pikad_leheküljed' ),
-       'MergeHistory'              => array( 'Liitmisajalugu' ),
+       'MergeHistory'              => array( 'Ajaloo_liitmine' ),
        'MIMEsearch'                => array( 'MIME_otsing' ),
        'Mostcategories'            => array( 'Enim_kategoriseeritud' ),
        'Mostimages'                => array( 'Kõige_kasutatumad_failid' ),
@@ -110,6 +112,7 @@ $specialPageAliases = array(
        'Specialpages'              => array( 'Erileheküljed' ),
        'Statistics'                => array( 'Arvandmestik' ),
        'Tags'                      => array( 'Märgised' ),
+       'TrackingCategories'        => array( 'Süsteemikategooriad' ),
        'Unblock'                   => array( 'Blokeerimise_eemaldamine' ),
        'Uncategorizedcategories'   => array( 'Kategoriseerimata_kategooriad' ),
        'Uncategorizedimages'       => array( 'Kategoriseerimata_failid' ),
@@ -156,6 +159,8 @@ $magicWords = array(
        'currentmonth'              => array( '1', 'HETKEKUU', 'CURRENTMONTH', 'CURRENTMONTH2' ),
        'currentmonth1'             => array( '1', 'HETKEKUU1', 'CURRENTMONTH1' ),
        'currentmonthname'          => array( '1', 'HETKEKUUNIMETUS', 'CURRENTMONTHNAME' ),
+       'currentmonthnamegen'       => array( '1', 'HETKEKUUOM', 'CURRENTMONTHNAMEGEN' ),
+       'currentmonthabbrev'        => array( '1', 'HETKEKUULÜH', 'CURRENTMONTHABBREV' ),
        'currentday'                => array( '1', 'HETKEKUUPÄEV', 'CURRENTDAY' ),
        'currentday2'               => array( '1', 'HETKEKUUPÄEV2', 'CURRENTDAY2' ),
        'currentdayname'            => array( '1', 'HETKENÄDALAPÄEV', 'CURRENTDAYNAME' ),
@@ -165,6 +170,8 @@ $magicWords = array(
        'localmonth'                => array( '1', 'KOHALIKKUU', 'LOCALMONTH', 'LOCALMONTH2' ),
        'localmonth1'               => array( '1', 'KOHALIKKUU1', 'LOCALMONTH1' ),
        'localmonthname'            => array( '1', 'KOHALIKKUUNIMETUS', 'LOCALMONTHNAME' ),
+       'localmonthnamegen'         => array( '1', 'KOHALIKKUUOM', 'LOCALMONTHNAMEGEN' ),
+       'localmonthabbrev'          => array( '1', 'KOHALIKKUULÜH', 'LOCALMONTHABBREV' ),
        'localday'                  => array( '1', 'KOHALIKKUUPÄEV', 'LOCALDAY' ),
        'localday2'                 => array( '1', 'KOHALIKKUUPÄEV2', 'LOCALDAY2' ),
        'localdayname'              => array( '1', 'KOHALIKNÄDALAPÄEV', 'LOCALDAYNAME' ),
@@ -177,7 +184,6 @@ $magicWords = array(
        'numberofusers'             => array( '1', 'KASUTAJAMÄÄR', 'NUMBEROFUSERS' ),
        'numberofactiveusers'       => array( '1', 'TEGUSKASUTAJAMÄÄR', 'NUMBEROFACTIVEUSERS' ),
        'numberofedits'             => array( '1', 'REDIGEERIMISMÄÄR', 'NUMBEROFEDITS' ),
-       'numberofviews'             => array( '1', 'VAATAMISTEARV', 'NUMBEROFVIEWS' ),
        'pagename'                  => array( '1', 'LEHEKÜLJENIMI', 'PAGENAME' ),
        'pagenamee'                 => array( '1', 'LEHEKÜLJENIMI1', 'PAGENAMEE' ),
        'namespace'                 => array( '1', 'NIMERUUM', 'NAMESPACE' ),
@@ -206,7 +212,9 @@ $magicWords = array(
        'img_center'                => array( '1', 'keskel', 'center', 'centre' ),
        'img_framed'                => array( '1', 'raam', 'framed', 'enframed', 'frame' ),
        'img_frameless'             => array( '1', 'raamita', 'frameless' ),
+       'img_lang'                  => array( '1', 'keel=$1', 'lang=$1' ),
        'img_page'                  => array( '1', 'lehekülg=$1', 'lehekülg_$1', 'page=$1', 'page $1' ),
+       'img_upright'               => array( '1', 'püsti', 'püsti=$1', 'upright', 'upright=$1', 'upright $1' ),
        'img_border'                => array( '1', 'ääris', 'border' ),
        'sitename'                  => array( '1', 'KOHANIMI', 'SITENAME' ),
        'ns'                        => array( '0', 'NR:', 'NS:' ),
index 9fd3123..6c03f1d 100644 (file)
@@ -43,44 +43,48 @@ $specialPageAliases = array(
        'Allmessages'               => array( 'تمام_پیغام‌ها' ),
        'AllMyUploads'              => array( 'همهٔ_بارگذاری‌های_من', 'همه_بارگذاری‌های_من' ),
        'Allpages'                  => array( 'تمام_صفحه‌ها' ),
+       'ApiHelp'                   => array( 'راهنمای_ای‌پی‌آی' ),
        'Ancientpages'              => array( 'صفحه‌های_قدیمی' ),
        'Badtitle'                  => array( 'عنوان_بد' ),
-       'Blankpage'                 => array( 'صفحه_خالی' ),
+       'Blankpage'                 => array( 'صفحهٔ_خالی', 'صفحه_خالی' ),
        'Block'                     => array( 'بستن_نشانی_آی‌پی' ),
        'Booksources'               => array( 'منابع_کتاب' ),
        'BrokenRedirects'           => array( 'تغییرمسیرهای_خراب' ),
        'Categories'                => array( 'رده‌ها' ),
        'ChangeEmail'               => array( 'تغییر_رایانامه' ),
        'ChangePassword'            => array( 'از_نو_کردن_گذرواژه' ),
-       'ComparePages'              => array( 'مقایسه_صفحات' ),
+       'ComparePages'              => array( 'مقایسهٔ_صفحات' ),
        'Confirmemail'              => array( 'تأیید_رایانامه' ),
        'Contributions'             => array( 'مشارکت‌ها' ),
        'CreateAccount'             => array( 'ایجاد_حساب_کاربری' ),
        'Deadendpages'              => array( 'صفحه‌های_بن‌بست' ),
        'DeletedContributions'      => array( 'مشارکت‌های_حذف_شده' ),
+       'Diff'                      => array( 'تفاوت' ),
        'DoubleRedirects'           => array( 'تغییرمسیرهای_دوتایی' ),
        'EditWatchlist'             => array( 'ویرایش_فهرست_پی‌گیری‌ها' ),
        'Emailuser'                 => array( 'نامه_به_کاربر' ),
        'ExpandTemplates'           => array( 'گسترش_الگوها' ),
-       'Export'                    => array( 'برون_بری_صفحه' ),
+       'Export'                    => array( 'برونبری_صفحه' ),
        'Fewestrevisions'           => array( 'کمترین_نسخه' ),
-       'FileDuplicateSearch'       => array( 'جستجوی_پرونده_تکراری' ),
+       'FileDuplicateSearch'       => array( 'جستجوی_پروندهٔ_تکراری' ),
        'Filepath'                  => array( 'مسیر_پرونده' ),
        'Import'                    => array( 'درون‌ریزی_صفحه' ),
        'Invalidateemail'           => array( 'باطل‌کردن_رایانامه' ),
        'JavaScriptTest'            => array( 'تست_جاوااسکریپت' ),
-       'BlockList'                 => array( 'فهرست_بستن_نشانی_آی‌پی' ),
+       'BlockList'                 => array( 'Ù\81Ù\87رست_بستÙ\87â\80\8cشدÙ\87â\80\8cÙ\87ا', 'Ù\81Ù\87رست_بستÙ\86\86شاÙ\86Û\8c_Ø¢Û\8câ\80\8cÙ¾Û\8c' ),
        'LinkSearch'                => array( 'جستجوی_پیوند' ),
        'Listadmins'                => array( 'فهرست_مدیران' ),
        'Listbots'                  => array( 'فهرست_ربات‌ها' ),
        'Listfiles'                 => array( 'فهرست_پرونده‌ها', 'فهرست_تصاویر' ),
        'Listgrouprights'           => array( 'اختیارات_گروه‌های_کاربری' ),
        'Listredirects'             => array( 'فهرست_تغییرمسیرها' ),
+       'ListDuplicatedFiles'       => array( 'فهرست_پرونده‌های_تکراری' ),
        'Listusers'                 => array( 'فهرست_کاربران' ),
-       'Lockdb'                    => array( 'قفل_کردن_پایگاه_داده' ),
+       'Lockdb'                    => array( 'قفل‌کردن_پایگاه_داده‌ها' ),
        'Log'                       => array( 'سیاهه‌ها' ),
        'Lonelypages'               => array( 'صفحه‌های_یتیم' ),
        'Longpages'                 => array( 'صفحه‌های_بلند' ),
+       'MediaStatistics'           => array( 'آمار_رسانه‌ها' ),
        'MergeHistory'              => array( 'ادغام_تاریخچه' ),
        'MIMEsearch'                => array( 'جستجوی_MIME' ),
        'Mostcategories'            => array( 'بیشترین_رده' ),
@@ -93,19 +97,20 @@ $specialPageAliases = array(
        'Movepage'                  => array( 'انتقال_صفحه' ),
        'Mycontributions'           => array( 'مشارکت‌های_من' ),
        'MyLanguage'                => array( 'زبان‌های_من' ),
-       'Mypage'                    => array( 'صفحه_من' ),
+       'Mypage'                    => array( 'صفحهٔ_من', 'صفحه_من' ),
        'Mytalk'                    => array( 'بحث_من' ),
        'Myuploads'                 => array( 'بارگذاری‌های_من' ),
        'Newimages'                 => array( 'تصاویر_جدید' ),
        'Newpages'                  => array( 'صفحه‌های_تازه' ),
        'PagesWithProp'             => array( 'صفحه‌های_با_خاصیت' ),
+       'PageLanguage'              => array( 'زبان_صفحه' ),
        'PasswordReset'             => array( 'بازنشاندن_گذرواژه' ),
        'PermanentLink'             => array( 'پیوند_دائمی' ),
        'Popularpages'              => array( 'صفحه‌های_محبوب' ),
        'Preferences'               => array( 'ترجیحات' ),
        'Prefixindex'               => array( 'نمایه_پیشوندی' ),
-       'Protectedpages'            => array( 'صفحه‌های_محافظت_شده' ),
-       'Protectedtitles'           => array( 'عنوان‌های_محافظت_شده' ),
+       'Protectedpages'            => array( 'صفحه‌های_محافظتشده' ),
+       'Protectedtitles'           => array( 'عنوان‌های_محافظتشده' ),
        'Randompage'                => array( 'صفحهٔ_تصادفی' ),
        'RandomInCategory'          => array( 'تصادفی_در_رده' ),
        'Randomredirect'            => array( 'تغییرمسیر_تصادفی' ),
@@ -114,18 +119,20 @@ $specialPageAliases = array(
        'Redirect'                  => array( 'تغییرمسیر' ),
        'ResetTokens'               => array( 'بازنشانی_نشانه‌ها' ),
        'Revisiondelete'            => array( 'حذف_نسخه' ),
+       'RunJobs'                   => array( 'اجرای_کارها' ),
        'Search'                    => array( 'جستجو' ),
        'Shortpages'                => array( 'صفحه‌های_کوتاه' ),
        'Specialpages'              => array( 'صفحه‌های_ویژه' ),
        'Statistics'                => array( 'آمار' ),
        'Tags'                      => array( 'برچسب‌ها' ),
+       'TrackingCategories'        => array( 'رده‌های_ردیابی' ),
        'Unblock'                   => array( 'باز_کردن' ),
-       'Uncategorizedcategories'   => array( 'رده‌های_رده‌بندی_نشده' ),
-       'Uncategorizedimages'       => array( 'تصویرهای_رده‌بندی_‌نشده' ),
-       'Uncategorizedpages'        => array( 'صفحه‌های_رده‌بندی_نشده' ),
-       'Uncategorizedtemplates'    => array( 'الگوهای_رده‌بندی_نشده' ),
+       'Uncategorizedcategories'   => array( 'رده‌های_رده‌بندینشده' ),
+       'Uncategorizedimages'       => array( 'تصویرهای_رده‌بندی‌نشده' ),
+       'Uncategorizedpages'        => array( 'صفحه‌های_رده‌بندینشده' ),
+       'Uncategorizedtemplates'    => array( 'الگوهای_رده‌بندینشده' ),
        'Undelete'                  => array( 'احیای_صفحهٔ_حذف‌شده' ),
-       'Unlockdb'                  => array( 'باز_کردن_پایگاه_داده' ),
+       'Unlockdb'                  => array( 'قفل‌گشایی_پایگاه_داده‌ها' ),
        'Unusedcategories'          => array( 'رده‌های_استفاده_نشده' ),
        'Unusedimages'              => array( 'تصاویر_استفاده_نشده' ),
        'Unusedtemplates'           => array( 'الگوهای_استفاده_نشده' ),
@@ -180,7 +187,6 @@ $magicWords = array(
        'numberofusers'             => array( '1', 'تعدادکاربران', 'NUMBEROFUSERS' ),
        'numberofactiveusers'       => array( '1', 'کاربران‌فعال', 'کاربران_فعال', 'NUMBEROFACTIVEUSERS' ),
        'numberofedits'             => array( '1', 'تعدادویرایش‌ها', 'NUMBEROFEDITS' ),
-       'numberofviews'             => array( '1', 'تعدادبازدید', 'NUMBEROFVIEWS' ),
        'pagename'                  => array( '1', 'نام‌صفحه', 'نام_صفحه', 'PAGENAME' ),
        'pagenamee'                 => array( '1', 'نام‌صفحه‌کد', 'نام_صفحه_کد', 'PAGENAMEE' ),
        'namespace'                 => array( '1', 'فضای‌نام', 'فضای_نام', 'NAMESPACE' ),
@@ -258,10 +264,12 @@ $magicWords = array(
        'revisionyear'              => array( '1', 'سال‌نسخه', 'سال_نسخه', 'REVISIONYEAR' ),
        'revisiontimestamp'         => array( '1', 'زمان‌یونیکسی‌نسخه', 'زمان‌نسخه', 'زمان_یونیکسی_نسخه', 'زمان_نسخه', 'REVISIONTIMESTAMP' ),
        'revisionuser'              => array( '1', 'کاربرنسخه', 'کاربر_نسخه', 'REVISIONUSER' ),
+       'revisionsize'              => array( '1', 'اندازهٔ‌نسخه', 'اندازهٔ_نسخه', 'REVISIONSIZE' ),
        'plural'                    => array( '0', 'جمع:', 'PLURAL:' ),
        'fullurl'                   => array( '0', 'نشانی‌کامل:', 'نشانی_کامل:', 'FULLURL:' ),
        'fullurle'                  => array( '0', 'نشانی‌کامل‌کد:', 'نشانی_کامل_کد:', 'FULLURLE:' ),
        'canonicalurl'              => array( '0', 'نشانی_استاندارد:', 'نشانی‌استاندارد:', 'CANONICALURL:' ),
+       'canonicalurle'             => array( '0', 'نشانی_استاندارد_کد:', 'نشانی‌استانداردکد:', 'CANONICALURLE:' ),
        'lcfirst'                   => array( '0', 'ابتداکوچک:', 'ابتدا_کوچک:', 'LCFIRST:' ),
        'ucfirst'                   => array( '0', 'ابتدابزرگ:', 'ابتدا_بزرگ:', 'UCFIRST:' ),
        'lc'                        => array( '0', 'ک:', 'LC:' ),
@@ -269,6 +277,7 @@ $magicWords = array(
        'raw'                       => array( '0', 'خام:', 'RAW:' ),
        'displaytitle'              => array( '1', 'عنوان‌ظاهری', 'عنوان_ظاهری', 'DISPLAYTITLE' ),
        'rawsuffix'                 => array( '1', 'ن', 'R' ),
+       'nocommafysuffix'           => array( '0', 'جداکننده‌خیر', 'NOSEP' ),
        'newsectionlink'            => array( '1', '__بخش‌جدید__', '__NEWSECTIONLINK__' ),
        'nonewsectionlink'          => array( '1', '__بی‌پیوندبخش__', '__بی‌پیوند‌بخش‌جدید__', '__NONEWSECTIONLINK__' ),
        'currentversion'            => array( '1', 'نسخه‌کنونی', 'نسخه_کنونی', 'CURRENTVERSION' ),
index ed4c90a..1219911 100644 (file)
@@ -35,6 +35,7 @@ $namespaceAliases = array(
 $specialPageAliases = array(
        'Activeusers'               => array( 'Aktiiviset_käyttäjät' ),
        'Allmessages'               => array( 'Järjestelmäviestit' ),
+       'AllMyUploads'              => array( 'Kaikki_tallennukseni' ),
        'Allpages'                  => array( 'Kaikki_sivut' ),
        'Ancientpages'              => array( 'Kuolleet_sivut' ),
        'Badtitle'                  => array( 'Kelpaamaton_otsikko' ),
@@ -51,6 +52,7 @@ $specialPageAliases = array(
        'CreateAccount'             => array( 'Luo_tunnus' ),
        'Deadendpages'              => array( 'Linkittömät_sivut' ),
        'DeletedContributions'      => array( 'Poistetut_muokkaukset' ),
+       'Diff'                      => array( 'Ero' ),
        'DoubleRedirects'           => array( 'Kaksinkertaiset_ohjaukset', 'Kaksinkertaiset_uudelleenohjaukset' ),
        'EditWatchlist'             => array( 'Muokkaa_tarkkailulistaa' ),
        'Emailuser'                 => array( 'Lähetä_sähköpostia' ),
@@ -61,6 +63,7 @@ $specialPageAliases = array(
        'Filepath'                  => array( 'Tiedostopolku' ),
        'Import'                    => array( 'Tuo_sivuja' ),
        'Invalidateemail'           => array( 'Hylkää_sähköpostiosoite' ),
+       'JavaScriptTest'            => array( 'JavaScriptTesti' ),
        'BlockList'                 => array( 'Muokkausestot' ),
        'LinkSearch'                => array( 'Linkkihaku' ),
        'Listadmins'                => array( 'Ylläpitäjät' ),
@@ -68,11 +71,13 @@ $specialPageAliases = array(
        'Listfiles'                 => array( 'Tiedostoluettelo' ),
        'Listgrouprights'           => array( 'Käyttäjäryhmien_oikeudet' ),
        'Listredirects'             => array( 'Ohjaukset', 'Ohjaussivut', 'Uudelleenohjaukset' ),
+       'ListDuplicatedFiles'       => array( 'Listaa_tuplatiedostot' ),
        'Listusers'                 => array( 'Käyttäjät' ),
        'Lockdb'                    => array( 'Lukitse_tietokanta' ),
        'Log'                       => array( 'Loki', 'Lokit' ),
        'Lonelypages'               => array( 'Yksinäiset_sivut' ),
        'Longpages'                 => array( 'Pitkät_sivut' ),
+       'MediaStatistics'           => array( 'Median_tiedot' ),
        'MergeHistory'              => array( 'Liitä_muutoshistoria' ),
        'MIMEsearch'                => array( 'MIME-haku' ),
        'Mostcategories'            => array( 'Luokitelluimmat_sivut' ),
@@ -90,6 +95,7 @@ $specialPageAliases = array(
        'Myuploads'                 => array( 'Omat_tiedostot' ),
        'Newimages'                 => array( 'Uudet_tiedostot', 'Uudet_kuvat' ),
        'Newpages'                  => array( 'Uudet_sivut' ),
+       'PageLanguage'              => array( 'Sivun_kieli' ),
        'PasswordReset'             => array( 'Unohtuneen_salasanan_vaihto' ),
        'PermanentLink'             => array( 'Ikilinkki' ),
        'Popularpages'              => array( 'Suositut_sivut' ),
@@ -98,16 +104,18 @@ $specialPageAliases = array(
        'Protectedpages'            => array( 'Suojatut_sivut' ),
        'Protectedtitles'           => array( 'Suojatut_sivunimet' ),
        'Randompage'                => array( 'Satunnainen_sivu' ),
-       'RandomInCategory'          => array( 'Satunnainen_sivu_luokasta' ),
+       'RandomInCategory'          => array( 'Satunnainen_kohde_luokasta' ),
        'Randomredirect'            => array( 'Satunnainen_ohjaus', 'Satunnainen_uudelleenohjaus' ),
        'Recentchanges'             => array( 'Tuoreet_muutokset' ),
        'Recentchangeslinked'       => array( 'Linkitetyt_muutokset' ),
-       'Revisiondelete'            => array( 'Poista_muokkaus' ),
+       'Redirect'                  => array( 'Ohjaus' ),
+       'Revisiondelete'            => array( 'Poista_versio' ),
        'Search'                    => array( 'Haku' ),
        'Shortpages'                => array( 'Lyhyet_sivut' ),
        'Specialpages'              => array( 'Toimintosivut' ),
        'Statistics'                => array( 'Tilastot' ),
-       'Tags'                      => array( 'Merkinnät' ),
+       'Tags'                      => array( 'Merkkaukset' ),
+       'TrackingCategories'        => array( 'Tarkkailuluokat' ),
        'Unblock'                   => array( 'Poista_esto' ),
        'Uncategorizedcategories'   => array( 'Luokittelemattomat_luokat' ),
        'Uncategorizedimages'       => array( 'Luokittelemattomat_tiedostot' ),
@@ -124,10 +132,10 @@ $specialPageAliases = array(
        'Userlogout'                => array( 'Kirjaudu_ulos' ),
        'Userrights'                => array( 'Käyttöoikeudet' ),
        'Version'                   => array( 'Versio' ),
-       'Wantedcategories'          => array( 'Halutuimmat_luokat' ),
-       'Wantedfiles'               => array( 'Halutuimmat_tiedostot' ),
-       'Wantedpages'               => array( 'Halutuimmat_sivut' ),
-       'Wantedtemplates'           => array( 'Halutuimmat_mallineet' ),
+       'Wantedcategories'          => array( 'Halutut_luokat' ),
+       'Wantedfiles'               => array( 'Halutut_tiedostot' ),
+       'Wantedpages'               => array( 'Halutut_sivut' ),
+       'Wantedtemplates'           => array( 'Halutut_mallineet' ),
        'Watchlist'                 => array( 'Tarkkailulista' ),
        'Whatlinkshere'             => array( 'Tänne_viittaavat_sivut' ),
        'Withoutinterwiki'          => array( 'Kielilinkittömät_sivut' ),
@@ -164,7 +172,6 @@ $magicWords = array(
        'numberoffiles'             => array( '1', 'TIEDOSTOMÄÄRÄ', 'NUMBEROFFILES' ),
        'numberofusers'             => array( '1', 'KÄYTTÄJÄMÄÄRÄ', 'NUMBEROFUSERS' ),
        'numberofedits'             => array( '1', 'MUOKKAUSMÄÄRÄ', 'NUMBEROFEDITS' ),
-       'numberofviews'             => array( '1', 'SIVUHAKUMÄÄRÄ', 'NUMBEROFVIEWS' ),
        'pagename'                  => array( '1', 'SIVUNIMI', 'PAGENAME' ),
        'pagenamee'                 => array( '1', 'SIVUNIMIE', 'PAGENAMEE' ),
        'namespace'                 => array( '1', 'NIMIAVARUUS', 'NAMESPACE' ),
index 5e406da..b9e8b54 100644 (file)
@@ -176,7 +176,6 @@ $magicWords = array(
        'numberofusers'             => array( '1', 'NOMBREUTILISATEURS', 'NUMBEROFUSERS' ),
        'numberofactiveusers'       => array( '1', 'NOMBREUTILISATEURSACTIFS', 'NUMBEROFACTIVEUSERS' ),
        'numberofedits'             => array( '1', 'NOMBREMODIFS', 'NUMBEROFEDITS' ),
-       'numberofviews'             => array( '1', 'NOMBREVUES', 'NUMBEROFVIEWS' ),
        'pagename'                  => array( '1', 'NOMPAGE', 'PAGENAME' ),
        'pagenamee'                 => array( '1', 'NOMPAGEX', 'PAGENAMEE' ),
        'namespace'                 => array( '1', 'ESPACENOMMAGE', 'NAMESPACE' ),
index 8682ab0..51a0e13 100644 (file)
@@ -177,7 +177,6 @@ $magicWords = array(
        'numberofusers'             => array( '1', 'NOMBRO_D_USANCIÉRS', 'NOMBREUTILISATEURS', 'NUMBEROFUSERS' ),
        'numberofactiveusers'       => array( '1', 'NOMBRO_D_USANCIÉRS_ACTIFS', 'NOMBREUTILISATEURSACTIFS', 'NUMBEROFACTIVEUSERS' ),
        'numberofedits'             => array( '1', 'NOMBRO_DE_CHANGEMENTS', 'NOMBREMODIFS', 'NUMBEROFEDITS' ),
-       'numberofviews'             => array( '1', 'NOMBRO_DE_VUES', 'NOMBREVUES', 'NUMBEROFVIEWS' ),
        'pagename'                  => array( '1', 'NOM_DE_LA_PÂGE', 'NOMPAGE', 'PAGENAME' ),
        'pagenamee'                 => array( '1', 'NOM_DE_LA_PÂGE_URL', 'NOMPAGEX', 'PAGENAMEE' ),
        'namespace'                 => array( '1', 'ÈSPÂÇO_DE_NOMS', 'ESPACENOMMAGE', 'NAMESPACE' ),
@@ -207,9 +206,9 @@ $magicWords = array(
        'img_framed'                => array( '1', 'encâdrâ', 'câdro', 'cadre', 'encadré', 'encadre', 'framed', 'enframed', 'frame' ),
        'img_frameless'             => array( '1', 'sen_câdro', 'pas_encâdrâ', 'sans_cadre', 'non_encadré', 'non_encadre', 'frameless' ),
        'img_page'                  => array( '1', 'pâge=$1', 'pâge $1', 'page=$1', 'page $1' ),
-       'img_upright'               => array( '1', 'drêt', 'drêt=$1', 'drêt $1', 'redresse', 'redresse=$1', 'redresse $1', 'upright', 'upright=$1', 'upright $1' ),
+       'img_upright'               => array( '1', 'drêt', 'drêt=$1', 'drêt $1', 'redresse', 'redresse=$1', 'redresse $1', 'redresse_$1', 'upright', 'upright=$1', 'upright $1' ),
        'img_border'                => array( '1', 'bordura', 'bordure', 'border' ),
-       'img_baseline'              => array( '1', 'legne_de_bâsa', 'ligne_de_base', 'base', 'baseline' ),
+       'img_baseline'              => array( '1', 'legne_de_bâsa', 'ligne_de_base', 'base', 'ligne-de-base', 'baseline' ),
        'img_sub'                   => array( '1', 'segno', 'indice', 'ind', 'sub' ),
        'img_super'                 => array( '1', 'èxposent', 'èxp', 'exposant', 'exp', 'super', 'sup' ),
        'img_top'                   => array( '1', 'd\'amont', 'haut', 'top' ),
index e30f724..8ab5bcc 100644 (file)
@@ -54,7 +54,7 @@ $dateFormats = array(
 $specialPageAliases = array(
        'Activeusers'               => array( 'Usuarios_activos' ),
        'Allmessages'               => array( 'Todas_as_mensaxes' ),
-       'AllMyUploads'              => array( 'Todas_as_miñas_cargas', 'Todos_os_meus_ficheiros' ),
+       'AllMyUploads'              => array( 'Todas_as_miñas_subidas', 'Todas_as_miñas_cargas', 'Todos_os_meus_ficheiros' ),
        'Allpages'                  => array( 'Todas_as_páxinas' ),
        'Ancientpages'              => array( 'Páxinas_máis_antigas' ),
        'Badtitle'                  => array( 'Título_incorrecto' ),
@@ -63,24 +63,24 @@ $specialPageAliases = array(
        'Booksources'               => array( 'Fontes_bibliográficas' ),
        'BrokenRedirects'           => array( 'Redireccións_rotas' ),
        'Categories'                => array( 'Categorías' ),
-       'ChangeEmail'               => array( 'Cambiar_o_correo_electrónico' ),
-       'ChangePassword'            => array( 'Cambiar_o_contrasinal' ),
+       'ChangeEmail'               => array( 'Cambiar_o_correo_electrónico', 'Cambiar_correo_electrónico' ),
+       'ChangePassword'            => array( 'Cambiar_o_contrasinal', 'Cambiar_contrasinal' ),
        'ComparePages'              => array( 'Comparar_as_páxinas' ),
-       'Confirmemail'              => array( 'Confirmar_o_correo_electrónico' ),
+       'Confirmemail'              => array( 'Confirmar_o_correo_electrónico', 'Confirmar_correo_electrónico' ),
        'Contributions'             => array( 'Contribucións' ),
        'CreateAccount'             => array( 'Crear_unha_conta' ),
        'Deadendpages'              => array( 'Páxinas_mortas' ),
        'DeletedContributions'      => array( 'Contribucións_borradas' ),
        'DoubleRedirects'           => array( 'Redireccións_dobres' ),
        'EditWatchlist'             => array( 'Editar_a_lista_de_vixilancia' ),
-       'Emailuser'                 => array( 'Correo_electrónico' ),
+       'Emailuser'                 => array( 'Enviar_correo_electrónico', 'Correo_electrónico', 'Enviar_correo_electrónico_usuario', 'Enviar_correo_electrónico_usuaria' ),
        'ExpandTemplates'           => array( 'Expandir_os_modelos' ),
        'Export'                    => array( 'Exportar' ),
        'Fewestrevisions'           => array( 'Páxinas_con_menos_revisións' ),
-       'FileDuplicateSearch'       => array( 'Procura_de_ficheiros_duplicados' ),
+       'FileDuplicateSearch'       => array( 'Procura_de_ficheiros_duplicados', 'Busca_de_ficheiros_duplicados', 'Busca_de_arquivos_duplicados' ),
        'Filepath'                  => array( 'Ruta_do_ficheiro' ),
        'Import'                    => array( 'Importar' ),
-       'Invalidateemail'           => array( 'Invalidar_o_enderezo_de_correo_electrónico' ),
+       'Invalidateemail'           => array( 'Invalidar_o_enderezo_de_correo_electrónico', 'Invalidar_correo_electrónico', 'Invalidar_enderezo_de_correo_electrónico', 'Invalidar_enderezo_correo_electrónico' ),
        'JavaScriptTest'            => array( 'Proba_do_JavaScript' ),
        'BlockList'                 => array( 'Lista_de_bloqueos', 'Lista_dos_bloqueos_a_enderezos_IP' ),
        'LinkSearch'                => array( 'Buscar_ligazóns_web' ),
@@ -94,55 +94,57 @@ $specialPageAliases = array(
        'Log'                       => array( 'Rexistros' ),
        'Lonelypages'               => array( 'Páxinas_orfas' ),
        'Longpages'                 => array( 'Páxinas_longas' ),
-       'MergeHistory'              => array( 'Fusionar_os_historiais' ),
+       'MergeHistory'              => array( 'Fusionar_os_historiais', 'Fusionar_historiais' ),
        'MIMEsearch'                => array( 'Procura_MIME' ),
        'Mostcategories'            => array( 'Páxinas_con_máis_categorías' ),
-       'Mostimages'                => array( 'Ficheiros_máis_ligados' ),
+       'Mostimages'                => array( 'Ficheiros_máis_ligados', 'Arquivos_máis_ligados' ),
        'Mostinterwikis'            => array( 'Páxinas_con_máis_interwikis' ),
        'Mostlinked'                => array( 'Páxinas_máis_ligadas' ),
        'Mostlinkedcategories'      => array( 'Categorías_máis_ligadas' ),
        'Mostlinkedtemplates'       => array( 'Modelos_máis_ligados' ),
        'Mostrevisions'             => array( 'Páxinas_con_máis_revisións' ),
-       'Movepage'                  => array( 'Mover_a_páxina' ),
-       'Mycontributions'           => array( 'As_miñas_contribucións' ),
-       'Mypage'                    => array( 'A_miña_páxina_de_usuario' ),
-       'Mytalk'                    => array( 'A_miña_conversa' ),
+       'Movepage'                  => array( 'Mover_a_páxina', 'Mover_páxina', 'Mover_o_artigo', 'Mover_artigo' ),
+       'Mycontributions'           => array( 'As_miñas_contribucións', 'Miñas_contribucións' ),
+       'Mypage'                    => array( 'A_miña_páxina_de_usuario', 'A_miña_páxina', 'Miña_páxina_de_usuario', 'Miña_páxina' ),
+       'Mytalk'                    => array( 'A_miña_conversa', 'Miña_conversa' ),
        'Myuploads'                 => array( 'As_miñas_subidas' ),
        'Newimages'                 => array( 'Imaxes_novas' ),
        'Newpages'                  => array( 'Páxinas_novas' ),
        'PagesWithProp'             => array( 'Páxinas_con_propiedades' ),
-       'PasswordReset'             => array( 'Restablecer_o_contrasinal' ),
+       'PasswordReset'             => array( 'Restablecer_o_contrasinal', 'Restablecer_contrasinal' ),
        'PermanentLink'             => array( 'Ligazón_permanente' ),
        'Popularpages'              => array( 'Páxinas_populares' ),
        'Preferences'               => array( 'Preferencias' ),
        'Prefixindex'               => array( 'Índice_de_prefixos' ),
        'Protectedpages'            => array( 'Páxinas_protexidas' ),
        'Protectedtitles'           => array( 'Títulos_protexidos' ),
-       'Randompage'                => array( 'Ao_chou', 'Páxina_aleatoria' ),
+       'Randompage'                => array( 'Ao_chou', 'Páxina_aleatoria', 'Aleatoria', 'Aleatorio' ),
+       'RandomInCategory'          => array( 'Aleatoria_na_categoría', 'Aleatorio_na_categoría' ),
        'Randomredirect'            => array( 'Redirección_aleatoria' ),
        'Recentchanges'             => array( 'Cambios_recentes' ),
        'Recentchangeslinked'       => array( 'Cambios_relacionados' ),
        'Redirect'                  => array( 'Redirección' ),
        'ResetTokens'               => array( 'Restablecer_os_pases' ),
        'Revisiondelete'            => array( 'Revisións_borradas' ),
-       'Search'                    => array( 'Procurar' ),
+       'Search'                    => array( 'Procurar', 'Buscar' ),
        'Shortpages'                => array( 'Páxinas_curtas' ),
        'Specialpages'              => array( 'Páxinas_especiais' ),
-       'Statistics'                => array( 'Estatísticas' ),
+       'Statistics'                => array( 'Estatísticas', 'Estadísticas' ),
        'Tags'                      => array( 'Etiquetas' ),
        'Unblock'                   => array( 'Desbloquear' ),
-       'Uncategorizedcategories'   => array( 'Categorías_sen_categoría' ),
+       'Uncategorizedcategories'   => array( 'Categorías_sen_categoría', 'Categorías_non_categorizadas' ),
        'Uncategorizedimages'       => array( 'Imaxes_sen_categoría' ),
        'Uncategorizedpages'        => array( 'Páxinas_sen_categoría' ),
        'Uncategorizedtemplates'    => array( 'Modelos_sen_categoría' ),
        'Undelete'                  => array( 'Restaurar' ),
        'Unlockdb'                  => array( 'Abrir_a_base_de_datos' ),
-       'Unusedcategories'          => array( 'Categorías_sen_uso' ),
-       'Unusedimages'              => array( 'Imaxes_sen_uso' ),
-       'Unusedtemplates'           => array( 'Modelos_non_usados' ),
-       'Unwatchedpages'            => array( 'Páxinas_sen_vixiar' ),
-       'Upload'                    => array( 'Cargar' ),
-       'Userlogin'                 => array( 'Rexistro' ),
+       'Unusedcategories'          => array( 'Categorías_sen_uso', 'Categorías_non_utilizadas' ),
+       'Unusedimages'              => array( 'Ficheiros_sen_uso', 'Imaxes_sen_uso', 'Ficheiros_non_usados', 'Imaxes_non_usadas' ),
+       'Unusedtemplates'           => array( 'Modelos_non_usados', 'Modelos_sen_uso' ),
+       'Unwatchedpages'            => array( 'Páxinas_sen_vixiar', 'Páxinas_non_vixiadas' ),
+       'Upload'                    => array( 'Subir', 'Cargar' ),
+       'UploadStash'               => array( 'Ficheiros_agochados', 'Arquivos_agochados', 'Subidas_agochadas' ),
+       'Userlogin'                 => array( 'Iniciar_sesión', 'Iniciar_a_sesión', 'Acceder_ao_sistema', 'Acceder_ó_sistema' ),
        'Userlogout'                => array( 'Saír_ao_anonimato' ),
        'Userrights'                => array( 'Dereitos_de_usuario' ),
        'Version'                   => array( 'Versión' ),
@@ -151,8 +153,8 @@ $specialPageAliases = array(
        'Wantedpages'               => array( 'Páxinas_requiridas', 'Ligazóns_rotas' ),
        'Wantedtemplates'           => array( 'Modelos_requiridos' ),
        'Watchlist'                 => array( 'Lista_de_vixilancia' ),
-       'Whatlinkshere'             => array( 'Páxinas_que_ligan_con_esta' ),
-       'Withoutinterwiki'          => array( 'Sen_interwiki' ),
+       'Whatlinkshere'             => array( 'Páxinas_que_ligan_con_esta', 'O_que_liga_aquí' ),
+       'Withoutinterwiki'          => array( 'Sen_interwiki', 'Sen_interwikis' ),
 );
 
 $magicWords = array(
@@ -188,7 +190,6 @@ $magicWords = array(
        'numberofusers'             => array( '1', 'NÚMERODEUSUARIOS', 'NUMERODEUSUARIOS', 'NÚMERODEUSUÁRIOS', 'NUMBEROFUSERS' ),
        'numberofactiveusers'       => array( '1', 'NÚMERODEUSUARIOSACTIVOS', 'NUMERODEUSUARIOSATIVOS', 'NÚMERODEUSUÁRIOSATIVOS', 'NUMBEROFACTIVEUSERS' ),
        'numberofedits'             => array( '1', 'NÚMERODEEDICIÓNS', 'NUMERODEEDICOES', 'NÚMERODEEDIÇÕES', 'NUMBEROFEDITS' ),
-       'numberofviews'             => array( '1', 'NÚMERODEVISITAS', 'NUMERODEEXIBICOES', 'NÚMERODEEXIBIÇÕES', 'NUMBEROFVIEWS' ),
        'pagename'                  => array( '1', 'NOMEDAPÁXINA', 'NOMEDAPAGINA', 'NOMEDAPÁGINA', 'PAGENAME' ),
        'namespace'                 => array( '1', 'ESPAZODENOMES', 'DOMINIO', 'DOMÍNIO', 'ESPACONOMINAL', 'ESPAÇONOMINAL', 'NAMESPACE' ),
        'namespacenumber'           => array( '1', 'NÚMERODOESPAZODENOMES', 'NAMESPACENUMBER' ),
@@ -208,8 +209,8 @@ $magicWords = array(
        'img_center'                => array( '1', 'centro', 'center', 'centre' ),
        'img_framed'                => array( '1', 'conmarco', 'conbordo', 'marco', 'commoldura', 'comborda', 'framed', 'enframed', 'frame' ),
        'img_frameless'             => array( '1', 'senmarco', 'senbordo', 'semmoldura', 'semborda', 'frameless' ),
-       'img_page'                  => array( '1', 'páxina=$1', 'páxina_$1', 'página=$1', 'página $1', 'page=$1', 'page $1' ),
-       'img_upright'               => array( '1', 'arribaádereita', 'arribaádereita=$1', 'arribaádereita_$1', 'superiordireito', 'superiordireito=$1', 'superiordireito $1', 'upright', 'upright=$1', 'upright $1' ),
+       'img_page'                  => array( '1', 'páxina=$1', 'páxina_$1', 'página=$1', 'página_$1', 'página $1', 'page=$1', 'page $1' ),
+       'img_upright'               => array( '1', 'arribaádereita', 'arribaádereita=$1', 'arribaádereita_$1', 'superiordireito', 'superiordireito=$1', 'superiordireito_$1', 'superiordireito $1', 'upright', 'upright=$1', 'upright $1' ),
        'img_border'                => array( '1', 'bordo', 'borda', 'border' ),
        'img_baseline'              => array( '1', 'liñadebase', 'linhadebase', 'baseline' ),
        'img_top'                   => array( '1', 'arriba', 'acima', 'top' ),
@@ -257,10 +258,16 @@ $magicWords = array(
        'defaultsort'               => array( '1', 'ORDENAR:', 'ORDENACAOPADRAO', 'ORDENAÇÃOPADRÃO', 'ORDEMPADRAO', 'ORDEMPADRÃO', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
        'tag'                       => array( '0', 'etiqueta', 'tag' ),
        'hiddencat'                 => array( '1', '__CATEGORÍAOCULTA__', '__CATEGORIAOCULTA__', '__CATOCULTA__', '__HIDDENCAT__' ),
-       'pagesincategory'           => array( '1', 'PÁXINASNACATEGORÍA', 'PAGINASNACATEGORIA', 'PÁGINASNACATEGORIA', 'PAGINASNACAT', 'PÁGINASNACAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
-       'pagesize'                  => array( '1', 'TAMAÑODAPÁXINA', 'TAMANHODAPAGINA', 'TAMANHODAPÁGINA', 'PAGESIZE' ),
+       'pagesincategory'           => array( '1', 'PÁXINASNACATEGORÍA', 'PAXINASNACATEGORIA', 'PAGINASNACATEGORIA', 'PÁGINASNACATEGORIA', 'PAGINASNACAT', 'PÁGINASNACAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+       'pagesize'                  => array( '1', 'TAMAÑODAPÁXINA', 'TAMAÑODAPAXINA', 'TAMANHODAPAGINA', 'TAMANHODAPÁGINA', 'PAGESIZE' ),
+       'index'                     => array( '1', '__INDEXAR__', '__INDEX__' ),
+       'noindex'                   => array( '1', '__NONINDEXAR__', '__NAOINDEXAR__', '__NÃOINDEXAR__', '__NOINDEX__' ),
+       'numberingroup'             => array( '1', 'NÚMEROENGRUPO', 'NUMEROENGRUPO', 'NUMERONOGRUPO', 'NÚMERONOGRUPO', 'NUMBERINGROUP', 'NUMINGROUP' ),
+       'staticredirect'            => array( '1', '__REDIRECCIÓNESTÁTICA__', '__REDIRECCIONESTATICA__', '__REDIRECIONAMENTOESTATICO__', '__REDIRECIONAMENTOESTÁTICO__', '__STATICREDIRECT__' ),
+       'protectionlevel'           => array( '1', 'NIVELDEPROTECCIÓN', 'NIVELDEPROTECCION', 'NIVELDEPROTECAO', 'NÍVELDEPROTEÇÃO', 'PROTECTIONLEVEL' ),
+       'formatdate'                => array( '0', 'formatodadata', 'formateardata', 'formatdate', 'dateformat' ),
        'url_path'                  => array( '0', 'RUTA', 'PATH' ),
-       'url_query'                 => array( '0', 'PESCUDA', 'QUERY' ),
+       'url_query'                 => array( '0', 'PESCUDA', 'BUSCA', 'QUERY' ),
        'pagesincategory_all'       => array( '0', 'todos', 'all' ),
        'pagesincategory_pages'     => array( '0', 'páxinas', 'pages' ),
        'pagesincategory_subcats'   => array( '0', 'subcategorías', 'subcats' ),
index 723eac8..f8268dd 100644 (file)
@@ -33,29 +33,51 @@ $namespaceAliases = array(
 );
 
 $specialPageAliases = array(
+       'Activeusers'               => array( 'MeaHoʻohanaNei', 'MeaHoohanaNei' ),
+       'Allmessages'               => array( 'PūlonoApau', 'PulonoApau' ),
        'Ancientpages'              => array( 'ʻAoʻaoKahiko', 'AoaoKahiko' ),
+       'Blankpage'                 => array( 'ʻAoʻaoHakahaka', 'AoaoHakahaka' ),
        'Categories'                => array( 'Māhele', 'Mahele' ),
+       'ChangeEmail'               => array( 'LoliLekauila' ),
+       'Confirmemail'              => array( 'HōʻoiaLekauila', 'HōoiaLekauila', 'HoʻoiaLekauila', 'HooiaLekauila' ),
        'Contributions'             => array( 'Haʻawina', 'Haawina' ),
        'CreateAccount'             => array( 'Kāinoa', 'Kainoa' ),
+       'Diff'                      => array( 'ʻOkoʻa', 'Okoa' ),
        'Emailuser'                 => array( 'LekaUila' ),
+       'Export'                    => array( 'Kāpuka', 'Kapuka' ),
+       'Filepath'                  => array( 'AlaWaihona' ),
+       'Import'                    => array( 'Kākomo', 'Kakomo' ),
+       'LinkSearch'                => array( 'HuliLoulou' ),
+       'Listadmins'                => array( 'HeluKahu' ),
+       'Listbots'                  => array( 'HeluLōpako', 'HeluLopako' ),
+       'Listredirects'             => array( 'HeluKiahou' ),
+       'Listusers'                 => array( 'HeluMeaHoʻohana', 'HeluMeaHoohana' ),
+       'Log'                       => array( 'Moʻolelo', 'Moolelo' ),
        'Longpages'                 => array( 'ʻAoʻaoLoa', 'AoaoLoa' ),
+       'MIMEsearch'                => array( 'HuliMIME' ),
        'Movepage'                  => array( 'HoʻoneʻeʻAoʻao', 'HooneeAoao' ),
        'Mycontributions'           => array( 'KaʻuHaʻawina', 'KauHaawina' ),
        'Mypage'                    => array( 'KaʻuʻAoʻao', 'KauAoao' ),
-       'Mytalk'                    => array( 'KaʻuKūkākūkā', 'KauKukakuka' ),
+       'Mytalk'                    => array( 'KaʻuWalaʻau', 'KauWalaau' ),
        'Newpages'                  => array( 'ʻAoʻaoHou', 'AoaoHou' ),
        'Preferences'               => array( 'Makemake' ),
        'Randompage'                => array( 'Kaulele' ),
        'Recentchanges'             => array( 'NāLoliHou', 'NaLoliHou' ),
+       'Redirect'                  => array( 'Kiahou' ),
        'Search'                    => array( 'Huli' ),
        'Shortpages'                => array( 'ʻAoʻaoPōkole', 'AoaoPokole' ),
        'Specialpages'              => array( 'PapaNui' ),
+       'Statistics'                => array( 'ʻIkehelupili', 'Ikehelupili' ),
+       'Tags'                      => array( 'Lepili' ),
        'Upload'                    => array( 'Hoʻouka', 'Hoouka' ),
+       'Userlogin'                 => array( 'ʻEʻe', 'Ee' ),
        'Userlogout'                => array( 'Haʻalele', 'Haalele' ),
-       'Watchlist'                 => array( 'PapaNānāPono', 'PapaNanaPono' ),
+       'Version'                   => array( 'Mana' ),
+       'Watchlist'                 => array( 'PapaKiaʻi', 'PapaKiai' ),
 );
 
 $magicWords = array(
+       'redirect'                  => array( '0', '#KIAHOU', '#REDIRECT' ),
        'currentmonth'              => array( '1', 'KĒIAMAHINA', 'KEIAMAHINA', 'CURRENTMONTH', 'CURRENTMONTH2' ),
        'currentmonthname'          => array( '1', 'KĒIAINOAMAHINA', 'KEIAINOAMAHINA', 'CURRENTMONTHNAME' ),
        'currentday'                => array( '1', 'KĒIALĀ', 'KEIALA', 'CURRENTDAY' ),
@@ -68,14 +90,31 @@ $magicWords = array(
        'numberofarticles'          => array( '1', 'HELUMEA', 'NUMBEROFARTICLES' ),
        'numberoffiles'             => array( '1', 'HELUWAIHONA', 'NUMBEROFFILES' ),
        'numberofusers'             => array( '1', 'HELUMEAHOʻOHANA', 'HELUMEAHOOHANA', 'NUMBEROFUSERS' ),
+       'numberofactiveusers'       => array( '1', 'HELUMEAHOʻOHANANEI', 'HELUMEAHOOHANANEI', 'NUMBEROFACTIVEUSERS' ),
        'numberofedits'             => array( '1', 'HELULOLI', 'NUMBEROFEDITS' ),
        'pagename'                  => array( '1', 'INOAʻAOʻAO', 'INOAAOAO', 'PAGENAME' ),
+       'namespace'                 => array( '1', 'LEWAINOA', 'NAMESPACE' ),
+       'namespacenumber'           => array( '1', 'HELULEWAINOA', 'NAMESPACENUMBER' ),
        'img_right'                 => array( '1', 'ʻākau', 'ākau', 'akau', 'right' ),
        'img_left'                  => array( '1', 'hema', 'left' ),
        'img_none'                  => array( '1', 'ʻaʻohe', 'aohe', 'none' ),
+       'img_middle'                => array( '1', 'waena', 'middle' ),
        'img_link'                  => array( '1', 'loulou=$1', 'link=$1' ),
+       'sitename'                  => array( '1', 'INOAKAHUA', 'SITENAME' ),
+       'pageid'                    => array( '0', 'IDʻAOʻAO', 'IDAOAO', 'PAGEID' ),
+       'server'                    => array( '0', 'KIKOWAENAPŪNAEWELE', 'KIKOWAENAPUNAEWELE', 'SERVER' ),
+       'servername'                => array( '0', 'INOAKIKOWAENAPŪNAEWELE', 'INOAKIKOWAENAPUNAEWELE', 'SERVERNAME' ),
+       'grammar'                   => array( '0', 'PILINAʻŌLELO', 'PILINAŌLELO', 'PILINAOLELO', 'GRAMMAR:' ),
+       'gender'                    => array( '0', 'KEKA', 'GENDER:' ),
        'currentweek'               => array( '1', 'KĒIAPULE', 'KEIAPULE', 'CURRENTWEEK' ),
+       'raw'                       => array( '0', 'MAKA:', 'RAW:' ),
        'language'                  => array( '0', '#ʻŌLELO', '#ŌLELO', '#OLELO', '#LANGUAGE:' ),
        'numberofadmins'            => array( '1', 'HELUKAHU', 'NUMBEROFADMINS' ),
+       'special'                   => array( '0', 'kūikawā', 'special' ),
+       'filepath'                  => array( '0', 'ALAWAIHONA:', 'FILEPATH:' ),
+       'url_query'                 => array( '0', 'NĪNAU', 'NINAU', 'QUERY' ),
+       'pagesincategory_all'       => array( '0', 'apau', 'all' ),
+       'pagesincategory_pages'     => array( '0', 'ʻaoʻao', 'aoao', 'pages' ),
+       'pagesincategory_files'     => array( '0', 'waihona', 'files' ),
 );
 
index 3c99df0..1f578a3 100644 (file)
@@ -46,6 +46,7 @@ $specialPageAliases = array(
        'Allmessages'               => array( 'הודעות_המערכת' ),
        'AllMyUploads'              => array( 'כל_ההעלאות_שלי' ),
        'Allpages'                  => array( 'כל_הדפים' ),
+       'ApiHelp'                   => array( 'עזרת_API' ),
        'Ancientpages'              => array( 'דפים_מוזנחים' ),
        'Badtitle'                  => array( 'כותרת_שגויה' ),
        'Blankpage'                 => array( 'דף_ריק' ),
@@ -53,7 +54,7 @@ $specialPageAliases = array(
        'Booksources'               => array( 'משאבי_ספרות', 'משאבי_ספרות_חיצוניים' ),
        'BrokenRedirects'           => array( 'הפניות_לא_תקינות', 'הפניות_שבורות' ),
        'Categories'                => array( 'קטגוריות', 'רשימת_קטגוריות' ),
-       'ChangeEmail'               => array( 'שינוי_דואר_אלקטרוני', 'שינוי_דואל' ),
+       'ChangeEmail'               => array( 'שינוי_דואר_אלקטרוני', 'שינוי_דוא"ל' ),
        'ChangePassword'            => array( 'שינוי_סיסמה' ),
        'ComparePages'              => array( 'השוואת_דפים' ),
        'Confirmemail'              => array( 'אימות_כתובת_דואר' ),
@@ -61,6 +62,7 @@ $specialPageAliases = array(
        'CreateAccount'             => array( 'הרשמה_לחשבון' ),
        'Deadendpages'              => array( 'דפים_ללא_קישורים' ),
        'DeletedContributions'      => array( 'תרומות_מחוקות' ),
+       'Diff'                      => array( 'הבדלים', 'הבדל' ),
        'DoubleRedirects'           => array( 'הפניות_כפולות' ),
        'EditWatchlist'             => array( 'עריכת_רשימת_המעקב' ),
        'Emailuser'                 => array( 'שליחת_דואר_למשתמש' ),
@@ -79,12 +81,13 @@ $specialPageAliases = array(
        'Listfiles'                 => array( 'רשימת_קבצים', 'רשימת_תמונות', 'קבצים', 'תמונות' ),
        'Listgrouprights'           => array( 'רשימת_הרשאות_לקבוצה' ),
        'Listredirects'             => array( 'רשימת_הפניות', 'הפניות' ),
-       'Listusers'                 => array( 'רשימת_משתמשים', 'משתמשים' ),
        'ListDuplicatedFiles'       => array( 'רשימת_קבצים_כפולים' ),
+       'Listusers'                 => array( 'רשימת_משתמשים', 'משתמשים' ),
        'Lockdb'                    => array( 'נעילת_בסיס_הנתונים' ),
        'Log'                       => array( 'יומנים' ),
        'Lonelypages'               => array( 'דפים_יתומים' ),
        'Longpages'                 => array( 'דפים_ארוכים' ),
+       'MediaStatistics'           => array( 'סטטיסטיקות_מדיה' ),
        'MergeHistory'              => array( 'מיזוג_גרסאות' ),
        'MIMEsearch'                => array( 'חיפוש_MIME' ),
        'Mostcategories'            => array( 'הקטגוריות_הרבות_ביותר', 'הדפים_מרובי-הקטגוריות_ביותר' ),
@@ -103,6 +106,7 @@ $specialPageAliases = array(
        'Newimages'                 => array( 'קבצים_חדשים', 'תמונות_חדשות', 'גלריית_קבצים_חדשים', 'גלריית_תמונות_חדשות' ),
        'Newpages'                  => array( 'דפים_חדשים' ),
        'PagesWithProp'             => array( 'דפים_עם_מאפיינים', 'דפים_לפי_מאפיינים' ),
+       'PageLanguage'              => array( 'שפת_הדף' ),
        'PasswordReset'             => array( 'איפוס_סיסמה' ),
        'PermanentLink'             => array( 'קישור_קבוע' ),
        'Popularpages'              => array( 'הדפים_הנצפים_ביותר', 'דפים_פופולריים' ),
@@ -118,11 +122,12 @@ $specialPageAliases = array(
        'Redirect'                  => array( 'הפניה' ),
        'ResetTokens'               => array( 'איפוס_אסימונים' ),
        'Revisiondelete'            => array( 'מחיקת_ושחזור_גרסאות' ),
+       'RunJobs'                   => array( 'הרצת_משימות' ),
        'Search'                    => array( 'חיפוש' ),
        'Shortpages'                => array( 'דפים_קצרים' ),
        'Specialpages'              => array( 'דפים_מיוחדים' ),
        'Statistics'                => array( 'סטטיסטיקות' ),
-       'Tags'                      => array( 'תגיות' ),
+       'Tags'                      => array( 'תגיות', 'תגים' ),
        'TrackingCategories'        => array( 'קטגוריות_מעקב' ),
        'Unblock'                   => array( 'שחרור_חסימה' ),
        'Uncategorizedcategories'   => array( 'קטגוריות_חסרות_קטגוריה' ),
@@ -185,7 +190,6 @@ $magicWords = array(
        'numberofusers'             => array( '1', 'מספר משתמשים', 'NUMBEROFUSERS' ),
        'numberofactiveusers'       => array( '1', 'מספר משתמשים פעילים', 'NUMBEROFACTIVEUSERS' ),
        'numberofedits'             => array( '1', 'מספר עריכות', 'NUMBEROFEDITS' ),
-       'numberofviews'             => array( '1', 'מספר צפיות', 'NUMBEROFVIEWS' ),
        'pagename'                  => array( '1', 'שם הדף', 'PAGENAME' ),
        'pagenamee'                 => array( '1', 'שם הדף מקודד', 'PAGENAMEE' ),
        'namespace'                 => array( '1', 'מרחב השם', 'NAMESPACE' ),
index 9abd595..d9d3ea4 100644 (file)
@@ -120,7 +120,168 @@ $specialPageAliases = array(
 );
 
 $magicWords = array(
-       'redirect'                  => array( '0', '#अनुप्रेषित', '#REDIRECT' ),
+       'redirect'                  => array( '0', '#पुनर्प्रेषित', '#अनुप्रेषित', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__बिना_अनुक्रम__', '__विषय_सूची_हीन__', '__NOTOC__' ),
+       'nogallery'                 => array( '0', '__गैलरी_नहीं__', '__NOGALLERY__' ),
+       'forcetoc'                  => array( '0', '__अनुक्रम_दिखाएँ__', '__विषय_सूची_दिखाएँ__', '__विषय_सूची_दिखायें__', '__FORCETOC__' ),
+       'toc'                       => array( '0', '__अनुक्रम__', '__विषय_सूची__', '__TOC__' ),
+       'noeditsection'             => array( '0', '__अनुभाग_सम्पादन_नहीं__', '__NOEDITSECTION__' ),
+       'currentmonth'              => array( '1', 'वर्तमान_माह', 'वर्तमान_माह2', 'वर्तमान_माह२', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonth1'             => array( '1', 'वर्तमान_माह1', 'वर्तमान_माह१', 'CURRENTMONTH1' ),
+       'currentmonthname'          => array( '1', 'वर्तमान_माह_नाम', 'CURRENTMONTHNAME' ),
+       'currentmonthnamegen'       => array( '1', 'वर्तमान_माह_सम्बन्ध', 'CURRENTMONTHNAMEGEN' ),
+       'currentmonthabbrev'        => array( '1', 'वर्तमान_माह_संक्षेप', 'CURRENTMONTHABBREV' ),
+       'currentday'                => array( '1', 'वर्तमान_दिन', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', 'वर्तमान_दिन2', 'वर्तमान_दिन२', 'CURRENTDAY2' ),
+       'currentdayname'            => array( '1', 'वर्तमान_दिन_नाम', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'वर्तमान_वर्ष', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'वर्तमान_समय', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', 'वर्तमान_घंटा', 'CURRENTHOUR' ),
+       'localmonth'                => array( '1', 'स्थानीय_माह', 'स्थानीय_माह2', 'स्थानीय_माह२', 'LOCALMONTH', 'LOCALMONTH2' ),
+       'localmonth1'               => array( '1', 'स्थानीय_माह1', 'स्थानीय_माह१', 'LOCALMONTH1' ),
+       'localmonthname'            => array( '1', 'स्थानीय_माह_नाम', 'LOCALMONTHNAME' ),
+       'localmonthnamegen'         => array( '1', 'स्थानीय_माह_सम्बन्ध', 'LOCALMONTHNAMEGEN' ),
+       'localmonthabbrev'          => array( '1', 'स्थानीय_माह_संक्षेप', 'LOCALMONTHABBREV' ),
+       'localday'                  => array( '1', 'स्थानीय_दिन', 'LOCALDAY' ),
+       'localday2'                 => array( '1', 'स्थानीय_दिन2', 'स्थानीय_दिन२', 'LOCALDAY2' ),
+       'localdayname'              => array( '1', 'स्थानीय_दिन_नाम', 'LOCALDAYNAME' ),
+       'localyear'                 => array( '1', 'स्थानीय_वर्ष', 'LOCALYEAR' ),
+       'localtime'                 => array( '1', 'स्थानीय_समय', 'LOCALTIME' ),
+       'localhour'                 => array( '1', 'स्थानीय_घंटा', 'LOCALHOUR' ),
+       'numberofpages'             => array( '1', 'पृष्ठ_संख्या', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'लेख_संख्या', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'फ़ाइल_संख्या', 'फाइल_संख्या', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'सदस्य_संख्या', 'NUMBEROFUSERS' ),
+       'numberofactiveusers'       => array( '1', 'सक्रिय_सदस्य_संख्या', 'NUMBEROFACTIVEUSERS' ),
+       'numberofedits'             => array( '1', 'सम्पादन_संख्या', 'NUMBEROFEDITS' ),
+       'pagename'                  => array( '1', 'पृष्ठ_नाम', 'PAGENAME' ),
+       'pagenamee'                 => array( '1', 'पृष्ठ_नाम_कोड', 'PAGENAMEE' ),
+       'namespace'                 => array( '1', 'नामस्थान', 'NAMESPACE' ),
+       'namespacee'                => array( '1', 'नामस्थान_कोड', 'NAMESPACEE' ),
+       'namespacenumber'           => array( '1', 'नामस्थान_संख्या', 'NAMESPACENUMBER' ),
+       'talkspace'                 => array( '1', 'चर्चा_स्थान', 'TALKSPACE' ),
+       'talkspacee'                => array( '1', 'चर्चा_स्थान_कोड', 'TALKSPACEE' ),
+       'subjectspace'              => array( '1', 'सामग्री_स्थान', 'लेख_स्थान', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+       'subjectspacee'             => array( '1', 'सामग्री_स्थान_कोड', 'लेख_स्थान_कोड', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+       'fullpagename'              => array( '1', 'पूर्ण_पृष्ठ_नाम', 'FULLPAGENAME' ),
+       'fullpagenamee'             => array( '1', 'पूर्ण_पृष्ठ_नाम_कोड', 'FULLPAGENAMEE' ),
+       'subpagename'               => array( '1', 'उपपृष्ठ_नाम', 'SUBPAGENAME' ),
+       'subpagenamee'              => array( '1', 'उपपृष्ठ_नाम_कोड', 'SUBPAGENAMEE' ),
+       'rootpagename'              => array( '1', 'मूल_पृष्ठ_नाम', 'ROOTPAGENAME' ),
+       'rootpagenamee'             => array( '1', 'मूल_पृष्ठ_नाम_कोड', 'ROOTPAGENAMEE' ),
+       'basepagename'              => array( '1', 'तल_पृष्ठ_नाम', 'BASEPAGENAME' ),
+       'basepagenamee'             => array( '1', 'तल_पृष्ठ_नाम_कोड', 'BASEPAGENAMEE' ),
+       'talkpagename'              => array( '1', 'चर्चा_पृष्ठ_नाम', 'TALKPAGENAME' ),
+       'talkpagenamee'             => array( '1', 'चर्चा_पृष्ठ_नाम_कोड', 'TALKPAGENAMEE' ),
+       'subjectpagename'           => array( '1', 'सामग्री_पृष्ठ_नाम', 'लेख_पृष्ठ_नाम', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+       'subjectpagenamee'          => array( '1', 'सामग्री_पृष्ठ_नाम_कोड', 'लेख_पृष्ठ_नाम_कोड', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+       'msg'                       => array( '0', 'सन्देश:', 'संदेश:', 'MSG:' ),
+       'subst'                     => array( '0', 'प्रति:', 'SUBST:' ),
+       'safesubst'                 => array( '0', 'सुरक्षित_प्रति:', 'SAFESUBST:' ),
+       'msgnw'                     => array( '0', 'सन्देश_नोविकी:', 'संदेश_नोविकी:', 'MSGNW:' ),
+       'img_thumbnail'             => array( '1', 'अंगूठाकार', 'अंगूठा', 'thumbnail', 'thumb' ),
+       'img_manualthumb'           => array( '1', 'अंगूठाकार=$1', 'अंगूठा=$1', 'thumbnail=$1', 'thumb=$1' ),
+       'img_right'                 => array( '1', 'दाएँ', 'दायें', 'दाएं', 'right' ),
+       'img_left'                  => array( '1', 'बाएँ', 'बायें', 'बाएं', 'left' ),
+       'img_none'                  => array( '1', 'कोई_नहीं', 'none' ),
+       'img_width'                 => array( '1', '$1पिक्सेल', '$1px' ),
+       'img_center'                => array( '1', 'केन्द्र', 'केंद्र', 'केन्द्रित', 'केंद्रित', 'center', 'centre' ),
+       'img_framed'                => array( '1', 'फ़्रेम', 'फ्रेम', 'framed', 'enframed', 'frame' ),
+       'img_frameless'             => array( '1', 'फ़्रेमहीन', 'फ्रेमहीन', 'frameless' ),
+       'img_lang'                  => array( '1', 'भाषा=$1', 'lang=$1' ),
+       'img_page'                  => array( '1', 'पृष्ठ=$1', 'पृष्ठ_$1', 'page=$1', 'page $1' ),
+       'img_upright'               => array( '1', 'खड़ी', 'खड़ी=$1', 'खड़ी_$1', 'upright', 'upright=$1', 'upright $1' ),
+       'img_border'                => array( '1', 'किनारा', 'बॉर्डर', 'border' ),
+       'img_baseline'              => array( '1', 'आधार_रेखा', 'baseline' ),
+       'img_sub'                   => array( '1', 'पद', 'sub' ),
+       'img_super'                 => array( '1', 'मूर्ध', 'super', 'sup' ),
+       'img_top'                   => array( '1', 'शीर्ष', 'top' ),
+       'img_text_top'              => array( '1', 'पाठ-शीर्ष', 'text-top' ),
+       'img_middle'                => array( '1', 'मध्य', 'middle' ),
+       'img_bottom'                => array( '1', 'तल', 'bottom' ),
+       'img_text_bottom'           => array( '1', 'पाठ-तल', 'text-bottom' ),
+       'img_link'                  => array( '1', 'कड़ी=$1', 'link=$1' ),
+       'img_alt'                   => array( '1', 'पाठ=$1', 'alt=$1' ),
+       'img_class'                 => array( '1', 'वर्ग=$1', 'class=$1' ),
+       'int'                       => array( '0', 'विश्व:', 'INT:' ),
+       'sitename'                  => array( '1', 'साइट_नाम', 'SITENAME' ),
+       'ns'                        => array( '0', 'नामस्थान:', 'NS:' ),
+       'nse'                       => array( '0', 'नामस्थान_कोड:', 'NSE:' ),
+       'localurl'                  => array( '0', 'स्थानीय_यू_आर_एल:', 'LOCALURL:' ),
+       'localurle'                 => array( '0', 'स्थानीय_यू_आर_एल_कोड:', 'LOCALURLE:' ),
+       'articlepath'               => array( '0', 'लेख_पथ', 'ARTICLEPATH' ),
+       'pageid'                    => array( '0', 'पृष्ठ_आइ_डी', 'PAGEID' ),
+       'server'                    => array( '0', 'सर्वर', 'SERVER' ),
+       'servername'                => array( '0', 'सर्वर_नाम', 'SERVERNAME' ),
+       'scriptpath'                => array( '0', 'स्क्रिप्ट_पथ', 'SCRIPTPATH' ),
+       'stylepath'                 => array( '0', 'स्टाइल_पथ', 'STYLEPATH' ),
+       'grammar'                   => array( '0', 'व्याकरण:', 'GRAMMAR:' ),
+       'gender'                    => array( '0', 'लिंग:', 'GENDER:' ),
+       'currentweek'               => array( '1', 'वर्तमान_सप्ताह', 'CURRENTWEEK' ),
+       'currentdow'                => array( '1', 'वर्तमान_सप्ताह_का_दिन', 'CURRENTDOW' ),
+       'localweek'                 => array( '1', 'स्थानीय_सप्ताह', 'LOCALWEEK' ),
+       'localdow'                  => array( '1', 'स्थानीय_सप्ताह_का_दिन', 'LOCALDOW' ),
+       'revisionid'                => array( '1', 'अवतरण_संख्या', 'REVISIONID' ),
+       'revisionday'               => array( '1', 'अवतरण_दिन', 'REVISIONDAY' ),
+       'revisionday2'              => array( '1', 'अवतरण_दिन2', 'अवतरण_दिन२', 'REVISIONDAY2' ),
+       'revisionmonth'             => array( '1', 'अवतरण_माह', 'REVISIONMONTH' ),
+       'revisionmonth1'            => array( '1', 'अवतरण_माह1', 'अवतरण_माह१', 'REVISIONMONTH1' ),
+       'revisionyear'              => array( '1', 'अवतरण_वर्ष', 'REVISIONYEAR' ),
+       'revisiontimestamp'         => array( '1', 'अवतरण_समय', 'REVISIONTIMESTAMP' ),
+       'revisionuser'              => array( '1', 'अवतरण_सदस्य', 'REVISIONUSER' ),
+       'revisionsize'              => array( '1', 'अवतरण_आकार', 'REVISIONSIZE' ),
+       'plural'                    => array( '0', 'वचन:', 'PLURAL:' ),
+       'fullurl'                   => array( '0', 'पूर्ण_यू_आर_एल:', 'FULLURL:' ),
+       'fullurle'                  => array( '0', 'पूर्ण_यू_आर_एल_कोड:', 'FULLURLE:' ),
+       'canonicalurl'              => array( '0', 'मानक_यू_आर_एल:', 'CANONICALURL:' ),
+       'canonicalurle'             => array( '0', 'मानक_यू_आर_एल_कोड:', 'CANONICALURLE:' ),
+       'lcfirst'                   => array( '0', 'छोटे_अक्षर_से_शुरू:', 'LCFIRST:' ),
+       'ucfirst'                   => array( '0', 'बड़े_अक्षर_से_शुरू:', 'UCFIRST:' ),
+       'lc'                        => array( '0', 'छोटे_अक्षर:', 'LC:' ),
+       'uc'                        => array( '0', 'बड़े_अक्षर:', 'UC:' ),
+       'raw'                       => array( '0', 'सादा:', 'RAW:' ),
+       'displaytitle'              => array( '1', 'दृश्य_शीर्षक', 'DISPLAYTITLE' ),
+       'rawsuffix'                 => array( '1', 'उ', 'R' ),
+       'nocommafysuffix'           => array( '0', 'वि_नहीं', 'NOSEP' ),
+       'newsectionlink'            => array( '1', '__विषय_जोड़ें_कड़ी__', '__NEWSECTIONLINK__' ),
+       'nonewsectionlink'          => array( '1', '__विषय_जोड़े_कड़ी_रहित__', '__NONEWSECTIONLINK__' ),
+       'currentversion'            => array( '1', 'वर्तमान_अवतरण', 'CURRENTVERSION' ),
+       'urlencode'                 => array( '0', 'यू_आर_एल_कोड:', 'URLENCODE:' ),
+       'anchorencode'              => array( '0', 'ऐंकर_कोड', 'ANCHORENCODE' ),
+       'currenttimestamp'          => array( '1', 'वर्तमान_समय_मुहर', 'CURRENTTIMESTAMP' ),
+       'localtimestamp'            => array( '1', 'स्थानीय_समय_मुहर', 'LOCALTIMESTAMP' ),
+       'directionmark'             => array( '1', 'दिशा_चिन्ह', 'DIRECTIONMARK', 'DIRMARK' ),
+       'language'                  => array( '0', '#भाषा:', '#LANGUAGE:' ),
+       'contentlanguage'           => array( '1', 'सामग्री_भाषा', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+       'pagesinnamespace'          => array( '1', 'नामस्थान_में_पृष्ठ:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+       'numberofadmins'            => array( '1', 'प्रबन्धक_संख्या', 'प्रबंधक_संख्या', 'NUMBEROFADMINS' ),
+       'formatnum'                 => array( '0', 'संख्या_रूप', 'FORMATNUM' ),
+       'padleft'                   => array( '0', 'बाएँ_जोड़ें', 'बायें_जोड़ें', 'PADLEFT' ),
+       'padright'                  => array( '0', 'दाएँ_जोड़ें', 'दायें_जोड़ें', 'PADRIGHT' ),
+       'special'                   => array( '0', 'विशेष', 'special' ),
+       'speciale'                  => array( '0', 'विशेष_कोड', 'speciale' ),
+       'defaultsort'               => array( '1', 'मूल_सॉर्ट:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+       'filepath'                  => array( '0', 'फ़ाइल_पथ:', 'FILEPATH:' ),
+       'tag'                       => array( '0', 'टैग', 'tag' ),
+       'hiddencat'                 => array( '1', '__छुपी_श्रेणी__', '__छिपी_श्रेणी__', '__HIDDENCAT__' ),
+       'pagesincategory'           => array( '1', 'श्रेणी_में_पृष्ठ', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+       'pagesize'                  => array( '1', 'पृष्ठ_आकार', 'PAGESIZE' ),
+       'index'                     => array( '1', '__सूचीबद्ध__', '__INDEX__' ),
+       'noindex'                   => array( '1', '__असूचीबद्ध__', '__NOINDEX__' ),
+       'numberingroup'             => array( '1', 'समूह_संख्या', 'NUMBERINGROUP', 'NUMINGROUP' ),
+       'staticredirect'            => array( '1', '__स्थिर_पुनर्प्रेषण__', '__स्थिर_अनुप्रेषण__', '__STATICREDIRECT__' ),
+       'protectionlevel'           => array( '1', 'सुरक्षा_स्तर', 'PROTECTIONLEVEL' ),
+       'cascadingsources'          => array( '1', 'सीढ़ी_सुरक्षा_स्रोत', 'CASCADINGSOURCES' ),
+       'formatdate'                => array( '0', 'तिथि_रूप', 'formatdate', 'dateformat' ),
+       'url_path'                  => array( '0', 'पथ', 'PATH' ),
+       'url_wiki'                  => array( '0', 'विकी', 'WIKI' ),
+       'url_query'                 => array( '0', 'पाठ', 'QUERY' ),
+       'defaultsort_noerror'       => array( '0', 'त्रुटि_नहीं', 'noerror' ),
+       'defaultsort_noreplace'     => array( '0', 'बदलें_नहीं', 'noreplace' ),
+       'pagesincategory_all'       => array( '0', 'सभी', 'all' ),
+       'pagesincategory_pages'     => array( '0', 'पृष्ठ', 'pages' ),
+       'pagesincategory_subcats'   => array( '0', 'श्रेणियाँ', 'subcats' ),
+       'pagesincategory_files'     => array( '0', 'फ़ाइलें', 'फाइलें', 'files' ),
 );
 
 $digitTransformTable = array(
index 53cbf54..65077c1 100644 (file)
@@ -85,6 +85,7 @@ $specialPageAliases = array(
        'Mycontributions'           => array( 'Moji_doprinosi' ),
        'Mypage'                    => array( 'Moja_stranica' ),
        'Mytalk'                    => array( 'Moj_razgovor' ),
+       'Myuploads'                 => array( 'Moje_datoteke' ),
        'Newimages'                 => array( 'Nove_datoteke', 'Nove_slike' ),
        'Newpages'                  => array( 'Nove_stranice' ),
        'Popularpages'              => array( 'Popularne_stranice' ),
@@ -117,7 +118,7 @@ $specialPageAliases = array(
        'Userlogin'                 => array( 'Prijava' ),
        'Userlogout'                => array( 'Odjava' ),
        'Userrights'                => array( 'Suradnička_prava' ),
-       'Version'                   => array( 'Verzija' ),
+       'Version'                   => array( 'Verzija', 'Inačica' ),
        'Wantedcategories'          => array( 'Tražene_kategorije' ),
        'Wantedfiles'               => array( 'Tražene_datoteke' ),
        'Wantedpages'               => array( 'Tražene_stranice' ),
@@ -128,7 +129,7 @@ $specialPageAliases = array(
 );
 
 $magicWords = array(
-       'redirect'                  => array( '0', '#PREUSMJERI', '#REDIRECT' ),
+       'redirect'                  => array( '0', '#Preusmjeri', '#PREUSMJERI', '#REDIRECT' ),
        'notoc'                     => array( '0', '__BEZSADRŽAJA__', '__NOTOC__' ),
        'nogallery'                 => array( '0', '__BEZGALERIJE__', '__NOGALLERY__' ),
        'forcetoc'                  => array( '0', '__UKLJUČISADRŽAJ__', '__FORCETOC__' ),
@@ -162,7 +163,6 @@ $magicWords = array(
        'numberofusers'             => array( '1', 'BROJSURADNIKA', 'NUMBEROFUSERS' ),
        'numberofactiveusers'       => array( '1', 'BROJAKTIVNIHSURADNIKA', 'NUMBEROFACTIVEUSERS' ),
        'numberofedits'             => array( '1', 'BROJUREĐIVANJA', 'NUMBEROFEDITS' ),
-       'numberofviews'             => array( '1', 'BROJPREGLEDA', 'NUMBEROFVIEWS' ),
        'pagename'                  => array( '1', 'IMESTRANICE', 'PAGENAME' ),
        'pagenamee'                 => array( '1', 'IMESTRANICEE', 'PAGENAMEE' ),
        'namespace'                 => array( '1', 'IMENSKIPROSTOR', 'NAMESPACE' ),
@@ -190,6 +190,7 @@ $magicWords = array(
        'img_center'                => array( '1', 'središte', 'center', 'centre' ),
        'img_framed'                => array( '1', 'okvir', 'framed', 'enframed', 'frame' ),
        'img_frameless'             => array( '1', 'bezokvira', 'frameless' ),
+       'img_lang'                  => array( '1', 'jezik=$1', 'lang=$1' ),
        'img_page'                  => array( '1', 'stranica=$1', 'stranica $1', 'page=$1', 'page $1' ),
        'img_upright'               => array( '1', 'uspravno=$1', 'uspravno $1', 'upright', 'upright=$1', 'upright $1' ),
        'img_border'                => array( '1', 'obrub', 'border' ),
@@ -201,6 +202,7 @@ $magicWords = array(
        'img_middle'                => array( '1', 'pola', 'middle' ),
        'img_bottom'                => array( '1', 'dno', 'bottom' ),
        'img_text_bottom'           => array( '1', 'tekst-dno', 'text-bottom' ),
+       'img_link'                  => array( '1', 'poveznica=$1', 'link=$1' ),
        'sitename'                  => array( '1', 'IMEPROJEKTA', 'SITENAME' ),
        'ns'                        => array( '0', 'IMP:', 'NS:' ),
        'localurl'                  => array( '0', 'MJESNIURL:', 'LOCALURL:' ),
index 22219b2..fb8fdb3 100644 (file)
@@ -70,6 +70,7 @@ $specialPageAliases = array(
        'Deadendpages'              => array( 'Strony_bjez_wotkazow' ),
        'DeletedContributions'      => array( 'Zničene_přinoški' ),
        'DoubleRedirects'           => array( 'Dwójne_daleposrědkowanja' ),
+       'EditWatchlist'             => array( 'Wobkedźbowanki_wobdźěłać' ),
        'Emailuser'                 => array( 'E-Mejl' ),
        'Export'                    => array( 'Eksport' ),
        'Fewestrevisions'           => array( 'Strony_z_najmjenje_wersijemi' ),
@@ -104,6 +105,7 @@ $specialPageAliases = array(
        'Mytalk'                    => array( 'Moja_diskusijna_strona' ),
        'Newimages'                 => array( 'Nowe_dataje' ),
        'Newpages'                  => array( 'Nowe_strony' ),
+       'PermanentLink'             => array( 'Trajny_wotkaz' ),
        'Popularpages'              => array( 'Najwoblubowaniše_strony' ),
        'Preferences'               => array( 'Nastajenja' ),
        'Prefixindex'               => array( 'Prefiksindeks' ),
@@ -113,6 +115,7 @@ $specialPageAliases = array(
        'Randomredirect'            => array( 'Připadne_daleposrědkowanje' ),
        'Recentchanges'             => array( 'Aktualne_změny' ),
        'Recentchangeslinked'       => array( 'Změny_zwjazanych_stronow' ),
+       'Redirect'                  => array( 'Dalesposrědkowanje' ),
        'Revisiondelete'            => array( 'Wušmórnjenje_wersijow' ),
        'Search'                    => array( 'Pytać' ),
        'Shortpages'                => array( 'Najkrótše_strony' ),
index eca285e..0019a4b 100644 (file)
@@ -188,7 +188,6 @@ $magicWords = array(
        'numberofusers'             => array( '1', 'SZERKESZTŐKSZÁMA', 'NUMBEROFUSERS' ),
        'numberofactiveusers'       => array( '1', 'AKTÍVSZERKESZTŐKSZÁMA', 'NUMBEROFACTIVEUSERS' ),
        'numberofedits'             => array( '1', 'SZERKESZTÉSEKSZÁMA', 'NUMBEROFEDITS' ),
-       'numberofviews'             => array( '1', 'MEGTEKINTÉSEKSZÁMA', 'NUMBEROFVIEWS' ),
        'pagename'                  => array( '1', 'OLDALNEVE', 'PAGENAME' ),
        'pagenamee'                 => array( '1', 'OLDALNEVEE', 'PAGENAMEE' ),
        'namespace'                 => array( '1', 'NÉVTERE', 'NAMESPACE' ),
index dc2ea35..3510931 100644 (file)
@@ -84,7 +84,6 @@ $magicWords = array(
        'numberofusers'             => array( '1', 'JUMLAHPENGGUNA', 'JUMPENG', 'NUMBEROFUSERS' ),
        'numberofactiveusers'       => array( '1', 'JUMLAHPENGGUNAAKTIF', 'JUMPENGTIF', 'NUMBEROFACTIVEUSERS' ),
        'numberofedits'             => array( '1', 'JUMLAHSUNTINGAN', 'JUMTING', 'NUMBEROFEDITS' ),
-       'numberofviews'             => array( '1', 'JUMLAHTAMPILAN', 'JUMTAM', 'NUMBEROFVIEWS' ),
        'pagename'                  => array( '1', 'NAMAHALAMAN', 'NAMMAN', 'PAGENAME' ),
        'pagenamee'                 => array( '1', 'NAMAHALAMANE', 'NAMMANE', 'PAGENAMEE' ),
        'namespace'                 => array( '1', 'RUANGNAMA', 'RUNAM', 'NAMESPACE' ),
index 7c0f1a7..27bbe78 100644 (file)
@@ -62,21 +62,21 @@ $specialPageAliases = array(
        'ChangeEmail'               => array( 'CambiaEmail' ),
        'ChangePassword'            => array( 'CambiaPassword' ),
        'ComparePages'              => array( 'ComparaPagine' ),
-       'Confirmemail'              => array( 'ConfermaEMail' ),
+       'Confirmemail'              => array( 'ConfermaEmail' ),
        'Contributions'             => array( 'Contributi', 'ContributiUtente', 'Edit' ),
-       'CreateAccount'             => array( 'CreaAccount' ),
+       'CreateAccount'             => array( 'CreaUtenza', 'CreaAccount' ),
        'Deadendpages'              => array( 'PagineSenzaUscita' ),
        'DeletedContributions'      => array( 'ContributiCancellati' ),
        'DoubleRedirects'           => array( 'RedirectDoppi' ),
        'EditWatchlist'             => array( 'ModificaOsservati', 'ModificaOsservatiSpeciali', 'ModificaListaSeguiti' ),
-       'Emailuser'                 => array( 'InviaEMail' ),
+       'Emailuser'                 => array( 'InviaEmail' ),
        'ExpandTemplates'           => array( 'EspandiTemplate' ),
        'Export'                    => array( 'Esporta' ),
        'Fewestrevisions'           => array( 'PagineConMenoRevisioni' ),
        'FileDuplicateSearch'       => array( 'CercaFileDuplicati' ),
        'Filepath'                  => array( 'Percorso' ),
        'Import'                    => array( 'Importa' ),
-       'Invalidateemail'           => array( 'InvalidaEMail' ),
+       'Invalidateemail'           => array( 'InvalidaEmail' ),
        'JavaScriptTest'            => array( 'TestJavaScript' ),
        'BlockList'                 => array( 'IPBloccati', 'ElencoBlocchi', 'Blocchi' ),
        'LinkSearch'                => array( 'CercaCollegamenti', 'CercaLink' ),
@@ -84,13 +84,14 @@ $specialPageAliases = array(
        'Listbots'                  => array( 'Bot', 'ElencoBot' ),
        'Listfiles'                 => array( 'File', 'Immagini' ),
        'Listgrouprights'           => array( 'ElencoPermessiGruppi', 'Privilegi' ),
-       'Listredirects'             => array( 'Redirect', 'ElencoRedirect' ),
+       'Listredirects'             => array( 'ElencoRedirect' ),
+       'ListDuplicatedFiles'       => array( 'ElencoFileDuplicati' ),
        'Listusers'                 => array( 'Utenti', 'ElencoUtenti' ),
        'Lockdb'                    => array( 'BloccaDB' ),
        'Log'                       => array( 'Registri', 'Registro' ),
        'Lonelypages'               => array( 'PagineOrfane' ),
        'Longpages'                 => array( 'PaginePiùLunghe' ),
-       'MergeHistory'              => array( 'FondiCronologia', 'UnificaCronologia' ),
+       'MergeHistory'              => array( 'UnisciCronologia' ),
        'MIMEsearch'                => array( 'RicercaMIME' ),
        'Mostcategories'            => array( 'PagineConPiùCategorie' ),
        'Mostimages'                => array( 'ImmaginiPiùRichiamate' ),
@@ -107,6 +108,7 @@ $specialPageAliases = array(
        'Myuploads'                 => array( 'MieiUpload', 'MieiEdit' ),
        'Newimages'                 => array( 'ImmaginiRecenti' ),
        'Newpages'                  => array( 'PaginePiùRecenti' ),
+       'PagesWithProp'             => array( 'PagineConProprietà' ),
        'PasswordReset'             => array( 'ReimpostaPassword' ),
        'PermanentLink'             => array( 'LinkPermanente' ),
        'Popularpages'              => array( 'PaginePiùVisitate' ),
@@ -119,12 +121,14 @@ $specialPageAliases = array(
        'Randomredirect'            => array( 'RedirectCasuale' ),
        'Recentchanges'             => array( 'UltimeModifiche' ),
        'Recentchangeslinked'       => array( 'ModificheCorrelate' ),
+       'ResetTokens'               => array( 'ReimpostaToken' ),
        'Revisiondelete'            => array( 'CancellaRevisione' ),
        'Search'                    => array( 'Ricerca', 'Cerca', 'Trova' ),
        'Shortpages'                => array( 'PaginePiùCorte' ),
        'Specialpages'              => array( 'PagineSpeciali' ),
        'Statistics'                => array( 'Statistiche' ),
        'Tags'                      => array( 'Etichette', 'Tag' ),
+       'TrackingCategories'        => array( 'CategorieMonitoraggio' ),
        'Unblock'                   => array( 'ElencoSblocchi', 'Sblocchi' ),
        'Uncategorizedcategories'   => array( 'CategorieSenzaCategorie' ),
        'Uncategorizedimages'       => array( 'ImmaginiSenzaCategorie' ),
@@ -180,7 +184,6 @@ $magicWords = array(
        'numberofusers'             => array( '1', 'NUMEROUTENTI', 'NUMBEROFUSERS' ),
        'numberofactiveusers'       => array( '1', 'NUMEROUTENTIATTIVI', 'NUMBEROFACTIVEUSERS' ),
        'numberofedits'             => array( '1', 'NUMEROMODIFICHE', 'NUMEROEDIT', 'NUMBEROFEDITS' ),
-       'numberofviews'             => array( '1', 'NUMEROVISITE', 'NUMBEROFVIEWS' ),
        'pagename'                  => array( '1', 'TITOLOPAGINA', 'PAGENAME' ),
        'pagenamee'                 => array( '1', 'TITOLOPAGINAE', 'PAGENAMEE' ),
        'subpagename'               => array( '1', 'NOMESOTTOPAGINA', 'SUBPAGENAME' ),
index aef8dad..caca23d 100644 (file)
@@ -60,7 +60,8 @@ $namespaceAliases = array(
 
 $specialPageAliases = array(
        'Activeusers'               => array( '活動中の利用者', '活動中の利用者一覧' ),
-       'Allmessages'               => array( 'メッセージ一覧', 'システムメッセージの一覧', '表示メッセージの一覧' ),
+       'Allmessages'               => array( 'メッセージ一覧', 'システムメッセージの一覧', '表示メッセージの一覧', '全メッセージ' ),
+       'AllMyUploads'              => array( '自分の全アップロード' ),
        'Allpages'                  => array( 'ページ一覧', '全ページ' ),
        'Ancientpages'              => array( '更新されていないページ' ),
        'Badtitle'                  => array( '不正なページ名' ),
@@ -77,6 +78,7 @@ $specialPageAliases = array(
        'CreateAccount'             => array( 'アカウント作成', 'アカウントの作成' ),
        'Deadendpages'              => array( '有効なページへのリンクがないページ', '行き止まりページ' ),
        'DeletedContributions'      => array( '削除された投稿記録', '削除された投稿履歴', '削除歴' ),
+       'Diff'                      => array( '差分' ),
        'DoubleRedirects'           => array( '二重リダイレクト', '二重転送' ),
        'EditWatchlist'             => array( 'ウォッチリストの編集', 'ウォッチリスト編集' ),
        'Emailuser'                 => array( 'メール送信', 'ウィキメール' ),
@@ -95,11 +97,13 @@ $specialPageAliases = array(
        'Listfiles'                 => array( 'ファイル一覧', 'ファイルリスト' ),
        'Listgrouprights'           => array( '利用者グループ権限', '利用者グループの権限一覧', '利用者権限一覧' ),
        'Listredirects'             => array( 'リダイレクト一覧', 'リダイレクトの一覧', 'リダイレクトリスト' ),
+       'ListDuplicatedFiles'       => array( '重複ファイル一覧' ),
        'Listusers'                 => array( '登録利用者一覧', '登録利用者の一覧' ),
        'Lockdb'                    => array( 'データベースロック' ),
        'Log'                       => array( 'ログ', '記録' ),
        'Lonelypages'               => array( '孤立しているページ' ),
        'Longpages'                 => array( '長いページ' ),
+       'MediaStatistics'           => array( 'メディア統計' ),
        'MergeHistory'              => array( '履歴統合' ),
        'MIMEsearch'                => array( 'MIME検索', 'MIMEタイプ検索' ),
        'Mostcategories'            => array( 'カテゴリの多いページ', 'カテゴリの多い項目' ),
@@ -118,6 +122,7 @@ $specialPageAliases = array(
        'Newimages'                 => array( '新着ファイル', '新しいファイルの一覧', '新着画像展示室' ),
        'Newpages'                  => array( '新しいページ' ),
        'PagesWithProp'             => array( 'プロパティがあるページ' ),
+       'PageLanguage'              => array( 'ページ言語' ),
        'PasswordReset'             => array( 'パスワード再設定', 'パスワードの再設定', 'パスワードのリセット', 'パスワードリセット' ),
        'PermanentLink'             => array( '固定リンク', 'パーマリンク' ),
        'Popularpages'              => array( '人気ページ' ),
@@ -126,7 +131,7 @@ $specialPageAliases = array(
        'Protectedpages'            => array( '保護されているページ' ),
        'Protectedtitles'           => array( '作成保護されているページ名' ),
        'Randompage'                => array( 'おまかせ表示' ),
-       'RandomInCategory'          => array( 'カテゴリ内おまかせ表示', 'カテゴリ中のランダムなページ' ),
+       'RandomInCategory'          => array( 'カテゴリ内おまかせ表示' ),
        'Randomredirect'            => array( 'おまかせリダイレクト', 'おまかせ転送' ),
        'Recentchanges'             => array( '最近の更新', '最近更新したページ' ),
        'Recentchangeslinked'       => array( '関連ページの更新状況', 'リンク先の更新状況' ),
@@ -138,6 +143,7 @@ $specialPageAliases = array(
        'Specialpages'              => array( '特別ページ一覧' ),
        'Statistics'                => array( '統計' ),
        'Tags'                      => array( 'タグ一覧' ),
+       'TrackingCategories'        => array( '追跡カテゴリ' ),
        'Unblock'                   => array( 'ブロック解除' ),
        'Uncategorizedcategories'   => array( 'カテゴリ未導入のカテゴリ' ),
        'Uncategorizedimages'       => array( 'カテゴリ未導入のファイル' ),
@@ -199,19 +205,21 @@ $magicWords = array(
        'numberofusers'             => array( '1', '利用者数', 'NUMBEROFUSERS' ),
        'numberofactiveusers'       => array( '1', '活動利用者数', '有効な利用者数', '有効利用者数', 'NUMBEROFACTIVEUSERS' ),
        'numberofedits'             => array( '1', '編集回数', 'NUMBEROFEDITS' ),
-       'numberofviews'             => array( '1', '閲覧回数', 'NUMBEROFVIEWS' ),
        'pagename'                  => array( '1', 'ページ名', 'PAGENAME' ),
        'pagenamee'                 => array( '1', 'ページ名E', 'ページ名E', 'PAGENAMEE' ),
        'namespace'                 => array( '1', '名前空間', 'NAMESPACE' ),
        'namespacee'                => array( '1', '名前空間E', '名前空間E', 'NAMESPACEE' ),
+       'namespacenumber'           => array( '1', '名前空間番号', 'NAMESPACENUMBER' ),
        'talkspace'                 => array( '1', 'トーク空間', 'ノート空間', '会話空間', 'トークスペース', 'TALKSPACE' ),
        'talkspacee'                => array( '1', 'トーク空間E', 'トーク空間E', 'ノート空間E', '会話空間E', 'ノート空間E', '会話空間E', 'トークスペースE', 'トークスペースE', 'TALKSPACEE' ),
        'subjectspace'              => array( '1', '主空間', '標準空間', '記事空間', 'SUBJECTSPACE', 'ARTICLESPACE' ),
        'subjectspacee'             => array( '1', '主空間E', '標準空間E', '標準空間E', '記事空間E', '記事空間E', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
        'fullpagename'              => array( '1', '完全なページ名', 'フルページ名', '完全な記事名', '完全記事名', 'FULLPAGENAME' ),
        'fullpagenamee'             => array( '1', '完全なページ名E', 'フルページ名E', 'フルページ名E', '完全なページ名E', 'FULLPAGENAMEE' ),
-       'subpagename'               => array( '1', 'サブページ名', 'SUBPAGENAME' ),
-       'subpagenamee'              => array( '1', 'サブページ名E', 'サブページ名E', 'SUBPAGENAMEE' ),
+       'subpagename'               => array( '1', 'サブページ名', '下位ページ名', 'SUBPAGENAME' ),
+       'subpagenamee'              => array( '1', 'サブページ名E', 'サブページ名E', '下位ページ名E', '下位ページ名E', 'SUBPAGENAMEE' ),
+       'rootpagename'              => array( '1', 'ルートページ名', 'ROOTPAGENAME' ),
+       'rootpagenamee'             => array( '1', 'ルートページ名E', 'ルートページ名E', 'ROOTPAGENAMEE' ),
        'basepagename'              => array( '1', '親ページ名', 'BASEPAGENAME' ),
        'basepagenamee'             => array( '1', '親ページ名E', '親ページ名E', 'BASEPAGENAMEE' ),
        'talkpagename'              => array( '1', 'トークページ名', '会話ページ名', 'TALKPAGENAME' ),
@@ -251,6 +259,7 @@ $magicWords = array(
        'localurl'                  => array( '0', 'ローカルURL:', 'ローカルURL:', 'LOCALURL:' ),
        'localurle'                 => array( '0', 'ローカルURLE:', 'ローカルURLE:', 'LOCALURLE:' ),
        'articlepath'               => array( '0', '記事パス', 'ARTICLEPATH' ),
+       'pageid'                    => array( '0', 'ページID', 'ページID', 'PAGEID' ),
        'server'                    => array( '0', 'サーバー', 'サーバ', 'SERVER' ),
        'servername'                => array( '0', 'サーバー名', 'サーバーネーム', 'サーバ名', 'サーバネーム', 'SERVERNAME' ),
        'scriptpath'                => array( '0', 'スクリプトパス', 'SCRIPTPATH' ),
@@ -300,7 +309,7 @@ $magicWords = array(
        'defaultsort'               => array( '1', 'デフォルトソート:', 'デフォルトソート:', 'デフォルトソートキー:', 'デフォルトカテゴリソート:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
        'filepath'                  => array( '0', 'ファイルパス:', 'ファイルパス:', 'FILEPATH:' ),
        'tag'                       => array( '0', 'タグ', 'tag' ),
-       'hiddencat'                 => array( '1', '__カテゴリ非表示__', '__カテ非表示__', '__非表示カテ__', '__HIDDENCAT__' ),
+       'hiddencat'                 => array( '1', '__カテゴリ非表示__', '__カテ非表示__', '__非表示カテ__', '__隠しカテゴリ__', '__HIDDENCAT__' ),
        'pagesincategory'           => array( '1', 'カテゴリ内ページ数', 'PAGESINCATEGORY', 'PAGESINCAT' ),
        'pagesize'                  => array( '1', 'ページサイズ', 'PAGESIZE' ),
        'index'                     => array( '1', '__インデックス__', '__インデックス__', '__INDEX__' ),
index 4e83fe3..d34e249 100644 (file)
@@ -76,6 +76,7 @@ $specialPageAliases = array(
        'Allmessages'               => array( '모든메시지' ),
        'AllMyUploads'              => array( '모든내올린파일', '모든내파일' ),
        'Allpages'                  => array( '모든문서' ),
+       'ApiHelp'                   => array( 'Api도움말' ),
        'Ancientpages'              => array( '오래된문서' ),
        'Badtitle'                  => array( '잘못된제목', '인식불가제목', '잘못된이름', '인식불가이름' ),
        'Blankpage'                 => array( '빈문서' ),
@@ -84,16 +85,17 @@ $specialPageAliases = array(
        'BrokenRedirects'           => array( '끊긴넘겨주기' ),
        'Categories'                => array( '분류' ),
        'ChangeEmail'               => array( '이메일바꾸기', '이메일변경' ),
-       'ChangePassword'            => array( '비밀번호바꾸기', '비밀번호변경', '비밀단어바꾸기', '비밀단어변경' ),
+       'ChangePassword'            => array( '비밀번호바꾸기', '비밀번호변경' ),
        'ComparePages'              => array( '문서비교' ),
-       'Confirmemail'              => array( '이메일인증' ),
+       'Confirmemail'              => array( '이메일확인', '이메일인증' ),
        'Contributions'             => array( '기여', '기여목록' ),
        'CreateAccount'             => array( '계정만들기', '가입' ),
        'Deadendpages'              => array( '막다른문서' ),
        'DeletedContributions'      => array( '삭제된기여' ),
+       'Diff'                      => array( '차이' ),
        'DoubleRedirects'           => array( '이중넘겨주기' ),
        'EditWatchlist'             => array( '주시문서목록편집' ),
-       'Emailuser'                 => array( '이메일보내기' ),
+       'Emailuser'                 => array( '이메일보내기', '이메일' ),
        'ExpandTemplates'           => array( '틀전개' ),
        'Export'                    => array( '내보내기' ),
        'Fewestrevisions'           => array( '역사짧은문서' ),
@@ -109,11 +111,13 @@ $specialPageAliases = array(
        'Listfiles'                 => array( '파일', '그림', '파일목록', '그림목록' ),
        'Listgrouprights'           => array( '사용자권한', '권한목록' ),
        'Listredirects'             => array( '넘겨주기목록' ),
+       'ListDuplicatedFiles'       => array( '중복된파일목록' ),
        'Listusers'                 => array( '사용자', '사용자목록' ),
        'Lockdb'                    => array( 'DB잠금', 'DB잠그기' ),
        'Log'                       => array( '기록', '로그' ),
        'Lonelypages'               => array( '외톨이문서', '홀로된문서' ),
        'Longpages'                 => array( '긴문서' ),
+       'MediaStatistics'           => array( '미디어통계' ),
        'MergeHistory'              => array( '역사합치기' ),
        'MIMEsearch'                => array( 'MIME검색', 'MIME찾기' ),
        'Mostcategories'            => array( '많이분류된문서' ),
@@ -132,7 +136,8 @@ $specialPageAliases = array(
        'Newimages'                 => array( '새파일', '새그림' ),
        'Newpages'                  => array( '새문서' ),
        'PagesWithProp'             => array( '속성별문서' ),
-       'PasswordReset'             => array( '비밀번호재설정', '비밀단어재설정', '비밀번호초기화', '비밀단어초기화' ),
+       'PageLanguage'              => array( '문서언어' ),
+       'PasswordReset'             => array( '비밀번호재설정', '비밀번호초기화' ),
        'PermanentLink'             => array( '고유링크', '영구링크' ),
        'Popularpages'              => array( '인기있는문서' ),
        'Preferences'               => array( '환경설정' ),
@@ -140,18 +145,20 @@ $specialPageAliases = array(
        'Protectedpages'            => array( '보호된문서' ),
        'Protectedtitles'           => array( '만들기보호된문서', '생성보호된문서' ),
        'Randompage'                => array( '임의문서' ),
-       'RandomInCategory'          => array( 'ë¶\84ë¥\98ì\97\90ì\9e\88ë\8a\94임의문서' ),
+       'RandomInCategory'          => array( 'ë¶\84ë¥\98ì\95\88ì\9d\98임의문서' ),
        'Randomredirect'            => array( '임의넘겨주기' ),
        'Recentchanges'             => array( '최근바뀜' ),
        'Recentchangeslinked'       => array( '링크최근바뀜' ),
        'Redirect'                  => array( '넘겨주기' ),
        'ResetTokens'               => array( '토큰재설정' ),
        'Revisiondelete'            => array( '특정판삭제' ),
+       'RunJobs'                   => array( '작업실행' ),
        'Search'                    => array( '검색', '찾기' ),
        'Shortpages'                => array( '짧은문서' ),
        'Specialpages'              => array( '특수문서', '특수기능' ),
        'Statistics'                => array( '통계' ),
        'Tags'                      => array( '태그' ),
+       'TrackingCategories'        => array( '추적용분류' ),
        'Unblock'                   => array( '차단해제' ),
        'Uncategorizedcategories'   => array( '분류안된분류' ),
        'Uncategorizedimages'       => array( '분류안된파일', '분류안된그림' ),
@@ -165,8 +172,8 @@ $specialPageAliases = array(
        'Unwatchedpages'            => array( '주시안되는문서' ),
        'Upload'                    => array( '올리기', '파일올리기', '그림올리기', '업로드' ),
        'UploadStash'               => array( '올린비공개파일', '비공개로올린파일' ),
-       'Userlogin'                 => array( '로그인' ),
-       'Userlogout'                => array( '로그아웃' ),
+       'Userlogin'                 => array( '로그인', '사용자로그인' ),
+       'Userlogout'                => array( '로그아웃', '사용자로그아웃' ),
        'Userrights'                => array( '권한조정', '관리자하기', '봇하기' ),
        'Version'                   => array( '버전' ),
        'Wantedcategories'          => array( '필요한분류' ),
@@ -213,7 +220,6 @@ $magicWords = array(
        'numberofusers'             => array( '1', '사용자수', '계정수', 'NUMBEROFUSERS' ),
        'numberofactiveusers'       => array( '1', '활동중인사용자수', 'NUMBEROFACTIVEUSERS' ),
        'numberofedits'             => array( '1', '편집수', 'NUMBEROFEDITS' ),
-       'numberofviews'             => array( '1', '조회수', 'NUMBEROFVIEWS' ),
        'pagename'                  => array( '1', '문서이름', 'PAGENAME' ),
        'pagenamee'                 => array( '1', '문서이름E', 'PAGENAMEE' ),
        'namespace'                 => array( '1', '이름공간', 'NAMESPACE' ),
@@ -263,7 +269,7 @@ $magicWords = array(
        'img_link'                  => array( '1', '링크=$1', 'link=$1' ),
        'img_alt'                   => array( '1', '대체글=$1', 'alt=$1' ),
        'img_class'                 => array( '1', '클래스=$1', 'class=$1' ),
-       'int'                       => array( '0', 'ì \95ì\88\98:', 'INT:' ),
+       'int'                       => array( '0', 'ì\9d¸í\84°í\8e\98ì\9d´ì\8a¤:', 'INT:' ),
        'sitename'                  => array( '1', '사이트이름', 'SITENAME' ),
        'ns'                        => array( '0', '이름:', '이름공간:', 'NS:' ),
        'nse'                       => array( '0', '이름E:', '이름공간E:', 'NSE:' ),
@@ -302,7 +308,7 @@ $magicWords = array(
        'lc'                        => array( '0', '소문자:', 'LC:' ),
        'uc'                        => array( '0', '대문자:', 'UC:' ),
        'raw'                       => array( '0', '원본:', 'RAW:' ),
-       'displaytitle'              => array( '1', '제목보이기', '제목표시', 'DISPLAYTITLE' ),
+       'displaytitle'              => array( '1', '보일제목', '표시제목', 'DISPLAYTITLE' ),
        'rawsuffix'                 => array( '1', '원', 'R' ),
        'nocommafysuffix'           => array( '0', '구분자없음', 'NOSEP' ),
        'newsectionlink'            => array( '1', '__새글쓰기__', '__NEWSECTIONLINK__' ),
@@ -333,6 +339,7 @@ $magicWords = array(
        'numberingroup'             => array( '1', '권한별사용자수', '그룹별사용자수', 'NUMBERINGROUP', 'NUMINGROUP' ),
        'staticredirect'            => array( '1', '__넘겨주기고정__', '__STATICREDIRECT__' ),
        'protectionlevel'           => array( '1', '보호수준', 'PROTECTIONLEVEL' ),
+       'cascadingsources'          => array( '1', '계단식원본', 'CASCADINGSOURCES' ),
        'formatdate'                => array( '0', '날짜형식', 'formatdate', 'dateformat' ),
        'url_path'                  => array( '0', '경로', 'PATH' ),
        'url_wiki'                  => array( '0', '위키', 'WIKI' ),
index e338b42..b1c9d3b 100644 (file)
@@ -125,7 +125,7 @@ $specialPageAliases = array(
        'Deadendpages'              => array( 'Sigge_ohne_Links_dren' ),
        'DeletedContributions'      => array( 'Fotjeschmeße' ),
        'DoubleRedirects'           => array( 'Ömleitunge_op_Ömleitunge' ),
-       'Emailuser'                 => array( 'Email', 'E-mail' ),
+       'Emailuser'                 => array( 'E-mail' ),
        'Export'                    => array( 'Expocht' ),
        'Fewestrevisions'           => array( 'Winnig_beärbeit', 'Winnish_beärbeidt', 'Winnich_bearbeit' ),
        'FileDuplicateSearch'       => array( 'Dubbel_Dateie' ),
index ea7384a..b093b58 100644 (file)
@@ -165,7 +165,6 @@ $magicWords = array(
        'numberofusers'             => array( '1', 'NIVERADHEVNYDHYORYON', 'NUMBEROFUSERS' ),
        'numberofactiveusers'       => array( '1', 'NIVERADHEVNYDHYORYONVYW', 'NUMBEROFACTIVEUSERS' ),
        'numberofedits'             => array( '1', 'NIVERAJANJYOW', 'NUMBEROFEDITS' ),
-       'numberofviews'             => array( '1', 'NIVERAWELYANSOW', 'NUMBEROFVIEWS' ),
        'pagename'                  => array( '1', 'HANOWANFOLEN', 'PAGENAME' ),
        'fullpagename'              => array( '1', 'HANOWLEUNANFOLEN', 'FULLPAGENAME' ),
        'img_thumbnail'             => array( '1', 'skeusennik', 'thumbnail', 'thumb' ),
index 02fdb1c..203788c 100644 (file)
@@ -54,6 +54,7 @@ $namespaceGenderAliases = array();
 $specialPageAliases = array(
        'Activeusers'               => array( 'Aktiv_Benotzer' ),
        'Allmessages'               => array( 'All_Systemmessagen' ),
+       'AllMyUploads'              => array( 'All_meng_Fichieren' ),
        'Allpages'                  => array( 'All_Säiten' ),
        'Ancientpages'              => array( 'Al_Säiten' ),
        'Badtitle'                  => array( 'Falschen_Titel' ),
@@ -64,19 +65,19 @@ $specialPageAliases = array(
        'Categories'                => array( 'Kategorien' ),
        'ChangeEmail'               => array( 'E-Mailadress_änneren' ),
        'ChangePassword'            => array( 'Passwuert_zrécksetzen' ),
-       'ComparePages'              => array( 'Säite_vergkäichen' ),
+       'ComparePages'              => array( 'Säite_vergläichen' ),
        'Confirmemail'              => array( 'E-Mail_confirméieren' ),
        'Contributions'             => array( 'Kontributiounen' ),
        'CreateAccount'             => array( 'Benotzerkont_opmaachen' ),
        'Deadendpages'              => array( 'Sakgaasse-Säiten' ),
-       'DeletedContributions'      => array( 'Geläschte_Kontributiounen' ),
+       'DeletedContributions'      => array( 'Geläscht_Kontributiounen' ),
        'DoubleRedirects'           => array( 'Duebel_Viruleedungen' ),
        'EditWatchlist'             => array( 'Iwwerwaachungslëscht_änneren' ),
        'Emailuser'                 => array( 'Dësem_Benotzer_eng_E-Mail_schécken' ),
        'ExpandTemplates'           => array( 'Schablounen_erweideren' ),
        'Export'                    => array( 'Exportéieren' ),
        'Fewestrevisions'           => array( 'Säite_mat_de_mannsten_Ännerungen' ),
-       'FileDuplicateSearch'       => array( 'No_duebele_Fichieren_sichen' ),
+       'FileDuplicateSearch'       => array( 'No_duebele_Fichiere_sichen' ),
        'Filepath'                  => array( 'Pad_bäi_de_Fichier' ),
        'Import'                    => array( 'Importéieren' ),
        'Invalidateemail'           => array( 'E-Mailadress_net_confirméieren' ),
@@ -88,6 +89,7 @@ $specialPageAliases = array(
        'Listfiles'                 => array( 'Billerlëscht' ),
        'Listgrouprights'           => array( 'Lëscht_vun_de_Grupperechter' ),
        'Listredirects'             => array( 'Viruleedungen' ),
+       'ListDuplicatedFiles'       => array( 'Lëscht_vun_den_duebele_Fichieren' ),
        'Listusers'                 => array( 'Lëscht_vun_de_Benotzer' ),
        'Lockdb'                    => array( 'Datebank_spären' ),
        'Log'                       => array( 'Logbicher' ),
@@ -96,11 +98,11 @@ $specialPageAliases = array(
        'MergeHistory'              => array( 'Versiounen_zesummeleeën' ),
        'MIMEsearch'                => array( 'No_MIME-Zorte_sichen' ),
        'Mostcategories'            => array( 'Säite_mat_de_meeschte_Kategorien' ),
-       'Mostimages'                => array( 'Dacks_benotzte_Biller' ),
+       'Mostimages'                => array( 'Dacks_benotzt_Biller' ),
        'Mostinterwikis'            => array( 'Meescht_Interwikien' ),
-       'Mostlinked'                => array( 'Dacks_verlinkte_Säiten' ),
-       'Mostlinkedcategories'      => array( 'Dacks_benotzte_Kategorien' ),
-       'Mostlinkedtemplates'       => array( 'Dacks_benotzte_Schablounen' ),
+       'Mostlinked'                => array( 'Dacks_verlinkt_Säiten' ),
+       'Mostlinkedcategories'      => array( 'Dacks_benotzt_Kategorien' ),
+       'Mostlinkedtemplates'       => array( 'Dacks_benotzt_Schablounen' ),
        'Mostrevisions'             => array( 'Säite_mat_de_meeschten_Ännerungen' ),
        'Movepage'                  => array( 'Säit_réckelen' ),
        'Mycontributions'           => array( 'Meng_Kontributiounen' ),
@@ -110,19 +112,22 @@ $specialPageAliases = array(
        'Myuploads'                 => array( 'Meng_eropgeluede_Fichieren' ),
        'Newimages'                 => array( 'Nei_Biller' ),
        'Newpages'                  => array( 'Nei_Säiten' ),
+       'PagesWithProp'             => array( 'Säite_mat_Eegeschaften' ),
+       'PageLanguage'              => array( 'Sprooch_vun_der_Säit' ),
        'PasswordReset'             => array( 'Zrécksetze_vum_Passwuert' ),
        'PermanentLink'             => array( 'Permanente_Link' ),
-       'Popularpages'              => array( 'Beléifste_Säiten' ),
+       'Popularpages'              => array( 'Beléifst_Säiten' ),
        'Preferences'               => array( 'Astellungen' ),
        'Prefixindex'               => array( 'Indexsich' ),
        'Protectedpages'            => array( 'Protegéiert_Säiten' ),
-       'Protectedtitles'           => array( 'Gespaarte_Säiten' ),
+       'Protectedtitles'           => array( 'Gespaart_Säiten' ),
        'Randompage'                => array( 'Zoufälleg_Säit' ),
-       'RandomInCategory'          => array( 'Zoufälleg_Säit_aus_der_Kategorie' ),
+       'RandomInCategory'          => array( 'Zoufälleg_Säit_an_der_Kategorie' ),
        'Randomredirect'            => array( 'Zoufälleg_Viruleedung' ),
        'Recentchanges'             => array( 'Rezent_Ännerungen' ),
        'Recentchangeslinked'       => array( 'Ännerungen_op_verlinkte_Säiten' ),
        'Redirect'                  => array( 'Viruleedung' ),
+       'ResetTokens'               => array( 'Token_zrécksetzen' ),
        'Revisiondelete'            => array( 'Versioun_läschen' ),
        'Search'                    => array( 'Sichen' ),
        'Shortpages'                => array( 'Kuerz_Säiten' ),
@@ -136,19 +141,19 @@ $specialPageAliases = array(
        'Uncategorizedtemplates'    => array( 'Schablounen_ouni_Kategorie' ),
        'Undelete'                  => array( 'Restauréieren' ),
        'Unlockdb'                  => array( 'Spär_vun_der_Datebank_ophiewen' ),
-       'Unusedcategories'          => array( 'Onbenotze_Kategorien' ),
-       'Unusedimages'              => array( 'Onbenotzte_Biller' ),
-       'Unusedtemplates'           => array( 'Onbenotzte_Schablounen' ),
+       'Unusedcategories'          => array( 'Onbenotz_Kategorien' ),
+       'Unusedimages'              => array( 'Onbenotzt_Biller' ),
+       'Unusedtemplates'           => array( 'Onbenotzt_Schablounen' ),
        'Unwatchedpages'            => array( 'Säiten_déi_net_iwwerwaacht_ginn' ),
        'Upload'                    => array( 'Eroplueden' ),
        'Userlogin'                 => array( 'Umellen' ),
        'Userlogout'                => array( 'Ofmellen' ),
        'Userrights'                => array( 'Benotzerrechter' ),
        'Version'                   => array( 'Versioun' ),
-       'Wantedcategories'          => array( 'Gewënschte_Kategorien' ),
-       'Wantedfiles'               => array( 'Gewënschte_Fichieren' ),
-       'Wantedpages'               => array( 'Gewënschte_Säiten' ),
-       'Wantedtemplates'           => array( 'Gewënschte_Schablounen' ),
+       'Wantedcategories'          => array( 'Gewënscht_Kategorien' ),
+       'Wantedfiles'               => array( 'Gewënscht_Fichieren' ),
+       'Wantedpages'               => array( 'Gewënscht_Säiten' ),
+       'Wantedtemplates'           => array( 'Gewënscht_Schablounen' ),
        'Watchlist'                 => array( 'Iwwerwaachungslëscht' ),
        'Whatlinkshere'             => array( 'Linken_op_dës_Säit' ),
        'Withoutinterwiki'          => array( 'Säiten_ouni_Interwiki-Linken' ),
@@ -175,6 +180,7 @@ $magicWords = array(
        'img_page'                  => array( '1', 'Säit=$1', 'Säit_$1', 'seite=$1', 'seite $1', 'page=$1', 'page $1' ),
        'img_border'                => array( '1', 'bord', 'rand', 'border' ),
        'img_top'                   => array( '1', 'uewen', 'oben', 'top' ),
+       'img_middle'                => array( '1', 'mëtt', 'mitte', 'middle' ),
        'img_bottom'                => array( '1', 'ënnen', 'unten', 'bottom' ),
        'grammar'                   => array( '0', 'GRAMMAIRE', 'GRAMMATIK:', 'GRAMMAR:' ),
        'plural'                    => array( '0', 'PLURAL', 'PLURAL:' ),
index 85c0c26..45c3216 100644 (file)
@@ -27,6 +27,7 @@ $specialPageAliases = array(
        'Booksources'               => array( '書海' ),
        'BrokenRedirects'           => array( '斷渡' ),
        'Categories'                => array( '類' ),
+       'ChangeEmail'               => array( '易郵' ),
        'ChangePassword'            => array( '易符節' ),
        'ComparePages'              => array( '較頁' ),
        'Confirmemail'              => array( '核郵驛' ),
@@ -34,6 +35,7 @@ $specialPageAliases = array(
        'CreateAccount'             => array( '增簿' ),
        'Deadendpages'              => array( '此無路也' ),
        'DeletedContributions'      => array( '已刪之積' ),
+       'Diff'                      => array( '異' ),
        'DoubleRedirects'           => array( '窮渡' ),
        'EditWatchlist'             => array( '治哨站' ),
        'Emailuser'                 => array( '遺書' ),
@@ -63,6 +65,8 @@ $specialPageAliases = array(
        'Mostrevisions'             => array( '屢審' ),
        'Movepage'                  => array( '遷' ),
        'Mycontributions'           => array( '吾績' ),
+       'Mypage'                    => array( '吾頁' ),
+       'Mytalk'                    => array( '吾書房' ),
        'Newimages'                 => array( '新圖之廊' ),
        'Newpages'                  => array( '新灶' ),
        'Preferences'               => array( '簿註' ),
index 1153500..4c962ad 100644 (file)
@@ -49,7 +49,6 @@ $magicWords = array(
        'numberofusers'             => array( '1', 'ISAMPIKAMBANA', 'NOMBREUTILISATEURS', 'NUMBEROFUSERS' ),
        'numberofactiveusers'       => array( '1', 'ISAMPIKAMBANAMANOVA', 'NOMBREUTILISATEURSACTIFS', 'NUMBEROFACTIVEUSERS' ),
        'numberofedits'             => array( '1', 'ISAFANOVANA', 'NOMBREMODIFS', 'NUMBEROFEDITS' ),
-       'numberofviews'             => array( '1', 'ISATOPIMASO', 'NOMBREVUES', 'NUMBEROFVIEWS' ),
        'pagename'                  => array( '1', 'ANARAMPEJY', 'ANARANAPEJY', 'NOMPAGE', 'PAGENAME' ),
        'pagenamee'                 => array( '1', 'ANARAMPEJYX', 'ANARANAPEJYX', 'NOMPAGEX', 'PAGENAMEE' ),
        'namespace'                 => array( '1', 'ANARANTSEHATRA', 'ANARANASEHATRA', 'ESPACENOMMAGE', 'NAMESPACE' ),
@@ -126,40 +125,47 @@ $namespaceAliases = array(
 $namespaceGenderAliases = array();
 
 $specialPageAliases = array(
-       'Activeusers'               => array( 'Mpikambana_mavitrika' ),
-       'Allmessages'               => array( 'Hafatra_rehetra' ),
-       'Allpages'                  => array( 'Pejy_rehetra' ),
-       'Ancientpages'              => array( 'Pejy_antitra' ),
-       'Blankpage'                 => array( 'Pejy_fotsy' ),
-       'Block'                     => array( 'Hanakana' ),
-       'Booksources'               => array( 'Boky_loharano' ),
-       'BrokenRedirects'           => array( 'Fihodinana_tapaka' ),
+       'Activeusers'               => array( 'Mpikambana_mavitrika', 'MpikambanaMavitrika' ),
+       'Allmessages'               => array( 'Hafatra_rehetra', 'HafatraRehetra' ),
+       'AllMyUploads'              => array( 'Fanondranana_rehetra', 'FanondrananaRehetra' ),
+       'Allpages'                  => array( 'Pejy_rehetra', 'PejyRehetra' ),
+       'Ancientpages'              => array( 'Pejy_antitra', 'PejyAntitra' ),
+       'Badtitle'                  => array( 'LohatenyDiso', 'Lohateny_diso' ),
+       'Blankpage'                 => array( 'Pejy_fotsy', 'PejyFotsy' ),
+       'Block'                     => array( 'Hanakana', 'Fanakanana', 'Sakana' ),
+       'Booksources'               => array( 'Boky_loharano', 'BokyLoharano', 'BokyLoharanon-torohay' ),
+       'BrokenRedirects'           => array( 'Fihodinana_tapaka', 'Fihodinana_vaky', 'FihodinanaTapaka', 'FihodinanaVaky' ),
        'Categories'                => array( 'Sokajy' ),
-       'ChangePassword'            => array( 'Hiova_tenimiafina' ),
-       'ComparePages'              => array( 'Fampitaha_pejy' ),
-       'Confirmemail'              => array( 'Fankatoavana_ny_adiresy_imailaka' ),
-       'Contributions'             => array( 'Fandraisan\'anjara' ),
-       'CreateAccount'             => array( 'Hamorona_kaonty' ),
-       'Deadendpages'              => array( 'Pejy_tsy_misy_rohy' ),
-       'DeletedContributions'      => array( 'Fandraisan\'anjara_voafafa' ),
+       'ChangeEmail'               => array( 'HanovaNyMailaka', 'Hanova_ny_mailaka' ),
+       'ChangePassword'            => array( 'Hiova_tenimiafina', 'HiovaTenimiafina', 'Fiovantenimiafina' ),
+       'ComparePages'              => array( 'Fampitaham-pejy', 'Fampitahampejy', 'HampitahaPejy', 'Hampitaha_pejy' ),
+       'Confirmemail'              => array( 'FanamarinanaAdiresyMailaka', 'Fanamarinana_adiresy_mailaka' ),
+       'Contributions'             => array( 'Fandraisan\'anjara', 'Fandraisananjara' ),
+       'CreateAccount'             => array( 'Hamorona_kaonty', 'HamoronaKaonty' ),
+       'Deadendpages'              => array( 'Pejy_tsy_misy_rohy', 'Pejy_tsy_mandrohy' ),
+       'DeletedContributions'      => array( 'Fandraisan\'anjara_voafafa', 'FandraisananjaraVoafafa' ),
+       'Diff'                      => array( 'Fahasmhf.' ),
        'DoubleRedirects'           => array( 'Fihodinana_miroa' ),
-       'EditWatchlist'             => array( 'Hanova_ny_pejy_arahana' ),
-       'Emailuser'                 => array( 'Handefa_imailaka' ),
-       'Export'                    => array( 'Hamoa-pejy' ),
+       'EditWatchlist'             => array( 'Hanova_ny_pejy_arahana', 'HanovaPejyArahana' ),
+       'Emailuser'                 => array( 'Handefa_mailaka', 'HandefaMailaka' ),
+       'ExpandTemplates'           => array( 'Hamelatra_endrika', 'HamelatraEndrika' ),
+       'Export'                    => array( 'Hanondrana_pejy', 'HanondranaPejy' ),
        'Fewestrevisions'           => array( 'Pejy_vitsy_mpanova_indrindra' ),
        'FileDuplicateSearch'       => array( 'Fikarohan-drakitra_miroa' ),
        'Filepath'                  => array( 'Lalan-drakitra' ),
        'Import'                    => array( 'Hampidi-pejy' ),
-       'BlockList'                 => array( 'Lisitry_ny_fanakanana' ),
+       'Invalidateemail'           => array( 'Hampandiso_ny_mailaka', 'HampandisoMailaka' ),
+       'JavaScriptTest'            => array( 'AndranaJavaScript' ),
+       'BlockList'                 => array( 'Lisitry_ny_sakana', 'Lisi-tsakana' ),
        'LinkSearch'                => array( 'Fikarohan-drohy' ),
-       'Listadmins'                => array( 'Lisitry_ny_mpandrindra' ),
-       'Listbots'                  => array( 'Lisitry_ny_rôbô' ),
-       'Listfiles'                 => array( 'Lisitran\'ny_rakitra' ),
+       'Listadmins'                => array( 'Lisitry_ny_mpandrindra', 'LisitraMpandrindra' ),
+       'Listbots'                  => array( 'Lisitry_ny_rôbô', 'LisitraRôbô', 'LisitraRobo' ),
+       'Listfiles'                 => array( 'Lisitry_ny_rakitra', 'LisitraRakitra' ),
        'Listgrouprights'           => array( 'Lisitry_ny_satam-pikambana' ),
        'Listredirects'             => array( 'Lisitry_ny_fihodinana' ),
        'Listusers'                 => array( 'Lisitran\'ny_mpikambana' ),
        'Lockdb'                    => array( 'Hanidy_ny_database' ),
-       'Log'                       => array( 'Tatitr\'asa' ),
+       'Log'                       => array( 'Laogy' ),
        'Lonelypages'               => array( 'Pejy_manirery' ),
        'Longpages'                 => array( 'Pejy_lavabe' ),
        'MergeHistory'              => array( 'Hampiaraka_ny_tantaram-pejy' ),
@@ -174,23 +180,33 @@ $specialPageAliases = array(
        'Mycontributions'           => array( 'Fandraisan\'anjarako' ),
        'Mypage'                    => array( 'Pejiko' ),
        'Mytalk'                    => array( 'Pejin-dresako' ),
+       'Myuploads'                 => array( 'Fanondranako' ),
        'Newimages'                 => array( 'Sary_vaovao' ),
        'Newpages'                  => array( 'Pejy_vaovao' ),
+       'PagesWithProp'             => array( 'Pejy_misy_tondro', 'PejyMisyTondro' ),
+       'PageLanguage'              => array( 'Fitenim-pejy', 'Fitenimpejy' ),
+       'PasswordReset'             => array( 'Famerenan-tenimiafina', 'Famerenantenimiafina' ),
+       'PermanentLink'             => array( 'Rohy_maharitra', 'RohyMaharitra' ),
        'Popularpages'              => array( 'Pejy_be_mpitsidika_indrindra' ),
        'Preferences'               => array( 'Safidy' ),
        'Prefixindex'               => array( 'Index' ),
        'Protectedpages'            => array( 'Pejy_voaaro' ),
        'Protectedtitles'           => array( 'Lohateny_voaaro' ),
        'Randompage'                => array( 'Kisendra' ),
-       'Randomredirect'            => array( 'Fihodinana_kisendta' ),
-       'Recentchanges'             => array( 'Fanovàna_farany' ),
-       'Recentchangeslinked'       => array( 'Fanarahana_ny_rohy' ),
-       'Revisiondelete'            => array( 'Santiôna_voafafa' ),
-       'Search'                    => array( 'Fikarohana' ),
-       'Shortpages'                => array( 'Pejy_fohy' ),
-       'Specialpages'              => array( 'Pejy_manokana' ),
+       'RandomInCategory'          => array( 'Pejy_kisendra_anaty_sokajy_iray', 'PejyKisendraAnatySokajy' ),
+       'Randomredirect'            => array( 'Fihodinana_kisendra', 'FihodinanaKisendra' ),
+       'Recentchanges'             => array( 'Fiovana_farany', 'FiovanaFarany' ),
+       'Recentchangeslinked'       => array( 'Fanarahana_ny_rohy', 'FanarahanaRohy' ),
+       'Redirect'                  => array( 'Fihodinana' ),
+       'ResetTokens'               => array( 'HamerinaToken' ),
+       'Revisiondelete'            => array( 'Versiona_voafafa', 'VersionaVoafafa' ),
+       'RunJobs'                   => array( 'Runjob' ),
+       'Search'                    => array( 'Fikarohana', 'Karoka' ),
+       'Shortpages'                => array( 'Pejy_fohy', 'PejyFohy' ),
+       'Specialpages'              => array( 'Pejy_manokana', 'PejyManokana' ),
        'Statistics'                => array( 'Statistika' ),
        'Tags'                      => array( 'Balizy' ),
+       'TrackingCategories'        => array( 'Sokajy_fanarahana', 'SokajyFanarahana' ),
        'Unblock'                   => array( 'Hanala_ny_fanakanana' ),
        'Uncategorizedcategories'   => array( 'Sokajy_tsy_misy_sokajy' ),
        'Uncategorizedimages'       => array( 'Sary_tsy_misy_sokajy', 'Rakitra_tsy_misy_sokajy' ),
@@ -203,6 +219,7 @@ $specialPageAliases = array(
        'Unusedtemplates'           => array( 'Endrika_tsy_misy_mpampiasa' ),
        'Unwatchedpages'            => array( 'Pejy_tsy_misy_mpanaraka' ),
        'Upload'                    => array( 'Hanafatra' ),
+       'UploadStash'               => array( 'Fanondranana_stash' ),
        'Userlogin'                 => array( 'Fidirana' ),
        'Userlogout'                => array( 'Fialàna' ),
        'Userrights'                => array( 'Fahefana' ),
index 5ab67ae..8a249e1 100644 (file)
@@ -156,8 +156,8 @@ $specialPageAliases = array(
 
 $magicWords = array(
        'redirect'                  => array( '0', '#ALIAH', '#ALIH', '#REDIRECT' ),
-       'pagesincategory_all'       => array( '0', 'sado', 'all' ),
-       'pagesincategory_pages'     => array( '0', 'laman', 'pages' ),
+       'pagesincategory_all'       => array( '0', 'sado', 'semua', 'all' ),
+       'pagesincategory_pages'     => array( '0', 'laman', 'halaman', 'pages' ),
        'pagesincategory_files'     => array( '0', 'berkas', 'files' ),
 );
 
index 3d29b6b..9f74d16 100644 (file)
@@ -96,6 +96,7 @@ $specialPageAliases = array(
        'Allmessages'               => array( 'СитеПораки' ),
        'AllMyUploads'              => array( 'СитеМоиПодигања' ),
        'Allpages'                  => array( 'СитеСтраници' ),
+       'ApiHelp'                   => array( 'ИзвршникПомош' ),
        'Ancientpages'              => array( 'НајстариСтраници' ),
        'Badtitle'                  => array( 'Лошнаслов' ),
        'Blankpage'                 => array( 'ПразнаСтраница' ),
@@ -109,14 +110,15 @@ $specialPageAliases = array(
        'Confirmemail'              => array( 'Потврди_е-пошта' ),
        'Contributions'             => array( 'Придонеси' ),
        'CreateAccount'             => array( 'СоздајКорисничкаСметка' ),
-       'Deadendpages'              => array( 'Ð\8cоÑ\80Ñ\81окакСтраници' ),
+       'Deadendpages'              => array( 'СлепиСтраници' ),
        'DeletedContributions'      => array( 'ИзбришаниПридонеси' ),
+       'Diff'                      => array( 'Разлики' ),
        'DoubleRedirects'           => array( 'ДвојниПренасочувања' ),
        'EditWatchlist'             => array( 'УредиНабљудувања' ),
        'Emailuser'                 => array( 'Пиши_е-пошта_на_корисникот' ),
        'ExpandTemplates'           => array( 'ПрошириШаблони' ),
        'Export'                    => array( 'Извоз' ),
-       'Fewestrevisions'           => array( 'Ð\9dаÑ\98малкÑ\83Ревизии' ),
+       'Fewestrevisions'           => array( 'Ð\9dаÑ\98малкÑ\83Ð\9fÑ\80еÑ\80абоÑ\82ки' ),
        'FileDuplicateSearch'       => array( 'ПребарувањеДупликатПодатотека' ),
        'Filepath'                  => array( 'ПатДоПодатотека' ),
        'Import'                    => array( 'Увоз' ),
@@ -129,11 +131,13 @@ $specialPageAliases = array(
        'Listfiles'                 => array( 'СписокНаПодатотеки', 'СписокНаСлики' ),
        'Listgrouprights'           => array( 'СписокНаГрупниПрава' ),
        'Listredirects'             => array( 'СписокНаПренасочувања' ),
+       'ListDuplicatedFiles'       => array( 'ИспишиДуплираниПодатотеки' ),
        'Listusers'                 => array( 'СписокНаКорисници', 'СписокКорисници' ),
        'Lockdb'                    => array( 'ЗаклучиБаза' ),
        'Log'                       => array( 'Дневник', 'Дневници' ),
        'Lonelypages'               => array( 'ОсамениСтраници', 'СтранциСирачиња' ),
        'Longpages'                 => array( 'ДолгиСтраници' ),
+       'MediaStatistics'           => array( 'МедиумскиСтатистики' ),
        'MergeHistory'              => array( 'СпојувањеИсторија' ),
        'MIMEsearch'                => array( 'MIMEПребарување' ),
        'Mostcategories'            => array( 'НајмногуКатегории' ),
@@ -142,7 +146,7 @@ $specialPageAliases = array(
        'Mostlinked'                => array( 'СоНајмногуВрски', 'СтранициСоНајмногуВрски' ),
        'Mostlinkedcategories'      => array( 'НајупотребуваниКатегории' ),
        'Mostlinkedtemplates'       => array( 'НајупотребуваниШаблони' ),
-       'Mostrevisions'             => array( 'Ð\9dаÑ\98многÑ\83Ревизии' ),
+       'Mostrevisions'             => array( 'Ð\9dаÑ\98многÑ\83Ð\9fÑ\80еÑ\80абоÑ\82ки' ),
        'Movepage'                  => array( 'ПреместиСтраница' ),
        'Mycontributions'           => array( 'МоиПридонеси' ),
        'MyLanguage'                => array( 'МојЈазик' ),
@@ -152,6 +156,7 @@ $specialPageAliases = array(
        'Newimages'                 => array( 'НовиСлики', 'НовиПодатотеки' ),
        'Newpages'                  => array( 'НовиСтраници' ),
        'PagesWithProp'             => array( 'СтранициСоСвојство' ),
+       'PageLanguage'              => array( 'ЈазикНаСтраницата' ),
        'PasswordReset'             => array( 'ПроменаНаЛозинка' ),
        'PermanentLink'             => array( 'ПостојанаВрска' ),
        'Popularpages'              => array( 'ПопуларниСтраници' ),
@@ -166,12 +171,14 @@ $specialPageAliases = array(
        'Recentchangeslinked'       => array( 'ПоврзаниПромени' ),
        'Redirect'                  => array( 'Пренасочување' ),
        'ResetTokens'               => array( 'ВратиОдновоЗнаци' ),
-       'Revisiondelete'            => array( 'БришењеРевизија' ),
+       'Revisiondelete'            => array( 'БришењеПреработка' ),
+       'RunJobs'                   => array( 'ПуштиЗадачи' ),
        'Search'                    => array( 'Барај' ),
        'Shortpages'                => array( 'КраткиСтраници' ),
-       'Specialpages'              => array( 'СпеÑ\86иÑ\98алниСтраници' ),
+       'Specialpages'              => array( 'СлÑ\83жбениСтраници' ),
        'Statistics'                => array( 'Статистики' ),
        'Tags'                      => array( 'Oзнаки', 'Приврзоци' ),
+       'TrackingCategories'        => array( 'КатегорииЗаСледење' ),
        'Unblock'                   => array( 'Одблокирај' ),
        'Uncategorizedcategories'   => array( 'НекатегоризираниКатегории' ),
        'Uncategorizedimages'       => array( 'НекатегоризираниСлики' ),
@@ -191,7 +198,7 @@ $specialPageAliases = array(
        'Version'                   => array( 'Верзија' ),
        'Wantedcategories'          => array( 'ПотребниКатегории' ),
        'Wantedfiles'               => array( 'ПотребниПодатотеки' ),
-       'Wantedpages'               => array( 'ПрекинатиВрски' ),
+       'Wantedpages'               => array( 'ПотребниСтраници' ),
        'Wantedtemplates'           => array( 'ПотребниШаблони' ),
        'Watchlist'                 => array( 'СписокНаНабљудувања' ),
        'Whatlinkshere'             => array( 'ШтоВодиОвде' ),
@@ -233,7 +240,6 @@ $magicWords = array(
        'numberofusers'             => array( '1', 'БРОЈНАКОРИСНИЦИ', 'NUMBEROFUSERS' ),
        'numberofactiveusers'       => array( '1', 'БРОЈНААКТИВНИКОРИСНИЦИ', 'NUMBEROFACTIVEUSERS' ),
        'numberofedits'             => array( '1', 'БРОЈНАУРЕДУВАЊА', 'NUMBEROFEDITS' ),
-       'numberofviews'             => array( '1', 'БРОЈНАПРЕГЛЕДУВАЊА', 'NUMBEROFVIEWS' ),
        'pagename'                  => array( '1', 'СТРАНИЦА', 'PAGENAME' ),
        'pagenamee'                 => array( '1', 'СТРАНИЦАИ', 'PAGENAMEE' ),
        'namespace'                 => array( '1', 'ИМЕПРОСТОР', 'ИМЕНСКИПРОСТОР', 'NAMESPACE' ),
@@ -288,15 +294,15 @@ $magicWords = array(
        'currentdow'                => array( '1', 'ТЕКОВЕНДЕНВОСЕДМИЦАТА', 'CURRENTDOW' ),
        'localweek'                 => array( '1', 'СЕДМИЦА_ЛОКАЛНО', 'LOCALWEEK' ),
        'localdow'                  => array( '1', 'ЛОКАЛЕНДЕНВОСЕДМИЦАТА', 'LOCALDOW' ),
-       'revisionid'                => array( '1', 'Ð\9dÐ\90Ð\97Ð\9dÐ\90Ð\9aÐ\90Ð\9dÐ\90РÐ\95Ð\92Ð\98Ð\97Ð\98Ð\88А', 'REVISIONID' ),
-       'revisionday'               => array( '1', 'Ð\94Ð\95Ð\9dÐ\9dÐ\90РÐ\95Ð\92Ð\98Ð\97Ð\98Ð\88А', 'REVISIONDAY' ),
-       'revisionday2'              => array( '1', 'Ð\94Ð\95Ð\9dÐ\9dÐ\90РÐ\95Ð\92Ð\98Ð\97Ð\98Ð\88А2', 'REVISIONDAY2' ),
-       'revisionmonth'             => array( '1', 'Ð\9cÐ\95СÐ\95ЦÐ\9dÐ\90РÐ\95Ð\92Ð\98Ð\97Ð\98Ð\88А', 'REVISIONMONTH' ),
-       'revisionmonth1'            => array( '1', 'Ð\9cÐ\95СÐ\95ЦÐ\9dÐ\90РÐ\95Ð\92Ð\98Ð\97Ð\98Ð\88А1', 'REVISIONMONTH1' ),
-       'revisionyear'              => array( '1', 'Ð\93Ð\9eÐ\94Ð\98Ð\9dÐ\90Ð\9dÐ\90РÐ\95Ð\92Ð\98Ð\97Ð\98Ð\88А', 'REVISIONYEAR' ),
-       'revisiontimestamp'         => array( '1', 'Ð\92РÐ\95Ð\9cÐ\95Ð\9dÐ\90РÐ\95Ð\92Ð\98Ð\97Ð\98Ð\88А', 'REVISIONTIMESTAMP' ),
-       'revisionuser'              => array( '1', 'Ð\9aÐ\9eРÐ\98СÐ\9dÐ\98Ð\9aÐ\9dÐ\90Ð\9dÐ\90РÐ\95Ð\92Ð\98Ð\97Ð\98Ð\88А', 'REVISIONUSER' ),
-       'revisionsize'              => array( '1', 'Ð\93Ð\9eÐ\9bÐ\95Ð\9cÐ\98Ð\9dÐ\90Ð\9dÐ\90РÐ\95Ð\92Ð\98Ð\97Ð\98Ð\88А', 'REVISIONSIZE' ),
+       'revisionid'                => array( '1', 'Ð\9dÐ\90Ð\97Ð\9dÐ\90Ð\9aÐ\90Ð\9dÐ\90Ð\9fРÐ\95РÐ\90Ð\91Ð\9eТÐ\9aА', 'REVISIONID' ),
+       'revisionday'               => array( '1', 'Ð\94Ð\95Ð\9dÐ\9dÐ\90Ð\9fРÐ\95РÐ\90Ð\91Ð\9eТÐ\9aА', 'REVISIONDAY' ),
+       'revisionday2'              => array( '1', 'Ð\94Ð\95Ð\9dÐ\9dÐ\90Ð\9fРÐ\95РÐ\90Ð\91Ð\9eТÐ\9aА2', 'REVISIONDAY2' ),
+       'revisionmonth'             => array( '1', 'Ð\9cÐ\95СÐ\95ЦÐ\9dÐ\90Ð\9fРÐ\95РÐ\90Ð\91Ð\9eТÐ\9aА', 'REVISIONMONTH' ),
+       'revisionmonth1'            => array( '1', 'Ð\9cÐ\95СÐ\95ЦÐ\9dÐ\90Ð\9fРÐ\95РÐ\90Ð\91Ð\9eТÐ\9aА1', 'REVISIONMONTH1' ),
+       'revisionyear'              => array( '1', 'Ð\93Ð\9eÐ\94Ð\98Ð\9dÐ\90Ð\9dÐ\90Ð\9fРÐ\95РÐ\90Ð\91Ð\9eТÐ\9aА', 'REVISIONYEAR' ),
+       'revisiontimestamp'         => array( '1', 'Ð\92РÐ\95Ð\9cÐ\95Ð\9dÐ\90Ð\9fРÐ\95РÐ\90Ð\91Ð\9eТÐ\9aА', 'REVISIONTIMESTAMP' ),
+       'revisionuser'              => array( '1', 'Ð\9aÐ\9eРÐ\98СÐ\9dÐ\98Ð\9aÐ\9dÐ\90Ð\9dÐ\90Ð\9fРÐ\95РÐ\90Ð\91Ð\9eТÐ\9aА', 'REVISIONUSER' ),
+       'revisionsize'              => array( '1', 'Ð\93Ð\9eÐ\9bÐ\95Ð\9cÐ\98Ð\9dÐ\90Ð\9dÐ\90Ð\9fРÐ\95РÐ\90Ð\91Ð\9eТÐ\9aА', 'REVISIONSIZE' ),
        'plural'                    => array( '0', 'МНОЖИНА:', 'PLURAL:' ),
        'fullurl'                   => array( '0', 'ПОЛНАURL:', 'FULLURL:' ),
        'fullurle'                  => array( '0', 'ПОЛНАURLE:', 'FULLURLE:' ),
@@ -325,7 +331,7 @@ $magicWords = array(
        'formatnum'                 => array( '0', 'ФОРМАТБРОЈ', 'FORMATNUM' ),
        'padleft'                   => array( '0', 'ПОСТАВИЛЕВО', 'PADLEFT' ),
        'padright'                  => array( '0', 'ПОСТАВИДЕСНО', 'PADRIGHT' ),
-       'special'                   => array( '0', 'Ñ\81пеÑ\86иÑ\98ална', 'Ñ\81пеÑ\86иÑ\98ални', 'special' ),
+       'special'                   => array( '0', 'Ñ\81лÑ\83жбена', 'Ñ\81лÑ\83жбени', 'special' ),
        'defaultsort'               => array( '1', 'ОСНОВНОПОДРЕДУВАЊЕ:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
        'filepath'                  => array( '0', 'ПОДАТОТЕЧНАПАТЕКА:', 'FILEPATH:' ),
        'tag'                       => array( '0', 'ознака', 'tag' ),
@@ -337,12 +343,15 @@ $magicWords = array(
        'numberingroup'             => array( '1', 'БРОЈВОГРУПА', 'NUMBERINGROUP', 'NUMINGROUP' ),
        'staticredirect'            => array( '1', '__СТАТИЧНОПРЕНАСОЧУВАЊЕ__', '__STATICREDIRECT__' ),
        'protectionlevel'           => array( '1', 'НИВОНАЗАШТИТА', 'PROTECTIONLEVEL' ),
+       'cascadingsources'          => array( '1', 'КАСКАДНИИЗВОРИ', 'CASCADINGSOURCES' ),
        'formatdate'                => array( '0', 'форматдатум', 'formatdate', 'dateformat' ),
        'url_path'                  => array( '0', 'ПАТЕКА', 'PATH' ),
        'url_wiki'                  => array( '0', 'ВИКИ', 'WIKI' ),
        'url_query'                 => array( '0', 'БАРАЊЕ', 'QUERY' ),
        'defaultsort_noerror'       => array( '0', 'безгрешки', 'noerror' ),
        'defaultsort_noreplace'     => array( '0', 'беззамена', 'noreplace' ),
+       'displaytitle_noerror'      => array( '0', 'безгрешка', 'noerror' ),
+       'displaytitle_noreplace'    => array( '0', 'незаменувај', 'noreplace' ),
        'pagesincategory_all'       => array( '0', 'сите', 'all' ),
        'pagesincategory_pages'     => array( '0', 'страници', 'pages' ),
        'pagesincategory_subcats'   => array( '0', 'поткатегории', 'subcats' ),
index 5b87ace..39f48b2 100644 (file)
@@ -102,6 +102,7 @@ $specialPageAliases = array(
        'CreateAccount'             => array( 'അംഗത്വമെടുക്കൽ' ),
        'Deadendpages'              => array( 'അന്ത്യസ്ഥാനത്തുള്ള_താളുകൾ' ),
        'DeletedContributions'      => array( 'മായ്ച്ച_സേവനങ്ങൾ' ),
+       'Diff'                      => array( 'വ്യത്യാസം' ),
        'DoubleRedirects'           => array( 'ഇരട്ടത്തിരിച്ചുവിടലുകൾ' ),
        'EditWatchlist'             => array( 'ശ്രദ്ധിക്കുന്നവയുടെപട്ടികതിരുത്തുക' ),
        'Emailuser'                 => array( 'ഉപയോക്തൃഇമെയിൽ' ),
@@ -120,6 +121,7 @@ $specialPageAliases = array(
        'Listfiles'                 => array( 'പ്രമാണങ്ങളുടെ_പട്ടിക', 'ചിത്രങ്ങളുടെ_പട്ടിക' ),
        'Listgrouprights'           => array( 'സമൂഹത്തിന്റെ_അവകാശങ്ങളുടെ_പട്ടിക' ),
        'Listredirects'             => array( 'തിരിച്ചുവിടൽ‌പട്ടിക' ),
+       'ListDuplicatedFiles'       => array( 'അപരപ്രമാണപട്ടിക' ),
        'Listusers'                 => array( 'ഉപയോക്താക്കളുടെ_പട്ടിക' ),
        'Lockdb'                    => array( 'ഡി.ബി.ബന്ധിക്കുക' ),
        'Log'                       => array( 'രേഖ', 'രേഖകൾ' ),
@@ -143,6 +145,7 @@ $specialPageAliases = array(
        'Newimages'                 => array( 'പുതിയ_പ്രമാണങ്ങൾ', 'പുതിയ_ചിത്രങ്ങൾ' ),
        'Newpages'                  => array( 'പുതിയ_താളുകൾ' ),
        'PagesWithProp'             => array( 'താളുകളുടെഉള്ളടക്കപ്രത്യേകതകൾ' ),
+       'PageLanguage'              => array( 'താളിന്റെഭാഷ' ),
        'PasswordReset'             => array( 'രഹസ്യവാക്ക്‌‌പുനക്രമീകരണം' ),
        'PermanentLink'             => array( 'സ്ഥിരംകണ്ണി' ),
        'Popularpages'              => array( 'ജനപ്രിയതാളുകൾ' ),
@@ -158,11 +161,13 @@ $specialPageAliases = array(
        'Redirect'                  => array( 'തിരിച്ചുവിടൽ' ),
        'ResetTokens'               => array( 'ചീട്ട്പുനഃസജ്ജീകരിക്കുക' ),
        'Revisiondelete'            => array( 'നാൾപ്പതിപ്പ്_മായ്ക്കൽ' ),
+       'RunJobs'                   => array( 'പ്രവൃത്തിനടപ്പാക്കൽ' ),
        'Search'                    => array( 'അന്വേഷണം' ),
        'Shortpages'                => array( 'ചെറിയ_താളുകൾ' ),
        'Specialpages'              => array( 'പ്രത്യേകതാളുകൾ' ),
        'Statistics'                => array( 'സ്ഥിതിവിവരം' ),
        'Tags'                      => array( 'റ്റാഗുകൾ' ),
+       'TrackingCategories'        => array( 'പിന്തുടരൽവർഗ്ഗങ്ങൾ' ),
        'Unblock'                   => array( 'തടയൽനീക്കുക' ),
        'Uncategorizedcategories'   => array( 'വർഗ്ഗീകരിക്കാത്ത_വർഗ്ഗങ്ങൾ' ),
        'Uncategorizedimages'       => array( 'വർഗ്ഗീകരിക്കാത്ത_പ്രമാണങ്ങൾ' ),
@@ -224,7 +229,6 @@ $magicWords = array(
        'numberofusers'             => array( '1', 'ഉപയോക്താക്കളുടെയെണ്ണം', 'അംഗങ്ങളുടെയെണ്ണം', 'NUMBEROFUSERS' ),
        'numberofactiveusers'       => array( '1', 'സജീവോപയാക്താക്കളുടെയെണ്ണം', 'NUMBEROFACTIVEUSERS' ),
        'numberofedits'             => array( '1', 'തിരുത്തലുകളുടെണ്ണം', 'NUMBEROFEDITS' ),
-       'numberofviews'             => array( '1', 'എടുത്തുനോക്കലുകളുടെണ്ണം', 'NUMBEROFVIEWS' ),
        'pagename'                  => array( '1', 'താളിന്റെപേര്‌', 'PAGENAME' ),
        'pagenamee'                 => array( '1', 'താളിന്റെപേര്‌സമഗ്രം', 'PAGENAMEE' ),
        'namespace'                 => array( '1', 'നാമമേഖല', 'NAMESPACE' ),
@@ -302,6 +306,7 @@ $magicWords = array(
        'revisionyear'              => array( '1', 'തിരുത്തിയവർഷം', 'REVISIONYEAR' ),
        'revisiontimestamp'         => array( '1', 'തിരുത്തിയസമയമുദ്ര', 'REVISIONTIMESTAMP' ),
        'revisionuser'              => array( '1', 'അവസാനംതിരുത്തിയയാൾ', 'REVISIONUSER' ),
+       'revisionsize'              => array( '1', 'നാൾപ്പതിപ്പിന്റെവലിപ്പം', 'REVISIONSIZE' ),
        'plural'                    => array( '0', 'ബഹുവചനം:', 'PLURAL:' ),
        'fullurl'                   => array( '0', 'പൂർണ്ണവിലാസം:', 'FULLURL:' ),
        'fullurle'                  => array( '0', 'പൂർണ്ണവിലാസംസമഗ്രം:', 'FULLURLE:' ),
@@ -326,7 +331,7 @@ $magicWords = array(
        'padright'                  => array( '0', 'വലത്ത്നിറക്കുക', 'PADRIGHT' ),
        'special'                   => array( '0', 'പ്രത്യേകം', 'special' ),
        'speciale'                  => array( '0', 'സവിശേഷം', 'speciale' ),
-       'defaultsort'               => array( '1', 'à´¸àµ\8dവതവàµ\87à´¯àµ\81à´³àµ\8dà´³à´\95àµ\8dരമപàµ\8dà´ªàµ\86à´\9fàµ\81à´¤àµ\8dതൽ:', 'à´¸àµ\8dവതവàµ\87à´¯àµ\81à´³àµ\8dà´³à´\95àµ\8dരമപàµ\8dà´ªàµ\86à´\9fàµ\81à´¤àµ\8dതൽà´\9aാവി:', 'à´¸àµ\8dവതവേയുള്ളവർഗ്ഗക്രമപ്പെടുത്തൽ:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+       'defaultsort'               => array( '1', 'à´¸àµ\8dവതàµ\87à´¯àµ\81à´³àµ\8dà´³à´\95àµ\8dരമപàµ\8dà´ªàµ\86à´\9fàµ\81à´¤àµ\8dതൽ:', 'à´¸àµ\8dവതàµ\87à´¯àµ\81à´³àµ\8dà´³à´\95àµ\8dരമപàµ\8dà´ªàµ\86à´\9fàµ\81à´¤àµ\8dതൽà´\9aാവി:', 'à´¸àµ\8dവതേയുള്ളവർഗ്ഗക്രമപ്പെടുത്തൽ:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
        'filepath'                  => array( '0', 'പ്രമാണപഥം:', 'FILEPATH:' ),
        'tag'                       => array( '0', 'റ്റാഗ്', 'ടാഗ്', 'tag' ),
        'hiddencat'                 => array( '1', '‌‌__മറഞ്ഞിരിക്കുംവർഗ്ഗം__', '__HIDDENCAT__' ),
index 667108a..977ebae 100644 (file)
@@ -42,5 +42,9 @@ $namespaceAliases = array(
        'Зургийн_хэлэлцүүлэг' => NS_FILE_TALK,
 );
 
+$magicWords = array(
+       'redirect'                  => array( '0', '#ЧИГЛҮҮЛЭГ', '#REDIRECT' ),
+);
+
 $linkTrail = '/^([a-zабвгдеёжзийклмнопрстуфхцчшщъыьэюя“»]+)(.*)$/sDu';
 
index 6806443..4f9b0cd 100644 (file)
@@ -202,7 +202,6 @@ $magicWords = array(
        'numberofusers'             => array( '1', 'सदस्यसंख्या', 'NUMBEROFUSERS' ),
        'numberofactiveusers'       => array( '1', 'सक्रीयसदस्यसंख्या', 'NUMBEROFACTIVEUSERS' ),
        'numberofedits'             => array( '1', 'संपादनसंख्या', 'NUMBEROFEDITS' ),
-       'numberofviews'             => array( '1', 'धडकसंख्या', 'प्रेक्षासंख्या', 'NUMBEROFVIEWS' ),
        'pagename'                  => array( '1', 'लेखनाव', 'PAGENAME' ),
        'pagenamee'                 => array( '1', 'लेखानावव', 'PAGENAMEE' ),
        'namespace'                 => array( '1', 'नामविश्व', 'NAMESPACE' ),
index b6da373..fb972b0 100644 (file)
@@ -107,10 +107,13 @@ $magicWords = array(
 $specialPageAliases = array(
        'Activeusers'               => array( 'Pengguna_aktif' ),
        'Allmessages'               => array( 'Semua_pesanan', 'Semua_mesej' ),
+       'AllMyUploads'              => array( 'Semua_muat_naik_saya', 'Semua_fail_saya' ),
        'Allpages'                  => array( 'Semua_laman' ),
+       'ApiHelp'                   => array( 'Bantuan_API' ),
        'Ancientpages'              => array( 'Laman_lapuk' ),
+       'Badtitle'                  => array( 'Tajuk_salah' ),
        'Blankpage'                 => array( 'Laman_kosong' ),
-       'Block'                     => array( 'Sekat_IP' ),
+       'Block'                     => array( 'Sekat', 'Sekat_IP', 'Sekat_pengguna' ),
        'Booksources'               => array( 'Sumber_buku' ),
        'BrokenRedirects'           => array( 'Lencongan_rosak', 'Pelencongan_rosak' ),
        'Categories'                => array( 'Kategori' ),
@@ -122,7 +125,9 @@ $specialPageAliases = array(
        'CreateAccount'             => array( 'Buka_akaun' ),
        'Deadendpages'              => array( 'Laman_buntu' ),
        'DeletedContributions'      => array( 'Sumbangan_dihapuskan' ),
+       'Diff'                      => array( 'Beza' ),
        'DoubleRedirects'           => array( 'Lencongan_berganda', 'Pelencongan_berganda' ),
+       'EditWatchlist'             => array( 'Sunting_senarai_pantau' ),
        'Emailuser'                 => array( 'E-mel_pengguna' ),
        'ExpandTemplates'           => array( 'Kembangkan_templat' ),
        'Export'                    => array( 'Eksport' ),
@@ -130,47 +135,59 @@ $specialPageAliases = array(
        'FileDuplicateSearch'       => array( 'Cari_fail_berganda' ),
        'Filepath'                  => array( 'Laluan_fail' ),
        'Invalidateemail'           => array( 'Batalkan_pengesahan_e-mel' ),
+       'JavaScriptTest'            => array( 'Kaji_JavaScript' ),
        'BlockList'                 => array( 'Sekatan_IP' ),
        'LinkSearch'                => array( 'Cari_pautan' ),
        'Listadmins'                => array( 'Senarai_pentadbir' ),
        'Listbots'                  => array( 'Senarai_bot' ),
        'Listfiles'                 => array( 'Senarai_imej' ),
-       'Listgrouprights'           => array( 'Senarai_hak_kumpulan' ),
+       'Listgrouprights'           => array( 'Hak_kumpulan', 'Senarai_hak_kumpulan' ),
        'Listredirects'             => array( 'Senarai_lencongan', 'Senarai_pelencongan' ),
+       'ListDuplicatedFiles'       => array( 'Senarai_fail_disalin' ),
        'Listusers'                 => array( 'Senarai_pengguna' ),
        'Lockdb'                    => array( 'Kunci_pangkalan_data' ),
        'Lonelypages'               => array( 'Laman_yatim' ),
        'Longpages'                 => array( 'Laman_panjang' ),
+       'MediaStatistics'           => array( 'Statistik_media' ),
        'MergeHistory'              => array( 'Gabung_sejarah' ),
        'MIMEsearch'                => array( 'Gelintar_MIME' ),
        'Mostcategories'            => array( 'Kategori_terbanyak' ),
        'Mostimages'                => array( 'Imej_terbanyak' ),
+       'Mostinterwikis'            => array( 'Interwiki_terbanyak' ),
        'Mostlinked'                => array( 'Laman_dipaut_terbanyak' ),
        'Mostlinkedcategories'      => array( 'Kategori_dipaut_terbanyak' ),
        'Mostlinkedtemplates'       => array( 'Templat_dipaut_terbanyak' ),
        'Mostrevisions'             => array( 'Semakan_terbanyak' ),
        'Movepage'                  => array( 'Pindah_laman' ),
        'Mycontributions'           => array( 'Sumbangan_saya' ),
+       'MyLanguage'                => array( 'Bahasa_saya' ),
        'Mypage'                    => array( 'Laman_saya' ),
        'Mytalk'                    => array( 'Perbincangan_saya' ),
        'Myuploads'                 => array( 'Muat_naik_saya' ),
        'Newimages'                 => array( 'Imej_baru' ),
        'Newpages'                  => array( 'Laman_baru' ),
+       'PagesWithProp'             => array( 'Laman_dengan_sifat' ),
+       'PageLanguage'              => array( 'Bahasa_laman' ),
+       'PasswordReset'             => array( 'Tetap_semula_kata_kunci' ),
+       'PermanentLink'             => array( 'Pautan_kekal' ),
        'Popularpages'              => array( 'Laman_popular' ),
        'Preferences'               => array( 'Keutamaan' ),
        'Prefixindex'               => array( 'Indeks_awalan' ),
        'Protectedpages'            => array( 'Laman_dilindungi' ),
        'Protectedtitles'           => array( 'Tajuk_dilindungi' ),
-       'Randompage'                => array( 'Laman_rawak' ),
+       'Randompage'                => array( 'Rawak', 'Laman_rawak' ),
+       'RandomInCategory'          => array( 'Rawak_dalam_kategori' ),
        'Randomredirect'            => array( 'Lencongan_rawak', 'Pelencongan_rawak' ),
        'Recentchanges'             => array( 'Perubahan_terkini' ),
        'Recentchangeslinked'       => array( 'Perubahan_berkaitan' ),
+       'Redirect'                  => array( 'Lencong' ),
        'Revisiondelete'            => array( 'Hapus_semakan' ),
-       'Search'                    => array( 'Gelintar' ),
+       'Search'                    => array( 'Cari', 'Gelintar' ),
        'Shortpages'                => array( 'Laman_pendek' ),
        'Specialpages'              => array( 'Laman_khas' ),
        'Statistics'                => array( 'Statistik' ),
-       'Tags'                      => array( 'Label' ),
+       'Tags'                      => array( 'Teg', 'Label' ),
+       'TrackingCategories'        => array( 'Kategori_penjejak' ),
        'Unblock'                   => array( 'Nyahsekat' ),
        'Uncategorizedcategories'   => array( 'Kategori_tanpa_kategori' ),
        'Uncategorizedimages'       => array( 'Imej_tanpa_kategori' ),
@@ -192,7 +209,7 @@ $specialPageAliases = array(
        'Wantedpages'               => array( 'Laman_dikehendaki' ),
        'Wantedtemplates'           => array( 'Templat_dikehendaki' ),
        'Watchlist'                 => array( 'Senarai_pantau' ),
-       'Whatlinkshere'             => array( 'Pautan_ke' ),
+       'Whatlinkshere'             => array( 'Pautan_ke_sini', 'Pautan_ke' ),
        'Withoutinterwiki'          => array( 'Laman_tanpa_pautan_bahasa' ),
 );
 
index e5dd967..2529cc9 100644 (file)
@@ -173,7 +173,6 @@ $magicWords = array(
        'numberofusers'             => array( '1', 'NUMRUTA\'UTENTI', 'NUMBEROFUSERS' ),
        'numberofactiveusers'       => array( '1', 'NUMRUTA\'UTENTIATTIVI', 'NUMBEROFACTIVEUSERS' ),
        'numberofedits'             => array( '1', 'NUMBRUTA\'MODIFIKI', 'NUMBEROFEDITS' ),
-       'numberofviews'             => array( '1', 'NUMRUTA\'VISTI', 'NUMBEROFVIEWS' ),
        'pagename'                  => array( '1', 'ISEMTAL-PAĠNA', 'PAGENAME' ),
        'pagenamee'                 => array( '1', 'ISEMTAL-PAĠNAE', 'PAGENAMEE' ),
        'namespace'                 => array( '1', 'SPAZJUTAL-ISEM', 'NAMESPACE' ),
index ad73dc1..16ecac2 100644 (file)
@@ -107,7 +107,6 @@ $magicWords = array(
        'numberofusers'             => array( '1', 'تعدادکارورون', 'تعدادکاربران', 'NUMBEROFUSERS' ),
        'numberofactiveusers'       => array( '1', 'کارورون_فعال', 'کاربران_فعال', 'کاربران‌فعال', 'NUMBEROFACTIVEUSERS' ),
        'numberofedits'             => array( '1', 'تعداددچی‌یه‌ئون', 'تعدادویرایش‌ها', 'NUMBEROFEDITS' ),
-       'numberofviews'             => array( '1', 'تعدادبازدید', 'NUMBEROFVIEWS' ),
        'pagename'                  => array( '1', 'نام‌صفحه', 'نام_صفحه', 'PAGENAME' ),
        'pagenamee'                 => array( '1', 'نام‌صفحه‌کد', 'نام_صفحه_کد', 'PAGENAMEE' ),
        'namespace'                 => array( '1', 'فضای‌نام', 'فضای_نام', 'NAMESPACE' ),
index 9ac1332..10af14b 100644 (file)
@@ -51,14 +51,22 @@ $namespaceAliases = array(
        '分類討論' => NS_CATEGORY_TALK,
 );
 
+$specialPageAliases = array(
+       'Recentchangeslinked'       => array( 'Siong-koan_ê_kái-piàn' ),
+       'Specialpages'              => array( 'Te̍k-sû_ia̍h' ),
+       'Upload'                    => array( 'Kā_tóng-àn_chiūⁿ-bāng' ),
+       'Whatlinkshere'             => array( 'Tó-ūi_liân_kàu_chia' ),
+);
+
 $datePreferences = array(
        'default',
        'ISO 8601',
 );
+
 $defaultDateFormat = 'nan';
+
 $dateFormats = array(
        'nan time' => 'H:i',
        'nan date' => 'Y-"nî" n-"goe̍h" j-"ji̍t" (l)',
        'nan both' => 'Y-"nî" n-"goe̍h" j-"ji̍t" (D) H:i',
 );
-
index e53cefd..6f9cf1f 100644 (file)
@@ -100,6 +100,7 @@ $dateFormats = array(
 $specialPageAliases = array(
        'Activeusers'               => array( 'Aktive_brukere' ),
        'Allmessages'               => array( 'Alle_systembeskjeder' ),
+       'AllMyUploads'              => array( 'Alle_mine_opplastinger' ),
        'Allpages'                  => array( 'Alle_sider' ),
        'Ancientpages'              => array( 'Gamle_sider' ),
        'Badtitle'                  => array( 'Ugyldig_tittel' ),
@@ -126,6 +127,7 @@ $specialPageAliases = array(
        'Filepath'                  => array( 'Filsti' ),
        'Import'                    => array( 'Importer' ),
        'Invalidateemail'           => array( 'Ugyldiggjøre_e-post' ),
+       'JavaScriptTest'            => array( 'Javascript-test' ),
        'BlockList'                 => array( 'Blokkeringsliste', 'IP-blokkeringsliste' ),
        'LinkSearch'                => array( 'Lenkesøk' ),
        'Listadmins'                => array( 'Administratorliste', 'Administratorer' ),
@@ -142,6 +144,7 @@ $specialPageAliases = array(
        'MIMEsearch'                => array( 'MIME-søk' ),
        'Mostcategories'            => array( 'Flest_kategorier' ),
        'Mostimages'                => array( 'Mest_lenkede_filer', 'Flest_filer', 'Flest_bilder' ),
+       'Mostinterwikis'            => array( 'Flest_interrwikilenker' ),
        'Mostlinked'                => array( 'Mest_lenkede_sider', 'Mest_lenket' ),
        'Mostlinkedcategories'      => array( 'Mest_lenkede_kategorier', 'Mest_brukte_kategorier' ),
        'Mostlinkedtemplates'       => array( 'Mest_lenkede_maler', 'Mest_brukte_maler' ),
@@ -154,6 +157,7 @@ $specialPageAliases = array(
        'Myuploads'                 => array( 'Mine_opplastinger' ),
        'Newimages'                 => array( 'Nye_filer', 'Nye_bilder' ),
        'Newpages'                  => array( 'Nye_sider' ),
+       'PagesWithProp'             => array( 'Sider_med_egenskap' ),
        'PasswordReset'             => array( 'Nullstill_passord' ),
        'PermanentLink'             => array( 'Permanent_lenke' ),
        'Popularpages'              => array( 'Populære_sider' ),
@@ -166,6 +170,7 @@ $specialPageAliases = array(
        'Randomredirect'            => array( 'Tilfeldig_omdirigering' ),
        'Recentchanges'             => array( 'Siste_endringer' ),
        'Recentchangeslinked'       => array( 'Relaterte_endringer' ),
+       'Redirect'                  => array( 'Omdirigering' ),
        'Revisiondelete'            => array( 'Revisjonssletting' ),
        'Search'                    => array( 'Søk' ),
        'Shortpages'                => array( 'Korte_sider' ),
@@ -232,7 +237,6 @@ $magicWords = array(
        'numberofusers'             => array( '1', 'ANTALLBRUKERE', 'NUMBEROFUSERS' ),
        'numberofactiveusers'       => array( '1', 'ANTALLAKTIVEBRUKERE', 'NUMBEROFACTIVEUSERS' ),
        'numberofedits'             => array( '1', 'ANTALLREDIGERINGER', 'NUMBEROFEDITS' ),
-       'numberofviews'             => array( '1', 'ANTALLVISNINGER', 'NUMBEROFVIEWS' ),
        'pagename'                  => array( '1', 'SIDENAVN', 'PAGENAME' ),
        'pagenamee'                 => array( '1', 'SIDENAVNE', 'PAGENAMEE' ),
        'namespace'                 => array( '1', 'NAVNEROM', 'NAMESPACE' ),
index e78964e..5e82e82 100644 (file)
@@ -108,7 +108,6 @@ $magicWords = array(
        'numberofusers'             => array( '1', 'ANTALGEBRUKERS', 'AANTALGEBRUIKERS', 'NUMBEROFUSERS' ),
        'numberofactiveusers'       => array( '1', 'ANTALAKTIEVEGEBRUKERS', 'AANTALACTIEVEGEBRUIKERS', 'ACTIEVEGEBRUIKERS', 'NUMBEROFACTIVEUSERS' ),
        'numberofedits'             => array( '1', 'ANTALBEWARKINGEN', 'AANTALBEWERKINGEN', 'NUMBEROFEDITS' ),
-       'numberofviews'             => array( '1', 'ANTALKERENBEKEKEN', 'AANTALKERENBEKEKEN', 'NUMBEROFVIEWS' ),
        'pagename'                  => array( '1', 'ZIEDNAAM', 'PAGINANAAM', 'PAGENAME' ),
        'pagenamee'                 => array( '1', 'ZIEDNAAME', 'PAGINANAAME', 'PAGENAMEE' ),
        'namespace'                 => array( '1', 'NAAMRUUMTE', 'NAAMRUIMTE', 'NAMESPACE' ),
index 7184f6c..7142bb1 100644 (file)
@@ -40,6 +40,11 @@ $namespaceNames = array(
        NS_CATEGORY_TALK    => 'श्रेणी_वार्ता',
 );
 
+$specialPageAliases = array(
+       'Activeusers'               => array( 'सक्रिय_प्रयोगकर्ताहरु' ),
+       'Listgrouprights'           => array( 'प्रयोगकर्ता_समूह_अधिकार' ),
+);
+
 $digitTransformTable = array(
        '0' => '०', # &#x0966;
        '1' => '१', # &#x0967;
index 0132437..7d7fa05 100644 (file)
@@ -146,7 +146,6 @@ $magicWords = array(
        'numberofusers'             => array( '1', 'AANTALGEBRUIKERS', 'NUMBEROFUSERS' ),
        'numberofactiveusers'       => array( '1', 'AANTALACTIEVEGEBRUIKERS', 'ACTIEVEGEBRUIKERS', 'NUMBEROFACTIVEUSERS' ),
        'numberofedits'             => array( '1', 'AANTALBEWERKINGEN', 'NUMBEROFEDITS' ),
-       'numberofviews'             => array( '1', 'AANTALKERENBEKEKEN', 'NUMBEROFVIEWS' ),
        'pagename'                  => array( '1', 'PAGINANAAM', 'PAGENAME' ),
        'pagenamee'                 => array( '1', 'PAGINANAAME', 'PAGENAMEE' ),
        'namespace'                 => array( '1', 'NAAMRUIMTE', 'NAMESPACE' ),
@@ -275,6 +274,7 @@ $specialPageAliases = array(
        'Allmessages'               => array( 'AlleBerichten', 'Systeemberichten' ),
        'AllMyUploads'              => array( 'AlMijnUploads' ),
        'Allpages'                  => array( 'AllePaginas', 'AllePagina’s', 'AllePagina\'s' ),
+       'ApiHelp'                   => array( 'ApiHulp' ),
        'Ancientpages'              => array( 'OudstePaginas', 'OudstePagina’s', 'OudstePagina\'s' ),
        'Badtitle'                  => array( 'OnjuistePaginanaam' ),
        'Blankpage'                 => array( 'LegePagina' ),
@@ -307,11 +307,13 @@ $specialPageAliases = array(
        'Listfiles'                 => array( 'Bestandenlijst', 'Afbeeldingenlijst' ),
        'Listgrouprights'           => array( 'GroepsrechtenWeergeven' ),
        'Listredirects'             => array( 'Doorverwijzinglijst', 'Redirectlijst' ),
+       'ListDuplicatedFiles'       => array( 'DuplicaatbestandenWeergeven' ),
        'Listusers'                 => array( 'Gebruikerslijst', 'Gebruikerlijst' ),
        'Lockdb'                    => array( 'DBblokkeren', 'DbBlokkeren', 'BlokkeerDB' ),
        'Log'                       => array( 'Logboeken', 'Logboek' ),
        'Lonelypages'               => array( 'Weespaginas', 'Weespagina\'s' ),
        'Longpages'                 => array( 'LangePaginas', 'LangePagina’s', 'LangePagina\'s' ),
+       'MediaStatistics'           => array( 'Mediastatistieken' ),
        'MergeHistory'              => array( 'GeschiedenisSamenvoegen' ),
        'MIMEsearch'                => array( 'MIMEzoeken', 'MIME-zoeken' ),
        'Mostcategories'            => array( 'MeesteCategorieën' ),
@@ -330,6 +332,7 @@ $specialPageAliases = array(
        'Newimages'                 => array( 'NieuweBestanden', 'NieuweAfbeeldingen' ),
        'Newpages'                  => array( 'NieuwePaginas', 'NieuwePagina’s', 'NieuwePagina\'s' ),
        'PagesWithProp'             => array( 'PaginasMetEigenschap', 'Pagina\'sMetEigenschap' ),
+       'PageLanguage'              => array( 'Paginataal' ),
        'PasswordReset'             => array( 'WachtwoordOpnieuwInstellen' ),
        'PermanentLink'             => array( 'PermanenteVerwijzing' ),
        'Popularpages'              => array( 'PopulairePaginas', 'PopulairePagina’s', 'PopulairePagina\'s' ),
@@ -345,11 +348,13 @@ $specialPageAliases = array(
        'Redirect'                  => array( 'Doorverwijzen' ),
        'ResetTokens'               => array( 'TokensOpnieuwInstellen' ),
        'Revisiondelete'            => array( 'VersieVerwijderen', 'HerzieningVerwijderen', 'RevisieVerwijderen' ),
+       'RunJobs'                   => array( 'TakenUitvoeren' ),
        'Search'                    => array( 'Zoeken' ),
        'Shortpages'                => array( 'KortePaginas', 'KortePagina’s', 'KortePagina\'s' ),
        'Specialpages'              => array( 'SpecialePaginas', 'SpecialePagina’s', 'SpecialePagina\'s' ),
        'Statistics'                => array( 'Statistieken' ),
        'Tags'                      => array( 'Labels' ),
+       'TrackingCategories'        => array( 'Trackingcategorieen' ),
        'Unblock'                   => array( 'Deblokkeren' ),
        'Uncategorizedcategories'   => array( 'NietGecategoriseerdeCategorieën', 'Niet-GecategoriseerdeCategorieën' ),
        'Uncategorizedimages'       => array( 'NietGecategoriseerdeBestanden', 'NietGecategoriseerdeAfbeeldingen', 'Niet-GecategoriseerdeAfbeeldingen' ),
index 991a513..606f720 100644 (file)
@@ -101,7 +101,7 @@ $bookstoreList = array(
 );
 
 $magicWords = array(
-       'redirect'                  => array( '0', '#omdiriger', '#REDIRECT' ),
+       'redirect'                  => array( '0', '#OMDIRIGER', '#omdiriger', '#REDIRECT' ),
        'notoc'                     => array( '0', '__INGAINNHALDSLISTE__', '__INGENINNHOLDSLISTE__', '__NOTOC__' ),
        'nogallery'                 => array( '0', '__INKJEGALLERI__', '__NOGALLERY__' ),
        'forcetoc'                  => array( '0', '__ALLTIDINNHALDSLISTE__', '__ALLTIDINNHOLDSLISTE__', '__FORCETOC__' ),
@@ -122,7 +122,6 @@ $magicWords = array(
        'numberofusers'             => array( '1', 'BRUKARTAL', 'NUMBEROFUSERS' ),
        'numberofactiveusers'       => array( '1', 'AKTIVEBRUKARAR', 'NUMBEROFACTIVEUSERS' ),
        'numberofedits'             => array( '1', 'ENDRINGSTAL', 'NUMBEROFEDITS' ),
-       'numberofviews'             => array( '1', 'VISINGSTAL', 'TALPÅVISINGAR', 'NUMBEROFVIEWS' ),
        'pagename'                  => array( '1', 'SIDENAMN', 'SIDENAVN', 'PAGENAME' ),
        'pagenamee'                 => array( '1', 'SIDENAMNE', 'SIDENAVNE', 'PAGENAMEE' ),
        'namespace'                 => array( '1', 'NAMNEROM', 'NAVNEROM', 'NAMESPACE' ),
@@ -143,6 +142,7 @@ $magicWords = array(
        'img_center'                => array( '1', 'sentrum', 'center', 'centre' ),
        'img_framed'                => array( '1', 'ramme', 'ramma', 'framed', 'enframed', 'frame' ),
        'img_frameless'             => array( '1', 'rammelaus', 'frameless' ),
+       'img_lang'                  => array( '1', 'språk=$1', 'lang=$1' ),
        'img_page'                  => array( '1', 'side=$1', 'side_$1', 'page=$1', 'page $1' ),
        'img_link'                  => array( '1', 'lenkje=$1', 'lenke=$1', 'link=$1' ),
        'sitename'                  => array( '1', 'NETTSTADNAMN', 'SITENAME' ),
@@ -280,15 +280,18 @@ $specialPageAliases = array(
        'Protectedpages'            => array( 'Verna_sider' ),
        'Protectedtitles'           => array( 'Verna_sidenamn' ),
        'Randompage'                => array( 'Tilfeldig_side' ),
+       'RandomInCategory'          => array( 'Tilfeldig_frå_kategori' ),
        'Randomredirect'            => array( 'Tilfeldig_omdirigering' ),
        'Recentchanges'             => array( 'Siste_endringar', 'Siste_endringane' ),
        'Recentchangeslinked'       => array( 'Relaterte_endringar' ),
+       'Redirect'                  => array( 'Omdiriger' ),
        'Revisiondelete'            => array( 'Versjonssletting' ),
        'Search'                    => array( 'Søk' ),
        'Shortpages'                => array( 'Korte_sider', 'Stutte_sider' ),
        'Specialpages'              => array( 'Spesialsider', 'Særsider' ),
        'Statistics'                => array( 'Statistikk' ),
        'Tags'                      => array( 'Merke' ),
+       'TrackingCategories'        => array( 'Sporingskategoriar' ),
        'Uncategorizedcategories'   => array( 'Ukategoriserte_kategoriar' ),
        'Uncategorizedimages'       => array( 'Ukategoriserte_filer' ),
        'Uncategorizedpages'        => array( 'Ukategoriserte_sider' ),
index 925513c..64220d8 100644 (file)
@@ -73,7 +73,7 @@ $specialPageAliases = array(
        'Deadendpages'              => array( 'Paginas_sul_camin_d\'enlòc' ),
        'DeletedContributions'      => array( 'Contribucions_escafadas', 'ContribucionsEscafadas' ),
        'DoubleRedirects'           => array( 'Redireccions_doblas', 'RedireccionsDoblas' ),
-       'Emailuser'                 => array( 'Corrièr_electronic', 'Email', 'Emèl', 'Emèil' ),
+       'Emailuser'                 => array( 'Corrièr_electronic', 'Emèl', 'Emèil' ),
        'Export'                    => array( 'Exportar', 'Exportacion' ),
        'Fewestrevisions'           => array( 'Mens_de_revisions' ),
        'FileDuplicateSearch'       => array( 'Recèrca_fichièr_en_doble', 'RecèrcaFichièrEnDoble' ),
@@ -177,7 +177,6 @@ $magicWords = array(
        'numberofusers'             => array( '1', 'NOMBREUTILIZAIRES', 'NUMBEROFUSERS' ),
        'numberofactiveusers'       => array( '1', 'NOMBREUTILIZAIRESACTIUS', 'NUMBEROFACTIVEUSERS' ),
        'numberofedits'             => array( '1', 'NOMBREEDICIONS', 'NOMBREMODIFS', 'NUMBEROFEDITS' ),
-       'numberofviews'             => array( '1', 'NOMBREVISTAS', 'NUMBEROFVIEWS' ),
        'pagename'                  => array( '1', 'NOMPAGINA', 'PAGENAME' ),
        'pagenamee'                 => array( '1', 'NOMPAGINAX', 'PAGENAMEE' ),
        'namespace'                 => array( '1', 'ESPACINOMENATGE', 'NAMESPACE' ),
index db25e5a..f3bea17 100644 (file)
@@ -203,7 +203,6 @@ $magicWords = array(
        'numberofusers'             => array( '1', 'ବ୍ୟବାହାରକାରୀ_ସଂଖ୍ୟା', 'NUMBEROFUSERS' ),
        'numberofactiveusers'       => array( '1', 'ସଚଳ_ବ୍ୟବାହାରକାରୀଙ୍କ_ସଂଖ୍ୟା', 'NUMBEROFACTIVEUSERS' ),
        'numberofedits'             => array( '1', 'ବଦଳ_ସଂଖ୍ୟା', 'NUMBEROFEDITS' ),
-       'numberofviews'             => array( '1', 'କେତେଥର_ଦେଖାଯାଇଛି', 'NUMBEROFVIEWS' ),
        'pagename'                  => array( '1', 'ପୃଷ୍ଠା_ନାଆଁ', 'PAGENAME' ),
        'pagenamee'                 => array( '1', 'ପୃଷ୍ଠା_ନାମକାରଣକାରୀ', 'PAGENAMEE' ),
        'namespace'                 => array( '1', 'ନେମସ୍ପେସ', 'NAMESPACE' ),
index 3412c80..3e3090c 100644 (file)
@@ -66,6 +66,7 @@ $namespaceAliases = array(
 $specialPageAliases = array(
        'Activeusers'               => array( 'ਸਰਗਰਮ_ਵਰਤੋਂਕਾਰ' ),
        'Allmessages'               => array( 'ਸਾਰੇ_ਸਨੇਹੇ' ),
+       'AllMyUploads'              => array( 'ਮੇਰੇ_ਸਾਰੇ_ਅੱਪਲੋਡ' ),
        'Allpages'                  => array( 'ਸਾਰੇ_ਸਫ਼ੇ' ),
        'Ancientpages'              => array( 'ਪੁਰਾਣੇ_ਸਫ਼ੇ' ),
        'Badtitle'                  => array( 'ਖ਼ਰਾਬ_ਸਿਰਲੇਖ' ),
@@ -73,38 +74,41 @@ $specialPageAliases = array(
        'Block'                     => array( 'ਪਾਬੰਦੀ_ਲਾਓ', 'IP_’ਤੇ_ਪਾਬੰਦੀ_ਲਾਓ', 'ਵਰਤੋਂਕਾਰ_’ਤੇ_ਪਾਬੰਦੀ_ਲਾਓ' ),
        'Booksources'               => array( 'ਕਿਤਾਬ_ਸਰੋਤ' ),
        'BrokenRedirects'           => array( 'ਟੁੱਟੇ_ਰੀਡਿਰੈਕਟ' ),
-       'Categories'                => array( 'ਸ਼੍ਰੇਣੀਆਂ' ),
-       'ChangeEmail'               => array( 'ਈ-ਮੇਲ_ਬਦਲੋ' ),
+       'Categories'                => array( 'ਸ਼੍ਰੇਣੀਆਂ', 'ਵਰਗ' ),
+       'ChangeEmail'               => array( 'ਈ-ਮੇਲ_ਬਦਲੋ', 'ਈਮੇਲ_ਬਦਲੋ' ),
        'ChangePassword'            => array( 'ਪਾਸਵਰਡ_ਬਦਲੋ', 'ਪਾਸਵਰਡ_ਰੀਸੈੱਟ_ਕਰੋ' ),
        'ComparePages'              => array( 'ਸਫ਼ਿਆਂ_ਦੀ_ਤੁਲਨਾ_ਕਰੋ' ),
-       'Confirmemail'              => array( 'ਈ-ਮੇਲ_ਤਸਦੀਕ_ਕਰੋ' ),
-       'Contributions'             => array( 'ਯੋਗਦਾਨ' ),
+       'Confirmemail'              => array( 'ਈ-ਮੇਲ_ਤਸਦੀਕ_ਕਰੋ', 'ਈਮੇਲ_ਤਸਦੀਕ_ਕਰੋ' ),
+       'Contributions'             => array( 'ਯੋਗਦਾਨ', 'ਹਿੱਸੇਦਾਰੀ' ),
        'CreateAccount'             => array( 'ਖਾਤਾ_ਬਣਾਓ' ),
        'Deadendpages'              => array( 'ਬੰਦ_ਸਫ਼ੇ' ),
        'DeletedContributions'      => array( 'ਮਿਟਾਏ_ਯੋਗਦਾਨ' ),
+       'Diff'                      => array( 'ਫ਼ਰਕ' ),
        'DoubleRedirects'           => array( 'ਦੂਹਰੇ_ਰੀਡਿਰੈਕਟ' ),
-       'EditWatchlist'             => array( 'ਨਿਗਰਾਨੀ-ਲਿਸਟ_ਸੋਧੋ' ),
+       'EditWatchlist'             => array( 'ਨਿਗਰਾਨੀ-ਲਿਸਟ_ਸੋਧੋ', 'ਨਿਗਰਾਨੀਲਿਸਟ_ਸੋਧੋ' ),
        'Emailuser'                 => array( 'ਵਰਤੋਂਕਾਰ_ਨੂੰ_ਈ-ਮੇਲ_ਕਰੋ' ),
+       'ExpandTemplates'           => array( 'ਫਰਮੇ_ਖੋਲ੍ਹੋ' ),
        'Export'                    => array( 'ਨਿਰਯਾਤ' ),
        'Fewestrevisions'           => array( 'ਸਭ_ਤੋਂ_ਘੱਟ_ਰੀਵਿਜ਼ਨਾਂ' ),
-       'FileDuplicateSearch'       => array( 'ਨਕਲੀ_ਫ਼ਾਈਲ_ਖੋਜੋ' ),
-       'Filepath'                  => array( 'ਫ਼ਾਈਲ_ਪਥ' ),
+       'FileDuplicateSearch'       => array( 'ਨਕਲੀ_ਫ਼ਾਈਲ_ਖੋਜੋ', 'ਨਕਲੀ_ਫ਼ਾਇਲ_ਖੋਜੋ' ),
+       'Filepath'                  => array( 'ਫ਼ਾਈਲ_ਪਥ', 'ਫ਼ਾਇਲ_ਪਥ' ),
        'Import'                    => array( 'ਆਯਾਤ' ),
        'Invalidateemail'           => array( 'ਗਲਤ_ਈ-ਮੇਲ_ਪਤਾ' ),
        'JavaScriptTest'            => array( 'ਜਾਵਾਸਕ੍ਰਿਪਟ_ਪਰਖ' ),
        'BlockList'                 => array( 'ਪਾਬੰਦੀਆਂ_ਦੀ_ਲਿਸਟ' ),
-       'LinkSearch'                => array( 'ਲਿੰਕ_ਖੋਜੋ' ),
+       'LinkSearch'                => array( 'ਲਿੰਕ_ਖੋਜੋ', 'ਕੜੀ_ਖੋਜੋ' ),
        'Listadmins'                => array( 'ਪ੍ਰਬੰਧਕਾਂ_ਦੀ_ਲਿਸਟ' ),
-       'Listbots'                  => array( 'ਬੋਟਾਂ_ਦੀ_ਲਿਸਟ' ),
-       'Listfiles'                 => array( 'ਫ਼ਾਈਲਾਂ_ਦੀ_ਲਿਸਟ' ),
+       'Listbots'                  => array( 'ਬੋਟ_ਲਿਸਟ' ),
+       'Listfiles'                 => array( 'ਫ਼ਾਈਲ_ਲਿਸਟ', 'ਫ਼ਾਇਲ_ਲਿਸਟ', 'ਤਸਵੀਰ_ਲਿਸਟ' ),
        'Listgrouprights'           => array( 'ਵਰਤੋਂਕਾਰ_ਹੱਕਾਂ_ਦੀ_ਲਿਸਟ' ),
        'Listredirects'             => array( 'ਰੀਡਿਰੈਕਟਾਂ_ਦੀ_ਲਿਸਟ' ),
+       'ListDuplicatedFiles'       => array( 'ਨਕਲੀ_ਫ਼ਾਇਲ_ਲਿਸਟ' ),
        'Listusers'                 => array( 'ਵਰਤੋਂਕਾਰਾਂ_ਦੀ_ਲਿਸਟ' ),
        'Lockdb'                    => array( 'ਡੈਟਾਬੇਸ_’ਤੇ_ਤਾਲਾ_ਲਗਾਓ' ),
        'Log'                       => array( 'ਚਿੱਠਾ', 'ਚਿੱਠੇ' ),
        'Lonelypages'               => array( 'ਇਕੱਲੇ_ਸਫ਼ੇ' ),
        'Longpages'                 => array( 'ਲੰਬੇ_ਸਫ਼ੇ' ),
-       'MergeHistory'              => array( 'ਰਲਾਉਣ_ਦਾ_ਅਤੀਤ' ),
+       'MergeHistory'              => array( 'ਰਲਾਉਣ_ਦਾ_ਅਤੀਤ', 'ਰਲ਼ਾਉਣ_ਦਾ_ਅਤੀਤ' ),
        'MIMEsearch'                => array( 'MIME_ਖੋਜੋ' ),
        'Mostcategories'            => array( 'ਸਭ_ਤੋਂ_ਵੱਧ_ਸ਼੍ਰੇਣੀਆਂ' ),
        'Mostimages'                => array( 'ਸਭ_ਤੋਂ_ਵੱਧ_ਜੁੜੀਆਂ_ਫ਼ਾਈਲਾਂ' ),
@@ -114,24 +118,27 @@ $specialPageAliases = array(
        'Mostlinkedtemplates'       => array( 'ਸਭ_ਤੋਂ_ਵੱਧ_ਜੁੜੇ_ਫਰਮੇ' ),
        'Mostrevisions'             => array( 'ਸਭ_ਤੋਂ_ਵੱਧ_ਰੀਵਿਜ਼ਨ' ),
        'Movepage'                  => array( 'ਸਿਰਲੇਖ_ਬਦਲੋ' ),
-       'Mycontributions'           => array( 'ਮੇਰੇ_ਯੋਗਦਾਨ' ),
+       'Mycontributions'           => array( 'ਮੇਰੇ_ਯੋਗਦਾਨ', 'ਮੇਰੀ_ਹਿੱਸੇਦਾਰੀ' ),
        'MyLanguage'                => array( 'ਮੇਰੀ_ਭਾਸ਼ਾ', 'ਮੇਰੀ_ਬੋਲੀ' ),
        'Mypage'                    => array( 'ਮੇਰਾ_ਸਫ਼ਾ' ),
-       'Mytalk'                    => array( 'ਮੇਰੀ_ਚਰਚਾ' ),
-       'Myuploads'                 => array( 'ਮੇਰੇ_ਅੱਪਲੋਡ' ),
-       'Newimages'                 => array( 'ਨਵੀਆਂ_ਫ਼ਾਈਲਾਂ' ),
+       'Mytalk'                    => array( 'ਮੇਰੀ_ਚਰਚਾ', 'ਮੇਰੀ_ਗੱਲ-ਬਾਤ' ),
+       'Myuploads'                 => array( 'ਮੇਰੇ_ਅੱਪਲੋਡ', 'ਮੇਰੀਆਂ_ਫ਼ਾਇਲਾਂ' ),
+       'Newimages'                 => array( 'ਨਵੀਆਂ_ਫ਼ਾਈਲਾਂ', 'ਨਵੀਆਂ_ਤਸਵੀਰਾਂ' ),
        'Newpages'                  => array( 'ਨਵੇਂ_ਸਫ਼ੇ' ),
+       'PageLanguage'              => array( 'ਸਫ਼ੇ_ਦੀ_ਭਾਸ਼ਾ' ),
        'PasswordReset'             => array( 'ਪਾਸਵਰਡ_ਰੀਸੈੱਟ' ),
-       'PermanentLink'             => array( 'ਪੱਕਾ_ਲਿੰਕ' ),
+       'PermanentLink'             => array( 'ਪੱਕਾ_ਲਿੰਕ', 'ਪੱਕੀ_ਕੜੀ' ),
        'Popularpages'              => array( 'ਮਸ਼ਹੂਰ_ਸਫ਼ੇ' ),
        'Preferences'               => array( 'ਪਸੰਦਾਂ' ),
        'Prefixindex'               => array( 'ਅਗੇਤਰ_ਤਤਕਰਾ' ),
        'Protectedpages'            => array( 'ਸੁਰੱਖਿਅਤ_ਸਫ਼ੇ' ),
        'Protectedtitles'           => array( 'ਸੁਰੱਖਿਅਤ_ਸਿਰਲੇਖ' ),
        'Randompage'                => array( 'ਰਲਵਾਂ_ਸਫ਼ਾ' ),
+       'RandomInCategory'          => array( 'ਰਲਵੀਂ_ਸ਼੍ਰੇਣੀ' ),
        'Randomredirect'            => array( 'ਸੁਰੱਖਿਅਤ_ਰੀਡਿਰੈਕਟ' ),
-       'Recentchanges'             => array( 'ਹਾਲੀਆ_ਤਬਦੀਲੀਆਂ' ),
-       'Recentchangeslinked'       => array( 'ਜੁੜੀਆਂ_ਤਾਜ਼ਾ_ਤਬਦੀਲੀਆਂ' ),
+       'Recentchanges'             => array( 'ਤਾਜ਼ਾ_ਤਬਦੀਲੀਆਂ' ),
+       'Recentchangeslinked'       => array( 'ਜੁੜੀਆਂ_ਹਾਲੀਆ_ਤਬਦੀਲੀਆਂ', 'ਸਬੰਧਤ_ਹਾਲੀਆ_ਤਬਦੀਲੀਆਂ' ),
+       'Redirect'                  => array( 'ਰੀਡਿਰੈਕਟ' ),
        'Revisiondelete'            => array( 'ਰੀਵਿਜ਼ਨ_ਮਿਟਾਓ' ),
        'Search'                    => array( 'ਖੋਜੋ' ),
        'Shortpages'                => array( 'ਛੋਟੇ_ਸਫ਼ੇ' ),
@@ -149,11 +156,11 @@ $specialPageAliases = array(
        'Unusedimages'              => array( 'ਅਣਵਰਤੀਆਂ_ਫ਼ਾਈਲਾਂ' ),
        'Unusedtemplates'           => array( 'ਅਣਵਰਤੇ_ਫਰਮੇ' ),
        'Unwatchedpages'            => array( 'ਬੇ-ਨਿਗਰਾਨ_ਸਫ਼ੇ' ),
-       'Upload'                    => array( 'ਅੱਪਲੋਡ' ),
+       'Upload'                    => array( 'ਅੱਪਲੋਡ_ਕਰੋ' ),
        'Userlogin'                 => array( 'ਵਰਤੋਂਕਾਰ_ਲਾਗਇਨ' ),
        'Userlogout'                => array( 'ਵਰਤੋਂਕਾਰ_ਲਾਗਆਊਟ' ),
        'Userrights'                => array( 'ਵਰਤੋਂਕਾਰ_ਹੱਕ', 'ਪ੍ਰਬੰਧਕ_ਬਣਾਓ', 'ਬੋਟ_ਬਣਾਓ' ),
-       'Version'                   => array( 'ਰੂਪ' ),
+       'Version'                   => array( 'ਰੂਪ', 'ਵਰਜਨ' ),
        'Wantedcategories'          => array( 'ਚਾਹੀਦੀਆਂ_ਸ਼੍ਰੇਣੀਆਂ' ),
        'Wantedfiles'               => array( 'ਚਾਹੀਦੀਆਂ_ਫ਼ਾਈਲਾਂ' ),
        'Wantedpages'               => array( 'ਚਾਹੀਦੇ_ਸਫ਼ੇ', 'ਟੁੱਟੇ_ਜੋੜ' ),
index f3f2ef5..4c82276 100644 (file)
@@ -293,8 +293,8 @@ $magicWords = array(
        'localdow'                  => array( '1', 'DZIEŃTYGODNIANR', 'LOCALDOW' ),
        'plural'                    => array( '0', 'MNOGA:', 'PLURAL:' ),
        'fullurl'                   => array( '0', 'PEŁNYURL', 'FULLURL:' ),
-       'lcfirst'                   => array( '0', 'ZMAŁEJ:', 'LCFIRST:' ),
-       'ucfirst'                   => array( '0', 'ZWIELKIEJ:', 'ZDUŻEJ:', 'UCFIRST:' ),
+       'lcfirst'                   => array( '0', 'ZMAŁEJ:', 'ODMAŁEJ:', 'LCFIRST:' ),
+       'ucfirst'                   => array( '0', 'ZWIELKIEJ:', 'ZDUŻEJ:', 'ODWIELKIEJ:', 'ODDUŻEJ:', 'UCFIRST:' ),
        'lc'                        => array( '0', 'MAŁE:', 'LC:' ),
        'uc'                        => array( '0', 'WIELKIE:', 'DUŻE:', 'UC:' ),
        'displaytitle'              => array( '1', 'WYŚWIETLANYTYTUŁ', 'DISPLAYTITLE' ),
@@ -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' ),
@@ -315,5 +315,7 @@ $magicWords = array(
        'protectionlevel'           => array( '1', '__POZIOMZABEZPIECZEŃ__', 'PROTECTIONLEVEL' ),
        'url_path'                  => array( '0', 'ŚCIEŻKA', 'PATH' ),
        'url_query'                 => array( '0', 'ZAPYTANIE', 'QUERY' ),
+       'pagesincategory_pages'     => array( '0', 'strony', 'pages' ),
+       'pagesincategory_files'     => array( '0', 'pliki', 'files' ),
 );
 
index 5dd94ab..7a293f6 100644 (file)
@@ -124,6 +124,7 @@ $specialPageAliases = array(
        'Booksources'               => array( 'Fontes_de_livros' ),
        'BrokenRedirects'           => array( 'Redireccionamentos_quebrados', 'Redirecionamentos_quebrados' ),
        'Categories'                => array( 'Categorias' ),
+       'ChangeEmail'               => array( 'Alterar_e-mail', 'Alterar_correio_electrónico' ),
        'ChangePassword'            => array( 'Reiniciar_palavra-chave', 'Repor_senha', 'Zerar_senha' ),
        'ComparePages'              => array( 'Comparar_páginas' ),
        'Confirmemail'              => array( 'Confirmar_correio_electrónico', 'Confirmar_e-mail', 'Confirmar_email' ),
@@ -131,6 +132,7 @@ $specialPageAliases = array(
        'CreateAccount'             => array( 'Criar_conta' ),
        'Deadendpages'              => array( 'Páginas_sem_saída', 'Artigos_sem_saída' ),
        'DeletedContributions'      => array( 'Contribuições_eliminadas', 'Edições_eliminadas' ),
+       'Diff'                      => array( 'Diferenças_entre_edições', 'Mudanças_entre_edições' ),
        'DoubleRedirects'           => array( 'Redireccionamentos_duplos', 'Redirecionamentos_duplos' ),
        'EditWatchlist'             => array( 'Editar_lista_de_páginas_vigiadas' ),
        'Emailuser'                 => array( 'Contactar_utilizador', 'Contactar_usuário', 'Contatar_usuário' ),
@@ -148,6 +150,7 @@ $specialPageAliases = array(
        'Listfiles'                 => array( 'Lista_de_ficheiros', 'Lista_de_imagens', 'Lista_de_arquivos' ),
        'Listgrouprights'           => array( 'Lista_de_privilégios_de_grupos', 'Listar_privilégios_de_grupos' ),
        'Listredirects'             => array( 'Redireccionamentos', 'Redirecionamentos', 'Lista_de_redireccionamentos', 'Lista_de_redirecionamentos' ),
+       'ListDuplicatedFiles'       => array( 'Lista_de_ficheiros_duplicados', 'Lista_de_arquivos_duplicados' ),
        'Listusers'                 => array( 'Lista_de_utilizadores', 'Lista_de_usuários' ),
        'Lockdb'                    => array( 'Bloquear_base_de_dados', 'Bloquear_a_base_de_dados', 'Bloquear_banco_de_dados' ),
        'Log'                       => array( 'Registo', 'Registos', 'Registro', 'Registros' ),
@@ -157,6 +160,7 @@ $specialPageAliases = array(
        'MIMEsearch'                => array( 'Busca_MIME' ),
        'Mostcategories'            => array( 'Páginas_com_mais_categorias', 'Artigos_com_mais_categorias' ),
        'Mostimages'                => array( 'Ficheiros_com_mais_afluentes', 'Imagens_com_mais_afluentes', 'Arquivos_com_mais_afluentes' ),
+       'Mostinterwikis'            => array( 'Páginas_com_mais_interwikis' ),
        'Mostlinked'                => array( 'Páginas_com_mais_afluentes', 'Artigos_com_mais_afluentes' ),
        'Mostlinkedcategories'      => array( 'Categorias_com_mais_afluentes', 'Categorias_mais_usadas' ),
        'Mostlinkedtemplates'       => array( 'Predefinições_com_mais_afluentes', 'Predefinições_mais_usadas' ),
@@ -167,6 +171,8 @@ $specialPageAliases = array(
        'Mytalk'                    => array( 'Minha_discussão' ),
        'Newimages'                 => array( 'Ficheiros_novos', 'Imagens_novas', 'Arquivos_novos' ),
        'Newpages'                  => array( 'Páginas_novas', 'Artigos_novos' ),
+       'PagesWithProp'             => array( 'Propriedades_de_página' ),
+       'PasswordReset'             => array( 'Redefinir_autenticação' ),
        'PermanentLink'             => array( 'Ligação_permanente', 'Link_permanente' ),
        'Popularpages'              => array( 'Páginas_populares', 'Artigos_populares' ),
        'Preferences'               => array( 'Preferências' ),
@@ -174,15 +180,19 @@ $specialPageAliases = array(
        'Protectedpages'            => array( 'Páginas_protegidas', 'Artigos_protegidos' ),
        'Protectedtitles'           => array( 'Títulos_protegidos' ),
        'Randompage'                => array( 'Aleatória', 'Aleatório', 'Página_aleatória', 'Artigo_aleatório' ),
+       'RandomInCategory'          => array( 'Aleatória_na_Categoria', 'Aleatório_na_Categoria' ),
        'Randomredirect'            => array( 'Redireccionamento_aleatório', 'Redirecionamento_aleatório' ),
        'Recentchanges'             => array( 'Mudanças_recentes' ),
        'Recentchangeslinked'       => array( 'Alterações_relacionadas', 'Novidades_relacionadas', 'Mudanças_relacionadas' ),
+       'Redirect'                  => array( 'Redirecionar', 'Redireccionar' ),
+       'ResetTokens'               => array( 'Reiniciar_tokens', 'Reiniciar_os_tokens' ),
        'Revisiondelete'            => array( 'Eliminar_edição', 'Eliminar_revisão', 'Apagar_edição', 'Apagar_revisão' ),
        'Search'                    => array( 'Pesquisar', 'Busca', 'Buscar', 'Procurar', 'Pesquisa' ),
        'Shortpages'                => array( 'Páginas_curtas', 'Artigos_curtos' ),
        'Specialpages'              => array( 'Páginas_especiais' ),
        'Statistics'                => array( 'Estatísticas' ),
        'Tags'                      => array( 'Etiquetas' ),
+       'TrackingCategories'        => array( 'Categorias_de_rastreamento', 'Monitoramento_de_Categorias' ),
        'Unblock'                   => array( 'Desbloquear' ),
        'Uncategorizedcategories'   => array( 'Categorias_não_categorizadas', 'Categorias_sem_categorias' ),
        'Uncategorizedimages'       => array( 'Ficheiros_não_categorizados', 'Imagens_não_categorizadas', 'Imagens_sem_categorias', 'Ficheiros_sem_categorias', 'Arquivos_sem_categorias' ),
@@ -195,6 +205,7 @@ $specialPageAliases = array(
        'Unusedtemplates'           => array( 'Predefinições_não_utilizadas', 'Predefinições_sem_uso' ),
        'Unwatchedpages'            => array( 'Páginas_não_vigiadas', 'Páginas_não-vigiadas', 'Artigos_não-vigiados', 'Artigos_não_vigiados' ),
        'Upload'                    => array( 'Carregar_imagem', 'Carregar_ficheiro', 'Carregar_arquivo', 'Enviar' ),
+       'UploadStash'               => array( 'Envios_ocultos', 'Ficheiros_ocultos', 'Arquivos_ocultos', 'Envios_escondidos', 'Ficheiros_escondidos', 'Arquivos_escondidos' ),
        'Userlogin'                 => array( 'Entrar' ),
        'Userlogout'                => array( 'Sair' ),
        'Userrights'                => array( 'Privilégios', 'Direitos', 'Estatutos' ),
@@ -241,7 +252,6 @@ $magicWords = array(
        'numberofusers'             => array( '1', 'NUMERODEUSUARIOS', 'NÚMERODEUSUÁRIOS', 'NUMBEROFUSERS' ),
        'numberofactiveusers'       => array( '1', 'NUMERODEUSUARIOSATIVOS', 'NÚMERODEUSUÁRIOSATIVOS', 'NUMBEROFACTIVEUSERS' ),
        'numberofedits'             => array( '1', 'NUMERODEEDICOES', 'NÚMERODEEDIÇÕES', 'NUMBEROFEDITS' ),
-       'numberofviews'             => array( '1', 'NUMERODEEXIBICOES', 'NÚMERODEEXIBIÇÕES', 'NUMBEROFVIEWS' ),
        'pagename'                  => array( '1', 'NOMEDAPAGINA', 'NOMEDAPÁGINA', 'PAGENAME' ),
        'pagenamee'                 => array( '1', 'NOMEDAPAGINAC', 'NOMEDAPÁGINAC', 'PAGENAMEE' ),
        'namespace'                 => array( '1', 'DOMINIO', 'DOMÍNIO', 'ESPACONOMINAL', 'ESPAÇONOMINAL', 'NAMESPACE' ),
index b981b37..8a63470 100644 (file)
@@ -140,6 +140,7 @@ $specialPageAliases = array(
        'CreateAccount'             => array( 'Criar_conta' ),
        'Deadendpages'              => array( 'Páginas_sem_saída', 'Artigos_sem_saída' ),
        'DeletedContributions'      => array( 'Contribuições_eliminadas', 'Edições_eliminadas' ),
+       'Diff'                      => array( 'Mudanças_entre_edições', 'Diferenças_entre_edições' ),
        'DoubleRedirects'           => array( 'Redirecionamentos_duplos' ),
        'EditWatchlist'             => array( 'Editar_lista_de_páginas_vigiadas' ),
        'Emailuser'                 => array( 'Contatar_usuário', 'Contactar_usuário', 'Contactar_utilizador' ),
@@ -249,7 +250,6 @@ $magicWords = array(
        'numberofusers'             => array( '1', 'NUMERODEUSUARIOS', 'NÚMERODEUSUÁRIOS', 'NUMBEROFUSERS' ),
        'numberofactiveusers'       => array( '1', 'NUMERODEUSUARIOSATIVOS', 'NÚMERODEUSUÁRIOSATIVOS', 'NUMBEROFACTIVEUSERS' ),
        'numberofedits'             => array( '1', 'NUMERODEEDICOES', 'NÚMERODEEDIÇÕES', 'NUMBEROFEDITS' ),
-       'numberofviews'             => array( '1', 'NUMERODEEXIBICOES', 'NÚMERODEEXIBIÇÕES', 'NUMBEROFVIEWS' ),
        'pagename'                  => array( '1', 'NOMEDAPAGINA', 'NOMEDAPÁGINA', 'PAGENAME' ),
        'pagenamee'                 => array( '1', 'NOMEDAPAGINAC', 'NOMEDAPÁGINAC', 'PAGENAMEE' ),
        'namespace'                 => array( '1', 'DOMINIO', 'DOMÍNIO', 'ESPACONOMINAL', 'ESPAÇONOMINAL', 'NAMESPACE' ),
index f057810..97afe6b 100644 (file)
@@ -40,22 +40,30 @@ $namespaceNames = array(
 $namespaceGenderAliases = array();
 
 $specialPageAliases = array(
+       'Activeusers'               => array( 'KuchiRuraqkuna' ),
        'Allmessages'               => array( 'TukuyWillaykuna' ),
+       'AllMyUploads'              => array( 'TukuyChurkusqaykuna' ),
        'Allpages'                  => array( 'TukuyPanqakuna' ),
        'Ancientpages'              => array( 'MawkaPanqa' ),
+       'Badtitle'                  => array( 'ManaAllinSuti' ),
        'Blankpage'                 => array( 'PanqataChusaqchay' ),
        'Block'                     => array( 'Harkay', 'RuraqtaHarkay', 'IPHarkay' ),
        'Booksources'               => array( 'PukyuLiwru' ),
        'BrokenRedirects'           => array( 'PantaPusapuna', 'PitisqaPusapuna' ),
        'Categories'                => array( 'Katiguriyakuna' ),
-       'ChangePassword'            => array( 'YaykunaRimataKutichiy' ),
+       'ChangeEmail'               => array( 'EChaskitaHukchay' ),
+       'ChangePassword'            => array( 'YaykunaRimataKutichiy', 'YaykunaRimataHukchay' ),
+       'ComparePages'              => array( 'PanqakunataWakinchay' ),
        'Confirmemail'              => array( 'EChaskitaTakyachiy' ),
        'Contributions'             => array( 'Rurasqakuna', 'Llamkapusqakuna' ),
        'CreateAccount'             => array( 'RakiqunaKamariy' ),
        'Deadendpages'              => array( 'Lluqsinannaq' ),
        'DeletedContributions'      => array( 'QullusqaRurasqa', 'QullusqaLlamkapusqa' ),
+       'Diff'                      => array( 'WakinKay' ),
        'DoubleRedirects'           => array( 'IskayllaPusapuna' ),
+       'EditWatchlist'             => array( 'WatiqasqakunataLlamkapuy' ),
        'Emailuser'                 => array( 'EChaskitaManakuy' ),
+       'ExpandTemplates'           => array( 'PlantillakunataHuknachay' ),
        'Export'                    => array( 'HawamanQuy' ),
        'Fewestrevisions'           => array( 'AsllaLlamkapusqa', 'AsllaKutiLlamkapusqa' ),
        'FileDuplicateSearch'       => array( 'IskayllaWillaniqitaMaskay' ),
@@ -87,22 +95,30 @@ $specialPageAliases = array(
        'MyLanguage'                => array( 'Rimayniy' ),
        'Mypage'                    => array( 'Panqay', 'NuqapPanqay' ),
        'Mytalk'                    => array( 'Rimachinay', 'RimanakuyPanqay', 'NuqapRimachinay', 'NuqapRimanakuyPanqay' ),
+       'Myuploads'                 => array( 'Churkusqaykuna' ),
        'Newimages'                 => array( 'MusuqRikcha', 'MusuqRikchakuna' ),
        'Newpages'                  => array( 'MusuqPanqa' ),
+       'PasswordReset'             => array( 'YaykunaRimaKutichina' ),
+       'PermanentLink'             => array( 'KakuqTinki' ),
        'Popularpages'              => array( 'WatukuqsapaPanqa', 'RikuqsapaPanqa', 'QhawaqsapaPanqa' ),
        'Preferences'               => array( 'Allinkachina', 'Allinkachinakuna' ),
        'Prefixindex'               => array( 'QallarinaKaskaSutisuyu' ),
        'Protectedpages'            => array( 'AmachasqaPanqa' ),
        'Protectedtitles'           => array( 'AmachasqaSuti' ),
        'Randompage'                => array( 'MayninpiPanqa' ),
+       'RandomInCategory'          => array( 'KatiguriyapiKikinmanta' ),
        'Randomredirect'            => array( 'KikinmantaPusapuna' ),
        'Recentchanges'             => array( 'NaqhaHukchasqa' ),
        'Recentchangeslinked'       => array( 'HukchasqaTinkimuq' ),
+       'Redirect'                  => array( 'Pusapuna', 'Pusapuy' ),
+       'ResetTokens'               => array( 'LlawikunataKutichiy' ),
        'Revisiondelete'            => array( 'MusuqchasqaQulluy' ),
        'Search'                    => array( 'Maskay' ),
        'Shortpages'                => array( 'UchuyPanqa' ),
        'Specialpages'              => array( 'SapaqPanqa', 'SapaqPanqakuna' ),
        'Statistics'                => array( 'Ranuy', 'Kanchachani' ),
+       'Tags'                      => array( 'Unanchachakuna' ),
+       'Unblock'                   => array( 'AmanaHarkaychu' ),
        'Uncategorizedcategories'   => array( 'KatiguriyannaqKatiguriya' ),
        'Uncategorizedimages'       => array( 'KatiguriyannaqRikcha' ),
        'Uncategorizedpages'        => array( 'KatiguriyannaqPanqa' ),
@@ -114,6 +130,7 @@ $specialPageAliases = array(
        'Unusedtemplates'           => array( 'ManaLlamkachisqaPlantilla' ),
        'Unwatchedpages'            => array( 'ManaWatiqasqa' ),
        'Upload'                    => array( 'Churkuy' ),
+       'UploadStash'               => array( 'PakasqaWillaniqikuna' ),
        'Userlogin'                 => array( 'RuraqYaykuy' ),
        'Userlogout'                => array( 'RuraqLluqsiy' ),
        'Userrights'                => array( 'RuraqpaHaynin' ),
@@ -160,7 +177,6 @@ $magicWords = array(
        'numberofusers'             => array( '1', 'HAYKARURAQ', 'NÚMERODEUSUARIOS', 'NUMERODEUSUARIOS', 'NUMBEROFUSERS' ),
        'numberofactiveusers'       => array( '1', 'HAYKARURACHKAQ', 'NÚMERODEUSUARIOSACTIVOS', 'NUMERODEUSUARIOSACTIVOS', 'NUMBEROFACTIVEUSERS' ),
        'numberofedits'             => array( '1', 'HAYKALLAMKAPUSQA', 'NÚMERODEEDICIONES', 'NUMERODEEDICIONES', 'NUMBEROFEDITS' ),
-       'numberofviews'             => array( '1', 'HAYKAQHAWASQA', 'HAYKAQAWASQA', 'NÚMERODEVISTAS', 'NUMERODEVISTAS', 'NUMBEROFVIEWS' ),
        'pagename'                  => array( '1', 'PANQASUTI', 'NOMBREDEPAGINA', 'NOMBREDEPÁGINA', 'PAGENAME' ),
        'pagenamee'                 => array( '1', 'PANQASUTIE', 'NOMBREDEPAGINAC', 'NOMBREDEPÁGINAC', 'PAGENAMEE' ),
        'namespace'                 => array( '1', 'SUTIKITI', 'ESPACIODENOMBRE', 'NAMESPACE' ),
@@ -206,7 +222,7 @@ $magicWords = array(
        'int'                       => array( '0', 'WILLAY:', 'INT:' ),
        'sitename'                  => array( '1', 'TIYAYSUTI', 'NOMBREDESITIO', 'NOMBREDELSITIO', 'SITENAME' ),
        'ns'                        => array( '0', 'SKITI:', 'EN:', 'NS:' ),
-       'localurl'                  => array( '0', 'KAYLLAURL:', 'URLLOCAL', 'LOCALURL:' ),
+       'localurl'                  => array( '0', 'KAYLLAURL:', 'URLLOCAL', 'URLLOCAL:', 'LOCALURL:' ),
        'localurle'                 => array( '0', 'KAYLLAURLE:', 'URLLOCALC:', 'LOCALURLE:' ),
        'server'                    => array( '0', 'SIRWIQ', 'SERVIDOR', 'SERVER' ),
        'servername'                => array( '0', 'SIRWIQSUTI', 'NOMBRESERVIDOR', 'SERVERNAME' ),
@@ -229,11 +245,11 @@ $magicWords = array(
        'plural'                    => array( '0', 'ACHKA:', 'PLURAL:' ),
        'fullurl'                   => array( '0', 'HUNTAURL:', 'URLCOMPLETA:', 'FULLURL:' ),
        'fullurle'                  => array( '0', 'HUNTAURLE:', 'URLCOMPLETAC:', 'FULLURLE:' ),
-       'lcfirst'                   => array( '0', 'UCHUYÑAWPAQ:', 'UCHUYNAWPAQ:', 'PRIMEROMINUS;', 'PRIMEROMINÚS:', 'LCFIRST:' ),
-       'ucfirst'                   => array( '0', 'HATUNÑAWPAQ:', 'HATUNNAWPAQ:', 'PRIMEROMAYUS;', 'PRIMEROMAYÚS:', 'UCFIRST:' ),
+       'lcfirst'                   => array( '0', 'UCHUYÑAWPAQ:', 'UCHUYNAWPAQ:', 'PRIMEROMINUS;', 'PRIMEROMINÚS:', 'PRIMEROMINUS:', 'LCFIRST:' ),
+       'ucfirst'                   => array( '0', 'HATUNÑAWPAQ:', 'HATUNNAWPAQ:', 'PRIMEROMAYUS;', 'PRIMEROMAYÚS:', 'PRIMEROMAYUS:', 'UCFIRST:' ),
        'lc'                        => array( '0', 'UCHUY:', 'MINUS:', 'MINÚS:', 'LC:' ),
        'uc'                        => array( '0', 'HATUN:', 'MAYUS:', 'MAYÚS:', 'UC:' ),
-       'raw'                       => array( '0', 'CHAWA:', 'SINFORMATO', 'SINPUNTOS', 'RAW:' ),
+       'raw'                       => array( '0', 'CHAWA:', 'SINFORMATO', 'SINPUNTOS', 'SINFORMATO:', 'SINPUNTOS:', 'RAW:' ),
        'displaytitle'              => array( '1', 'SUTITARIKUCHIY', 'MOSTRARTÍTULO', 'MOSTRARTITULO', 'DISPLAYTITLE' ),
        'currentversion'            => array( '1', 'KUNANMUSUQCHASQA', 'REVISIÓNACTUAL', 'VERSIONACTUAL', 'VERSIÓNACTUAL', 'CURRENTVERSION' ),
        'urlencode'                 => array( '0', 'URLLLAWICHAY', 'URL-LLAWICHAY', 'CODIFICAR', 'CODIFICARURL:', 'URLENCODE:' ),
@@ -260,5 +276,6 @@ $magicWords = array(
        'numberingroup'             => array( '1', 'HUÑUPIYUPAY', 'HUNUPIYUPAY', 'NÚMEROENGRUPO', 'NUMEROENGRUPO', 'NUMENGRUPO', 'NÚMENGRUPO', 'NUMBERINGROUP', 'NUMINGROUP' ),
        'staticredirect'            => array( '1', '__TIYAQLLAPUSAPUNA__', '__REDIRECCIONESTATICA__', '__REDIRECCIÓNESTÁTICA__', '__STATICREDIRECT__' ),
        'protectionlevel'           => array( '1', 'HAYKAAMACHAY', 'IMASINCHIAMACHAY', 'NIVELDEPROTECCIÓN', 'PROTECTIONLEVEL' ),
+       'formatdate'                => array( '0', 'punchawrikchakuy', 'formatodefecha', 'formatearfecha', 'formatdate', 'dateformat' ),
 );
 
index a3c15c6..3d62d43 100644 (file)
@@ -66,7 +66,6 @@ $magicWords = array(
        'numberofusers'             => array( '1', 'NUMARDEUTILIZATORI', 'NUMBEROFUSERS' ),
        'numberofactiveusers'       => array( '1', 'NUMARDEUTILIZATORIACTIVI', 'NUMBEROFACTIVEUSERS' ),
        'numberofedits'             => array( '1', 'NUMARDEMODIFICARI', 'NUMBEROFEDITS' ),
-       'numberofviews'             => array( '1', 'NUMARDEVIZUALIZARI', 'NUMBEROFVIEWS' ),
        'pagename'                  => array( '1', 'NUMEPAGINA', 'PAGENAME' ),
        'pagenamee'                 => array( '1', 'NUMEEPAGINA', 'PAGENAMEE' ),
        'namespace'                 => array( '1', 'SPATIUDENUME', 'NAMESPACE' ),
index 02b7972..a74c9db 100644 (file)
@@ -150,6 +150,7 @@ $specialPageAliases = array(
        'CreateAccount'             => array( 'Создать_учётную_запись', 'Создать_пользователя', 'Зарегистрироваться' ),
        'Deadendpages'              => array( 'Тупиковые_страницы' ),
        'DeletedContributions'      => array( 'Удалённый_вклад' ),
+       'Diff'                      => array( 'Изменения' ),
        'DoubleRedirects'           => array( 'Двойные_перенаправления' ),
        'EditWatchlist'             => array( 'Править_список_наблюдения' ),
        'Emailuser'                 => array( 'Письмо_участнику', 'Отправить_письмо' ),
@@ -168,6 +169,7 @@ $specialPageAliases = array(
        'Listfiles'                 => array( 'Список_файлов', 'Список_изображений' ),
        'Listgrouprights'           => array( 'Права_групп_участников', 'Список_прав_групп' ),
        'Listredirects'             => array( 'Список_перенаправлений' ),
+       'ListDuplicatedFiles'       => array( 'Список_файлов-дубликатов' ),
        'Listusers'                 => array( 'Список_участников' ),
        'Lockdb'                    => array( 'Заблокировать_БД', 'Заблокировать_базу_данных' ),
        'Log'                       => array( 'Журналы', 'Журнал' ),
@@ -267,7 +269,6 @@ $magicWords = array(
        'numberofusers'             => array( '1', 'КОЛИЧЕСТВО_УЧАСТНИКОВ', 'NUMBEROFUSERS' ),
        'numberofactiveusers'       => array( '1', 'КОЛИЧЕСТВО_АКТИВНЫХ_УЧАСТНИКОВ', 'NUMBEROFACTIVEUSERS' ),
        'numberofedits'             => array( '1', 'КОЛИЧЕСТВО_ПРАВОК', 'NUMBEROFEDITS' ),
-       'numberofviews'             => array( '1', 'КОЛИЧЕСТВО_ПРОСМОТРОВ', 'NUMBEROFVIEWS' ),
        'pagename'                  => array( '1', 'НАЗВАНИЕ_СТРАНИЦЫ', 'PAGENAME' ),
        'pagenamee'                 => array( '1', 'НАЗВАНИЕ_СТРАНИЦЫ_2', 'PAGENAMEE' ),
        'namespace'                 => array( '1', 'ПРОСТРАНСТВО_ИМЁН', 'NAMESPACE' ),
index bdfcd8e..cb23741 100644 (file)
@@ -45,6 +45,7 @@ $namespaceAliases = array(
 $specialPageAliases = array(
        'Activeusers'               => array( 'Актівны_хоснователї' ),
        'Allmessages'               => array( 'Сістемовы_повідомлїня' ),
+       'AllMyUploads'              => array( 'Вшыткы_мої_файлы' ),
        'Allpages'                  => array( 'Вшыткы_сторінкы' ),
        'Ancientpages'              => array( 'Давны_сторінкы' ),
        'Badtitle'                  => array( 'Планый_тітул' ),
@@ -91,6 +92,7 @@ $specialPageAliases = array(
        'Mostrevisions'             => array( 'Найбівше_ревізій' ),
        'Movepage'                  => array( 'Переменовати' ),
        'Mycontributions'           => array( 'Мій_вклад' ),
+       'MyLanguage'                => array( 'Мій_язык' ),
        'Mypage'                    => array( 'Моя_сторінка' ),
        'Mytalk'                    => array( 'Моя_діскузія' ),
        'Myuploads'                 => array( 'Мої_награня_файлів' ),
@@ -100,17 +102,31 @@ $specialPageAliases = array(
        'PermanentLink'             => array( 'Тырвалый_одказ' ),
        'Popularpages'              => array( 'Популарны_сторінкы' ),
        'Preferences'               => array( 'Наставлїня' ),
+       'Protectedpages'            => array( 'Замкнуты_сторінкы' ),
+       'Protectedtitles'           => array( 'Замкнуты_назвы' ),
        'Randompage'                => array( 'Нагодна_статя' ),
        'Randomredirect'            => array( 'Нагодне_напрямлїня' ),
        'Recentchanges'             => array( 'Послїднї_зміны' ),
        'Recentchangeslinked'       => array( 'Повязаны_едітованя' ),
        'Search'                    => array( 'Гляданя' ),
        'Shortpages'                => array( 'Курты_сторінкы' ),
-       'Specialpages'              => array( 'Шпеціялны_сторінкы' ),
+       'Specialpages'              => array( 'Шпеціалны_сторінкы' ),
        'Statistics'                => array( 'Штатістіка' ),
        'Tags'                      => array( 'Позначкы' ),
        'Unblock'                   => array( 'Одблоковати' ),
        'Uncategorizedcategories'   => array( 'Некатеґорізованы_катеґорії' ),
        'Uncategorizedimages'       => array( 'Некатеґорізованы_файлы' ),
+       'Uncategorizedpages'        => array( 'Некатеґорізованы_сторінкы' ),
+       'Uncategorizedtemplates'    => array( 'Некатеґорізованы_шаблоны' ),
+       'Unusedcategories'          => array( 'Нехоснованы_катеґорії' ),
+       'Unusedimages'              => array( 'Нехоснованы_файлы' ),
+       'Unusedtemplates'           => array( 'Нехоснованы_шаблоны' ),
+       'Unwatchedpages'            => array( 'Неслїдованы_сторінкы' ),
+       'Wantedcategories'          => array( 'Пожадованы_катеґорії' ),
+       'Wantedfiles'               => array( 'Пожадованы_файлы' ),
+       'Wantedpages'               => array( 'Пожадованы_сторінкы' ),
+       'Wantedtemplates'           => array( 'Пожадованы_шаблоны' ),
+       'Whatlinkshere'             => array( 'Одказы_гев' ),
+       'Withoutinterwiki'          => array( 'Без_інтервікі' ),
 );
 
index 6b15283..14a8f99 100644 (file)
@@ -203,7 +203,6 @@ $magicWords = array(
        'numberoffiles'             => array( '1', 'संचिकानाम्‌‌सङ्ख्या', 'NUMBEROFFILES' ),
        'numberofusers'             => array( '1', 'योजकस्यसङ्ख्या', 'NUMBEROFUSERS' ),
        'numberofedits'             => array( '1', 'सम्पादनसङ्ख्या', 'NUMBEROFEDITS' ),
-       'numberofviews'             => array( '1', 'दृष्टिसङ्ख्या', 'NUMBEROFVIEWS' ),
        'pagename'                  => array( '1', 'पृष्ठनाम', 'PAGENAME' ),
        'namespace'                 => array( '1', 'नामविश्व', 'NAMESPACE' ),
        'talkspace'                 => array( '1', 'व्यासपिठ', 'TALKSPACE' ),
index c5dbf12..f8aa19f 100644 (file)
@@ -148,7 +148,6 @@ $magicWords = array(
        'numberofusers'             => array( '1', 'BROJKORISNIKA', 'NUMBEROFUSERS' ),
        'numberofactiveusers'       => array( '1', 'BROJAKTIVNIHKORISNIKA', 'NUMBEROFACTIVEUSERS' ),
        'numberofedits'             => array( '1', 'BROJIZMJENA', 'BROJIZMENA', 'BROJUREĐIVANJA', 'NUMBEROFEDITS' ),
-       'numberofviews'             => array( '1', 'BROJPREGLEDA', 'NUMBEROFVIEWS' ),
        'pagename'                  => array( '1', 'STRANICA', 'IMESTRANICE', 'PAGENAME' ),
        'pagenamee'                 => array( '1', 'STRANICE', 'IMESTRANICEE', 'PAGENAMEE' ),
        'namespace'                 => array( '1', 'IMENSKIPROSTOR', 'NAMESPACE' ),
index 3c27597..987464a 100644 (file)
@@ -156,7 +156,6 @@ $magicWords = array(
        'numberofusers'             => array( '1', 'NUMRIIPËRDORUESVE', 'NUMBEROFUSERS' ),
        'numberofactiveusers'       => array( '1', 'NUMRIIPËRDORUESVEAKTIVË', 'NUMBEROFACTIVEUSERS' ),
        'numberofedits'             => array( '1', 'NUMRIREDAKTIMEVE', 'NUMBEROFEDITS' ),
-       'numberofviews'             => array( '1', 'NUMRIISHIKIMEVE', 'NUMBEROFVIEWS' ),
        'pagename'                  => array( '1', 'EMRIFAQES', 'PAGENAME' ),
        'namespace'                 => array( '1', 'HAPËSIRA', 'NAMESPACE' ),
        'fullpagename'              => array( '1', 'EMRIIPLOTËIFAQES', 'FULLPAGENAME' ),
index e9d8aa9..0f89cca 100644 (file)
@@ -96,39 +96,45 @@ $specialPageAliases = array(
        'Activeusers'               => array( 'АктивниКорисници', 'Активни_корисници' ),
        'Allmessages'               => array( 'СвеПоруке', 'Све_поруке' ),
        'Allpages'                  => array( 'Све_странице' ),
-       'Ancientpages'              => array( 'НајстаријиЧланци' ),
+       'Ancientpages'              => array( 'Ð\9dаÑ\98Ñ\81Ñ\82аÑ\80иÑ\98еСÑ\82Ñ\80аниÑ\86е', 'Ð\9dаÑ\98Ñ\81Ñ\82аÑ\80иÑ\98иЧланÑ\86и' ),
        'Badtitle'                  => array( 'Лош_наслов' ),
+       'Blankpage'                 => array( 'ПразнаСтраница' ),
        'Block'                     => array( 'Блокирај', 'БлокирајИП', 'БлокирајКорисника' ),
        'BrokenRedirects'           => array( 'Покварена_преусмерења', 'Неисправна_преусмерења' ),
        'Categories'                => array( 'Категорије' ),
+       'ChangePassword'            => array( 'ПромениЛозинку' ),
        'ComparePages'              => array( 'Упореди_странице' ),
        'Confirmemail'              => array( 'ПотврдиЕ-пошту', 'Потврда_е-поште' ),
        'Contributions'             => array( 'Доприноси', 'Прилози' ),
        'CreateAccount'             => array( 'ОтвориНалог', 'Отвори_налог' ),
+       'DeletedContributions'      => array( 'ОбрисаниДоприноси' ),
        'DoubleRedirects'           => array( 'Двострука_преусмерења' ),
        'Export'                    => array( 'Извези' ),
-       'Fewestrevisions'           => array( 'ЧланциСаНајмањеРевизија' ),
+       'Fewestrevisions'           => array( 'Ð\9dаÑ\98маÑ\9aеÐ\98змена', 'ЧланÑ\86иСаÐ\9dаÑ\98маÑ\9aеРевизиÑ\98а' ),
        'Filepath'                  => array( 'Путања_датотеке' ),
        'Import'                    => array( 'Увези' ),
-       'Listadmins'                => array( 'ПописАдминистратора', 'Списак_администратора' ),
-       'Listbots'                  => array( 'ПописБотова', 'Списак_ботова' ),
-       'Listfiles'                 => array( 'СписакСлика', 'Списак_датотека' ),
+       'BlockList'                 => array( 'СписакБлокираних', 'ПописБлокираних' ),
+       'Listadmins'                => array( 'СписакАдминистратора', 'ПописАдминистратора', 'Списак_администратора' ),
+       'Listbots'                  => array( 'СписакБотова', 'ПописБотова', 'Списак_ботова' ),
+       'Listfiles'                 => array( 'СписакДатотека', 'СписакСлика', 'Списак_датотека' ),
        'Listgrouprights'           => array( 'СписакКорисничкихПрава', 'Списак_корисничких_права' ),
        'Listredirects'             => array( 'СписакПреусмерења', 'Списак_преусмерења' ),
+       'ListDuplicatedFiles'       => array( 'СписакДупликата' ),
        'Listusers'                 => array( 'СписакКорисника', 'КорисничкиСписак', 'Списак_корисника', 'Кориснички_списак' ),
        'Lockdb'                    => array( 'ЗакључајБазу', 'Закључај_базу' ),
        'Log'                       => array( 'Извештај', 'Извештаји' ),
        'Lonelypages'               => array( 'Сирочићи' ),
        'Longpages'                 => array( 'ДугачкеСтране' ),
-       'MergeHistory'              => array( 'Споји_историју' ),
+       'MergeHistory'              => array( 'СпојиИсторију', 'Споји_историју' ),
        'MIMEsearch'                => array( 'MIME_претрага' ),
-       'Mostcategories'            => array( 'ЧланциСаНајвишеКатегорија' ),
-       'Mostimages'                => array( 'НајповезанијеСлике' ),
+       'Mostcategories'            => array( 'НајвишеКатегорија', 'ЧланциСаНајвишеКатегорија' ),
+       'Mostimages'                => array( 'НајповезанијеДатотеке', 'НајповезанијеСлике' ),
+       'Mostinterwikis'            => array( 'НајвишеМеђувикија' ),
        'Mostlinked'                => array( 'НајповезанијеСтране' ),
        'Mostlinkedcategories'      => array( 'НајповезанијеКатегорије' ),
        'Mostlinkedtemplates'       => array( 'НајповезанијиШаблони' ),
-       'Mostrevisions'             => array( 'ЧланциСаНајвишеРевизија' ),
-       'Movepage'                  => array( 'Преусмери', 'Премести_страницу' ),
+       'Mostrevisions'             => array( 'Ð\9dаÑ\98виÑ\88еРевизиÑ\98а', 'ЧланÑ\86иСаÐ\9dаÑ\98виÑ\88еРевизиÑ\98а' ),
+       'Movepage'                  => array( 'Премести', 'Преусмери', 'Премести_страницу' ),
        'Mycontributions'           => array( 'МојиДоприноси', 'Моји_доприноси', 'Моји_прилози' ),
        'MyLanguage'                => array( 'Мој_језик' ),
        'Mypage'                    => array( 'МојаСтраница', 'Моја_страница' ),
@@ -140,34 +146,39 @@ $specialPageAliases = array(
        'Popularpages'              => array( 'Популарне_странице' ),
        'Preferences'               => array( 'Подешавања', 'Поставке' ),
        'Protectedpages'            => array( 'ЗаштићенеСтранице', 'Заштићене_странице' ),
-       'Protectedtitles'           => array( 'Заштићени_наслови' ),
+       'Protectedtitles'           => array( 'ЗаштићениНаслови', 'Заштићени_наслови' ),
        'Randompage'                => array( 'СлучајнаСтрана', 'Насумична_страница' ),
+       'Randomredirect'            => array( 'СлучајноПреусмерење' ),
        'Recentchanges'             => array( 'СкорашњеИзмене', 'Скорашње_измене' ),
        'Search'                    => array( 'Претражи' ),
-       'Shortpages'                => array( 'КраткиЧланци' ),
+       'Shortpages'                => array( 'Ð\9aÑ\80аÑ\82кеСÑ\82Ñ\80аниÑ\86е', 'Ð\9aÑ\80аÑ\82киЧланÑ\86и' ),
        'Specialpages'              => array( 'СпецијалнеСтране', 'Посебне_странице' ),
        'Statistics'                => array( 'Статистике' ),
        'Tags'                      => array( 'Ознаке' ),
-       'Uncategorizedcategories'   => array( 'КатегоријеБезКатегорија', 'Несврстане_категорије' ),
-       'Uncategorizedimages'       => array( 'СликеБезКатегорија', 'ДатотекеБезКатегорија' ),
-       'Uncategorizedpages'        => array( 'ЧланциБезКатегорија', 'Чланци_без_категорија' ),
-       'Uncategorizedtemplates'    => array( 'ШаблониБезКатегорија' ),
+       'Unblock'                   => array( 'Деблокирај' ),
+       'Uncategorizedcategories'   => array( 'НекатегорисанеКатегорије', 'КатегоријеБезКатегорија' ),
+       'Uncategorizedimages'       => array( 'НекатегорисанеДатотеке', 'СликеБезКатегорија' ),
+       'Uncategorizedpages'        => array( 'НекатегорисанеСтранице', 'ЧланциБезКатегорија', 'Чланци_без_категорија' ),
+       'Uncategorizedtemplates'    => array( 'НекатегорисаниШаблони', 'ШаблониБезКатегорија' ),
        'Undelete'                  => array( 'Врати' ),
        'Unlockdb'                  => array( 'ОткључајБазу', 'Откључај_базу' ),
        'Unusedcategories'          => array( 'НеискоришћенеКатегорије' ),
-       'Unusedimages'              => array( 'НеискоришћенеСлике', 'НеискоришћенеДатотеке' ),
+       'Unusedimages'              => array( 'НеискоришћенеДатотеке', 'НеискоришћенеСлике' ),
+       'Unusedtemplates'           => array( 'НеискоришћениШаблони' ),
+       'Unwatchedpages'            => array( 'НенадгледанеСтранице' ),
        'Upload'                    => array( 'Пошаљи' ),
        'UploadStash'               => array( 'Складиште' ),
        'Userlogin'                 => array( 'Корисничка_пријава' ),
        'Userlogout'                => array( 'Корисничка_одјава' ),
+       'Userrights'                => array( 'КорисничкаПрава' ),
        'Version'                   => array( 'Верзија', 'Издање' ),
        'Wantedcategories'          => array( 'ТраженеКатегорије' ),
-       'Wantedfiles'               => array( 'ТраженеСлике' ),
+       'Wantedfiles'               => array( 'ТÑ\80аженеÐ\94аÑ\82оÑ\82еке', 'ТÑ\80аженеСлике' ),
        'Wantedpages'               => array( 'ТраженеСтране' ),
        'Wantedtemplates'           => array( 'ТражениШаблони' ),
        'Watchlist'                 => array( 'СписакНадгледања', 'Списак_надгледања' ),
-       'Whatlinkshere'             => array( 'Шта_је_повезано_овде' ),
-       'Withoutinterwiki'          => array( 'Ð\91ез_меÑ\92Ñ\83викиÑ\98е' ),
+       'Whatlinkshere'             => array( 'ШтаВодиОвде', 'Шта_је_повезано_овде' ),
+       'Withoutinterwiki'          => array( 'Ð\91ез_меÑ\92Ñ\83викиÑ\98а' ),
 );
 
 $datePreferences = array(
@@ -281,11 +292,11 @@ $magicWords = array(
        'numberofusers'             => array( '1', 'БРОЈКОРИСНИКА', 'БРОЈ_КОРИСНИКА', 'NUMBEROFUSERS' ),
        'numberofactiveusers'       => array( '1', 'БРОЈАКТИВНИХКОРИСНИКА', 'БРОЈ_АКТИВНИХ_КОРИСНИКА', 'NUMBEROFACTIVEUSERS' ),
        'numberofedits'             => array( '1', 'БРОЈИЗМЕНА', 'БРОЈ_ИЗМЕНА', 'NUMBEROFEDITS' ),
-       'numberofviews'             => array( '1', 'БРОЈПРЕГЛЕДА', 'БРОЈ_ПРЕГЛЕДА', 'NUMBEROFVIEWS' ),
        'pagename'                  => array( '1', 'ИМЕСТРАНИЦЕ', 'ИМЕ_СТРАНИЦЕ', 'СТРАНИЦА', 'PAGENAME' ),
        'pagenamee'                 => array( '1', 'ИМЕНАСТРАНИЦА', 'ИМЕНА_СТРАНИЦА', 'СТРАНИЦЕ', 'PAGENAMEE' ),
        'namespace'                 => array( '1', 'ИМЕНСКИПРОСТОР', 'ИМЕНСКИ_ПРОСТОР', 'NAMESPACE' ),
        'namespacee'                => array( '1', 'ИМЕНСКИПРОСТОРИ', 'ИМЕНСКИ_ПРОСТОРИ', 'NAMESPACEE' ),
+       'namespacenumber'           => array( '1', 'БРОЈИМЕНСКОГПРОСТОРА', 'NAMESPACENUMBER' ),
        'talkspace'                 => array( '1', 'РАЗГОВОР', 'TALKSPACE' ),
        'talkspacee'                => array( '1', 'РАЗГОВОРИ', 'TALKSPACEE' ),
        'subjectspace'              => array( '1', 'ИМЕНСКИПРОСТОРЧЛАНКА', 'ИМЕНСКИ_ПРОСТОР_ЧЛАНКА', 'SUBJECTSPACE', 'ARTICLESPACE' ),
@@ -301,7 +312,7 @@ $magicWords = array(
        'subjectpagename'           => array( '1', 'ИМЕЧЛАНКА', 'ИМЕ_ЧЛАНКА', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
        'subjectpagenamee'          => array( '1', 'ИМЕНАЧЛАНАКА', 'ИМЕНА_ЧЛАНАКА', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
        'msg'                       => array( '0', 'ПОР:', 'MSG:' ),
-       'subst'                     => array( '0', 'ЗАМЕНИ:', 'ЗАМЕНА:', 'SUBST:' ),
+       'subst'                     => array( '0', 'ЗАМЕНИ:', 'ЗАМЕНА:', 'СУБСТ', 'SUBST:' ),
        'safesubst'                 => array( '0', 'БЕЗБЕДНАЗАМЕНА', 'БЕЗБЕДНА_ЗАМЕНА', 'SAFESUBST:' ),
        'msgnw'                     => array( '0', 'НВПОР:', 'MSGNW:' ),
        'img_thumbnail'             => array( '1', 'мини', 'умањено', 'thumbnail', 'thumb' ),
@@ -309,13 +320,13 @@ $magicWords = array(
        'img_right'                 => array( '1', 'десно', 'д', 'right' ),
        'img_left'                  => array( '1', 'лево', 'л', 'left' ),
        'img_none'                  => array( '1', 'без', 'н', 'none' ),
-       'img_width'                 => array( '1', '$1пискел', '$1п', '$1px' ),
-       'img_center'                => array( '1', 'центар', 'ц', 'center', 'centre' ),
+       'img_width'                 => array( '1', '$1пискел', '$1п', '$1p', '$1px' ),
+       'img_center'                => array( '1', 'центар', 'ц', 'c', 'center', 'centre' ),
        'img_framed'                => array( '1', 'оквир', 'рам', 'framed', 'enframed', 'frame' ),
        'img_frameless'             => array( '1', 'безоквира', 'без_оквира', 'безрама', 'без_рама', 'frameless' ),
        'img_page'                  => array( '1', 'страница=$1', 'страна=$1', 'страница_$1', 'страна_$1', 'page=$1', 'page $1' ),
        'img_upright'               => array( '1', 'усправно', 'усправно=$1', 'усправно_$1', 'upright', 'upright=$1', 'upright $1' ),
-       'img_border'                => array( '1', 'ивица', 'border' ),
+       'img_border'                => array( '1', 'ивица', 'оивичено', 'border' ),
        'img_baseline'              => array( '1', 'основа', 'baseline' ),
        'img_sub'                   => array( '1', 'под', 'sub' ),
        'img_super'                 => array( '1', 'супер', 'super', 'sup' ),
@@ -332,6 +343,7 @@ $magicWords = array(
        'localurl'                  => array( '0', 'ЛОКАЛНААДРЕСА:', 'ЛОКАЛНА_АДРЕСА:', 'LOCALURL:' ),
        'localurle'                 => array( '0', 'ЛОКАЛНЕАДРЕСЕ:', 'ЛОКАЛНЕ_АДРЕСЕ:', 'LOCALURLE:' ),
        'articlepath'               => array( '0', 'ПУТАЊАЧЛАНКА', 'ПУТАЊА_ЧЛАНКА', 'ARTICLEPATH' ),
+       'pageid'                    => array( '0', 'БРОЈСТРАНИЦЕ', 'PAGEID' ),
        'server'                    => array( '0', 'СЕРВЕР', 'SERVER' ),
        'servername'                => array( '0', 'ИМЕСЕРВЕРА', 'ИМЕ_СЕРВЕРА', 'SERVERNAME' ),
        'scriptpath'                => array( '0', 'СКРИПТА', 'SCRIPTPATH' ),
@@ -339,7 +351,7 @@ $magicWords = array(
        'grammar'                   => array( '0', 'ГРАМАТИКА:', 'GRAMMAR:' ),
        'gender'                    => array( '0', 'РОД:', 'ЛИЦЕ:', 'GENDER:' ),
        'notitleconvert'            => array( '0', '__БЕЗКН__', '__BEZKN__', '__NOTITLECONVERT__', '__NOTC__' ),
-       'nocontentconvert'          => array( '0', '__Ð\91Ð\95Ð\97ЦЦ__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+       'nocontentconvert'          => array( '0', '__Ð\91Ð\95Ð\97Ð\9aС__', '__Ð\91Ð\95Ð\97ЦЦ__', '__BEZKS__', '__NOCONTENTCONVERT__', '__NOCC__' ),
        'currentweek'               => array( '1', 'ТРЕНУТНАНЕДЕЉА', 'ТРЕНУТНА_НЕДЕЉА', 'ТЕКУЋАНЕДЕЉА', 'ТЕКУЋА_НЕДЕЉА', 'CURRENTWEEK' ),
        'currentdow'                => array( '1', 'ТРЕНУТНИДОВ', 'ТЕКУЋИДУН', 'CURRENTDOW' ),
        'localweek'                 => array( '1', 'ЛОКАЛНАНЕДЕЉА', 'ЛОКАЛНА_НЕДЕЉА', 'LOCALWEEK' ),
@@ -390,6 +402,8 @@ $magicWords = array(
        'url_path'                  => array( '0', 'ПУТАЊА', 'PATH' ),
        'url_wiki'                  => array( '0', 'ВИКИ', 'WIKI' ),
        'url_query'                 => array( '0', 'РЕДОСЛЕД', 'QUERY' ),
+       'pagesincategory_all'       => array( '0', 'све', 'all' ),
+       'pagesincategory_files'     => array( '0', 'датотеке', 'files' ),
 );
 $separatorTransformTable = array( ',' => '.', '.' => ',' );
 
index 6a5817c..d13c654 100644 (file)
@@ -194,11 +194,11 @@ $magicWords = array(
        'numberofusers'             => array( '1', 'BROJKORISNIKA', 'BROJ_KORISNIKA', 'NUMBEROFUSERS' ),
        'numberofactiveusers'       => array( '1', 'BROJAKTIVNIHKORISNIKA', 'BROJ_AKTIVNIH_KORISNIKA', 'NUMBEROFACTIVEUSERS' ),
        'numberofedits'             => array( '1', 'BROJIZMENA', 'BROJ_IZMENA', 'NUMBEROFEDITS' ),
-       'numberofviews'             => array( '1', 'BROJPREGLEDA', 'BROJ_PREGLEDA', 'NUMBEROFVIEWS' ),
        'pagename'                  => array( '1', 'IMESTRANICE', 'IME_STRANICE', 'STRANICA', 'PAGENAME' ),
        'pagenamee'                 => array( '1', 'IMENASTRANICA', 'IMENA_STRANICA', 'STRANICE', 'PAGENAMEE' ),
        'namespace'                 => array( '1', 'IMENSKIPROSTOR', 'IMENSKI_PROSTOR', 'NAMESPACE' ),
        'namespacee'                => array( '1', 'IMENSKIPROSTORI', 'IMENSKI_PROSTORI', 'NAMESPACEE' ),
+       'namespacenumber'           => array( '1', 'BROJIMENSKOGPROSTORA', 'NAMESPACENUMBER' ),
        'talkspace'                 => array( '1', 'RAZGOVOR', 'TALKSPACE' ),
        'talkspacee'                => array( '1', 'RAZGOVORI', 'TALKSPACEE' ),
        'subjectspace'              => array( '1', 'IMENSKIPROSTORČLANKA', 'IMENSKI_PROSTOR_ČLANKA', 'SUBJECTSPACE', 'ARTICLESPACE' ),
index 5936055..48e3511 100644 (file)
@@ -91,22 +91,28 @@ $namespaceAliases = array(
 );
 
 $specialPageAliases = array(
+       'Activeusers'               => array( 'Aktiva_användare' ),
        'Allmessages'               => array( 'Systemmeddelanden' ),
+       'AllMyUploads'              => array( 'Alla_mina_uppladdnignar', 'Alla_mina_filer' ),
        'Allpages'                  => array( 'Alla_sidor' ),
        'Ancientpages'              => array( 'Gamla_sidor' ),
+       'Badtitle'                  => array( 'Dålig_titel' ),
        'Blankpage'                 => array( 'Tom_sida' ),
        'Block'                     => array( 'Blockera' ),
        'Booksources'               => array( 'Bokkällor' ),
        'BrokenRedirects'           => array( 'Trasiga_omdirigeringar', 'Dåliga_omdirigeringar' ),
        'Categories'                => array( 'Kategorier' ),
-       'ChangePassword'            => array( 'Återställ_lösenord' ),
+       'ChangeEmail'               => array( 'Ändra_e-postadress' ),
+       'ChangePassword'            => array( 'Ändra_lösenord' ),
+       'ComparePages'              => array( 'Jämför_sidor' ),
        'Confirmemail'              => array( 'Bekräfta_epost' ),
        'Contributions'             => array( 'Bidrag' ),
        'CreateAccount'             => array( 'Skapa_konto' ),
        'Deadendpages'              => array( 'Sidor_utan_länkar', 'Sidor_utan_länkar_från' ),
        'DeletedContributions'      => array( 'Raderade_bidrag' ),
        'DoubleRedirects'           => array( 'Dubbla_omdirigeringar' ),
-       'Emailuser'                 => array( 'E-mail' ),
+       'EditWatchlist'             => array( 'Redigera_bevakningslista' ),
+       'Emailuser'                 => array( 'E-post', 'E-mail' ),
        'ExpandTemplates'           => array( 'Expandera_mallar', 'Utöka_mallar' ),
        'Export'                    => array( 'Exportera' ),
        'Fewestrevisions'           => array( 'Minst_versioner' ),
@@ -114,6 +120,7 @@ $specialPageAliases = array(
        'Filepath'                  => array( 'Filsökväg' ),
        'Import'                    => array( 'Importera' ),
        'Invalidateemail'           => array( 'Ogiltigförklara_epost' ),
+       'JavaScriptTest'            => array( 'JavaScript_test' ),
        'BlockList'                 => array( 'Blockeringslista' ),
        'LinkSearch'                => array( 'Länksökning' ),
        'Listadmins'                => array( 'Administratörer' ),
@@ -121,15 +128,18 @@ $specialPageAliases = array(
        'Listfiles'                 => array( 'Fillista', 'Bildlista' ),
        'Listgrouprights'           => array( 'Grupprättighetslista' ),
        'Listredirects'             => array( 'Omdirigeringar' ),
+       'ListDuplicatedFiles'       => array( 'Lista_dubblettfiler' ),
        'Listusers'                 => array( 'Användare', 'Användarlista' ),
        'Lockdb'                    => array( 'Lås_databasen' ),
        'Log'                       => array( 'Logg' ),
        'Lonelypages'               => array( 'Föräldralösa_sidor', 'Övergivna_sidor', 'Sidor_utan_länkar_till' ),
        'Longpages'                 => array( 'Långa_sidor' ),
+       'MediaStatistics'           => array( 'Media_statistik' ),
        'MergeHistory'              => array( 'Slå_ihop_historik' ),
        'MIMEsearch'                => array( 'MIME-sökning' ),
        'Mostcategories'            => array( 'Flest_kategorier' ),
        'Mostimages'                => array( 'Mest_länkade_filer', 'Flest_bilder' ),
+       'Mostinterwikis'            => array( 'Flest_interwikilänkar' ),
        'Mostlinked'                => array( 'Mest_länkade_sidor' ),
        'Mostlinkedcategories'      => array( 'Största_kategorier' ),
        'Mostlinkedtemplates'       => array( 'Mest_använda_mallar' ),
@@ -140,22 +150,30 @@ $specialPageAliases = array(
        'Mypage'                    => array( 'Min_sida' ),
        'Mytalk'                    => array( 'Min_diskussion' ),
        'Myuploads'                 => array( 'Mina_uppladdningar' ),
-       'Newimages'                 => array( 'Nya_bilder' ),
+       'Newimages'                 => array( 'Nya_filer', 'Nya_bilder' ),
        'Newpages'                  => array( 'Nya_sidor' ),
+       'PagesWithProp'             => array( 'Sidor_med_en_sidegenskap' ),
+       'PageLanguage'              => array( 'Sidspråk' ),
+       'PasswordReset'             => array( 'Återställ_lösenord' ),
+       'PermanentLink'             => array( 'Permanent_länk' ),
        'Popularpages'              => array( 'Populära_sidor' ),
        'Preferences'               => array( 'Inställningar' ),
        'Protectedpages'            => array( 'Skyddade_sidor' ),
        'Protectedtitles'           => array( 'Skyddade_titlar' ),
        'Randompage'                => array( 'Slumpsida' ),
+       'RandomInCategory'          => array( 'Slumpsida_i_kategori' ),
        'Randomredirect'            => array( 'Slumpomdirigering' ),
        'Recentchanges'             => array( 'Senaste_ändringar' ),
        'Recentchangeslinked'       => array( 'Senaste_relaterade_ändringar' ),
+       'Redirect'                  => array( 'Omdirigering' ),
+       'ResetTokens'               => array( 'Återställ_nycklar' ),
        'Revisiondelete'            => array( 'Radera_version' ),
        'Search'                    => array( 'Sök' ),
        'Shortpages'                => array( 'Korta_sidor' ),
        'Specialpages'              => array( 'Specialsidor' ),
        'Statistics'                => array( 'Statistik' ),
        'Tags'                      => array( 'Märken', 'Taggar' ),
+       'TrackingCategories'        => array( 'Spårningskategorier' ),
        'Unblock'                   => array( 'Avblockera' ),
        'Uncategorizedcategories'   => array( 'Okategoriserade_kategorier' ),
        'Uncategorizedimages'       => array( 'Okategoriserade_filer', 'Okategoriserade_bilder' ),
@@ -213,7 +231,6 @@ $magicWords = array(
        'numberofusers'             => array( '1', 'ANTALANVÄNDARE', 'NUMBEROFUSERS' ),
        'numberofactiveusers'       => array( '1', 'ANTALAKTIVAANVÄNDARE', 'NUMBEROFACTIVEUSERS' ),
        'numberofedits'             => array( '1', 'ANTALREDIGERINGAR', 'NUMBEROFEDITS' ),
-       'numberofviews'             => array( '1', 'ANTALVISNINGAR', 'NUMBEROFVIEWS' ),
        'pagename'                  => array( '1', 'SIDNAMN', 'PAGENAME' ),
        'pagenamee'                 => array( '1', 'SIDNAMNE', 'PAGENAMEE' ),
        'namespace'                 => array( '1', 'NAMNRYMD', 'NAMESPACE' ),
index b5f131a..5a5e44b 100644 (file)
@@ -61,19 +61,27 @@ $namespaceAliases = array(
 );
 
 $specialPageAliases = array(
+       'Activeusers'               => array( 'చురుగ్గావున్నవాడుకరులు' ),
        'Allmessages'               => array( 'అన్నిసందేశాలు' ),
+       'AllMyUploads'              => array( 'నాయెక్కింపులన్నీ' ),
        'Allpages'                  => array( 'అన్నిపేజీలు' ),
        'Ancientpages'              => array( 'పురాతనపేజీలు' ),
+       'Badtitle'                  => array( 'చెడుశీర్షిక' ),
        'Blankpage'                 => array( 'ఖాళీపేజి' ),
        'Block'                     => array( 'అడ్డగించు', 'ఐపినిఅడ్డగించు', 'వాడుకరినిఅడ్డగించు' ),
        'Booksources'               => array( 'పుస్తకమూలాలు' ),
        'BrokenRedirects'           => array( 'తెగిపోయినదారిమార్పులు' ),
        'Categories'                => array( 'వర్గాలు' ),
+       'ChangeEmail'               => array( 'ఈమెయిలుమార్పు' ),
        'ChangePassword'            => array( 'సంకేతపదముమార్చు' ),
+       'ComparePages'              => array( 'పేజీలనుపోల్చు' ),
        'Confirmemail'              => array( 'ఈమెయిలుధ్రువపరచు' ),
+       'Contributions'             => array( 'చేర్పులు' ),
        'CreateAccount'             => array( 'ఖాతాసృష్టించు' ),
        'Deadendpages'              => array( 'అగాధపేజీలు' ),
-       'DoubleRedirects'           => array( 'రెండుసార్లుదారిమార్పు' ),
+       'DeletedContributions'      => array( 'తొలగించినచేర్పులు' ),
+       'Diff'                      => array( 'తేడా' ),
+       'DoubleRedirects'           => array( 'జమిలిదారిమార్పు' ),
        'Emailuser'                 => array( 'వాడుకరికిఈమెయిలుచెయ్యి' ),
        'Export'                    => array( 'ఎగుమతి' ),
        'Fewestrevisions'           => array( 'అతితక్కువకూర్పులు' ),
index c48704a..1327bd4 100644 (file)
@@ -50,7 +50,7 @@ $specialPageAliases = array(
        'Listfiles'                 => array( 'Lista_imajen' ),
        'Listusers'                 => array( 'Lista_uza-na\'in' ),
        'Longpages'                 => array( 'Pájina_naruk' ),
-       'Movepage'                  => array( 'Book' ),
+       'Movepage'                  => array( 'Book_pájina', 'Book' ),
        'Mypage'                    => array( 'Ha\'u-nia_pájina' ),
        'Newimages'                 => array( 'Imajen_foun' ),
        'Preferences'               => array( 'Preferénsia' ),
index f1d9a4b..30cf401 100644 (file)
@@ -97,7 +97,6 @@ $magicWords = array(
        'numberofusers'             => array( '1', 'ИШТИРОКӘКОН_ҒӘДӘР', 'NUMBEROFUSERS' ),
        'numberofactiveusers'       => array( '1', 'ТИЛИКӘ_ИШТИРОКӘКОН_ҒӘДӘР', 'NUMBEROFACTIVEUSERS' ),
        'numberofedits'             => array( '1', 'ДӘГИШОН_ҒӘДӘР', 'NUMBEROFEDITS' ),
-       'numberofviews'             => array( '1', 'ДИЈӘ_КАРДЕ_ҒӘДӘР', 'NUMBEROFVIEWS' ),
        'pagename'                  => array( '1', 'СӘҺИФӘ_НОМ', 'PAGENAME' ),
        'pagenamee'                 => array( '1', 'СӘҺИФӘ_НОМ_2', 'PAGENAMEE' ),
        'namespace'                 => array( '1', 'НОМОН_МӘКОН', 'NAMESPACE' ),
index 21cc341..0f61a96 100644 (file)
@@ -230,7 +230,6 @@ $magicWords = array(
        'numberofusers'             => array( '1', 'KULLANICISAYISI', 'NUMBEROFUSERS' ),
        'numberofactiveusers'       => array( '1', 'AKTİFKULLANICISAYISI', 'ETKİNKULLANICISAYISI', 'NUMBEROFACTIVEUSERS' ),
        'numberofedits'             => array( '1', 'DEĞİŞİKLİKSAYISI', 'NUMBEROFEDITS' ),
-       'numberofviews'             => array( '1', 'GÖRÜNTÜLEMESAYISI', 'NUMBEROFVIEWS' ),
        'pagename'                  => array( '1', 'SAYFAADI', 'PAGENAME' ),
        'pagenamee'                 => array( '1', 'SAYFAADIU', 'PAGENAMEE' ),
        'namespace'                 => array( '1', 'ADALANI', 'İSİMALANI', 'NAMESPACE' ),
index 77759a1..b369096 100644 (file)
@@ -49,6 +49,20 @@ $namespaceAliases = array(
 );
 
 $specialPageAliases = array(
+       'Activeusers'               => array( 'Идекпейжилер' ),
+       'Allmessages'               => array( 'Шупту_медеглелдер' ),
+       'AllMyUploads'              => array( 'Шупту_файлдарым' ),
+       'Allpages'                  => array( 'Шупту_арыннар' ),
+       'Badtitle'                  => array( 'Хоржок_ат-сып' ),
+       'Blankpage'                 => array( 'Куруг_арын' ),
+       'Block'                     => array( 'Дуглаар' ),
+       'Booksources'               => array( 'Ном_үндезини' ),
+       'BrokenRedirects'           => array( 'Үзүлген_көжүрүглер' ),
+       'Categories'                => array( 'Аңгылалдар' ),
+       'ChangeEmail'               => array( 'Э-шуудаң_солуур' ),
+       'ChangePassword'            => array( 'Уруң_солуур' ),
+       'ComparePages'              => array( 'Арыннар_деңнээр' ),
+       'Confirmemail'              => array( 'Э-шуудаң_бадыткаар' ),
        'MyLanguage'                => array( 'Дылым' ),
 );
 
index 861b936..2caaefa 100644 (file)
@@ -116,6 +116,7 @@ $bookstoreList = array(
 $specialPageAliases = array(
        'Activeusers'               => array( 'Активні_дописувачі' ),
        'Allmessages'               => array( 'Системні_повідомлення' ),
+       'AllMyUploads'              => array( 'Усі_мої_файли' ),
        'Allpages'                  => array( 'Усі_сторінки' ),
        'Ancientpages'              => array( 'Давні_сторінки' ),
        'Badtitle'                  => array( 'Помилковий_заголовок' ),
@@ -142,6 +143,7 @@ $specialPageAliases = array(
        'Filepath'                  => array( 'Шлях_до_файлу' ),
        'Import'                    => array( 'Імпорт' ),
        'Invalidateemail'           => array( 'Неперевірена_email-адреса' ),
+       'JavaScriptTest'            => array( 'JavaScript_тест' ),
        'BlockList'                 => array( 'Список_блокувань', 'Блокування', 'Блокування_IP-адрес' ),
        'LinkSearch'                => array( 'Пошук_посилань' ),
        'Listadmins'                => array( 'Список_адміністраторів' ),
@@ -149,6 +151,7 @@ $specialPageAliases = array(
        'Listfiles'                 => array( 'Список_файлів' ),
        'Listgrouprights'           => array( 'Список_прав_груп', 'Права_груп_користувачів' ),
        'Listredirects'             => array( 'Список_перенаправлень' ),
+       'ListDuplicatedFiles'       => array( 'Список_дубльованих_файлів' ),
        'Listusers'                 => array( 'Список_користувачів' ),
        'Lockdb'                    => array( 'Заблокувати_базу_даних' ),
        'Log'                       => array( 'Журнали' ),
@@ -182,6 +185,7 @@ $specialPageAliases = array(
        'Randomredirect'            => array( 'Випадкове_перенаправлення' ),
        'Recentchanges'             => array( 'Нові_редагування' ),
        'Recentchangeslinked'       => array( 'Пов\'язані_редагування' ),
+       'Redirect'                  => array( 'Перенаправлення' ),
        'Revisiondelete'            => array( 'Вилучити_редагування' ),
        'Search'                    => array( 'Пошук' ),
        'Shortpages'                => array( 'Короткі_сторінки' ),
@@ -237,19 +241,18 @@ $magicWords = array(
        'localmonthname'            => array( '1', 'НАЗВА_ЛОКАЛЬНОГО_МІСЯЦЯ', 'НАЗВАНИЕ_МЕСТНОГО_МЕСЯЦА', 'LOCALMONTHNAME' ),
        'localmonthnamegen'         => array( '1', 'НАЗВА_ЛОКАЛЬНОГО_МІСЯЦЯ_РОД', 'НАЗВАНИЕ_МЕСТНОГО_МЕСЯЦА_РОД', 'LOCALMONTHNAMEGEN' ),
        'localmonthabbrev'          => array( '1', 'НАЗВА_ЛОКАЛЬНОГО_МІСЯЦЯ_АБР', 'НАЗВАНИЕ_МЕСТНОГО_МЕСЯЦА_АБР', 'LOCALMONTHABBREV' ),
-       'localday'                  => array( '1', 'ЛОКАЛЬНИЙ_ДЕНЬ', 'МЕСТНЫЙ_ДЕНЬ', 'LOCALDAY' ),
-       'localday2'                 => array( '1', 'ЛОКАЛЬНИЙ_ДЕНЬ_2', 'МЕСТНЫЙ_ДЕНЬ_2', 'LOCALDAY2' ),
-       'localdayname'              => array( '1', 'НАЗВА_ЛОКАЛЬНОГО_ДНЯ', 'НАЗВАНИЕ_МЕСТНОГО_ДНЯ', 'LOCALDAYNAME' ),
-       'localyear'                 => array( '1', 'ЛОКАЛЬНИЙ_РІК', 'МЕСТНЫЙ_ГОД', 'LOCALYEAR' ),
-       'localtime'                 => array( '1', 'ЛОКАЛЬНИЙ_ЧАС', 'МЕСТНОЕ_ВРЕМЯ', 'LOCALTIME' ),
-       'localhour'                 => array( '1', 'ЛОКАЛЬНА_ГОДИНА', 'МЕСТНЫЙ_ЧАС', 'LOCALHOUR' ),
+       'localday'                  => array( '1', 'Ð\9bÐ\9eÐ\9aÐ\90Ð\9bЬÐ\9dÐ\98Ð\99\94Ð\95Ð\9dЬ', 'Ð\9cÐ\86СЦÐ\95Ð\92Ð\98Ð\99\94Ð\95Ð\9dЬ', 'Ð\9cÐ\95СТÐ\9dЫÐ\99\94Ð\95Ð\9dЬ', 'LOCALDAY' ),
+       'localday2'                 => array( '1', 'Ð\9bÐ\9eÐ\9aÐ\90Ð\9bЬÐ\9dÐ\98Ð\99\94Ð\95Ð\9dЬ_2', 'Ð\9cÐ\86СЦÐ\95Ð\92Ð\98Ð\99\94Ð\95Ð\9dЬ_2', 'Ð\9cÐ\95СТÐ\9dЫÐ\99\94Ð\95Ð\9dЬ_2', 'LOCALDAY2' ),
+       'localdayname'              => array( '1', 'НАЗВА_ЛОКАЛЬНОГО_ДНЯ', 'НАЗВА_МІСЦЕВОГО_ДНЯ', 'НАЗВАНИЕ_МЕСТНОГО_ДНЯ', 'LOCALDAYNAME' ),
+       'localyear'                 => array( '1', 'Ð\9bÐ\9eÐ\9aÐ\90Ð\9bЬÐ\9dÐ\98Ð\99_РÐ\86Ð\9a', 'Ð\9cÐ\86СЦÐ\95Ð\92Ð\98Ð\99_РÐ\86Ð\9a', 'Ð\9cÐ\95СТÐ\9dЫÐ\99\93Ð\9eÐ\94', 'LOCALYEAR' ),
+       'localtime'                 => array( '1', 'Ð\9bÐ\9eÐ\9aÐ\90Ð\9bЬÐ\9dÐ\98Ð\99_ЧÐ\90С', 'Ð\9cÐ\86СЦÐ\95Ð\92Ð\98Ð\99_ЧÐ\90С', 'Ð\9cÐ\95СТÐ\9dÐ\9eÐ\95\92РÐ\95Ð\9cЯ', 'LOCALTIME' ),
+       'localhour'                 => array( '1', 'Ð\9bÐ\9eÐ\9aÐ\90Ð\9bЬÐ\9dÐ\90\93Ð\9eÐ\94Ð\98Ð\9dÐ\90', 'Ð\9cÐ\86СЦÐ\95Ð\92Ð\90\93Ð\9eÐ\94Ð\98Ð\9dÐ\90', 'Ð\9cÐ\95СТÐ\9dЫÐ\99_ЧÐ\90С', 'LOCALHOUR' ),
        'numberofpages'             => array( '1', 'КІЛЬКІСТЬ_СТОРІНОК', 'КОЛИЧЕСТВО_СТРАНИЦ', 'NUMBEROFPAGES' ),
        'numberofarticles'          => array( '1', 'КІЛЬКІСТЬ_СТАТЕЙ', 'КОЛИЧЕСТВО_СТАТЕЙ', 'NUMBEROFARTICLES' ),
        'numberoffiles'             => array( '1', 'КІЛЬКІСТЬ_ФАЙЛІВ', 'КОЛИЧЕСТВО_ФАЙЛОВ', 'NUMBEROFFILES' ),
        'numberofusers'             => array( '1', 'КІЛЬКІСТЬ_КОРИСТУВАЧІВ', 'КОЛИЧЕСТВО_УЧАСТНИКОВ', 'NUMBEROFUSERS' ),
        'numberofactiveusers'       => array( '1', 'КІЛЬКІСТЬ_АКТИВНИХ_КОРИСТУВАЧІВ', 'КОЛИЧЕСТВО_АКТИВНЫХ_УЧАСТНИКОВ', 'NUMBEROFACTIVEUSERS' ),
        'numberofedits'             => array( '1', 'КІЛЬКІСТЬ_РЕДАГУВАНЬ', 'КОЛИЧЕСТВО_ПРАВОК', 'NUMBEROFEDITS' ),
-       'numberofviews'             => array( '1', 'КІЛЬКІСТЬ_ПЕРЕГЛЯДІВ', 'КОЛИЧЕСТВО_ПРОСМОТРОВ', 'NUMBEROFVIEWS' ),
        'pagename'                  => array( '1', 'НАЗВА_СТОРІНКИ', 'НАЗВАНИЕ_СТРАНИЦЫ', 'PAGENAME' ),
        'pagenamee'                 => array( '1', 'НАЗВА_СТОРІНКИ_2', 'НАЗВАНИЕ_СТРАНИЦЫ_2', 'PAGENAMEE' ),
        'namespace'                 => array( '1', 'ПРОСТІР_НАЗВ', 'ПРОСТРАНСТВО_ИМЁН', 'NAMESPACE' ),
@@ -266,8 +269,8 @@ $magicWords = array(
        'basepagenamee'             => array( '1', 'ОСНОВА_НАЗВИ_ПІДСТОРІНКИ_2', 'ОСНОВА_НАЗВАНИЯ_СТРАНИЦЫ_2', 'BASEPAGENAMEE' ),
        'talkpagename'              => array( '1', 'НАЗВА_СТОРІНКИ_ОБГОВОРЕННЯ', 'НАЗВАНИЕ_СТРАНИЦЫ_ОБСУЖДЕНИЯ', 'TALKPAGENAME' ),
        'talkpagenamee'             => array( '1', 'НАЗВА_СТОРІНКИ_ОБГОВОРЕННЯ_2', 'НАЗВАНИЕ_СТРАНИЦЫ_ОБСУЖДЕНИЯ_2', 'TALKPAGENAMEE' ),
-       'subjectpagename'           => array( '1', 'НАЗВА_СТАТТІ', 'НАЗВАНИЕ_СТРАНИЦЫ_СТАТЬИ', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
-       'subjectpagenamee'          => array( '1', 'НАЗВА_СТАТТІ_2', 'НАЗВАНИЕ_СТРАНИЦЫ_СТАТЬИ_2', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+       'subjectpagename'           => array( '1', 'НАЗВА_СТАТТІ', 'НАЗВА_СТОРІНКИ_СТАТТІ', 'НАЗВАНИЕ_СТРАНИЦЫ_СТАТЬИ', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+       'subjectpagenamee'          => array( '1', 'НАЗВА_СТАТТІ_2', 'НАЗВА_СТОРІНКИ_СТАТТІ_2', 'НАЗВАНИЕ_СТРАНИЦЫ_СТАТЬИ_2', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
        'msg'                       => array( '0', 'ПОВІД:', 'ПОВІДОМЛЕННЯ:', 'СООБЩЕНИЕ:', 'СООБЩ:', 'MSG:' ),
        'subst'                     => array( '0', 'ПІДСТ:', 'ПІДСТАНОВКА:', 'ПОДСТАНОВКА:', 'ПОДСТ:', 'SUBST:' ),
        'safesubst'                 => array( '0', 'БЕЗПЕЧНА_ПІДСТАНОВКА:', 'ЗАЩПОДСТ:', 'SAFESUBST:' ),
@@ -281,9 +284,9 @@ $magicWords = array(
        'img_center'                => array( '1', 'центр', 'center', 'centre' ),
        'img_framed'                => array( '1', 'обрамити', 'рамка', 'обрамить', 'framed', 'enframed', 'frame' ),
        'img_frameless'             => array( '1', 'безрамки', 'frameless' ),
-       'img_page'                  => array( '1', 'сторінка=$1', 'сторінка_$1', 'страница=$1', 'страница_$1', 'страница $1', 'page=$1', 'page $1' ),
-       'img_upright'               => array( '1', 'зверхуправоруч', 'зверхуправоруч=$1', 'зверхуправоруч_$1', 'сверхусправа', 'сверхусправа=$1', 'сверхусправа_$1', 'сверхусправа $1', 'upright', 'upright=$1', 'upright $1' ),
-       'img_border'                => array( '1', 'межа', 'граница', 'border' ),
+       'img_page'                  => array( '1', 'сторінка=$1', 'сторінка_$1', 'страница=$1', 'страница $1', 'page=$1', 'page $1' ),
+       'img_upright'               => array( '1', 'зверхуправоруч', 'зверхуправоруч=$1', 'зверхуправоруч_$1', 'сверхусправа', 'сверхусправа=$1', 'сверхусправа $1', 'upright', 'upright=$1', 'upright $1' ),
+       'img_border'                => array( '1', 'межа', 'границя', 'граница', 'border' ),
        'img_baseline'              => array( '1', 'основа', 'основание', 'baseline' ),
        'img_sub'                   => array( '1', 'під', 'под', 'sub' ),
        'img_super'                 => array( '1', 'над', 'super', 'sup' ),
@@ -300,6 +303,8 @@ $magicWords = array(
        'nse'                       => array( '0', 'ПН_2:', 'ПИК:', 'NSE:' ),
        'localurl'                  => array( '0', 'ЛОКАЛЬНА_АДРЕСА:', 'ЛОКАЛЬНЫЙ_АДРЕС:', 'LOCALURL:' ),
        'localurle'                 => array( '0', 'ЛОКАЛЬНА_АДРЕСА_2:', 'ЛОКАЛЬНЫЙ_АДРЕС_2:', 'LOCALURLE:' ),
+       'articlepath'               => array( '0', 'ШЛЯХ_ДО_СТАТТІ', 'ПУТЬ_К_СТАТЬЕ', 'ARTICLEPATH' ),
+       'pageid'                    => array( '0', 'ІДЕНТИФІКАТОР_СТОРІНКИ', 'ИДЕНТИФИКАТОР_СТРАНИЦЫ', 'PAGEID' ),
        'server'                    => array( '0', 'СЕРВЕР', 'SERVER' ),
        'servername'                => array( '0', 'НАЗВА_СЕРВЕРА', 'НАЗВАНИЕ_СЕРВЕРА', 'SERVERNAME' ),
        'scriptpath'                => array( '0', 'ШЛЯХ_ДО_СКРИПТУ', 'ПУТЬ_К_СКРИПТУ', 'SCRIPTPATH' ),
@@ -323,10 +328,10 @@ $magicWords = array(
        'plural'                    => array( '0', 'МНОЖИНА:', 'МНОЖЕСТВЕННОЕ_ЧИСЛО:', 'PLURAL:' ),
        'fullurl'                   => array( '0', 'ПОВНА_АДРЕСА:', 'ПОЛНЫЙ_АДРЕС:', 'FULLURL:' ),
        'fullurle'                  => array( '0', 'ПОВНА_АДРЕСА_2:', 'ПОЛНЫЙ_АДРЕС_2:', 'FULLURLE:' ),
-       'lcfirst'                   => array( '0', 'НР_ПЕРША:', 'ПЕРША_БУКВА_МАЛА:', 'ПЕРВАЯ_БУКВА_МАЛЕНЬКАЯ:', 'LCFIRST:' ),
-       'ucfirst'                   => array( '0', 'ВР_ПЕРША:', 'ПЕРША_БУКВА_ВЕЛИКА:', 'ПЕРВАЯ_БУКВА_БОЛЬШАЯ:', 'UCFIRST:' ),
-       'lc'                        => array( '0', 'НР:', 'НИЖНІЙ_РЕГІСТР:', 'МАЛИМИ_БУКВАМИ:', 'МАЛЕНЬКИМИ_БУКВАМИ:', 'LC:' ),
-       'uc'                        => array( '0', 'ВР:', 'ВЕРХНІЙ_РЕГІСТР:', 'ВЕЛИКИМИ_БУКВАМИ:', 'БОЛЬШИМИ_БУКВАМИ:', 'UC:' ),
+       'lcfirst'                   => array( '0', 'Ð\9dР_Ð\9fÐ\95РШÐ\90:', 'Ð\9fÐ\95РШÐ\90\91УÐ\9aÐ\92Ð\90\9cÐ\90Ð\9bÐ\90:', 'Ð\9fÐ\95РШÐ\90\9bÐ\86ТÐ\95РÐ\90\9cÐ\90Ð\9bÐ\90:', 'Ð\9cÐ\90Ð\9bÐ\90\9fÐ\95РШÐ\90\9bÐ\86ТÐ\95РÐ\90:', 'Ð\9fÐ\95РÐ\92Ð\90Я_Ð\91УÐ\9aÐ\92Ð\90\9cÐ\90Ð\9bÐ\95Ð\9dЬÐ\9aÐ\90Я:', 'LCFIRST:' ),
+       'ucfirst'                   => array( '0', 'Ð\92Р_Ð\9fÐ\95РШÐ\90:', 'Ð\9fÐ\95РШÐ\90\91УÐ\9aÐ\92Ð\90\92Ð\95Ð\9bÐ\98Ð\9aÐ\90:', 'Ð\9fÐ\95ШÐ\90\94Ð\86ТÐ\95РÐ\90\92Ð\95Ð\9bÐ\98Ð\9aÐ\90:', 'Ð\92Ð\95Ð\9bÐ\98Ð\9aÐ\90\9fÐ\95РШÐ\90\9bÐ\86ТÐ\95РÐ\90:', 'Ð\9fÐ\95РÐ\92Ð\90Я_Ð\91УÐ\9aÐ\92Ð\90\91Ð\9eÐ\9bЬШÐ\90Я:', 'UCFIRST:' ),
+       'lc'                        => array( '0', 'Ð\9dР:', 'Ð\9dÐ\98Ð\96Ð\9dÐ\86Ð\99_РÐ\95Ð\93Ð\86СТР:', 'Ð\9cÐ\90Ð\9bÐ\98Ð\9cÐ\98\91УÐ\9aÐ\92Ð\90Ð\9cÐ\98:', 'Ð\9cÐ\90Ð\9bÐ\98Ð\9cÐ\98\9bÐ\86ТÐ\95РÐ\90Ð\9cÐ\98:', 'Ð\9cÐ\90Ð\9bÐ\95Ð\9dЬÐ\9aÐ\98Ð\9cÐ\98\91УÐ\9aÐ\92Ð\90Ð\9cÐ\98:', 'LC:' ),
+       'uc'                        => array( '0', 'Ð\92Р:', 'Ð\92Ð\95РХÐ\9dÐ\86Ð\99_РÐ\95Ð\93Ð\86СТР:', 'Ð\92Ð\95Ð\9bÐ\98Ð\9aÐ\98Ð\9cÐ\98\91УÐ\9aÐ\92Ð\90Ð\9cÐ\98:', 'Ð\92Ð\95Ð\9bÐ\98Ð\9aÐ\98Ð\9cÐ\98\9bÐ\86ТÐ\95РÐ\90Ð\9cÐ\98:', 'Ð\91Ð\9eÐ\9bЬШÐ\98Ð\9cÐ\98\91УÐ\9aÐ\92Ð\90Ð\9cÐ\98:', 'UC:' ),
        'raw'                       => array( '0', 'НЕОБРОБ:', 'НЕОБРАБ:', 'RAW:' ),
        'displaytitle'              => array( '1', 'ПОКАЗАТИ_ЗАГОЛОВОК', 'ПОКАЗАТЬ_ЗАГОЛОВОК', 'DISPLAYTITLE' ),
        'rawsuffix'                 => array( '1', 'Н', 'R' ),
@@ -346,11 +351,11 @@ $magicWords = array(
        'padleft'                   => array( '0', 'ЗАПОВНИТИ_ЛІВОРУЧ', 'ЗАПОЛНИТЬ_СЛЕВА', 'PADLEFT' ),
        'padright'                  => array( '0', 'ЗАПОВНИТИ_ПРАВОРУЧ', 'ЗАПОЛНИТЬ_СПРАВА', 'PADRIGHT' ),
        'special'                   => array( '0', 'спеціальна', 'служебная', 'special' ),
-       'defaultsort'               => array( '1', 'СТАНДАРТНЕ_СОРТУВАННЯ:', 'СОРТУВАННЯ:', 'СОРТИРОВКА_ПО_УМОЛЧАНИЮ', 'КЛЮЧ_СОРТИРОВКИ', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+       'defaultsort'               => array( '1', 'СТАНДАРТНЕ_СОРТУВАННЯ:_КЛЮЧ_СОРТУВАННЯ', 'СОРТИРОВКА_ПО_УМОЛЧАНИЮ', 'КЛЮЧ_СОРТИРОВКИ', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
        'filepath'                  => array( '0', 'ШЛЯХ_ДО_ФАЙЛУ:', 'ПУТЬ_К_ФАЙЛУ:', 'FILEPATH:' ),
-       'tag'                       => array( '0', 'тег', 'мітка', 'метка', 'тэг', 'tag' ),
-       'hiddencat'                 => array( '1', '__ПРИХОВ_КАТ__', '__СКРЫТАЯ_КАТЕГОРИЯ__', '__HIDDENCAT__' ),
-       'pagesincategory'           => array( '1', 'СТОР_В_КАТ', 'СТОР_У_КАТ', 'СТРАНИЦ_В_КАТЕГОРИИ', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+       'tag'                       => array( '0', 'тег', 'мітка', 'теґ', 'метка', 'тэг', 'tag' ),
+       'hiddencat'                 => array( '1', '__Ð\9fРÐ\98Ð¥Ð\9eÐ\92\9aÐ\90Т__', '__Ð\9fРÐ\98Ð¥Ð\9eÐ\92Ð\90Ð\9dÐ\90\9aÐ\90ТÐ\95Ð\93Ð\9eРÐ\86Я__', '__СÐ\9aРЫТÐ\90Я_Ð\9aÐ\90ТÐ\95Ð\93Ð\9eРÐ\98Я__', '__HIDDENCAT__' ),
+       'pagesincategory'           => array( '1', 'СТÐ\9eР_Ð\92\9aÐ\90Т', 'СТÐ\9eР_У_Ð\9aÐ\90Т', 'СТÐ\9eРÐ\86Ð\9dÐ\9eÐ\9a_У_Ð\9aÐ\90ТÐ\95Ð\93Ð\9eРÐ\86Ð\87', 'СТРÐ\90Ð\9dÐ\98Ц_Ð\92\9aÐ\90ТÐ\95Ð\93Ð\9eРÐ\98Ð\98', 'PAGESINCATEGORY', 'PAGESINCAT' ),
        'pagesize'                  => array( '1', 'РОЗМІР', 'РОЗМІР_СТОРІНКИ', 'РАЗМЕР_СТРАНИЦЫ', 'PAGESIZE' ),
        'index'                     => array( '1', '__ІНДЕКС__', '__ИНДЕКС__', '__INDEX__' ),
        'noindex'                   => array( '1', '__БЕЗ_ІНДЕКСУ__', '__БЕЗ_ИНДЕКСА__', '__NOINDEX__' ),
@@ -361,6 +366,9 @@ $magicWords = array(
        'url_path'                  => array( '0', 'ШЛЯХ', 'ПУТЬ', 'PATH' ),
        'url_wiki'                  => array( '0', 'ВІКІ', 'ВИКИ', 'WIKI' ),
        'url_query'                 => array( '0', 'ЗАПИТ', 'ЗАПРОС', 'QUERY' ),
+       'pagesincategory_all'       => array( '0', 'усе', 'все', 'all' ),
+       'pagesincategory_pages'     => array( '0', 'сторінки', 'страницы', 'pages' ),
+       'pagesincategory_subcats'   => array( '0', 'підкатегорії', 'подкатегории', 'subcats' ),
 );
 
 $linkTrail = '/^([a-zабвгґдеєжзиіїйклмнопрстуфхцчшщьєюяёъы“»]+)(.*)$/sDu';
index 7ee1fe8..1394c16 100644 (file)
@@ -63,7 +63,7 @@ $specialPageAliases = array(
        'Ancientpages'              => array( 'قدیم_صفحات' ),
        'Badtitle'                  => array( 'خراب_عنوان' ),
        'Blankpage'                 => array( 'خالی_صفحہ' ),
-       'Block'                     => array( 'پابÙ\86دÛ\8c', 'دستÙ\88ر_شبکÛ\8c_پابÙ\86دÛ\8c', 'پابندی_بر_صارف' ),
+       'Block'                     => array( 'پابÙ\86دÛ\8c', 'آئÛ\8c_Ù¾Û\8c_پتÛ\81_پابÙ\86دÛ\8cØ\8c_پابندی_بر_صارف' ),
        'Booksources'               => array( 'کتابی_وسائل' ),
        'BrokenRedirects'           => array( 'شکستہ_رجوع_مکررات' ),
        'Categories'                => array( 'زمرہ_جات' ),
@@ -119,6 +119,8 @@ $specialPageAliases = array(
        'Shortpages'                => array( 'مختصر_صفحات' ),
        'Specialpages'              => array( 'خصوصی_صفحات' ),
        'Statistics'                => array( 'شماریات' ),
+       'Tags'                      => array( 'ٹیگز' ),
+       'Unblock'                   => array( 'پابندی_ختم' ),
        'Uncategorizedcategories'   => array( 'غیر_زمرہ_بند_زمرہ_جات' ),
        'Uncategorizedimages'       => array( 'غیر_زمرہ_بند_املاف', 'غیر_زمرہ_بند_تصاویر' ),
        'Uncategorizedpages'        => array( 'غیر_زمرہ_بند_صفحات' ),
@@ -133,10 +135,10 @@ $specialPageAliases = array(
        'Userlogout'                => array( 'خارج_نوشتگی' ),
        'Userrights'                => array( 'صارفی_اختیارات' ),
        'Version'                   => array( 'اخراجہ' ),
-       'Wantedcategories'          => array( 'مطلوب_زمرہ_جات' ),
-       'Wantedfiles'               => array( 'مطلوب_املاف' ),
-       'Wantedpages'               => array( 'مطلوب_صفحات', 'شکستہ_روابط' ),
-       'Wantedtemplates'           => array( 'مطلوب_سانچے' ),
+       'Wantedcategories'          => array( 'مطلوبہ_زمرہ_جات' ),
+       'Wantedfiles'               => array( 'مطلوبہ_املاف' ),
+       'Wantedpages'               => array( 'مطلوبہ_صفحات', 'شکستہ_روابط' ),
+       'Wantedtemplates'           => array( 'مطلوبہ_سانچے' ),
        'Watchlist'                 => array( 'زیر_نظر_فہرست' ),
        'Whatlinkshere'             => array( 'یہاں_کس_کا_رابطہ' ),
        'Withoutinterwiki'          => array( 'بدون_بین_الویکی' ),
index 1c474cc..33d36bc 100644 (file)
@@ -88,7 +88,6 @@ $magicWords = array(
        'numberofusers'             => array( '1', 'FOYDALANUVCHISONI', 'NUMBEROFUSERS' ),
        'numberofactiveusers'       => array( '1', 'FAOLFOYDALANUVCHISONI', 'NUMBEROFACTIVEUSERS' ),
        'numberofedits'             => array( '1', 'OZGARISHSONI', 'NUMBEROFEDITS' ),
-       'numberofviews'             => array( '1', 'KORISHSONI', 'NUMBEROFVIEWS' ),
        'pagename'                  => array( '1', 'SAHIFANOMI', 'PAGENAME' ),
        'namespace'                 => array( '1', 'NOMFAZO', 'NAMESPACE' ),
        'gender'                    => array( '0', 'JINS', 'GENDER:' ),
index c691b0e..2724a60 100644 (file)
@@ -62,6 +62,7 @@ $specialPageAliases = array(
        'Allmessages'               => array( 'Mọi_thông_điệp', 'Mọi_thông_báo' ),
        'AllMyUploads'              => array( 'Mọi_tập_tin_của_tôi', 'Mọi_tập_tin_tôi_tải_lên' ),
        'Allpages'                  => array( 'Mọi_bài' ),
+       'ApiHelp'                   => array( 'Trợ_giúp_API' ),
        'Ancientpages'              => array( 'Trang_cũ' ),
        'Badtitle'                  => array( 'Tựa_đề_hỏng' ),
        'Blankpage'                 => array( 'Trang_trắng' ),
@@ -77,6 +78,7 @@ $specialPageAliases = array(
        'CreateAccount'             => array( 'Mở_tài_khoản', 'Đăng_ký', 'Đăng_kí' ),
        'Deadendpages'              => array( 'Trang_đường_cùng' ),
        'DeletedContributions'      => array( 'Đóng_góp_bị_xóa', 'Đóng_góp_bị_xoá' ),
+       'Diff'                      => array( 'Khác', 'Khác_biệt' ),
        'DoubleRedirects'           => array( 'Đổi_hướng_kép' ),
        'EditWatchlist'             => array( 'Sửa_danh_sách_theo_dõi' ),
        'Emailuser'                 => array( 'Gửi_thư', 'Gửi_thư_điện_tử' ),
@@ -95,11 +97,13 @@ $specialPageAliases = array(
        'Listfiles'                 => array( 'Danh_sách_tập_tin', 'Danh_sách_hình' ),
        'Listgrouprights'           => array( 'Quyền_nhóm_người_dùng' ),
        'Listredirects'             => array( 'Trang_đổi_hướng' ),
+       'ListDuplicatedFiles'       => array( 'Tập_tin_trùng_lắp' ),
        'Listusers'                 => array( 'Danh_sách_thành_viên' ),
        'Lockdb'                    => array( 'Khóa_CSDL', 'Khóa_cơ_sở_dữ_liệu', 'Khoá_CSDL', 'Khoá_cơ_sở_dữ_liệu' ),
        'Log'                       => array( 'Nhật_trình' ),
        'Lonelypages'               => array( 'Trang_mồ_côi' ),
        'Longpages'                 => array( 'Trang_dài' ),
+       'MediaStatistics'           => array( 'Thống_kê_phương_tiện' ),
        'MergeHistory'              => array( 'Trộn_lịch_sử' ),
        'MIMEsearch'                => array( 'Tìm_MIME' ),
        'Mostcategories'            => array( 'Thể_loại_lớn_nhất' ),
@@ -118,6 +122,7 @@ $specialPageAliases = array(
        'Newimages'                 => array( 'Tập_tin_mới', 'Hình_mới' ),
        'Newpages'                  => array( 'Trang_mới' ),
        'PagesWithProp'             => array( 'Trang_theo_thuộc_tính' ),
+       'PageLanguage'              => array( 'Ngôn_ngữ_trang' ),
        'PasswordReset'             => array( 'Tái_tạo_mật_khẩu', 'Đặt_lại_mật_khẩu' ),
        'PermanentLink'             => array( 'Liên_kết_thường_trực' ),
        'Popularpages'              => array( 'Trang_phổ_biến' ),
@@ -133,11 +138,13 @@ $specialPageAliases = array(
        'Redirect'                  => array( 'Đổi_hướng' ),
        'ResetTokens'               => array( 'Đặt_lại_dấu_hiệu' ),
        'Revisiondelete'            => array( 'Xóa_phiên_bản', 'Xoá_phiên_bản' ),
+       'RunJobs'                   => array( 'Chạy_việc' ),
        'Search'                    => array( 'Tìm_kiếm' ),
        'Shortpages'                => array( 'Trang_ngắn' ),
        'Specialpages'              => array( 'Trang_đặc_biệt' ),
        'Statistics'                => array( 'Thống_kê' ),
        'Tags'                      => array( 'Thẻ' ),
+       'TrackingCategories'        => array( 'Thể_loại_theo_dõi' ),
        'Unblock'                   => array( 'Bỏ_cấm' ),
        'Uncategorizedcategories'   => array( 'Thể_loại_chưa_phân_loại' ),
        'Uncategorizedimages'       => array( 'Tập_tin_chưa_phân_loại', 'Hình_chưa_phân_loại' ),
@@ -198,7 +205,6 @@ $magicWords = array(
        'numberofusers'             => array( '1', 'SỐ_THÀNH_VIÊN', 'SỐTHÀNHVIÊN', 'NUMBEROFUSERS' ),
        'numberofactiveusers'       => array( '1', 'SỐ_THÀNH_VIÊN_TÍCH_CỰC', 'SỐTHÀNHVIÊNTÍCHCỰC', 'NUMBEROFACTIVEUSERS' ),
        'numberofedits'             => array( '1', 'SỐ_SỬA_ĐỔI', 'SỐSỬAĐỔI', 'NUMBEROFEDITS' ),
-       'numberofviews'             => array( '1', 'SỐ_LẦN_XEM', 'SỐLẦNXEM', 'NUMBEROFVIEWS' ),
        'pagename'                  => array( '1', 'TÊN_TRANG', 'TÊNTRANG', 'PAGENAME' ),
        'pagenamee'                 => array( '1', 'TÊN_TRANG_2', 'TÊNTRANG2', 'PAGENAMEE' ),
        'namespace'                 => array( '1', 'KHÔNG_GIAN_TÊN', 'KHÔNGGIANTÊN', 'NAMESPACE' ),
@@ -212,6 +218,7 @@ $magicWords = array(
        'subjectpagename'           => array( '1', 'TÊN_TRANG_NỘI_DUNG', 'TÊNTRANGNỘIDUNG', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
        'msg'                       => array( '0', 'NHẮN:', 'MSG:' ),
        'subst'                     => array( '0', 'THẾ:', 'SUBST:' ),
+       'safesubst'                 => array( '0', 'THẾ_AN_TOÀN:', 'SAFESUBST:' ),
        'msgnw'                     => array( '0', 'NHẮN_MỚI:', 'NHẮNMỚI:', 'MSGNW:' ),
        'img_thumbnail'             => array( '1', 'nhỏ', 'thumbnail', 'thumb' ),
        'img_manualthumb'           => array( '1', 'nhỏ=$1', 'thumbnail=$1', 'thumb=$1' ),
@@ -220,6 +227,8 @@ $magicWords = array(
        'img_none'                  => array( '1', 'không', 'none' ),
        'img_center'                => array( '1', 'giữa', 'center', 'centre' ),
        'img_framed'                => array( '1', 'khung', 'framed', 'enframed', 'frame' ),
+       'img_frameless'             => array( '1', 'không_khung', 'frameless' ),
+       'img_lang'                  => array( '1', 'tiếng=$1', 'ngôn_ngữ=$1', 'lang=$1' ),
        'img_page'                  => array( '1', 'trang=$1', 'trang_$1', 'page=$1', 'page $1' ),
        'img_upright'               => array( '1', 'đứng', 'đứng=$1', 'đứng_$1', 'upright', 'upright=$1', 'upright $1' ),
        'img_border'                => array( '1', 'viền', 'border' ),
@@ -228,9 +237,11 @@ $magicWords = array(
        'img_super'                 => array( '1', 'chỉ-số-trên', 'super', 'sup' ),
        'img_top'                   => array( '1', 'trên', 'top' ),
        'img_text_top'              => array( '1', 'trên-chữ', 'text-top' ),
+       'img_middle'                => array( '1', 'nửa-chiều-cao', 'middle' ),
        'img_bottom'                => array( '1', 'dưới', 'bottom' ),
        'img_text_bottom'           => array( '1', 'dưới-chữ', 'text-bottom' ),
        'img_link'                  => array( '1', 'liên_kết=$1', 'link=$1' ),
+       'img_alt'                   => array( '1', 'thế=$1', 'thay_thế=$1', 'alt=$1' ),
        'img_class'                 => array( '1', 'lớp=$1', 'class=$1' ),
        'int'                       => array( '0', 'NỘI:', 'INT:' ),
        'sitename'                  => array( '1', 'TÊN_MẠNG', 'TÊNMẠNG', 'SITENAME' ),
@@ -256,6 +267,7 @@ $magicWords = array(
        'revisionyear'              => array( '1', 'NĂM_BẢN', 'NĂMBẢN', 'REVISIONYEAR' ),
        'revisiontimestamp'         => array( '1', 'MỐC_THỜI_GIAN_BẢN', 'MỐCTHỜIGIANBẢN', 'DẤU_THỜI_GIAN_BẢN', 'DẤUTHỜIGIANBẢN', 'REVISIONTIMESTAMP' ),
        'revisionuser'              => array( '1', 'NGƯỜI_DÙNG_BẢN', 'NGƯỜIDÙNGBẢN', 'REVISIONUSER' ),
+       'revisionsize'              => array( '1', 'CỠ_PHIÊN_BẢN', 'CỠPHIÊNBẢN', 'REVISIONSIZE' ),
        'plural'                    => array( '0', 'SỐ_NHIỀU:', 'SỐNHIỀU:', 'PLURAL:' ),
        'fullurl'                   => array( '0', 'URL_ĐỦ:', 'URLĐỦ:', 'FULLURL:' ),
        'canonicalurl'              => array( '0', 'URL_CHUẨN:', 'URLCHUẨN:', 'CANONICALURL:' ),
@@ -271,11 +283,13 @@ $magicWords = array(
        'anchorencode'              => array( '0', 'MÃ_HÓA_NEO', 'MÃHÓANEO', 'MÃ_HOÁ_NEO', 'MÃHOÁNEO', 'ANCHORENCODE' ),
        'currenttimestamp'          => array( '1', 'MỐC_THỜI_GIAN_NÀY', 'MỐCTHỜIGIANNÀY', 'DẤU_THỜI_GIAN_NÀY', 'DẤUTHỜIGIANNÀY', 'CURRENTTIMESTAMP' ),
        'localtimestamp'            => array( '1', 'MỐC_THỜI_GIAN_ĐỊA_PHƯƠNG', 'MỐCTHỜIGIANĐỊAPHƯƠNG', 'DẤU_THỜI_GIAN_ĐỊA_PHƯƠNG', 'DẤUTHỜIGIANĐỊAPHƯƠNG', 'LOCALTIMESTAMP' ),
+       'directionmark'             => array( '1', 'DẤU_HƯỚNG_VIẾT', 'DẤUHƯỚNGVIẾT', 'DIRECTIONMARK', 'DIRMARK' ),
        'language'                  => array( '0', '#NGÔN_NGỮ:', '#NGÔNNGỮ:', '#LANGUAGE:' ),
        'contentlanguage'           => array( '1', 'NGÔN_NGỮ_NỘI_DUNG', 'NGÔNNGỮNỘIDUNG', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
        'pagesinnamespace'          => array( '1', 'CỠ_KHÔNG_GIAN_TÊN:', 'CỠKHÔNGGIANTÊN:', 'CỠ_KGT:', 'CỠKGT:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
        'numberofadmins'            => array( '1', 'SỐ_BẢO_QUẢN_VIÊN', 'SỐBẢOQUẢNVIÊN', 'SỐ_QUẢN_LÝ', 'SỐQUẢNLÝ', 'SỐ_QUẢN_LÍ', 'SỐQUẢNLÍ', 'NUMBEROFADMINS' ),
        'formatnum'                 => array( '0', 'PHÂN_CHIA_SỐ', 'PHÂNCHIASỐ', 'FORMATNUM' ),
+       'special'                   => array( '0', 'đặc_biệt', 'special' ),
        'defaultsort'               => array( '1', 'XẾP_MẶC_ĐỊNH:', 'XẾPMẶCĐỊNH:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
        'filepath'                  => array( '0', 'ĐƯỜNG_DẪN_TẬP_TIN', 'ĐƯỜNGDẪNTẬPTIN', 'FILEPATH:' ),
        'tag'                       => array( '0', 'thẻ', 'tag' ),
@@ -287,6 +301,8 @@ $magicWords = array(
        'numberingroup'             => array( '1', 'CỠ_NHÓM', 'CỠNHÓM', 'NUMBERINGROUP', 'NUMINGROUP' ),
        'staticredirect'            => array( '1', '__ĐỔI_HƯỚNG_NHẤT_ĐỊNH__', '__ĐỔIHƯỚNGNHẤTĐỊNH__', '__STATICREDIRECT__' ),
        'protectionlevel'           => array( '1', 'MỨC_KHÓA', 'MỨCKHÓA', 'MỨC_KHOÁ', 'MỨCKHOÁ', 'PROTECTIONLEVEL' ),
+       'cascadingsources'          => array( '1', 'NGUỒN_THEO_TẦNG', 'NGUỒNTHEOTẦNG', 'CASCADINGSOURCES' ),
+       'formatdate'                => array( '0', 'định_dạng_ngày', 'địnhdạngngày', 'formatdate', 'dateformat' ),
        'url_path'                  => array( '0', 'ĐƯỜNG_DẪN', 'ĐƯỜNGDẪN', 'PATH' ),
        'url_query'                 => array( '0', 'TRUY_VẤN', 'TRUYVẤN', 'QUERY' ),
        'defaultsort_noerror'       => array( '0', 'không_lỗi', 'noerror' ),
index 9b6dad4..ed61df4 100644 (file)
@@ -94,6 +94,7 @@ $specialPageAliases = array(
        'Log'                       => array( 'לאגביכער' ),
        'Lonelypages'               => array( 'פאר\'יתומ\'טע_בלעטער' ),
        'Longpages'                 => array( 'לאנגע_בלעטער' ),
+       'MergeHistory'              => array( 'צונויפמישן_היסטאריע' ),
        'MIMEsearch'                => array( 'זוכן_MIME' ),
        'Mostcategories'            => array( 'מערסטע_קאטעגאריעס' ),
        'Mostimages'                => array( 'מערסטע_פארבונדענע_בילדער' ),
@@ -117,6 +118,7 @@ $specialPageAliases = array(
        'Randompage'                => array( 'צופעליג', 'צופעליגער_בלאט' ),
        'Randomredirect'            => array( 'צופעליק_ווײַטערפֿירן' ),
        'Recentchanges'             => array( 'לעצטע_ענדערונגען' ),
+       'Redirect'                  => array( 'ווײַטערפירונג' ),
        'Revisiondelete'            => array( 'אויסמעקן_ווערסיעס' ),
        'Search'                    => array( 'זוכן' ),
        'Shortpages'                => array( 'קורצע_בלעטער' ),
@@ -152,6 +154,7 @@ $magicWords = array(
        'nogallery'                 => array( '0', '__קיין_גאלעריע__', '__ללא_גלריה__', '__NOGALLERY__' ),
        'toc'                       => array( '0', '__אינהאלט__', '__תוכן_עניינים__', '__תוכן__', '__TOC__' ),
        'noeditsection'             => array( '0', '__נישט_רעדאקטירן__', '__ללא_עריכה__', '__NOEDITSECTION__' ),
+       'currentmonth'              => array( '1', 'לויפיקער_מאנאט', 'חודש נוכחי', 'חודש נוכחי 2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
        'currentday'                => array( '1', 'לויפיקער_טאג', 'יום נוכחי', 'CURRENTDAY' ),
        'currentyear'               => array( '1', 'לויפֿיקע_יאָר', 'שנה נוכחית', 'CURRENTYEAR' ),
        'currenttime'               => array( '1', 'לויפֿיקע_צײַט', 'שעה נוכחית', 'CURRENTTIME' ),
@@ -159,6 +162,7 @@ $magicWords = array(
        'numberofarticles'          => array( '1', 'צאל_ארטיקלען', 'מספר ערכים', 'NUMBEROFARTICLES' ),
        'numberoffiles'             => array( '1', 'צאל_טעקעס', 'מספר קבצים', 'NUMBEROFFILES' ),
        'numberofusers'             => array( '1', 'צאל_באניצער', 'מספר משתמשים', 'NUMBEROFUSERS' ),
+       'numberofactiveusers'       => array( '1', 'צאל_טעטיקע_באניצער', 'מספר משתמשים פעילים', 'NUMBEROFACTIVEUSERS' ),
        'numberofedits'             => array( '1', 'צאל_רעדאקטירונגען', 'מספר עריכות', 'NUMBEROFEDITS' ),
        'pagename'                  => array( '1', 'בלאטנאמען', 'שם הדף', 'PAGENAME' ),
        'namespace'                 => array( '1', 'נאמענטייל', 'מרחב השם', 'NAMESPACE' ),
@@ -188,8 +192,11 @@ $magicWords = array(
        'language'                  => array( '0', '#שפראך:', '#שפה:', '#LANGUAGE:' ),
        'special'                   => array( '0', 'באזונדער', 'מיוחד', 'special' ),
        'defaultsort'               => array( '1', 'גרונטסארטיר:', 'מיון רגיל:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+       'filepath'                  => array( '0', 'טעקעשטעג:', 'נתיב לקובץ:', 'FILEPATH:' ),
+       'tag'                       => array( '0', 'טאג', 'תגית', 'tag' ),
        'hiddencat'                 => array( '1', '__באהאלטענע_קאטעגאריע__', '__באהאלטענע_קאט__', '__קטגוריה_מוסתרת__', '__HIDDENCAT__' ),
        'pagesize'                  => array( '1', 'בלאטגרייס', 'גודל דף', 'PAGESIZE' ),
+       'url_path'                  => array( '0', 'שטעג', 'נתיב', 'PATH' ),
        'url_wiki'                  => array( '0', 'וויקי', 'ויקי', 'WIKI' ),
        'pagesincategory_pages'     => array( '0', 'בלעטער', 'דפים', 'pages' ),
 );
index 9d0573d..8ee87f0 100644 (file)
@@ -98,76 +98,87 @@ $specialPageAliases = array(
        'Allmessages'               => array( '所有消息', '所有訊息', '所有讯息' ),
        'Allpages'                  => array( '所有页面', '所有頁面' ),
        'Ancientpages'              => array( '最早页面', '最早頁面' ),
+       'Badtitle'                  => array( '错误标题', '无效标题', '錯誤標題' ),
        'Blankpage'                 => array( '空白页面', '空白頁面' ),
-       'Booksources'               => array( '网络书源', '網絡書源', '網路書源', '网路书源' ),
-       'BrokenRedirects'           => array( '损坏的重定向页', '損壞的重定向頁' ),
+       'Booksources'               => array( '网络书源', '網絡書源', '網路書源' ),
+       'BrokenRedirects'           => array( '受损重定向' ),
        'Categories'                => array( '页面分类', '頁面分類' ),
        'ChangePassword'            => array( '修改密码', '修改密碼' ),
        'Confirmemail'              => array( '确认电子邮件', '確認電子郵件' ),
-       'Contributions'             => array( '用户贡献', '用戶貢獻' ),
-       'CreateAccount'             => array( '创建账户', '創建帳戶' ),
-       'Deadendpages'              => array( '断链页面', '斷鏈頁面', '斷連頁面', '断连页面' ),
-       'DeletedContributions'      => array( '已删除的用户贡献', '已刪除的用戶貢獻' ),
-       'DoubleRedirects'           => array( '双重重定向页面', '雙重重定向頁面' ),
-       'Emailuser'                 => array( '电邮用户', '電郵用戶' ),
-       'Export'                    => array( '导出页面', '導出頁面' ),
+       'Contributions'             => array( '用户贡献', '用戶貢獻', '使用者貢獻', '使用者贡献' ),
+       'CreateAccount'             => array( '创建账户', '創建賬戶', '建立帳戶', '建立帳號', '建立帐号' ),
+       'Deadendpages'              => array( '断链页面', '斷鏈頁面', '斷連頁面' ),
+       'DeletedContributions'      => array( '删除的贡献' ),
+       'Diff'                      => array( '差异', '差異' ),
+       'DoubleRedirects'           => array( '双重重定向', '雙重重新導向' ),
+       'Emailuser'                 => array( '电邮联系', '電郵聯絡' ),
+       'Export'                    => array( '导出页面', '導出頁面', '匯出頁面', '汇出页面' ),
        'Fewestrevisions'           => array( '最少修订页面', '最少修訂頁面' ),
        'Filepath'                  => array( '文件路径', '文件路徑', '檔案路徑', '档案路径' ),
-       'Import'                    => array( '导入页面', '導入頁面' ),
-       'Invalidateemail'           => array( '不可识别的电邮地址', '不可識別的電郵址' ),
+       'Import'                    => array( '导入页面', '導入頁面', '匯入頁面', '汇入页面' ),
+       'Invalidateemail'           => array( '不可识别的电邮地址', '不可識別的電郵址' ),
        'BlockList'                 => array( '封禁列表' ),
+       'LinkSearch'                => array( '链接搜索', '鏈接搜索', '連結搜尋', '连结搜寻' ),
        'Listadmins'                => array( '管理员列表', '管理員列表' ),
-       'Listbots'                  => array( '机器人列表', '機器人列表' ),
+       'Listbots'                  => array( '机器人列表', '機器人清單', '機械人清單' ),
        'Listfiles'                 => array( '文件列表', '檔案列表', '档案列表' ),
        'Listgrouprights'           => array( '群组权限', '群組權限' ),
-       'Listusers'                 => array( '用户列表', '用戶列表' ),
+       'Listredirects'             => array( '重定向页列表', '重定向列表', '重新導向清單' ),
+       'Listusers'                 => array( '用户列表', '用戶列表', '使用者清單' ),
        'Log'                       => array( '日志', '日誌' ),
        'Lonelypages'               => array( '孤立页面', '孤立頁面' ),
        'Longpages'                 => array( '长页面', '長頁面' ),
        'MergeHistory'              => array( '合并历史', '合併歷史' ),
        'MIMEsearch'                => array( 'MIME搜索', 'MIME搜尋', 'MIME搜寻' ),
        'Mostcategories'            => array( '最多分类页面', '最多分類頁面' ),
-       'Mostimages'                => array( '最多链接文件', '最多鏈接文件', '最多連結檔案', '最多连结档案' ),
+       'Mostimages'                => array( '最多链接文件', '最多鏈接文件', '最多連結檔案' ),
        'Mostlinked'                => array( '最多链接页面', '最多連結頁面' ),
        'Mostlinkedcategories'      => array( '最多链接分类', '最多連結分類' ),
        'Mostlinkedtemplates'       => array( '最多链接模板', '最多連結模板' ),
        'Mostrevisions'             => array( '最多修订页面', '最多修訂頁面' ),
        'Movepage'                  => array( '移动页面', '移動頁面' ),
        'Mycontributions'           => array( '我的贡献', '我的貢獻' ),
-       'Mypage'                    => array( '我的用户页', '我的用戶頁' ),
+       'MyLanguage'                => array( '我的语言', '我的語言' ),
+       'Mypage'                    => array( '我的用户页', '我的用戶頁', '我的使用者頁面' ),
        'Mytalk'                    => array( '我的讨论页', '我的討論頁' ),
-       'Newimages'                 => array( '新建文件', '新建檔案', '新建档案' ),
+       'Newimages'                 => array( '新建文件', '新建檔案' ),
        'Newpages'                  => array( '最新页面', '最新頁面' ),
+       'PasswordReset'             => array( '重置密码', '重設密碼' ),
        'Popularpages'              => array( '热点页面', '熱點頁面' ),
-       'Preferences'               => array( '参数设置', '參數設置' ),
-       'Prefixindex'               => array( '前缀索引', '前綴索引' ),
+       'Preferences'               => array( 'å\8f\82æ\95°è®¾ç½®', 'å\81\8f好設å®\9a', 'å\8f\83æ\95¸è¨­ç½®' ),
+       'Prefixindex'               => array( '前缀索引', '前綴索引', '字首索引' ),
        'Protectedpages'            => array( '已保护页面', '已保護頁面' ),
        'Protectedtitles'           => array( '已保护标题', '已保護標題' ),
        'Randompage'                => array( '随机页面', '隨機頁面' ),
-       'Recentchanges'             => array( '最近更改' ),
-       'Recentchangeslinked'       => array( '链出更改', '鏈出更改', '連出更改', '连出更改' ),
-       'Search'                    => array( '搜索', '搜尋', '搜寻' ),
+       'Recentchanges'             => array( '最近更改', '近期變動' ),
+       'Recentchangeslinked'       => array( '链出更改', '鏈出更改', '連出更改' ),
+       'Redirect'                  => array( '重定向', '重新導向' ),
+       'ResetTokens'               => array( '重置密钥', '重設金鑰' ),
+       'Revisiondelete'            => array( '版本删除' ),
+       'Search'                    => array( '搜索', '搜尋' ),
        'Shortpages'                => array( '短页面', '短頁面' ),
        'Specialpages'              => array( '特殊页面', '特殊頁面' ),
-       'Statistics'                => array( '统计信息', '統計信息', '統計资讯', '统计资讯' ),
+       'Statistics'                => array( '统计', '统计信息', '統計', '統計資訊' ),
+       'Tags'                      => array( '标签', '標籤' ),
+       'TrackingCategories'        => array( '追踪分类' ),
        'Uncategorizedcategories'   => array( '未归类分类', '未歸類分類' ),
-       'Uncategorizedimages'       => array( '未归类文件', '未歸類文件', '未歸類檔案', '未归类档案' ),
+       'Uncategorizedimages'       => array( '未归类文件', '未歸類文件', '未歸類檔案' ),
        'Uncategorizedpages'        => array( '未归类页面', '未歸類頁面' ),
        'Uncategorizedtemplates'    => array( '未归类模板', '未歸類模板' ),
        'Undelete'                  => array( '恢复被删页面', '恢復被刪頁面' ),
        'Unusedcategories'          => array( '未使用分类', '未使用分類' ),
-       'Unusedimages'              => array( '未使用文件', '未使用檔案', '未使用档案' ),
+       'Unusedimages'              => array( '未使用文件', '未使用檔案' ),
        'Unusedtemplates'           => array( '未使用模板' ),
        'Upload'                    => array( '上传文件', '上傳檔案', '上載檔案', '上载档案' ),
-       'Userlogin'                 => array( '用户登录', '用戶登錄', '用戶登入', '用户登入' ),
-       'Userlogout'                => array( '用户登出', '用戶登出' ),
-       'Userrights'                => array( '用户权限', '用戶權限' ),
-       'Version'                   => array( '版本信息', '版本資訊', '版本资讯' ),
-       'Wantedcategories'          => array( '待撰分类', '待撰分類' ),
-       'Wantedfiles'               => array( '需要的文件', '需要的檔案', '需要的档案' ),
-       'Wantedpages'               => array( '待撰页面', '待撰頁面' ),
+       'Userlogin'                 => array( '用户登录', '用戶登入', '使用者登入' ),
+       'Userlogout'                => array( '用户退出', '用戶登出', '使用者登出' ),
+       'Userrights'                => array( '用户权限', '用戶權限', '使用者權限' ),
+       'Version'                   => array( '版本' ),
+       'Wantedcategories'          => array( '需要的分类' ),
+       'Wantedfiles'               => array( '需要的文件', '需要的檔案' ),
+       'Wantedpages'               => array( '需要的页面' ),
        'Wantedtemplates'           => array( '需要的模板' ),
-       'Watchlist'                 => array( '监视列表', '監視列表' ),
-       'Whatlinkshere'             => array( '链入页面', '鏈入頁面', '連入頁面', '连入页面' ),
+       'Watchlist'                 => array( '监视列表', '監視列表', '監視清单' ),
+       'Whatlinkshere'             => array( '链入页面', '鏈入頁面', '連入頁面' ),
 );
 
index e6501c6..84d4373 100644 (file)
@@ -136,44 +136,48 @@ $specialPageAliases = array(
        'Allmessages'               => array( '所有信息' ),
        'AllMyUploads'              => array( '我上传的所有文件', '我的所有文件' ),
        'Allpages'                  => array( '所有页面' ),
+       'ApiHelp'                   => array( 'Api帮助' ),
        'Ancientpages'              => array( '最老页面' ),
        'Badtitle'                  => array( '错误标题', '无效标题' ),
        'Blankpage'                 => array( '空白页面' ),
-       'Block'                     => array( '封禁用户' ),
+       'Block'                     => array( '封禁', '封禁IP', '封禁用户', '封' ),
        'Booksources'               => array( '网络书源' ),
        'BrokenRedirects'           => array( '受损重定向' ),
        'Categories'                => array( '页面分类' ),
-       'ChangeEmail'               => array( '修改邮箱' ),
-       'ChangePassword'            => array( '修改密码' ),
-       'ComparePages'              => array( '对比页面', '比较页面' ),
+       'ChangeEmail'               => array( '修改邮箱地址' ),
+       'ChangePassword'            => array( '修改密码', '重置密码', '找回密码' ),
+       'ComparePages'              => array( '对比页面' ),
        'Confirmemail'              => array( '确认电子邮件' ),
-       'Contributions'             => array( '用户贡献' ),
+       'Contributions'             => array( '用户贡献', '贡献' ),
        'CreateAccount'             => array( '创建账户' ),
        'Deadendpages'              => array( '断链页面' ),
        'DeletedContributions'      => array( '已删除的用户贡献' ),
+       'Diff'                      => array( '编辑差异' ),
        'DoubleRedirects'           => array( '双重重定向', '两次重定向' ),
        'EditWatchlist'             => array( '编辑监视列表' ),
        'Emailuser'                 => array( '电邮联系' ),
        'ExpandTemplates'           => array( '展开模板' ),
-       'Export'                    => array( '导出页面' ),
+       'Export'                    => array( '导出页面', '导出' ),
        'Fewestrevisions'           => array( '版本最少页面', '最少修订页面' ),
        'FileDuplicateSearch'       => array( '搜索重复文件' ),
        'Filepath'                  => array( '文件路径' ),
-       'Import'                    => array( '导入页面' ),
+       'Import'                    => array( '导入页面', '导入' ),
        'Invalidateemail'           => array( '无效电邮地址' ),
        'JavaScriptTest'            => array( 'JavaScript测试' ),
-       'BlockList'                 => array( '封禁列表' ),
+       'BlockList'                 => array( '封禁列表', 'IP封禁列表' ),
        'LinkSearch'                => array( '搜索网页链接' ),
        'Listadmins'                => array( '管理员列表' ),
        'Listbots'                  => array( '机器人列表' ),
-       'Listfiles'                 => array( '文件列表' ),
+       'Listfiles'                 => array( '文件列表', '图像列表' ),
        'Listgrouprights'           => array( '用户组权限' ),
        'Listredirects'             => array( '重定向页列表' ),
+       'ListDuplicatedFiles'       => array( '重复文件列表' ),
        'Listusers'                 => array( '用户列表' ),
        'Lockdb'                    => array( '锁定数据库' ),
        'Log'                       => array( '日志' ),
        'Lonelypages'               => array( '孤立页面' ),
        'Longpages'                 => array( '长页面' ),
+       'MediaStatistics'           => array( '媒体统计' ),
        'MergeHistory'              => array( '合并历史' ),
        'MIMEsearch'                => array( 'MIME搜索' ),
        'Mostcategories'            => array( '最多分类页面' ),
@@ -181,52 +185,55 @@ $specialPageAliases = array(
        'Mostinterwikis'            => array( '最多跨wiki链接页面' ),
        'Mostlinked'                => array( '最多链接页面' ),
        'Mostlinkedcategories'      => array( '最多链接分类' ),
-       'Mostlinkedtemplates'       => array( '最多链接模板' ),
+       'Mostlinkedtemplates'       => array( '最多嵌入页面', '最多链接模板', '最多使用模板' ),
        'Mostrevisions'             => array( '最多修订页面' ),
        'Movepage'                  => array( '移动页面' ),
        'Mycontributions'           => array( '我的贡献' ),
        'MyLanguage'                => array( '我的语言' ),
        'Mypage'                    => array( '我的用户页' ),
-       'Mytalk'                    => array( '我的讨论页' ),
-       'Myuploads'                 => array( '我上传的文件' ),
-       'Newimages'                 => array( '新建文件' ),
+       'Mytalk'                    => array( '我的讨论页', '我的对话页' ),
+       'Myuploads'                 => array( '我上传的文件', '我的文件' ),
+       'Newimages'                 => array( '新建文件', '新建图像' ),
        'Newpages'                  => array( '新建页面' ),
-       'PagesWithProp'             => array( '带属性的页面' ),
+       'PagesWithProp'             => array( '带属性的页面', '基于属性的页面' ),
+       'PageLanguage'              => array( '页面语言' ),
        'PasswordReset'             => array( '重设密码' ),
-       'PermanentLink'             => array( '永久链接' ),
+       'PermanentLink'             => array( '固定链接', '永久链接' ),
        'Popularpages'              => array( '热点页面' ),
        'Preferences'               => array( '参数设置', '设置' ),
        'Prefixindex'               => array( '前缀索引' ),
        'Protectedpages'            => array( '已保护页面' ),
        'Protectedtitles'           => array( '已保护标题' ),
-       'Randompage'                => array( '随机页面' ),
+       'Randompage'                => array( '随机', '随机页面' ),
        'RandomInCategory'          => array( '分类内随机' ),
        'Randomredirect'            => array( '随机重定向', '随机重定向页' ),
        'Recentchanges'             => array( '最近更改' ),
-       'Recentchangeslinked'       => array( '相关更改', '链出更改' ),
+       'Recentchangeslinked'       => array( '最近链出更改', '相关更改' ),
        'Redirect'                  => array( '重定向' ),
        'ResetTokens'               => array( '重置权标' ),
-       'Revisiondelete'            => array( '删除或恢复修订' ),
+       'Revisiondelete'            => array( '删除修订', '恢复修订' ),
+       'RunJobs'                   => array( '运行工作' ),
        'Search'                    => array( '搜索' ),
        'Shortpages'                => array( '短页面' ),
        'Specialpages'              => array( '特殊页面' ),
        'Statistics'                => array( '统计信息' ),
        'Tags'                      => array( '标签' ),
-       'Unblock'                   => array( '解除封禁' ),
+       'TrackingCategories'        => array( '追踪分类' ),
+       'Unblock'                   => array( '解除封禁', '解封' ),
        'Uncategorizedcategories'   => array( '未分类分类' ),
-       'Uncategorizedimages'       => array( '未分类文件' ),
+       'Uncategorizedimages'       => array( '未分类文件', '未分类图像' ),
        'Uncategorizedpages'        => array( '未分类页面' ),
        'Uncategorizedtemplates'    => array( '未分类模板' ),
        'Undelete'                  => array( '恢复被删页面' ),
        'Unlockdb'                  => array( '解除数据库锁定' ),
        'Unusedcategories'          => array( '未使用分类' ),
-       'Unusedimages'              => array( '未使用文件' ),
+       'Unusedimages'              => array( '未使用文件', '未使用图像' ),
        'Unusedtemplates'           => array( '未使用模板' ),
        'Unwatchedpages'            => array( '未受监视页面' ),
        'Upload'                    => array( '上传文件' ),
        'UploadStash'               => array( '上传藏匿' ),
-       'Userlogin'                 => array( '用户登录' ),
-       'Userlogout'                => array( '用户退出' ),
+       'Userlogin'                 => array( '用户登录', '登录' ),
+       'Userlogout'                => array( '用户退出', '退出' ),
        'Userrights'                => array( '用户权限' ),
        'Version'                   => array( '版本', '版本信息' ),
        'Wantedcategories'          => array( '需要的分类', '待撰分类' ),
@@ -235,7 +242,7 @@ $specialPageAliases = array(
        'Wantedtemplates'           => array( '需要的模板' ),
        'Watchlist'                 => array( '监视列表' ),
        'Whatlinkshere'             => array( '链入页面' ),
-       'Withoutinterwiki'          => array( '无跨维基', '无跨维基链接页面' ),
+       'Withoutinterwiki'          => array( '无跨wiki', '无跨wiki链接页面' ),
 );
 
 $magicWords = array(
@@ -256,10 +263,13 @@ $magicWords = array(
        'currentyear'               => array( '1', '今年', 'CURRENTYEAR' ),
        'currenttime'               => array( '1', '当前时间', '此时', 'CURRENTTIME' ),
        'currenthour'               => array( '1', '当前小时', 'CURRENTHOUR' ),
-       'localmonth'                => array( '1', '本地月', 'LOCALMONTH', 'LOCALMONTH2' ),
+       'localmonth'                => array( '1', '本地月', '本地月2', 'LOCALMONTH', 'LOCALMONTH2' ),
+       'localmonth1'               => array( '1', '本地月1', 'LOCALMONTH1' ),
        'localmonthname'            => array( '1', '本地月份名', 'LOCALMONTHNAME' ),
        'localmonthnamegen'         => array( '1', '本地月历', 'LOCALMONTHNAMEGEN' ),
+       'localmonthabbrev'          => array( '1', '本地月缩写', 'LOCALMONTHABBREV' ),
        'localday'                  => array( '1', '本地日', 'LOCALDAY' ),
+       'localday2'                 => array( '1', '本地日2', 'LOCALDAY2' ),
        'localdayname'              => array( '1', '本地日名', 'LOCALDAYNAME' ),
        'localyear'                 => array( '1', '本地年', 'LOCALYEAR' ),
        'localtime'                 => array( '1', '本地时间', 'LOCALTIME' ),
@@ -270,20 +280,27 @@ $magicWords = array(
        'numberofusers'             => array( '1', '用户数', 'NUMBEROFUSERS' ),
        'numberofactiveusers'       => array( '1', '活跃用户数', 'NUMBEROFACTIVEUSERS' ),
        'numberofedits'             => array( '1', '编辑数', 'NUMBEROFEDITS' ),
-       'numberofviews'             => array( '1', '访问数', 'NUMBEROFVIEWS' ),
        'pagename'                  => array( '1', '页名', '页面名', '页面名称', 'PAGENAME' ),
-       'pagenamee'                 => array( '1', '页名等同', '页面名等同', '页面名E', 'PAGENAMEE' ),
+       'pagenamee'                 => array( '1', '页面名等同', '页面名称等同', 'PAGENAMEE' ),
        'namespace'                 => array( '1', '名字空间', 'NAMESPACE' ),
-       'namespacee'                => array( '1', '名字空间等同', '名字空间E', 'NAMESPACEE' ),
+       'namespacee'                => array( '1', '名字空间等同', 'NAMESPACEE' ),
        'namespacenumber'           => array( '1', '名字空间编号', 'NAMESPACENUMBER' ),
        'talkspace'                 => array( '1', '讨论空间', '讨论名字空间', 'TALKSPACE' ),
-       'talkspacee'                => array( '1', '讨论空间等同', '讨论名字空间E', 'TALKSPACEE' ),
-       'fullpagename'              => array( '1', '页面全名', '完整页面名', 'FULLPAGENAME' ),
-       'fullpagenamee'             => array( '1', '完整页面名E', 'FULLPAGENAMEE' ),
-       'subpagename'               => array( '1', '子页面名', 'SUBPAGENAME' ),
-       'subpagenamee'              => array( '1', '子页面名等同', '子页面名E', 'SUBPAGENAMEE' ),
-       'talkpagename'              => array( '1', '讨论页面名', 'TALKPAGENAME' ),
-       'talkpagenamee'             => array( '1', '讨论页面名等同', '讨论页面名E', 'TALKPAGENAMEE' ),
+       'talkspacee'                => array( '1', '讨论空间等同', '讨论名字空间等同', 'TALKSPACEE' ),
+       'subjectspace'              => array( '1', '主名字空间', '条目名字空间', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+       'subjectspacee'             => array( '1', '主名字空间等同', '条目名字空间等同', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+       'fullpagename'              => array( '1', '页面全称', '完整页面名称', 'FULLPAGENAME' ),
+       'fullpagenamee'             => array( '1', '完整页面名称等同', 'FULLPAGENAMEE' ),
+       'subpagename'               => array( '1', '子页面名称', 'SUBPAGENAME' ),
+       'subpagenamee'              => array( '1', '子页面名称等同', 'SUBPAGENAMEE' ),
+       'rootpagename'              => array( '1', '根页面名称', 'ROOTPAGENAME' ),
+       'rootpagenamee'             => array( '1', '根页面名称等同', 'ROOTPAGENAMEE' ),
+       'basepagename'              => array( '1', '基础页面名称', 'BASEPAGENAME' ),
+       'basepagenamee'             => array( '1', '基础页面名称等同', 'BASEPAGENAMEE' ),
+       'talkpagename'              => array( '1', '讨论页面名称', '对话页面名称', 'TALKPAGENAME' ),
+       'talkpagenamee'             => array( '1', '讨论页面名称等同', '对话页面名称等同', 'TALKPAGENAMEE' ),
+       'subjectpagename'           => array( '1', '主名字空间页面名称', '条目页面名称', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+       'subjectpagenamee'          => array( '1', '主名字空间页面名称等同', '条目页面名称等同', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
        'subst'                     => array( '0', '替代:', 'SUBST:' ),
        'safesubst'                 => array( '0', '安全替代:', 'SAFESUBST:' ),
        'img_thumbnail'             => array( '1', '缩略图', 'thumbnail', 'thumb' ),
@@ -295,15 +312,25 @@ $magicWords = array(
        'img_center'                => array( '1', '居中', 'center', 'centre' ),
        'img_framed'                => array( '1', '有框', 'framed', 'enframed', 'frame' ),
        'img_frameless'             => array( '1', '无框', 'frameless' ),
+       'img_lang'                  => array( '1', '语言=$1', 'lang=$1' ),
        'img_page'                  => array( '1', '页数=$1', '$1页', 'page=$1', 'page $1' ),
+       'img_upright'               => array( '1', '右上', '右上=$1', '右上$1', 'upright', 'upright=$1', 'upright $1' ),
        'img_border'                => array( '1', '边框', 'border' ),
+       'img_baseline'              => array( '1', '基线', 'baseline' ),
+       'img_sub'                   => array( '1', '子', 'sub' ),
+       'img_super'                 => array( '1', '超', 'super', 'sup' ),
+       'img_top'                   => array( '1', '顶部', 'top' ),
+       'img_text_top'              => array( '1', '文字顶部', 'text-top' ),
+       'img_middle'                => array( '1', '中间', 'middle' ),
+       'img_bottom'                => array( '1', '底部', 'bottom' ),
+       'img_text_bottom'           => array( '1', '文字底部', 'text-bottom' ),
        'img_link'                  => array( '1', '链接=$1', 'link=$1' ),
        'img_alt'                   => array( '1', '替代=$1', '替代文本=$1', 'alt=$1' ),
        'img_class'                 => array( '1', '类=$1', 'class=$1' ),
        'int'                       => array( '0', '界面:', 'INT:' ),
        'sitename'                  => array( '1', '站点名称', 'SITENAME' ),
-       'ns'                        => array( '0', '名空间:', 'NS:' ),
-       'nse'                       => array( '0', '名空间E:', 'NSE:' ),
+       'ns'                        => array( '0', '名空间:', 'NS:' ),
+       'nse'                       => array( '0', '名空间E:', 'NSE:' ),
        'localurl'                  => array( '0', '本地URL:', 'LOCALURL:' ),
        'localurle'                 => array( '0', '本地URLE:', 'LOCALURLE:' ),
        'articlepath'               => array( '0', '条目路径', 'ARTICLEPATH' ),
@@ -313,17 +340,32 @@ $magicWords = array(
        'scriptpath'                => array( '0', '脚本路径', 'SCRIPTPATH' ),
        'stylepath'                 => array( '0', '样式路径', 'STYLEPATH' ),
        'grammar'                   => array( '0', '语法:', 'GRAMMAR:' ),
-       'gender'                    => array( '0', '性:', '性别:', 'GENDER:' ),
+       'gender'                    => array( '0', '性别:', 'GENDER:' ),
        'notitleconvert'            => array( '0', '__不转换标题__', '__NOTITLECONVERT__', '__NOTC__' ),
        'nocontentconvert'          => array( '0', '__不转换内容__', '__NOCONTENTCONVERT__', '__NOCC__' ),
        'currentweek'               => array( '1', '本周', 'CURRENTWEEK' ),
+       'currentdow'                => array( '1', '当前DOW', 'CURRENTDOW' ),
+       'localweek'                 => array( '1', '本地周', 'LOCALWEEK' ),
+       'localdow'                  => array( '1', '本地DOW', 'LOCALDOW' ),
+       'revisionid'                => array( '1', '修订ID', 'REVISIONID' ),
+       'revisionday'               => array( '1', '修订日', 'REVISIONDAY' ),
+       'revisionday2'              => array( '1', '修订日2', 'REVISIONDAY2' ),
+       'revisionmonth'             => array( '1', '修订月', 'REVISIONMONTH' ),
+       'revisionmonth1'            => array( '1', '修订月1', 'REVISIONMONTH1' ),
+       'revisionyear'              => array( '1', '修订年', 'REVISIONYEAR' ),
+       'revisiontimestamp'         => array( '1', '修订时间戳', 'REVISIONTIMESTAMP' ),
+       'revisionuser'              => array( '1', '修订用户', 'REVISIONUSER' ),
+       'revisionsize'              => array( '1', '修订大小', 'REVISIONSIZE' ),
        'plural'                    => array( '0', '复数:', 'PLURAL:' ),
        'fullurl'                   => array( '0', '完整URL:', 'FULLURL:' ),
-       'fullurle'                  => array( '0', '完整URL等同:', '完整URLE:', 'FULLURLE:' ),
+       'fullurle'                  => array( '0', '完整URL等同:', 'FULLURLE:' ),
+       'canonicalurl'              => array( '0', '规范URL:', 'CANONICALURL:' ),
+       'canonicalurle'             => array( '0', '规范URL等同:', 'CANONICALURLE:' ),
        'lcfirst'                   => array( '0', '小写首字:', 'LCFIRST:' ),
        'ucfirst'                   => array( '0', '大写首字:', 'UCFIRST:' ),
        'lc'                        => array( '0', '小写:', 'LC:' ),
        'uc'                        => array( '0', '大写:', 'UC:' ),
+       'raw'                       => array( '0', '原始:', 'RAW:' ),
        'displaytitle'              => array( '1', '显示标题', 'DISPLAYTITLE' ),
        'newsectionlink'            => array( '1', '__新段落链接__', '__NEWSECTIONLINK__' ),
        'nonewsectionlink'          => array( '1', '__无新段落链接__', '__NONEWSECTIONLINK__' ),
@@ -341,21 +383,30 @@ $magicWords = array(
        'padleft'                   => array( '0', '左填充', 'PADLEFT' ),
        'padright'                  => array( '0', '右填充', 'PADRIGHT' ),
        'special'                   => array( '0', '特殊', 'special' ),
-       'speciale'                  => array( '0', '特殊等同', '特殊e', 'speciale' ),
+       'speciale'                  => array( '0', '特殊等同', 'speciale' ),
        'defaultsort'               => array( '1', '默认排序:', '默认排序关键字:', '默认分类排序:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
        'filepath'                  => array( '0', '文件路径:', 'FILEPATH:' ),
        'tag'                       => array( '0', '标记', 'tag' ),
        'hiddencat'                 => array( '1', '__隐藏分类__', '__HIDDENCAT__' ),
-       'pagesincategory'           => array( '1', '分类中页数', '分类中页面数', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+       'pagesincategory'           => array( '1', '分类中页面数', 'PAGESINCATEGORY', 'PAGESINCAT' ),
        'pagesize'                  => array( '1', '页面大小', 'PAGESIZE' ),
        'index'                     => array( '1', '__索引__', '__INDEX__' ),
-       'noindex'                   => array( '1', '__索引__', '__NOINDEX__' ),
+       'noindex'                   => array( '1', '__索引__', '__NOINDEX__' ),
        'numberingroup'             => array( '1', '组中用户数', 'NUMBERINGROUP', 'NUMINGROUP' ),
        'staticredirect'            => array( '1', '__静态重定向__', '__STATICREDIRECT__' ),
        'protectionlevel'           => array( '1', '保护级别', 'PROTECTIONLEVEL' ),
+       'cascadingsources'          => array( '1', '级联来源', 'CASCADINGSOURCES' ),
        'formatdate'                => array( '0', '格式化日期', '日期格式化', 'formatdate', 'dateformat' ),
+       'url_path'                  => array( '0', '路径', 'PATH' ),
+       'url_query'                 => array( '0', '查询', 'QUERY' ),
        'defaultsort_noerror'       => array( '0', '不报错', 'noerror' ),
        'defaultsort_noreplace'     => array( '0', '不替换', 'noreplace' ),
+       'displaytitle_noerror'      => array( '0', '无错误', 'noerror' ),
+       'displaytitle_noreplace'    => array( '0', '无代替', 'noreplace' ),
+       'pagesincategory_all'       => array( '0', '所有', 'all' ),
+       'pagesincategory_pages'     => array( '0', '页面', 'pages' ),
+       'pagesincategory_subcats'   => array( '0', '子分类', 'subcats' ),
+       'pagesincategory_files'     => array( '0', '文件', 'files' ),
 );
 
 $linkTrail = '/^()(.*)$/sD';
index 9b7dc9e..6e5dea1 100644 (file)
@@ -116,122 +116,144 @@ $namespaceAliases = array(
 );
 
 $specialPageAliases = array(
-       'Activeusers'               => array( '活躍用戶' ),
-       'Allmessages'               => array( '所有息' ),
-       'AllMyUploads'              => array( 'æ\89\80æ\9c\89æ\9c¬äººä¸\8aè¼\89', 'æ\89\80æ\9c\89æ\9c¬äººæ\96\87件' ),
+       'Activeusers'               => array( '活躍使用者' ),
+       'Allmessages'               => array( '所有息' ),
+       'AllMyUploads'              => array( 'æ\89\80æ\9c\89æ\88\91ç\9a\84ä¸\8aå\82³', 'æ\89\80æ\9c\89æ\88\91ç\9a\84æª\94æ¡\88', 'æ\89\80æ\9c\89æ\9c¬äººä¸\8aè¼\89', 'æ\89\80æ\9c\89æ\9c¬äººæª\94æ¡\88' ),
        'Allpages'                  => array( '所有頁面' ),
-       'Ancientpages'              => array( '最早頁面' ),
+       'ApiHelp'                   => array( 'Api使用說明' ),
+       'Ancientpages'              => array( '最舊頁面', '最早頁面' ),
        'Badtitle'                  => array( '無效標題' ),
        'Blankpage'                 => array( '空白頁面' ),
-       'Block'                     => array( '查封用戶' ),
-       'Booksources'               => array( '網絡書源' ),
-       'BrokenRedirects'           => array( '損壞的重定向頁' ),
-       'Categories'                => array( '頁面分類' ),
-       'ChangeEmail'               => array( '修改郵箱' ),
-       'ChangePassword'            => array( '修改密碼' ),
+       'Block'                     => array( '封鎖', '封鎖IP', '封鎖使用者', '封禁', '封禁IP', '封禁使用者' ),
+       'Booksources'               => array( '書籍來源', '網路書源' ),
+       'BrokenRedirects'           => array( '損壞的重新導向', '損壞的重定向頁' ),
+       'Categories'                => array( '分類', '頁面分類' ),
+       'ChangeEmail'               => array( '更改信箱', '修改郵箱' ),
+       'ChangePassword'            => array( '更改密碼', '修改密碼', '密碼重設' ),
        'ComparePages'              => array( '頁面比較' ),
-       'Confirmemail'              => array( '確認電子郵件' ),
-       'Contributions'             => array( '用戶貢獻' ),
-       'CreateAccount'             => array( '創建賬戶' ),
-       'Deadendpages'              => array( '斷鏈頁面' ),
-       'DeletedContributions'      => array( '已刪除的用戶貢獻' ),
-       'DoubleRedirects'           => array( '雙重重定向頁面' ),
-       'EditWatchlist'             => array( '編輯監視列表' ),
-       'Emailuser'                 => array( '電郵用戶' ),
+       'Confirmemail'              => array( '確認信箱', '確認電郵' ),
+       'Contributions'             => array( '使用者貢獻', '用戶貢獻' ),
+       'CreateAccount'             => array( '建立帳號', '建立帳戶' ),
+       'Deadendpages'              => array( '無連結頁面', '斷鏈頁面' ),
+       'DeletedContributions'      => array( '已刪除的貢獻', '已刪除的用戶貢獻' ),
+       'Diff'                      => array( '編輯差異' ),
+       'DoubleRedirects'           => array( '雙重的重新導向', '雙重重定向頁面' ),
+       'EditWatchlist'             => array( '編輯監視清單', '編輯監視列表' ),
+       'Emailuser'                 => array( '寄信給使用者', '寄信', '電郵使用者' ),
        'ExpandTemplates'           => array( '展開模板' ),
-       'Export'                    => array( 'å°\8e出頁面' ),
+       'Export'                    => array( 'å\8c¯å\87º', 'å\8c¯出頁面' ),
        'Fewestrevisions'           => array( '最少修訂頁面' ),
-       'FileDuplicateSearch'       => array( '搜索重複文件' ),
-       'Filepath'                  => array( 'æ\96\87件路徑' ),
-       'Import'                    => array( 'å°\8e入頁面' ),
-       'Invalidateemail'           => array( '不可識別的電郵地址' ),
+       'FileDuplicateSearch'       => array( '重複檔案搜尋', '搜尋重複檔案' ),
+       'Filepath'                  => array( 'æª\94æ¡\88路徑' ),
+       'Import'                    => array( 'å\8c¯å\85¥', 'å\8c¯入頁面' ),
+       'Invalidateemail'           => array( '無效的信箱' ),
        'JavaScriptTest'            => array( 'JavaScript測試' ),
-       'BlockList'                 => array( '封禁列表' ),
-       'LinkSearch'                => array( '搜索網頁鏈接' ),
-       'Listadmins'                => array( '管理員列表' ),
-       'Listbots'                  => array( '機器人列表' ),
-       'Listfiles'                 => array( '文件列表' ),
-       'Listgrouprights'           => array( '群組權限' ),
-       'Listredirects'             => array( '重定向頁面列表' ),
-       'Listusers'                 => array( '用戶列表' ),
-       'Lockdb'                    => array( '鎖定數據庫' ),
+       'BlockList'                 => array( '封鎖清單', 'IP封鎖清單', '封禁列表', 'IP封禁列表' ),
+       'LinkSearch'                => array( '連結搜尋', '搜尋網頁連結' ),
+       'Listadmins'                => array( '管理員清單', '管理員列表' ),
+       'Listbots'                  => array( '機器人清單', '機械人列表' ),
+       'Listfiles'                 => array( '檔案清單', '圖片清單', '檔案列表', '圖像列表' ),
+       'Listgrouprights'           => array( '群組權限清單', '使用者群組權限', '群組權限列表' ),
+       'Listredirects'             => array( '重新導向清單', '重定向頁面列表' ),
+       'ListDuplicatedFiles'       => array( '重複檔案清單', '重複檔案列表' ),
+       'Listusers'                 => array( '使用者清單', '使用者列表' ),
+       'Lockdb'                    => array( '鎖定資料庫', '鎖定數據庫' ),
        'Log'                       => array( '日誌' ),
        'Lonelypages'               => array( '孤立頁面' ),
-       'Longpages'                 => array( '長頁面' ),
+       'Longpages'                 => array( '過長的頁面', '長頁面' ),
+       'MediaStatistics'           => array( '媒體統計' ),
        'MergeHistory'              => array( '合併歷史' ),
-       'MIMEsearch'                => array( 'MIME搜' ),
-       'Mostcategories'            => array( '最多分類頁面' ),
-       'Mostimages'                => array( '最多鏈接文件' ),
-       'Mostinterwikis'            => array( '最多跨維基連結' ),
-       'Mostlinked'                => array( '最多鏈接頁面' ),
-       'Mostlinkedcategories'      => array( '最多鏈接分類' ),
-       'Mostlinkedtemplates'       => array( '最多鏈接模板' ),
-       'Mostrevisions'             => array( '最多修訂頁面' ),
+       'MIMEsearch'                => array( 'MIME搜' ),
+       'Mostcategories'            => array( '最多分類的頁面', '最多分類頁面' ),
+       'Mostimages'                => array( '被連結最多的檔案', '最多連結檔案' ),
+       'Mostinterwikis'            => array( '最多_Interwiki_連結的頁面', '最多跨wiki連結' ),
+       'Mostlinked'                => array( '被連結最多的頁面', '最多連結頁面' ),
+       'Mostlinkedcategories'      => array( '被連結最多的分類', '最多連結分類' ),
+       'Mostlinkedtemplates'       => array( '被引用最多的頁面', '被連結最多的模板', '被使用最多的模板' ),
+       'Mostrevisions'             => array( '最多修訂的頁面', '最多修訂頁面' ),
        'Movepage'                  => array( '移動頁面' ),
        'Mycontributions'           => array( '我的貢獻' ),
        'MyLanguage'                => array( '我的語言' ),
-       'Mypage'                    => array( '我的用戶頁' ),
-       'Mytalk'                    => array( '我的討論頁' ),
-       'Myuploads'                 => array( '我的上傳' ),
-       'Newimages'                 => array( '新建文件' ),
-       'Newpages'                  => array( '新頁面' ),
-       'PagesWithProp'             => array( '帶屬性頁面' ),
+       'Mypage'                    => array( '我的使用者頁面', '我的用戶頁' ),
+       'Mytalk'                    => array( '我的對話', '我的討論頁' ),
+       'Myuploads'                 => array( '我的上傳', '我的上載', '我的檔案' ),
+       'Newimages'                 => array( '新增檔案', '新增圖片' ),
+       'Newpages'                  => array( '新增頁面', '新頁面' ),
+       'PagesWithProp'             => array( '擁有屬性的頁面', '帶屬性頁面' ),
+       'PageLanguage'              => array( '頁面語言' ),
        'PasswordReset'             => array( '重設密碼' ),
-       'PermanentLink'             => array( '永久連結' ),
-       'Popularpages'              => array( '熱點頁面' ),
-       'Preferences'               => array( 'å\8f\83æ\95¸è¨­ç½®' ),
-       'Prefixindex'               => array( '前綴索引' ),
-       'Protectedpages'            => array( '已保護頁面' ),
-       'Protectedtitles'           => array( '已保護標題' ),
+       'PermanentLink'             => array( '靜態連結', '永久連結' ),
+       'Popularpages'              => array( 'ç\86±é\96\80é \81é\9d¢', 'ç\86±é»\9eé \81é\9d¢' ),
+       'Preferences'               => array( 'å\81\8f好設å®\9a' ),
+       'Prefixindex'               => array( 'å­\97é¦\96ç´¢å¼\95', 'å\89\8d綴索å¼\95' ),
+       'Protectedpages'            => array( 'å\8f\97ä¿\9dè­·é \81é\9d¢', 'å·²ä¿\9dè­·é \81é\9d¢' ),
+       'Protectedtitles'           => array( 'å\8f\97ä¿\9dè­·æ¨\99é¡\8c', 'å·²ä¿\9dè­·æ¨\99é¡\8c' ),
        'Randompage'                => array( '隨機頁面' ),
-       'Randomredirect'            => array( '隨機重定向頁面' ),
-       'Recentchanges'             => array( '最近更改' ),
-       'Recentchangeslinked'       => array( '鏈出更改' ),
-       'Redirect'                  => array( '重定向' ),
-       'ResetTokens'               => array( '覆寫令牌' ),
-       'Revisiondelete'            => array( '刪除或恢復版本' ),
-       'Search'                    => array( '搜索' ),
-       'Shortpages'                => array( '短頁面' ),
+       'RandomInCategory'          => array( '隨機分類頁面', '於分類中隨機' ),
+       'Randomredirect'            => array( '隨機重新導向', '隨機重定向頁面' ),
+       'Recentchanges'             => array( '最近變更', '最近更改' ),
+       'Recentchangeslinked'       => array( '已連結的最近變更', '相關變更', '連出更改' ),
+       'Redirect'                  => array( '重新導向', '重定向' ),
+       'ResetTokens'               => array( '重設密鑰', '覆寫令牌' ),
+       'Revisiondelete'            => array( '修訂刪除', '刪除或恢復版本' ),
+       'RunJobs'                   => array( '執行作業', '運行工作' ),
+       'Search'                    => array( '搜尋' ),
+       'Shortpages'                => array( '過短的頁面', '短頁面' ),
        'Specialpages'              => array( '特殊頁面' ),
-       'Statistics'                => array( '統計信息' ),
+       'Statistics'                => array( '統計資訊' ),
        'Tags'                      => array( '標籤' ),
-       'Unblock'                   => array( '解除封禁' ),
-       'Uncategorizedcategories'   => array( '未歸類分類' ),
-       'Uncategorizedimages'       => array( '未歸類文件' ),
-       'Uncategorizedpages'        => array( '未歸類頁面' ),
-       'Uncategorizedtemplates'    => array( '未歸類模板' ),
-       'Undelete'                  => array( '恢復被刪頁面' ),
-       'Unlockdb'                  => array( '解除數據庫鎖定' ),
-       'Unusedcategories'          => array( '未使用分類' ),
-       'Unusedimages'              => array( '未使用文件' ),
-       'Unusedtemplates'           => array( '未使用模板' ),
-       'Unwatchedpages'            => array( '未被監視的頁面' ),
-       'Upload'                    => array( '上傳文件' ),
-       'UploadStash'               => array( '上傳藏匿' ),
-       'Userlogin'                 => array( '用戶登錄' ),
-       'Userlogout'                => array( '用戶登出' ),
-       'Userrights'                => array( '用戶權限' ),
-       'Version'                   => array( '版本信息' ),
-       'Wantedcategories'          => array( '待撰分類' ),
-       'Wantedfiles'               => array( '需要的文件' ),
-       'Wantedpages'               => array( '待撰頁面' ),
+       'TrackingCategories'        => array( '追蹤分類', '跟蹤分類' ),
+       'Unblock'                   => array( '解除封鎖', '解除封禁', '解禁' ),
+       'Uncategorizedcategories'   => array( '未分類的分類', '未歸類分類' ),
+       'Uncategorizedimages'       => array( '未分類的檔案', '未分類的圖片', '未歸類檔案' ),
+       'Uncategorizedpages'        => array( '未分類的頁面', '未歸類頁面' ),
+       'Uncategorizedtemplates'    => array( '未分類的模板', '未歸類模板' ),
+       'Undelete'                  => array( '取消刪除' ),
+       'Unlockdb'                  => array( '解除鎖定資料庫', '解除資料庫鎖定' ),
+       'Unusedcategories'          => array( '未使用的分類', '未使用分類' ),
+       'Unusedimages'              => array( '未使用的檔案', '未使用檔案' ),
+       'Unusedtemplates'           => array( '未使用的模板', '未使用模板' ),
+       'Unwatchedpages'            => array( '未監視的頁面', '未被監視的頁面' ),
+       'Upload'                    => array( '上傳', '上載檔案' ),
+       'UploadStash'               => array( '上傳儲藏庫' ),
+       'Userlogin'                 => array( '使用者登入' ),
+       'Userlogout'                => array( '使用者登出' ),
+       'Userrights'                => array( '使用者權限' ),
+       'Version'                   => array( '版本', '版本資訊' ),
+       'Wantedcategories'          => array( '需要的分類', '待撰分類' ),
+       'Wantedfiles'               => array( '需要的檔案' ),
+       'Wantedpages'               => array( '需要的頁面', '待撰頁面' ),
        'Wantedtemplates'           => array( '需要的模板' ),
-       'Watchlist'                 => array( '監視列表' ),
-       'Whatlinkshere'             => array( 'é\8f\88入頁面' ),
-       'Withoutinterwiki'          => array( '沒有跨語言鏈接的頁面' ),
+       'Watchlist'                 => array( '監視清單' ),
+       'Whatlinkshere'             => array( 'é\80£入頁面' ),
+       'Withoutinterwiki'          => array( '無跨wiki連結頁面', '無跨維基連結頁面' ),
 );
 
 $magicWords = array(
-       'redirect'                  => array( '0', '#重定向', '#REDIRECT' ),
+       'redirect'                  => array( '0', '#重新導向', '#重定向', '#REDIRECT' ),
        'notoc'                     => array( '0', '__無目錄__', '__无目录__', '__NOTOC__' ),
        'nogallery'                 => array( '0', '__無圖庫__', '__无图库__', '__NOGALLERY__' ),
        'forcetoc'                  => array( '0', '__強制目錄__', '__强显目录__', '__FORCETOC__' ),
        'toc'                       => array( '0', '__目錄__', '__目录__', '__TOC__' ),
-       'noeditsection'             => array( '0', '__無段落編輯__', '__无段落编辑__', '__NOEDITSECTION__' ),
-       'currentmonth'              => array( '1', '本月', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonthabbrev'        => array( '1', 'æ\9c¬æ\9c\88簡稱', '本月简称', 'CURRENTMONTHABBREV' ),
+       'noeditsection'             => array( '0', '__無段落編輯__', '__无编辑段落__', '__无段落编辑__', '__NOEDITSECTION__' ),
+       'currentmonth'              => array( '1', '本月', '本月2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonthabbrev'        => array( '1', 'æ\9c¬æ\9c\88縮寫', '本月简称', 'CURRENTMONTHABBREV' ),
        'currentday'                => array( '1', '今天', 'CURRENTDAY' ),
-       'currenttime'               => array( '1', '當前時間', '此時', '此时', '当前时间', 'CURRENTTIME' ),
+       'currenttime'               => array( '1', '目前時間', '当前时间', '此时', 'CURRENTTIME' ),
+       'numberofpages'             => array( '1', '頁面數', '页面数', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', '文章數', '条目数', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', '檔案數', '文件数', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', '使用者人數量', '用户数', 'NUMBEROFUSERS' ),
+       'numberofactiveusers'       => array( '1', '活躍使用者人數', '活跃用户数', 'NUMBEROFACTIVEUSERS' ),
+       'pagename'                  => array( '1', '頁面名稱', '页名', '页面名', '页面名称', 'PAGENAME' ),
+       'namespace'                 => array( '1', '命名空間', '名字空间', 'NAMESPACE' ),
+       'namespacenumber'           => array( '1', '命名空間數', '名字空间编号', 'NAMESPACENUMBER' ),
+       'talkspace'                 => array( '1', '對話空間', '讨论空间', '讨论名字空间', 'TALKSPACE' ),
+       'rootpagename'              => array( '1', '根頁面名稱', 'ROOTPAGENAME' ),
+       'rootpagenamee'             => array( '1', '根頁面名稱E', 'ROOTPAGENAMEE' ),
+       'msg'                       => array( '0', '訊息:', 'MSG:' ),
+       'subst'                     => array( '0', '替換:', '替代:', 'SUBST:' ),
+       'safesubst'                 => array( '0', '安全替換:', '安全替代:', 'SAFESUBST:' ),
        'img_thumbnail'             => array( '1', '縮圖', '缩略图', 'thumbnail', 'thumb' ),
        'img_manualthumb'           => array( '1', '縮圖=$1', '缩略图=$1', 'thumbnail=$1', 'thumb=$1' ),
        'img_right'                 => array( '1', '右', 'right' ),
@@ -241,24 +263,41 @@ $magicWords = array(
        'img_center'                => array( '1', '置中', '居中', 'center', 'centre' ),
        'img_framed'                => array( '1', '有框', 'framed', 'enframed', 'frame' ),
        'img_frameless'             => array( '1', '無框', '无框', 'frameless' ),
+       'img_lang'                  => array( '1', '語言=$1', 'lang=$1' ),
        'img_page'                  => array( '1', '頁=$1', '$1頁', '页数=$1', '$1页', 'page=$1', 'page $1' ),
+       'img_border'                => array( '1', '邊框', '边框', 'border' ),
+       'img_sub'                   => array( '1', '下標', 'sub' ),
+       'img_super'                 => array( '1', '上標', 'super', 'sup' ),
+       'img_top'                   => array( '1', '垂直置頂', 'top' ),
+       'img_text_top'              => array( '1', '文字置頂', 'text-top' ),
+       'img_middle'                => array( '1', '垂直置中', 'middle' ),
+       'img_bottom'                => array( '1', '垂直置底', 'bottom' ),
+       'img_text_bottom'           => array( '1', '文字置底', 'text-bottom' ),
        'img_link'                  => array( '1', '連結=$1', '链接=$1', 'link=$1' ),
+       'img_alt'                   => array( '1', '替代文字', '替代=$1', '替代文本=$1', 'alt=$1' ),
+       'img_class'                 => array( '1', '類別=$1', '类=$1', 'class=$1' ),
        'sitename'                  => array( '1', '網站名稱', '站点名称', 'SITENAME' ),
-       'ns'                        => array( '0', 'å\90\8då­\97空間:', '名字空间:', 'NS:' ),
-       'nse'                       => array( '0', 'å\90\8då­\97空間E:', '名字空间E:', 'NSE:' ),
+       'ns'                        => array( '0', 'å\91½å\90\8d空間:', '名字空间:', 'NS:' ),
+       'nse'                       => array( '0', 'å\91½å\90\8d空間E:', '名字空间E:', 'NSE:' ),
        'localurl'                  => array( '0', '本地URL:', 'LOCALURL:' ),
        'localurle'                 => array( '0', '本地URLE:', 'LOCALURLE:' ),
        'pageid'                    => array( '0', '頁面ID', '页面ID', 'PAGEID' ),
        'server'                    => array( '0', '伺服器', '服务器', 'SERVER' ),
        'servername'                => array( '0', '伺服器名稱', '服务器名', 'SERVERNAME' ),
-       'gender'                    => array( '0', '性別:', '性别:', 'GENDER:' ),
+       'gender'                    => array( '0', '性別:', '性:', '性别:', 'GENDER:' ),
        'notitleconvert'            => array( '0', '__不轉換標題__', '__不转换标题__', '__NOTITLECONVERT__', '__NOTC__' ),
        'nocontentconvert'          => array( '0', '__不轉換內容__', '__不转换内容__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+       'revisionuser'              => array( '1', '修訂使用者', 'REVISIONUSER' ),
        'displaytitle'              => array( '1', '顯示標題', '显示标题', 'DISPLAYTITLE' ),
-       'currentversion'            => array( '1', 'ç\95前版本', '当前版本', 'CURRENTVERSION' ),
+       'currentversion'            => array( '1', 'ç\9b®前版本', '当前版本', 'CURRENTVERSION' ),
        'language'                  => array( '0', '#語言:', '#语言:', '#LANGUAGE:' ),
+       'contentlanguage'           => array( '1', '內容語言', '内容语言', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+       'numberofadmins'            => array( '1', '管理員數', '管理员数', 'NUMBEROFADMINS' ),
        'hiddencat'                 => array( '1', '__隱藏分類__', '__隐藏分类__', '__HIDDENCAT__' ),
-       'staticredirect'            => array( '1', '__靜態重定向__', '__静态重定向__', '__STATICREDIRECT__' ),
+       'staticredirect'            => array( '1', '__靜態重新導向__', '__静态重定向__', '__STATICREDIRECT__' ),
+       'url_query'                 => array( '0', '查詢', 'QUERY' ),
+       'pagesincategory_pages'     => array( '0', '頁面', 'pages' ),
+       'pagesincategory_files'     => array( '0', '檔案', 'files' ),
 );
 
 $bookstoreList = array(
index 067f7dd..2a79ea9 100644 (file)
@@ -39,22 +39,28 @@ $namespaceAliases = array(
 );
 
 $specialPageAliases = array(
+       'Allmessages'               => array( '所有訊息' ),
        'Ancientpages'              => array( '最舊頁面' ),
-       'Block'                     => array( '查封用戶' ),
-       'FileDuplicateSearch'       => array( '搜索重復文件' ),
-       'Invalidateemail'           => array( '無法識別的電郵地址' ),
-       'LinkSearch'                => array( '搜索網頁鏈接' ),
-       'Listredirects'             => array( '重定向頁面列表' ),
-       'Lockdb'                    => array( '鎖定數據庫' ),
-       'MIMEsearch'                => array( 'MIME搜索' ),
-       'Randomredirect'            => array( '隨機重定向頁面' ),
+       'Block'                     => array( '封鎖使用者' ),
+       'CreateAccount'             => array( '建立帳號' ),
+       'FileDuplicateSearch'       => array( '搜尋重復檔案' ),
+       'Invalidateemail'           => array( '無法識別的電郵位址' ),
+       'LinkSearch'                => array( '搜尋網頁連結' ),
+       'Listfiles'                 => array( '檔案清單' ),
+       'Listredirects'             => array( '重新導向頁面清單' ),
+       'Lockdb'                    => array( '鎖定資料庫' ),
+       'MIMEsearch'                => array( 'MIME搜尋' ),
+       'Newimages'                 => array( '新增檔案' ),
+       'Randomredirect'            => array( '隨機重新導向頁面' ),
        'Recentchanges'             => array( '近期變動' ),
        'Revisiondelete'            => array( '刪除或恢復版本' ),
        'Unblock'                   => array( '解除封鎖' ),
-       'Unlockdb'                  => array( '解除數據庫鎖定' ),
+       'Unlockdb'                  => array( '解除資料庫鎖定' ),
        'Unwatchedpages'            => array( '未被監視的頁面' ),
-       'Userrights'                => array( '用戶權限' ),
-       'Withoutinterwiki'          => array( '沒有跨語言鏈接的頁面' ),
+       'Userrights'                => array( '使用者權限' ),
+       'Watchlist'                 => array( '監視清單' ),
+       'Whatlinkshere'             => array( '連入頁面' ),
+       'Withoutinterwiki'          => array( '沒有跨語言連結的頁面' ),
 );
 
 $datePreferences = array(
index 9b98b20..af14bb3 100644 (file)
@@ -1207,7 +1207,13 @@ abstract class Maintenance {
                }
 
                if ( $isatty && function_exists( 'readline' ) ) {
-                       return readline( $prompt );
+                       $resp = readline( $prompt );
+                       if ( $resp === null ) {
+                               // Workaround for https://github.com/facebook/hhvm/issues/4776
+                               return false;
+                       } else {
+                               return $resp;
+                       }
                } else {
                        if ( $isatty ) {
                                $st = self::readlineEmulation( $prompt );
diff --git a/maintenance/archives/patch-hitcounter.sql b/maintenance/archives/patch-hitcounter.sql
deleted file mode 100644 (file)
index 2d698f6..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
---
--- hitcounter table is used to buffer page hits before they are periodically
--- counted and added to the cur_counter column in the cur table.
--- December 2003
---
-
-CREATE TABLE /*$wgDBprefix*/hitcounter (
-  hc_id INTEGER UNSIGNED NOT NULL
-) ENGINE=MEMORY MAX_ROWS=25000;
diff --git a/maintenance/archives/patch-user-newtalk-userid-unsigned.sql b/maintenance/archives/patch-user-newtalk-userid-unsigned.sql
new file mode 100644 (file)
index 0000000..a83e03b
--- /dev/null
@@ -0,0 +1 @@
+ALTER TABLE /*_*/user_newtalk MODIFY user_id int unsigned NOT NULL default 0;
index 75500c2..76bc982 100644 (file)
@@ -14,11 +14,30 @@ class ConvertExtensionToRegistration extends Maintenance {
                'ExtensionFunctions' => 'handleExtensionFunctions',
        );
 
+       /**
+        * Keys that should be put at the top of the generated JSON file (T86608)
+        *
+        * @var array
+        */
+       protected $promote = array(
+               'name',
+               'version',
+               'author',
+               'url',
+               'description',
+               'descriptionmsg',
+               'namemsg',
+               'license-name',
+               'type',
+       );
+
        private $json, $dir;
 
        public function __construct() {
                parent::__construct();
                $this->mDescription = 'Converts extension entry points to the new JSON registration format';
+               $this->addArg( 'path', 'Location to the PHP entry point you wish to convert', /* $required = */ true );
+               $this->addOption( 'skin', 'Whether to write to skin.json', false, false );
        }
 
        protected function getAllGlobals() {
@@ -59,8 +78,19 @@ class ConvertExtensionToRegistration extends Maintenance {
                        }
                }
 
-               $fname = "{$this->dir}/extension.json";
-               $prettyJSON = FormatJson::encode( $this->json, "\t", FormatJson::ALL_OK );
+               // Move some keys to the top
+               $out = array();
+               foreach ( $this->promote as $key ) {
+                       if ( isset( $this->json[$key] ) ) {
+                               $out[$key] = $this->json[$key];
+                               unset( $this->json[$key] );
+                       }
+               }
+               $out += $this->json;
+
+               $type = $this->hasOption( 'skin' ) ? 'skin' : 'extension';
+               $fname = "{$this->dir}/$type.json";
+               $prettyJSON = FormatJson::encode( $out, "\t", FormatJson::ALL_OK );
                file_put_contents( $fname, $prettyJSON . "\n" );
                $this->output( "Wrote output to $fname.\n" );
        }
@@ -125,12 +155,36 @@ class ConvertExtensionToRegistration extends Maintenance {
        }
 
        protected function handleResourceModules( $realName, $value ) {
+               $defaults = array();
+               $remote = $this->hasOption( 'skin' ) ? 'remoteSkinPath' : 'remoteExtPath';
                foreach ( $value as $name => $data ) {
                        if ( isset( $data['localBasePath'] ) ) {
                                $data['localBasePath'] = $this->stripPath( $data['localBasePath'], $this->dir );
+                               if ( !$defaults ) {
+                                       $defaults['localBasePath'] = $data['localBasePath'];
+                                       unset( $data['localBasePath'] );
+                                       if ( isset( $data[$remote] ) ) {
+                                               $defaults[$remote] = $data[$remote];
+                                               unset( $data[$remote] );
+                                       }
+                               } else {
+                                       if ( $data['localBasePath'] === $defaults['localBasePath'] ) {
+                                               unset( $data['localBasePath'] );
+                                       }
+                                       if ( isset( $data[$remote] ) && isset( $defaults[$remote] )
+                                               && $data[$remote] === $defaults[$remote]
+                                       ) {
+                                               unset( $data[$remote] );
+                                       }
+                               }
                        }
+
+
                        $this->json[$realName][$name] = $data;
                }
+               if ( $defaults ) {
+                       $this->json['ResourceFileModulePaths'] = $defaults;
+               }
        }
 }
 
index c93a971..cc2167e 100644 (file)
@@ -98,23 +98,18 @@ $maintenance->finalSetup();
 require_once "$IP/includes/Setup.php";
 
 // Do the work
-try {
-       $maintenance->execute();
+$maintenance->execute();
 
-       // Potentially debug globals
-       $maintenance->globals();
+// Potentially debug globals
+$maintenance->globals();
 
-       // Perform deferred updates.
-       DeferredUpdates::doUpdates( 'commit' );
+// Perform deferred updates.
+DeferredUpdates::doUpdates( 'commit' );
 
-       // log profiling info
-       wfLogProfilingData();
+// log profiling info
+wfLogProfilingData();
 
-       // Commit and close up!
-       $factory = wfGetLBFactory();
-       $factory->commitMasterChanges();
-       $factory->shutdown();
-} catch ( Exception $mwe ) {
-       echo $mwe->getText();
-       exit( 1 );
-}
+// Commit and close up!
+$factory = wfGetLBFactory();
+$factory->commitMasterChanges();
+$factory->shutdown();
index e20c477..3f10a33 100644 (file)
@@ -60,6 +60,11 @@ if ( $__useReadline ) {
        readline_read_history( $__historyFile );
 }
 
+$__phpPath = preg_match( '/Zend Engine|HipHop VM/', wfShellExecWithStderr( 'php --version' ) )
+       ? 'php' //standard system path name
+       : ''; // not accessible somehow
+
+$__multiLine = '';
 $__e = null; // PHP exception
 while ( ( $__line = Maintenance::readconsole() ) !== false ) {
        if ( $__e && !preg_match( '/^(exit|die);?$/', $__line ) ) {
@@ -74,8 +79,18 @@ while ( ( $__line = Maintenance::readconsole() ) !== false ) {
                readline_add_history( $__line );
                readline_write_history( $__historyFile );
        }
+       // Try to only run PHP once a valid chunk is formed (deals with newlines)
+       if ( $__phpPath ) {
+               $res = wfShellExecWithStderr(
+                       "echo " . wfEscapeShellArg( "<?php\n{$__multiLine}{$__line}" ) . " | php -l" );
+               if ( strpos( $res, 'No syntax errors' ) !== 0 && substr( $__multiLine, -2 ) !== "\n\n" ) {
+                       $__multiLine .= "$__line\n";
+                       continue;
+               }
+       }
        try {
-               $__val = eval( $__line . ";" );
+               $__val = eval( $__multiLine . $__line . ";" );
+               $__multiLine = '';
        } catch ( Exception $__e ) {
                echo "Caught exception " . get_class( $__e ) .
                        ": {$__e->getMessage()}\n" . $__e->getTraceAsString() . "\n";
index 0660e55..91c60c1 100644 (file)
@@ -1,77 +1,77 @@
 # Based more or less on the public interwiki map from MeatballWiki
 # Default interwiki prefixes...
-acronym|http://www.acronymfinder.com/~/search/af.aspx?string=exact&Acronym=$1|0
-advogato|http://www.advogato.org/$1|0
-arxiv|http://www.arxiv.org/abs/$1|0
-c2find|http://c2.com/cgi/wiki?FindPage&value=$1|0
-cache|http://www.google.com/search?q=cache:$1|0
-commons|https://commons.wikimedia.org/wiki/$1|0
-dictionary|http://www.dict.org/bin/Dict?Database=*&Form=Dict1&Strategy=*&Query=$1|0
-docbook|http://wiki.docbook.org/$1|0
-doi|http://dx.doi.org/$1|0
-drumcorpswiki|http://www.drumcorpswiki.com/$1|0
-dwjwiki|http://www.suberic.net/cgi-bin/dwj/wiki.cgi?$1|0
-elibre|http://enciclopedia.us.es/index.php/$1|0
-emacswiki|http://www.emacswiki.org/cgi-bin/wiki.pl?$1|0
-foldoc|http://foldoc.org/?$1|0
-foxwiki|http://fox.wikis.com/wc.dll?Wiki~$1|0
-freebsdman|http://www.FreeBSD.org/cgi/man.cgi?apropos=1&query=$1|0
-gej|http://www.esperanto.de/dej.malnova/aktivikio.pl?$1|0
-gentoo-wiki|http://gentoo-wiki.com/$1|0
-google|http://www.google.com/search?q=$1|0
-googlegroups|http://groups.google.com/groups?q=$1|0
-hammondwiki|http://www.dairiki.org/HammondWiki/$1|0
-hrwiki|http://www.hrwiki.org/wiki/$1|0
-imdb|http://www.imdb.com/find?q=$1&tt=on|0
-jargonfile|http://sunir.org/apps/meta.pl?wiki=JargonFile&redirect=$1|0
-kmwiki|http://kmwiki.wikispaces.com/$1|0
-linuxwiki|http://linuxwiki.de/$1|0
-lojban|http://www.lojban.org/tiki/tiki-index.php?page=$1|0
-lqwiki|http://wiki.linuxquestions.org/wiki/$1|0
-lugkr|http://www.lug-kr.de/wiki/$1|0
-meatball|http://www.usemod.com/cgi-bin/mb.pl?$1|0
-mediawikiwiki|https://www.mediawiki.org/wiki/$1|0
-mediazilla|https://bugzilla.wikimedia.org/$1|0
-memoryalpha|http://en.memory-alpha.org/wiki/$1|0
-metawiki|http://sunir.org/apps/meta.pl?$1|0
-metawikimedia|https://meta.wikimedia.org/wiki/$1|0
-mozillawiki|http://wiki.mozilla.org/$1|0
-mw|http://www.mediawiki.org/wiki/$1|0
-oeis|http://oeis.org/$1|0
-openwiki|http://openwiki.com/ow.asp?$1|0
-ppr|http://c2.com/cgi/wiki?$1|0
-pythoninfo|http://wiki.python.org/moin/$1|0
-rfc|http://www.rfc-editor.org/rfc/rfc$1.txt|0
-s23wiki|http://s23.org/wiki/$1|0
-seattlewireless|http://seattlewireless.net/$1|0
-senseislibrary|http://senseis.xmp.net/?$1|0
-shoutwiki|http://www.shoutwiki.com/wiki/$1|0
-sourceforge|http://sourceforge.net/$1|0
-sourcewatch|http://www.sourcewatch.org/index.php?title=$1|0
-squeak|http://wiki.squeak.org/squeak/$1|0
-tejo|http://www.tejo.org/vikio/$1|0
-tmbw|http://www.tmbw.net/wiki/$1|0
-tmnet|http://www.technomanifestos.net/?$1|0
-theopedia|http://www.theopedia.com/$1|0
-twiki|http://twiki.org/cgi-bin/view/$1|0
-uea|http://uea.org/vikio/index.php/$1|0
-uncyclopedia|http://en.uncyclopedia.co/wiki/$1|0
-unreal|http://wiki.beyondunreal.com/$1|0
-usemod|http://www.usemod.com/cgi-bin/wiki.pl?$1|0
-webseitzwiki|http://webseitz.fluxent.com/wiki/$1|0
-wiki|http://c2.com/cgi/wiki?$1|0
-wikia|http://www.wikia.com/wiki/$1|0
-wikibooks|https://en.wikibooks.org/wiki/$1|0
-wikif1|http://www.wikif1.org/$1|0
-wikihow|http://www.wikihow.com/$1|0
-wikinfo|http://wikinfo.co/English/index.php/$1|0
-wikimedia|https://wikimediafoundation.org/wiki/$1|0
-wikinews|https://en.wikinews.org/wiki/$1|0
-wikipedia|https://en.wikipedia.org/wiki/$1|0
-wikiquote|https://en.wikiquote.org/wiki/$1|0
-wikisource|https://wikisource.org/wiki/$1|0
-wikispecies|https://species.wikimedia.org/wiki/$1|0
-wikiversity|https://en.wikiversity.org/wiki/$1|0
-wikivoyage|https://en.wikivoyage.org/wiki/$1|0
-wikt|https://en.wiktionary.org/wiki/$1|0
-wiktionary|https://en.wiktionary.org/wiki/$1|0
+acronym|http://www.acronymfinder.com/~/search/af.aspx?string=exact&Acronym=$1|0|
+advogato|http://www.advogato.org/$1|0|
+arxiv|http://www.arxiv.org/abs/$1|0|
+c2find|http://c2.com/cgi/wiki?FindPage&value=$1|0|
+cache|http://www.google.com/search?q=cache:$1|0|
+commons|https://commons.wikimedia.org/wiki/$1|0|https://commons.wikimedia.org/w/api.php
+dictionary|http://www.dict.org/bin/Dict?Database=*&Form=Dict1&Strategy=*&Query=$1|0|
+docbook|http://wiki.docbook.org/$1|0|
+doi|http://dx.doi.org/$1|0|
+drumcorpswiki|http://www.drumcorpswiki.com/$1|0|http://drumcorpswiki.com/api.php
+dwjwiki|http://www.suberic.net/cgi-bin/dwj/wiki.cgi?$1|0|
+elibre|http://enciclopedia.us.es/index.php/$1|0|http://enciclopedia.us.es/api.php
+emacswiki|http://www.emacswiki.org/cgi-bin/wiki.pl?$1|0|
+foldoc|http://foldoc.org/?$1|0|
+foxwiki|http://fox.wikis.com/wc.dll?Wiki~$1|0|
+freebsdman|http://www.FreeBSD.org/cgi/man.cgi?apropos=1&query=$1|0|
+gej|http://www.esperanto.de/dej.malnova/aktivikio.pl?$1|0|
+gentoo-wiki|http://gentoo-wiki.com/$1|0|
+google|http://www.google.com/search?q=$1|0|
+googlegroups|http://groups.google.com/groups?q=$1|0|
+hammondwiki|http://www.dairiki.org/HammondWiki/$1|0|
+hrwiki|http://www.hrwiki.org/wiki/$1|0|http://www.hrwiki.org/w/api.php
+imdb|http://www.imdb.com/find?q=$1&tt=on|0|
+jargonfile|http://sunir.org/apps/meta.pl?wiki=JargonFile&redirect=$1|0|
+kmwiki|http://kmwiki.wikispaces.com/$1|0|
+linuxwiki|http://linuxwiki.de/$1|0|
+lojban|http://www.lojban.org/tiki/tiki-index.php?page=$1|0|
+lqwiki|http://wiki.linuxquestions.org/wiki/$1|0|
+lugkr|http://www.lug-kr.de/wiki/$1|0|
+meatball|http://www.usemod.com/cgi-bin/mb.pl?$1|0|
+mediawikiwiki|https://www.mediawiki.org/wiki/$1|0|https://www.mediawiki.org/w/api.php
+mediazilla|https://bugzilla.wikimedia.org/$1|0|
+memoryalpha|http://en.memory-alpha.org/wiki/$1|0|http://en.memory-alpha.org/api.php
+metawiki|http://sunir.org/apps/meta.pl?$1|0|
+metawikimedia|https://meta.wikimedia.org/wiki/$1|0|https://meta.wikimedia.org/w/api.php
+mozillawiki|http://wiki.mozilla.org/$1|0|https://wiki.mozilla.org/api.php
+mw|https://www.mediawiki.org/wiki/$1|0|https://www.mediawiki.org/w/api.php
+oeis|http://oeis.org/$1|0|
+openwiki|http://openwiki.com/ow.asp?$1|0|
+ppr|http://c2.com/cgi/wiki?$1|0|
+pythoninfo|http://wiki.python.org/moin/$1|0|
+rfc|http://www.rfc-editor.org/rfc/rfc$1.txt|0|
+s23wiki|http://s23.org/wiki/$1|0|http://s23.org/w/api.php
+seattlewireless|http://seattlewireless.net/$1|0|
+senseislibrary|http://senseis.xmp.net/?$1|0|
+shoutwiki|http://www.shoutwiki.com/wiki/$1|0|http://www.shoutwiki.com/w/api.php
+sourceforge|http://sourceforge.net/$1|0|
+sourcewatch|http://www.sourcewatch.org/index.php?title=$1|0|http://www.sourcewatch.org/api.php
+squeak|http://wiki.squeak.org/squeak/$1|0|
+tejo|http://www.tejo.org/vikio/$1|0|
+tmbw|http://www.tmbw.net/wiki/$1|0|http://tmbw.net/wiki/api.php
+tmnet|http://www.technomanifestos.net/?$1|0|
+theopedia|http://www.theopedia.com/$1|0|
+twiki|http://twiki.org/cgi-bin/view/$1|0|
+uea|http://uea.org/vikio/index.php/$1|0|http://uea.org/vikio/api.php
+uncyclopedia|http://en.uncyclopedia.co/wiki/$1|0|http://en.uncyclopedia.co/w/api.php
+unreal|http://wiki.beyondunreal.com/$1|0|http://wiki.beyondunreal.com/w/api.php
+usemod|http://www.usemod.com/cgi-bin/wiki.pl?$1|0|
+webseitzwiki|http://webseitz.fluxent.com/wiki/$1|0|
+wiki|http://c2.com/cgi/wiki?$1|0|
+wikia|http://www.wikia.com/wiki/$1|0|
+wikibooks|https://en.wikibooks.org/wiki/$1|0|https://en.wikibooks.org/w/api.php
+wikif1|http://www.wikif1.org/$1|0|
+wikihow|http://www.wikihow.com/$1|0|http://www.wikihow.com/api.php
+wikinfo|http://wikinfo.co/English/index.php/$1|0|
+wikimedia|https://wikimediafoundation.org/wiki/$1|0|https://wikimediafoundation.org/w/api.php
+wikinews|https://en.wikinews.org/wiki/$1|0|https://en.wikinews.org/w/api.php
+wikipedia|https://en.wikipedia.org/wiki/$1|0|https://en.wikipedia.org/w/api.php
+wikiquote|https://en.wikiquote.org/wiki/$1|0|https://en.wikiquote.org/w/api.php
+wikisource|https://wikisource.org/wiki/$1|0|https://wikisource.org/w/api.php
+wikispecies|https://species.wikimedia.org/wiki/$1|0|https://species.wikimedia.org/w/api.php
+wikiversity|https://en.wikiversity.org/wiki/$1|0|https://en.wikiversity.org/w/api.php
+wikivoyage|https://en.wikivoyage.org/wiki/$1|0|https://en.wikivoyage.org/w/api.php
+wikt|https://en.wiktionary.org/wiki/$1|0|https://en.wiktionary.org/w/api.php
+wiktionary|https://en.wiktionary.org/wiki/$1|0|https://en.wiktionary.org/w/api.php
index aad0cc3..0628773 100644 (file)
@@ -1,80 +1,80 @@
 -- Based more or less on the public interwiki map from MeatballWiki
 -- Default interwiki prefixes...
 
-REPLACE INTO /*$wgDBprefix*/interwiki (iw_prefix,iw_url,iw_local) VALUES
-('acronym','http://www.acronymfinder.com/~/search/af.aspx?string=exact&Acronym=$1',0),
-('advogato','http://www.advogato.org/$1',0),
-('arxiv','http://www.arxiv.org/abs/$1',0),
-('c2find','http://c2.com/cgi/wiki?FindPage&value=$1',0),
-('cache','http://www.google.com/search?q=cache:$1',0),
-('commons','https://commons.wikimedia.org/wiki/$1',0),
-('dictionary','http://www.dict.org/bin/Dict?Database=*&Form=Dict1&Strategy=*&Query=$1',0),
-('docbook','http://wiki.docbook.org/$1',0),
-('doi','http://dx.doi.org/$1',0),
-('drumcorpswiki','http://www.drumcorpswiki.com/$1',0),
-('dwjwiki','http://www.suberic.net/cgi-bin/dwj/wiki.cgi?$1',0),
-('elibre','http://enciclopedia.us.es/index.php/$1',0),
-('emacswiki','http://www.emacswiki.org/cgi-bin/wiki.pl?$1',0),
-('foldoc','http://foldoc.org/?$1',0),
-('foxwiki','http://fox.wikis.com/wc.dll?Wiki~$1',0),
-('freebsdman','http://www.FreeBSD.org/cgi/man.cgi?apropos=1&query=$1',0),
-('gej','http://www.esperanto.de/dej.malnova/aktivikio.pl?$1',0),
-('gentoo-wiki','http://gentoo-wiki.com/$1',0),
-('google','http://www.google.com/search?q=$1',0),
-('googlegroups','http://groups.google.com/groups?q=$1',0),
-('hammondwiki','http://www.dairiki.org/HammondWiki/$1',0),
-('hrwiki','http://www.hrwiki.org/wiki/$1',0),
-('imdb','http://www.imdb.com/find?q=$1&tt=on',0),
-('jargonfile','http://sunir.org/apps/meta.pl?wiki=JargonFile&redirect=$1',0),
-('kmwiki','http://kmwiki.wikispaces.com/$1',0),
-('linuxwiki','http://linuxwiki.de/$1',0),
-('lojban','http://www.lojban.org/tiki/tiki-index.php?page=$1',0),
-('lqwiki','http://wiki.linuxquestions.org/wiki/$1',0),
-('lugkr','http://www.lug-kr.de/wiki/$1',0),
-('meatball','http://www.usemod.com/cgi-bin/mb.pl?$1',0),
-('mediawikiwiki','https://www.mediawiki.org/wiki/$1',0),
-('mediazilla','https://bugzilla.wikimedia.org/$1',0),
-('memoryalpha','http://en.memory-alpha.org/wiki/$1',0),
-('metawiki','http://sunir.org/apps/meta.pl?$1',0),
-('metawikimedia','https://meta.wikimedia.org/wiki/$1',0),
-('mozillawiki','http://wiki.mozilla.org/$1',0),
-('mw','http://www.mediawiki.org/wiki/$1',0),
-('oeis','http://oeis.org/$1',0),
-('openwiki','http://openwiki.com/ow.asp?$1',0),
-('ppr','http://c2.com/cgi/wiki?$1',0),
-('pythoninfo','http://wiki.python.org/moin/$1',0),
-('rfc','http://www.rfc-editor.org/rfc/rfc$1.txt',0),
-('s23wiki','http://s23.org/wiki/$1',0),
-('seattlewireless','http://seattlewireless.net/$1',0),
-('senseislibrary','http://senseis.xmp.net/?$1',0),
-('shoutwiki','http://www.shoutwiki.com/wiki/$1',0),
-('sourceforge','http://sourceforge.net/$1',0),
-('sourcewatch','http://www.sourcewatch.org/index.php?title=$1',0),
-('squeak','http://wiki.squeak.org/squeak/$1',0),
-('tejo','http://www.tejo.org/vikio/$1',0),
-('tmbw','http://www.tmbw.net/wiki/$1',0),
-('tmnet','http://www.technomanifestos.net/?$1',0),
-('theopedia','http://www.theopedia.com/$1',0),
-('twiki','http://twiki.org/cgi-bin/view/$1',0),
-('uea','http://uea.org/vikio/index.php/$1',0),
-('uncyclopedia','http://en.uncyclopedia.co/wiki/$1',0),
-('unreal','http://wiki.beyondunreal.com/$1',0),
-('usemod','http://www.usemod.com/cgi-bin/wiki.pl?$1',0),
-('webseitzwiki','http://webseitz.fluxent.com/wiki/$1',0),
-('wiki','http://c2.com/cgi/wiki?$1',0),
-('wikia','http://www.wikia.com/wiki/$1',0),
-('wikibooks','https://en.wikibooks.org/wiki/$1',0),
-('wikif1','http://www.wikif1.org/$1',0),
-('wikihow','http://www.wikihow.com/$1',0),
-('wikinfo','http://wikinfo.co/English/index.php/$1',0),
-('wikimedia','https://wikimediafoundation.org/wiki/$1',0),
-('wikinews','https://en.wikinews.org/wiki/$1',0),
-('wikipedia','https://en.wikipedia.org/wiki/$1',0),
-('wikiquote','https://en.wikiquote.org/wiki/$1',0),
-('wikisource','https://wikisource.org/wiki/$1',0),
-('wikispecies','https://species.wikimedia.org/wiki/$1',0),
-('wikiversity','https://en.wikiversity.org/wiki/$1',0),
-('wikivoyage','https://en.wikivoyage.org/wiki/$1',0),
-('wikt','https://en.wiktionary.org/wiki/$1',0),
-('wiktionary','https://en.wiktionary.org/wiki/$1',0)
+REPLACE INTO /*$wgDBprefix*/interwiki (iw_prefix,iw_url,iw_local,iw_api) VALUES
+('acronym','http://www.acronymfinder.com/~/search/af.aspx?string=exact&Acronym=$1',0,''),
+('advogato','http://www.advogato.org/$1',0,''),
+('arxiv','http://www.arxiv.org/abs/$1',0,''),
+('c2find','http://c2.com/cgi/wiki?FindPage&value=$1',0,''),
+('cache','http://www.google.com/search?q=cache:$1',0,''),
+('commons','https://commons.wikimedia.org/wiki/$1',0,'https://commons.wikimedia.org/w/api.php'),
+('dictionary','http://www.dict.org/bin/Dict?Database=*&Form=Dict1&Strategy=*&Query=$1',0,''),
+('docbook','http://wiki.docbook.org/$1',0,''),
+('doi','http://dx.doi.org/$1',0,''),
+('drumcorpswiki','http://www.drumcorpswiki.com/$1',0,'http://drumcorpswiki.com/api.php'),
+('dwjwiki','http://www.suberic.net/cgi-bin/dwj/wiki.cgi?$1',0,''),
+('elibre','http://enciclopedia.us.es/index.php/$1',0,'http://enciclopedia.us.es/api.php'),
+('emacswiki','http://www.emacswiki.org/cgi-bin/wiki.pl?$1',0,''),
+('foldoc','http://foldoc.org/?$1',0,''),
+('foxwiki','http://fox.wikis.com/wc.dll?Wiki~$1',0,''),
+('freebsdman','http://www.FreeBSD.org/cgi/man.cgi?apropos=1&query=$1',0,''),
+('gej','http://www.esperanto.de/dej.malnova/aktivikio.pl?$1',0,''),
+('gentoo-wiki','http://gentoo-wiki.com/$1',0,''),
+('google','http://www.google.com/search?q=$1',0,''),
+('googlegroups','http://groups.google.com/groups?q=$1',0,''),
+('hammondwiki','http://www.dairiki.org/HammondWiki/$1',0,''),
+('hrwiki','http://www.hrwiki.org/wiki/$1',0,'http://www.hrwiki.org/w/api.php'),
+('imdb','http://www.imdb.com/find?q=$1&tt=on',0,''),
+('jargonfile','http://sunir.org/apps/meta.pl?wiki=JargonFile&redirect=$1',0,''),
+('kmwiki','http://kmwiki.wikispaces.com/$1',0,''),
+('linuxwiki','http://linuxwiki.de/$1',0,''),
+('lojban','http://www.lojban.org/tiki/tiki-index.php?page=$1',0,''),
+('lqwiki','http://wiki.linuxquestions.org/wiki/$1',0,''),
+('lugkr','http://www.lug-kr.de/wiki/$1',0,''),
+('meatball','http://www.usemod.com/cgi-bin/mb.pl?$1',0,''),
+('mediawikiwiki','https://www.mediawiki.org/wiki/$1',0,'https://www.mediawiki.org/w/api.php'),
+('mediazilla','https://bugzilla.wikimedia.org/$1',0,''),
+('memoryalpha','http://en.memory-alpha.org/wiki/$1',0,'http://en.memory-alpha.org/api.php'),
+('metawiki','http://sunir.org/apps/meta.pl?$1',0,''),
+('metawikimedia','https://meta.wikimedia.org/wiki/$1',0,'https://meta.wikimedia.org/w/api.php'),
+('mozillawiki','http://wiki.mozilla.org/$1',0,'https://wiki.mozilla.org/api.php'),
+('mw','https://www.mediawiki.org/wiki/$1',0,'https://www.mediawiki.org/w/api.php'),
+('oeis','http://oeis.org/$1',0,''),
+('openwiki','http://openwiki.com/ow.asp?$1',0,''),
+('ppr','http://c2.com/cgi/wiki?$1',0,''),
+('pythoninfo','http://wiki.python.org/moin/$1',0,''),
+('rfc','http://www.rfc-editor.org/rfc/rfc$1.txt',0,''),
+('s23wiki','http://s23.org/wiki/$1',0,'http://s23.org/w/api.php'),
+('seattlewireless','http://seattlewireless.net/$1',0,''),
+('senseislibrary','http://senseis.xmp.net/?$1',0,''),
+('shoutwiki','http://www.shoutwiki.com/wiki/$1',0,'http://www.shoutwiki.com/w/api.php'),
+('sourceforge','http://sourceforge.net/$1',0,''),
+('sourcewatch','http://www.sourcewatch.org/index.php?title=$1',0,'http://www.sourcewatch.org/api.php'),
+('squeak','http://wiki.squeak.org/squeak/$1',0,''),
+('tejo','http://www.tejo.org/vikio/$1',0,''),
+('tmbw','http://www.tmbw.net/wiki/$1',0,'http://tmbw.net/wiki/api.php'),
+('tmnet','http://www.technomanifestos.net/?$1',0,''),
+('theopedia','http://www.theopedia.com/$1',0,''),
+('twiki','http://twiki.org/cgi-bin/view/$1',0,''),
+('uea','http://uea.org/vikio/index.php/$1',0,'http://uea.org/vikio/api.php'),
+('uncyclopedia','http://en.uncyclopedia.co/wiki/$1',0,'http://en.uncyclopedia.co/w/api.php'),
+('unreal','http://wiki.beyondunreal.com/$1',0,'http://wiki.beyondunreal.com/w/api.php'),
+('usemod','http://www.usemod.com/cgi-bin/wiki.pl?$1',0,''),
+('webseitzwiki','http://webseitz.fluxent.com/wiki/$1',0,''),
+('wiki','http://c2.com/cgi/wiki?$1',0,''),
+('wikia','http://www.wikia.com/wiki/$1',0,''),
+('wikibooks','https://en.wikibooks.org/wiki/$1',0,'https://en.wikibooks.org/w/api.php'),
+('wikif1','http://www.wikif1.org/$1',0,''),
+('wikihow','http://www.wikihow.com/$1',0,'http://www.wikihow.com/api.php'),
+('wikinfo','http://wikinfo.co/English/index.php/$1',0,''),
+('wikimedia','https://wikimediafoundation.org/wiki/$1',0,'https://wikimediafoundation.org/w/api.php'),
+('wikinews','https://en.wikinews.org/wiki/$1',0,'https://en.wikinews.org/w/api.php'),
+('wikipedia','https://en.wikipedia.org/wiki/$1',0,'https://en.wikipedia.org/w/api.php'),
+('wikiquote','https://en.wikiquote.org/wiki/$1',0,'https://en.wikiquote.org/w/api.php'),
+('wikisource','https://wikisource.org/wiki/$1',0,'https://wikisource.org/w/api.php'),
+('wikispecies','https://species.wikimedia.org/wiki/$1',0,'https://species.wikimedia.org/w/api.php'),
+('wikiversity','https://en.wikiversity.org/wiki/$1',0,'https://en.wikiversity.org/w/api.php'),
+('wikivoyage','https://en.wikivoyage.org/wiki/$1',0,'https://en.wikivoyage.org/w/api.php'),
+('wikt','https://en.wiktionary.org/wiki/$1',0,'https://en.wiktionary.org/w/api.php'),
+('wiktionary','https://en.wiktionary.org/wiki/$1',0,'https://en.wiktionary.org/w/api.php')
 ;
index ece0450..29e4d2a 100644 (file)
@@ -25,7 +25,7 @@ require_once __DIR__ . '/../Maintenance.php';
 
 /**
  * Generates the normalizer data file for Arabic.
- * For NFC see includes/normal.
+ * For NFC see includes/libs/normal.
  *
  * @ingroup MaintenanceLanguage
  */
index c7237cf..8ed3c32 100644 (file)
@@ -25,7 +25,7 @@ require_once __DIR__ . '/../Maintenance.php';
 
 /**
  * Generates the normalizer data file for Malayalam.
- * For NFC see includes/normal.
+ * For NFC see includes/libs/normal.
  *
  * @ingroup MaintenanceLanguage
  */
index cbc389b..96e01fe 100644 (file)
@@ -39,28 +39,46 @@ class NamespaceConflictChecker extends Maintenance {
         */
        protected $db;
 
+       private $resolvableCount = 0;
+       private $totalPages = 0;
+
        public function __construct() {
                parent::__construct();
                $this->mDescription = "";
                $this->addOption( 'fix', 'Attempt to automatically fix errors' );
-               $this->addOption( 'suffix', "Dupes will be renamed with correct namespace with " .
+               $this->addOption( 'merge', "Instead of renaming conflicts, do a history merge with " .
+                       "the correct title" );
+               $this->addOption( 'add-suffix', "Dupes will be renamed with correct namespace with " .
                        "<text> appended after the article name", false, true );
-               $this->addOption( 'prefix', "Do an explicit check for the given title prefix " .
-                       "appended after the article name", false, true );
+               $this->addOption( 'add-prefix', "Dupes will be renamed with correct namespace with " .
+                       "<text> prepended before the article name", false, true );
+               $this->addOption( 'source-pseudo-namespace', "Move all pages with the given source " .
+                       "prefix (with an implied colon following it). If --dest-namespace is not specified, " .
+                       "the colon will be replaced with a hyphen.",
+                       false, true );
+               $this->addOption( 'dest-namespace', "In combination with --source-pseudo-namespace, " .
+                       "specify the namespace ID of the destination.", false, true );
+               $this->addOption( 'move-talk', "If this is specified, pages in the Talk namespace that " .
+                       "begin with a conflicting prefix will be renamed, for example " .
+                       "Talk:File:Foo -> File_Talk:Foo" );
        }
 
        public function execute() {
                $this->db = wfGetDB( DB_MASTER );
 
-               $fix = $this->hasOption( 'fix' );
-               $suffix = $this->getOption( 'suffix', '' );
-               $prefix = $this->getOption( 'prefix', '' );
-               $key = intval( $this->getOption( 'key', 0 ) );
-
-               if ( $prefix ) {
-                       $retval = $this->checkPrefix( $key, $prefix, $fix, $suffix );
+               $options = array(
+                       'fix' => $this->hasOption( 'fix' ),
+                       'merge' => $this->hasOption( 'merge' ),
+                       'add-suffix' => $this->getOption( 'add-suffix', '' ),
+                       'add-prefix' => $this->getOption( 'add-prefix', '' ),
+                       'move-talk' => $this->hasOption( 'move-talk' ),
+                       'source-pseudo-namespace' => $this->getOption( 'source-pseudo-namespace', '' ),
+                       'dest-namespace' => intval( $this->getOption( 'dest-namespace', 0 ) ) );
+
+               if ( $options['source-pseudo-namespace'] !== '' ) {
+                       $retval = $this->checkPrefix( $options );
                } else {
-                       $retval = $this->checkAll( $fix, $suffix );
+                       $retval = $this->checkAll( $options );
                }
 
                if ( $retval ) {
@@ -71,13 +89,13 @@ class NamespaceConflictChecker extends Maintenance {
        }
 
        /**
-        * @todo Document
-        * @param bool $fix Whether or not to fix broken entries
-        * @param string $suffix Suffix to append to renamed articles
+        * Check all namespaces
+        *
+        * @param array $options Associative array of validated command-line options
         *
         * @return bool
         */
-       private function checkAll( $fix, $suffix = '' ) {
+       private function checkAll( $options ) {
                global $wgContLang, $wgNamespaceAliases, $wgCapitalLinks;
 
                $spaces = array();
@@ -131,14 +149,31 @@ class NamespaceConflictChecker extends Maintenance {
                        }
                }
 
-               ksort( $spaces );
-               asort( $spaces );
+               // Sort by namespace index, and if there are two with the same index,
+               // break the tie by sorting by name
+               $origSpaces = $spaces;
+               uksort( $spaces, function ( $a, $b ) use ( $origSpaces ) {
+                       if ( $origSpaces[$a] < $origSpaces[$b] ) {
+                               return -1;
+                       } elseif ( $origSpaces[$a] > $origSpaces[$b] ) {
+                               return 1;
+                       } elseif ( $a < $b ) {
+                               return -1;
+                       } elseif ( $a > $b ) {
+                               return 1;
+                       } else {
+                               return 0;
+                       }
+               } );
 
                $ok = true;
                foreach ( $spaces as $name => $ns ) {
-                       $ok = $this->checkNamespace( $ns, $name, $fix, $suffix ) && $ok;
+                       $ok = $this->checkNamespace( $ns, $name, $options ) && $ok;
                }
 
+               $this->output( "{$this->totalPages} pages to fix, " .
+                       "{$this->resolvableCount} were resolvable.\n" );
+
                return $ok;
        }
 
@@ -158,178 +193,273 @@ class NamespaceConflictChecker extends Maintenance {
        }
 
        /**
-        * @todo Document
-        * @param int $ns A namespace id
+        * Check a given prefix and try to move it into the given destination namespace
+        *
+        * @param int $ns Destination namespace id
         * @param string $name
-        * @param bool $fix Whether to fix broken entries
-        * @param string $suffix Suffix to append to renamed articles
+        * @param array $options Associative array of validated command-line options
         * @return bool
         */
-       private function checkNamespace( $ns, $name, $fix, $suffix = '' ) {
-               $conflicts = $this->getConflicts( $ns, $name );
-               $count = count( $conflicts );
+       private function checkNamespace( $ns, $name, $options ) {
+               $targets = $this->getTargetList( $ns, $name, $options );
+               $count = $targets->numRows();
+               $this->totalPages += $count;
                if ( $count == 0 ) {
                        return true;
                }
 
+               $dryRunNote = $options['fix'] ? '' : ' DRY RUN ONLY';
+
                $ok = true;
-               foreach ( $conflicts as $row ) {
-                       $resolvable = $this->reportConflict( $row, $suffix );
-                       $ok = $ok && $resolvable;
-                       if ( $fix && ( $resolvable || $suffix != '' ) ) {
-                               $ok = $this->resolveConflict( $row, $resolvable, $suffix ) && $ok;
+               foreach ( $targets as $row ) {
+
+                       // Find the new title and determine the action to take
+
+                       $newTitle = $this->getDestinationTitle( $ns, $name, $row, $options );
+                       $logStatus = false;
+                       if ( !$newTitle ) {
+                               $logStatus = 'invalid title';
+                               $action = 'abort';
+                       } elseif ( $newTitle->exists() ) {
+                               if ( $options['merge'] ) {
+                                       if ( $this->canMerge( $row->page_id, $newTitle, $logStatus ) ) {
+                                               $action = 'merge';
+                                       } else {
+                                               $action = 'abort';
+                                       }
+                               } elseif ( $options['add-prefix'] == '' && $options['add-suffix'] == '' ) {
+                                       $action = 'abort';
+                                       $logStatus = 'dest title exists and --add-prefix not specified';
+                               } else {
+                                       $newTitle = $this->getAlternateTitle( $newTitle, $options );
+                                       if ( !$newTitle ) {
+                                               $action = 'abort';
+                                               $logStatus = 'alternate title is invalid';
+                                       } elseif ( $newTitle->exists() ) {
+                                               $action = 'abort';
+                                               $logStatus = 'title conflict';
+                                       } else {
+                                               $action = 'move';
+                                               $logStatus = 'alternate';
+                                       }
+                               }
+                       } else {
+                               $action = 'move';
+                               $logStatus = 'no conflict';
+                       }
+
+                       // Take the action or log a dry run message
+
+                       $logTitle = "id={$row->page_id} ns={$row->page_namespace} dbk={$row->page_title}";
+                       $pageOK = true;
+
+                       switch ( $action ) {
+                               case 'abort':
+                                       $this->output( "$logTitle *** $logStatus\n" );
+                                       $pageOK = false;
+                                       break;
+                               case 'move':
+                                       $this->output( "$logTitle -> " .
+                                               $newTitle->getPrefixedDBkey() . " ($logStatus)$dryRunNote\n" );
+
+                                       if ( $options['fix'] ) {
+                                               $pageOK = $this->movePage( $row->page_id, $newTitle );
+                                       }
+                                       break;
+                               case 'merge':
+                                       $this->output( "$logTitle => " .
+                                               $newTitle->getPrefixedDBkey() . " (merge)$dryRunNote\n" );
+
+                                       if ( $options['fix'] ) {
+                                               $pageOK = $this->mergePage( $row->page_id, $newTitle );
+                                       }
+                                       break;
+                       }
+
+                       if ( $pageOK ) {
+                               $this->resolvableCount++;
+                       } else {
+                               $ok = false;
                        }
                }
 
+               // @fixme Also needs to do like self::getTargetList() on the
+               // *_namespace and *_title fields of pagelinks, templatelinks, and
+               // redirects, and schedule a LinksUpdate job or similar for each found
+               // *_from.
+
                return $ok;
        }
 
        /**
-        * @todo Do this for real
-        * @param int $key
-        * @param string $prefix
-        * @param bool $fix
-        * @param string $suffix
+        * Move the given pseudo-namespace, either replacing the colon with a hyphen
+        * (useful for pseudo-namespaces that conflict with interwiki links) or move
+        * them to another namespace if specified.
+        * @param array $options Associative array of validated command-line options
         * @return bool
         */
-       private function checkPrefix( $key, $prefix, $fix, $suffix = '' ) {
-               $this->output( "Checking prefix \"$prefix\" vs namespace $key\n" );
+       private function checkPrefix( $options ) {
+               $prefix = $options['source-pseudo-namespace'];
+               $ns = $options['dest-namespace'];
+               $this->output( "Checking prefix \"$prefix\" vs namespace $ns\n" );
 
-               return $this->checkNamespace( $key, $prefix, $fix, $suffix );
+               return $this->checkNamespace( $ns, $prefix, $options );
        }
 
        /**
-        * Find pages in mainspace that have a prefix of the new namespace
-        * so we know titles that will need migrating
+        * Find pages in main and talk namespaces that have a prefix of the new
+        * namespace so we know titles that will need migrating
         *
-        * @param int $ns Namespace id (id for new namespace?)
+        * @param int $ns Destination namespace id
         * @param string $name Prefix that is being made a namespace
+        * @param array $options Associative array of validated command-line options
         *
-        * @return array
+        * @return ResultWrapper
         */
-       private function getConflicts( $ns, $name ) {
-               $titleSql = "TRIM(LEADING {$this->db->addQuotes( "$name:" )} FROM page_title)";
-               if ( $ns == 0 ) {
-                       // An interwiki; try an alternate encoding with '-' for ':'
-                       $titleSql = $this->db->buildConcat( array(
-                               $this->db->addQuotes( "$name-" ),
-                               $titleSql,
-                       ) );
+       private function getTargetList( $ns, $name, $options ) {
+               if ( $options['move-talk'] && MWNamespace::isSubject( $ns ) ) {
+                       $checkNamespaces = array( NS_MAIN, NS_TALK );
+               } else {
+                       $checkNamespaces = NS_MAIN;
                }
 
-               return iterator_to_array( $this->db->select( 'page',
+               return $this->db->select( 'page',
                        array(
-                               'id' => 'page_id',
-                               'oldtitle' => 'page_title',
-                               'namespace' => $this->db->addQuotes( $ns ) . ' + page_namespace',
-                               'title' => $titleSql,
-                               'oldnamespace' => 'page_namespace',
+                               'page_id',
+                               'page_title',
+                               'page_namespace',
                        ),
                        array(
-                               'page_namespace' => array( 0, 1 ),
+                               'page_namespace' => $checkNamespaces,
                                'page_title' . $this->db->buildLike( "$name:", $this->db->anyString() ),
                        ),
                        __METHOD__
-               ) );
+               );
        }
 
        /**
-        * Report any conflicts we find
-        *
+        * Get the preferred destination title for a given target page row.
+        * @param integer $ns The destination namespace ID
+        * @param string $name The conflicting prefix
         * @param stdClass $row
-        * @param string $suffix
-        * @return bool
+        * @param array $options Associative array of validated command-line options
+        * @return Title|false
         */
-       private function reportConflict( $row, $suffix ) {
-               $newTitle = Title::makeTitleSafe( $row->namespace, $row->title );
-               if ( is_null( $newTitle ) || !$newTitle->canExist() ) {
-                       // Title is also an illegal title...
-                       // For the moment we'll let these slide to cleanupTitles or whoever.
-                       $this->output( sprintf( "... %d (%d,\"%s\")\n",
-                               $row->id,
-                               $row->oldnamespace,
-                               $row->oldtitle ) );
-                       $this->output( "...  *** cannot resolve automatically; illegal title ***\n" );
-
-                       return false;
+       private function getDestinationTitle( $ns, $name, $row, $options ) {
+               $dbk = substr( $row->page_title, strlen( "$name:" ) );
+               if ( $ns == 0 ) {
+                       // An interwiki; try an alternate encoding with '-' for ':'
+                       $dbk = "$name-" . $dbk;
                }
-
-               $this->output( sprintf( "... %d (%d,\"%s\") -> (%d,\"%s\") [[%s]]\n",
-                       $row->id,
-                       $row->oldnamespace,
-                       $row->oldtitle,
-                       $newTitle->getNamespace(),
-                       $newTitle->getDBkey(),
-                       $newTitle->getPrefixedText() ) );
-
-               $id = $newTitle->getArticleID();
-               if ( $id ) {
-                       $this->output( "...  *** cannot resolve automatically; page exists with ID $id ***\n" );
-
+               $destNS = $ns;
+               if ( $row->page_namespace == NS_TALK && MWNamespace::isSubject( $ns ) ) {
+                       // This is an associated talk page moved with the --move-talk feature.
+                       $destNS = MWNamespace::getTalk( $destNS );
+               }
+               $newTitle = Title::makeTitleSafe( $destNS, $dbk );
+               if ( !$newTitle || !$newTitle->canExist() ) {
                        return false;
-               } else {
-                       return true;
                }
+               return $newTitle;
        }
 
        /**
-        * Resolve any conflicts
+        * Get an alternative title to move a page to. This is used if the
+        * preferred destination title already exists.
         *
-        * @param stClass $row Row from the page table to fix
-        * @param bool $resolvable
-        * @param string $suffix Suffix to append to the fixed page
-        * @return bool
+        * @param Title $title
+        * @param array $options Associative array of validated command-line options
+        * @return Title|bool
         */
-       private function resolveConflict( $row, $resolvable, $suffix ) {
-               if ( !$resolvable ) {
-                       $this->output( "...  *** old title {$row->title}\n" );
-                       while ( true ) {
-                               $row->title .= $suffix;
-                               $this->output( "...  *** new title {$row->title}\n" );
-                               $title = Title::makeTitleSafe( $row->namespace, $row->title );
-                               if ( !$title ) {
-                                       $this->output( "... !!! invalid title\n" );
-
-                                       return false;
-                               }
-                               $id = $title->getArticleID();
-                               if ( $id ) {
-                                       $this->output( "...  *** page exists with ID $id ***\n" );
-                               } else {
-                                       break;
-                               }
+       private function getAlternateTitle( $title, $options ) {
+               $prefix = $options['add-prefix'];
+               $suffix = $options['add-suffix'];
+               if ( $prefix == '' && $suffix == '' ) {
+                       return false;
+               }
+               while ( true ) {
+                       $dbk = $prefix . $title->getDBkey() . $suffix;
+                       $title = Title::makeTitleSafe( $title->getNamespace(), $dbk );
+                       if ( !$title ) {
+                               return false;
+                       }
+                       if ( !$title->exists() ) {
+                               return $title;
                        }
-                       $this->output( "...  *** using suffixed form [[" . $title->getPrefixedText() . "]] ***\n" );
                }
-               $this->resolveConflictOn( $row, 'page', 'page' );
-
-               return true;
        }
 
        /**
-        * Resolve a given conflict
+        * Move a page
+        *
+        * @fixme Update pl_from_namespace etc.
         *
-        * @param stdClass $row Row from the old broken entry
-        * @param string $table Table to update
-        * @param string $prefix Prefix for column name, like page or ar
+        * @param integer $id The page_id
+        * @param Title $newTitle The new title
         * @return bool
         */
-       private function resolveConflictOn( $row, $table, $prefix ) {
-               $this->output( "... resolving on $table... " );
-               $newTitle = Title::makeTitleSafe( $row->namespace, $row->title );
-               $this->db->update( $table,
+       private function movePage( $id, Title $newTitle ) {
+               $this->db->update( 'page',
                        array(
-                               "{$prefix}_namespace" => $newTitle->getNamespace(),
-                               "{$prefix}_title" => $newTitle->getDBkey(),
+                               "page_namespace" => $newTitle->getNamespace(),
+                               "page_title" => $newTitle->getDBkey(),
                        ),
                        array(
-                               // "{$prefix}_namespace" => 0,
-                               // "{$prefix}_title" => $row->oldtitle,
-                               "{$prefix}_id" => $row->id,
+                               "page_id" => $id,
                        ),
                        __METHOD__ );
-               $this->output( "ok.\n" );
 
+               // @fixme Needs updating the *_from_namespace fields in categorylinks,
+               // pagelinks, templatelinks and imagelinks.
+
+               return true;
+       }
+
+       /**
+        * Determine if we can merge a page.
+        * We check if an inaccessible revision would become the latest and
+        * deny the merge if so -- it's theoretically possible to update the
+        * latest revision, but opens a can of worms -- search engine updates,
+        * recentchanges review, etc.
+        *
+        * @param integer $id The page_id
+        * @param Title $newTitle The new title
+        * @param string $logStatus This is set to the log status message on failure
+        * @return bool
+        */
+       private function canMerge( $id, Title $newTitle, &$logStatus ) {
+               $latestDest = Revision::newFromTitle( $newTitle, 0, Revision::READ_LATEST );
+               $latestSource = Revision::newFromPageId( $id, 0, Revision::READ_LATEST );
+               if ( $latestSource->getTimestamp() > $latestDest->getTimestamp() ) {
+                       $logStatus = 'cannot merge since source is later';
+                       return false;
+               } else {
+                       return true;
+               }
+       }
+
+       /**
+        * Merge page histories
+        *
+        * @param integer $id The page_id
+        * @param Title $newTitle The new title
+        */
+       private function mergePage( $id, Title $newTitle ) {
+               $destId = $newTitle->getArticleId();
+               $this->db->begin( __METHOD__ );
+               $this->db->update( 'revision',
+                       // SET
+                       array( 'rev_page' => $destId ),
+                       // WHERE
+                       array( 'rev_page' => $id ),
+                       __METHOD__ );
+
+               $this->db->delete( 'page', array( 'page_id' => $id ), __METHOD__ );
+
+               // @fixme Need WikiPage::doDeleteUpdates() or similar to avoid orphan
+               // rows in the links tables.
+
+               $this->db->commit( __METHOD__ );
                return true;
        }
 }
index 5391bd9..6076206 100644 (file)
@@ -415,7 +415,7 @@ CREATE TABLE recentchanges (
   rc_minor           SMALLINT     NOT NULL  DEFAULT 0,
   rc_bot             SMALLINT     NOT NULL  DEFAULT 0,
   rc_new             SMALLINT     NOT NULL  DEFAULT 0,
-  rc_cur_id          INTEGER          NULL  REFERENCES page(page_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED,
+  rc_cur_id          INTEGER          NULL,
   rc_this_oldid      INTEGER      NOT NULL,
   rc_last_oldid      INTEGER      NOT NULL,
   rc_type            SMALLINT     NOT NULL  DEFAULT 0,
index bc85c66..e29d89e 100644 (file)
@@ -70,6 +70,7 @@ class RebuildTextIndex extends Maintenance {
 
                if ( $this->db->getType() == 'mysql' ) {
                        $this->dropMysqlTextIndex();
+                       $this->clearSearchIndex();
                        $this->populateSearchIndex();
                        $this->createMysqlTextIndex();
                } else {
index 88d9f87..f6245f2 100755 (executable)
@@ -39,10 +39,13 @@ fi
 # * the Apex theme files,
 # * the minimised distribution files, and
 # * the RTL sheets for non-CSSJanus environments
+# * the raster- and vector-only distribution sheets
 rsync --force --recursive --delete \
        --exclude '*apex*' \
        --exclude 'oojs-ui*.min.*' \
        --exclude 'oojs-ui*.rtl.css' \
+       --exclude 'oojs-ui*.raster.css' \
+       --exclude 'oojs-ui*.vector.css' \
        ./node_modules/oojs-ui/dist/ "$REPO_DIR/$TARGET_DIR" || exit 1
 
 # Clean up temporary area
index 40605ce..6abfb66 100644 (file)
@@ -68,7 +68,7 @@ class RunJobs extends Maintenance {
 
                $json = ( $this->getOption( 'result' ) === 'json' );
 
-               $runner = new JobRunner();
+               $runner = new JobRunner( MWLoggerFactory::getInstance( 'runJobs' ) );
                if ( !$json ) {
                        $runner->setDebugHandler( array( $this, 'debugInternal' ) );
                }
index cfffbbc..3cb4a2b 100644 (file)
@@ -50,9 +50,15 @@ require_once __DIR__ . '/../Maintenance.php';
  */
 class CompressOld extends Maintenance {
        /**
-        * @todo document
+        * Option to load each revision individually.
+        *
         */
        const LS_INDIVIDUAL = 0;
+
+       /**
+        * Option to load revisions in chunks.
+        *
+        */
        const LS_CHUNKED = 1;
 
        public function __construct() {
@@ -137,7 +143,8 @@ class CompressOld extends Maintenance {
        }
 
        /**
-        * @todo document
+        * Fetch the text row-by-row to 'compressPage' function for compression.
+        *
         * @param int $start
         * @param string $extdb
         */
@@ -172,7 +179,8 @@ class CompressOld extends Maintenance {
        }
 
        /**
-        * @todo document
+        * Compress the text in gzip format.
+        *
         * @param stdClass $row
         * @param string $extdb
         * @return bool
@@ -214,6 +222,8 @@ class CompressOld extends Maintenance {
        }
 
        /**
+        * Compress the text in chunks after concatenating the revisions.
+        *
         * @param int $startId
         * @param int $maxChunkSize
         * @param string $beginDate
index 348fb77..ab59cb8 100644 (file)
@@ -25,7 +25,6 @@ define( 'REPORTING_INTERVAL', 1 );
 
 if ( !defined( 'MEDIAWIKI' ) ) {
        require_once __DIR__ . '/../commandLine.inc';
-       require_once __DIR__ . '/../../includes/externalstore/ExternalStoreDB.php';
        require_once 'resolveStubs.php';
 
        $fname = 'moveToExternal';
index 290f164..36741cb 100644 (file)
@@ -22,8 +22,6 @@
  * @ingroup Maintenance ExternalStorage
  */
 
-define( 'REPORTING_INTERVAL', 100 );
-
 if ( !defined( 'MEDIAWIKI' ) ) {
        $optionsWithArgs = array( 'm' );
 
index 112ac05..4433502 100644 (file)
@@ -182,7 +182,7 @@ CREATE UNIQUE INDEX /*i*/ufg_user_group ON /*_*/user_former_groups (ufg_user,ufg
 --
 CREATE TABLE /*_*/user_newtalk (
   -- Key to user.user_id
-  user_id int NOT NULL default 0,
+  user_id int unsigned NOT NULL default 0,
   -- If the user is an anonymous user their IP address is stored here
   -- since the user_id of 0 is ambiguous
   user_ip varbinary(40) NOT NULL default '',
index d1d17cf..182a2c4 100755 (executable)
@@ -56,6 +56,10 @@ class UpdateMediaWiki extends Maintenance {
                        true
                );
                $this->addOption( 'force', 'Override when $wgAllowSchemaUpdates disables this script' );
+               $this->addOption(
+                       'skip-external-dependencies',
+                       'Skips checking whether external dependencies are up to date, mostly for developers'
+               );
        }
 
        function getDbType() {
@@ -131,6 +135,16 @@ class UpdateMediaWiki extends Maintenance {
                        wfCountdown( 5 );
                }
 
+               // Check external dependencies are up to date
+               if ( !$this->hasOption( 'skip-external-dependencies' ) ) {
+                       $composerLockUpToDate = $this->runChild( 'CheckComposerLockUpToDate' );
+                       $composerLockUpToDate->execute();
+               } else {
+                       $this->output(
+                               "Skipping checking whether external dependencies are up to date, proceed at your own risk\n"
+                       );
+               }
+
                # Attempt to connect to the database as a privileged user
                # This will vomit up an error if there are permissions problems
                $db = wfGetDB( DB_MASTER );
index 101fcd9..4ef12ba 100644 (file)
@@ -5,17 +5,17 @@
     "test": "grunt test"
   },
   "devDependencies": {
-    "grunt": "0.4.2",
+    "grunt": "0.4.5",
     "grunt-banana-checker": "0.2.0",
-    "grunt-contrib-jshint": "0.10.0",
+    "grunt-contrib-jshint": "0.11.0",
     "grunt-contrib-watch": "0.6.1",
-    "grunt-jscs": "0.8.1",
+    "grunt-jscs": "1.5.0",
     "grunt-jsonlint": "1.0.4",
-    "grunt-karma": "0.9.0",
-    "karma": "0.12.28",
+    "grunt-karma": "0.10.1",
+    "karma": "0.12.31",
     "karma-chrome-launcher": "0.1.7",
-    "karma-firefox-launcher": "0.1.3",
+    "karma-firefox-launcher": "0.1.4",
     "karma-qunit": "0.1.4",
-    "qunitjs": "1.15.0"
+    "qunitjs": "1.17.1"
   }
 }
index 4e3fb5a..f172cfb 100644 (file)
@@ -36,7 +36,7 @@ header( 'Content-Type: text/html; charset=utf-8' );
 <!DOCTYPE html>
 <html>
 <head>
-       <meta charset="UTF-8">
+       <meta charset="UTF-8" />
        <title>Profiling data</title>
        <style>
                /* noc.wikimedia.org/base.css */
@@ -422,7 +422,7 @@ if ( isset( $_REQUEST['filter'] ) ) {
        ?>
        </tbody>
 </table>
-<hr>
+<hr />
 <p>Total time: <code><?php printf( '%5.02f', profile_point::$totaltime ); ?></code></p>
 
 <p>Total memory: <code><?php printf( '%5.02f', profile_point::$totalmemory / 1024 ); ?></code></p>
index 6e8cd99..3750593 100644 (file)
@@ -266,8 +266,8 @@ return array(
                'targets' => array( 'desktop', 'mobile' ),
        ),
        'jquery.qunit' => array(
-               'scripts' => 'resources/lib/jquery/jquery.qunit.js',
-               'styles' => 'resources/lib/jquery/jquery.qunit.css',
+               'scripts' => 'resources/lib/qunitjs/qunit.js',
+               'styles' => 'resources/lib/qunitjs/qunit.css',
                'position' => 'top',
                'targets' => array( 'desktop', 'mobile' ),
        ),
@@ -765,7 +765,10 @@ return array(
        /* MediaWiki */
 
        'mediawiki' => array(
-               'scripts' => 'resources/src/mediawiki/mediawiki.js',
+               'scripts' => array(
+                       'resources/src/mediawiki/mediawiki.js',
+                       'resources/src/mediawiki/mediawiki.startUp.js',
+               ),
                'debugScripts' => 'resources/src/mediawiki/mediawiki.log.js',
                'raw' => true,
                'targets' => array( 'desktop', 'mobile' ),
@@ -953,6 +956,17 @@ return array(
                        'mediawiki.api',
                ),
        ),
+       'mediawiki.sectionAnchor' => array(
+               'skinStyles' => array(
+                       'default' => array(
+                               'resources/src/mediawiki/mediawiki.sectionAnchor.css' =>
+                                       array( 'media' => 'screen'),
+                               'resources/src/mediawiki/mediawiki.sectionAnchor.hide.css' =>
+                                       array( 'media' => 'print' ),
+                       ),
+               ),
+               'targets' => array( 'desktop', 'mobile' ),
+       ),
        'mediawiki.Title' => array(
                'scripts' => 'resources/src/mediawiki/mediawiki.Title.js',
                'dependencies' => array(
@@ -1073,7 +1087,9 @@ return array(
        'mediawiki.action.history.diff' => array(
                'styles' => array(
                        'resources/src/mediawiki.action/mediawiki.action.history.diff.css',
-                       'resources/src/mediawiki.action/mediawiki.action.history.diff.print.css' => array( 'media' => 'print' ),
+                       'resources/src/mediawiki.action/mediawiki.action.history.diff.print.css' => array(
+                               'media' => 'print'
+                       ),
                ),
                'group' => 'mediawiki.action.history',
                'targets' => array( 'desktop', 'mobile' ),
@@ -1355,6 +1371,7 @@ return array(
                ),
                'dependencies' => array(
                        'mediawiki.language',
+                       'mediawiki.confirmCloseWindow',
                ),
        ),
        'mediawiki.special.recentchanges' => array(
@@ -1662,7 +1679,7 @@ return array(
        'oojs-ui.styles' => array(
                'position' => 'top',
                'skinStyles' => array(
-                       'default' => 'resources/lib/oojs-ui/oojs-ui-mediawiki.svg.css',
+                       'default' => 'resources/lib/oojs-ui/oojs-ui-mediawiki.css',
                ),
                'targets' => array( 'desktop', 'mobile' ),
        ),
diff --git a/resources/assets/poweredby_mediawiki_132x47.png b/resources/assets/poweredby_mediawiki_132x47.png
new file mode 100644 (file)
index 0000000..a784ecf
Binary files /dev/null and b/resources/assets/poweredby_mediawiki_132x47.png differ
diff --git a/resources/assets/poweredby_mediawiki_176x62.png b/resources/assets/poweredby_mediawiki_176x62.png
new file mode 100644 (file)
index 0000000..7970801
Binary files /dev/null and b/resources/assets/poweredby_mediawiki_176x62.png differ
diff --git a/resources/lib/jquery/jquery.qunit.css b/resources/lib/jquery/jquery.qunit.css
deleted file mode 100644 (file)
index 385a1ce..0000000
+++ /dev/null
@@ -1,264 +0,0 @@
-/*!
- * QUnit 1.16.0
- * http://qunitjs.com/
- *
- * Copyright 2006, 2014 jQuery Foundation and other contributors
- * Released under the MIT license
- * http://jquery.org/license
- *
- * Date: 2014-12-03T16:32Z
- */
-
-/** Font Family and Sizes */
-
-#qunit-tests, #qunit-header, #qunit-banner, #qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult {
-       font-family: "Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial, sans-serif;
-}
-
-#qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult, #qunit-tests li { font-size: small; }
-#qunit-tests { font-size: smaller; }
-
-
-/** Resets */
-
-#qunit-tests, #qunit-header, #qunit-banner, #qunit-userAgent, #qunit-testresult, #qunit-modulefilter {
-       margin: 0;
-       padding: 0;
-}
-
-
-/** Header */
-
-#qunit-header {
-       padding: 0.5em 0 0.5em 1em;
-
-       color: #8699A4;
-       background-color: #0D3349;
-
-       font-size: 1.5em;
-       line-height: 1em;
-       font-weight: 400;
-
-       border-radius: 5px 5px 0 0;
-}
-
-#qunit-header a {
-       text-decoration: none;
-       color: #C2CCD1;
-}
-
-#qunit-header a:hover,
-#qunit-header a:focus {
-       color: #FFF;
-}
-
-#qunit-testrunner-toolbar label {
-       display: inline-block;
-       padding: 0 0.5em 0 0.1em;
-}
-
-#qunit-banner {
-       height: 5px;
-}
-
-#qunit-testrunner-toolbar {
-       padding: 0.5em 1em 0.5em 1em;
-       color: #5E740B;
-       background-color: #EEE;
-       overflow: hidden;
-}
-
-#qunit-userAgent {
-       padding: 0.5em 1em 0.5em 1em;
-       background-color: #2B81AF;
-       color: #FFF;
-       text-shadow: rgba(0, 0, 0, 0.5) 2px 2px 1px;
-}
-
-#qunit-modulefilter-container {
-       float: right;
-}
-
-/** Tests: Pass/Fail */
-
-#qunit-tests {
-       list-style-position: inside;
-}
-
-#qunit-tests li {
-       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;
-}
-
-#qunit-tests li strong {
-       cursor: pointer;
-}
-
-#qunit-tests li.skipped strong {
-       cursor: default;
-}
-
-#qunit-tests li a {
-       padding: 0.5em;
-       color: #C2CCD1;
-       text-decoration: none;
-}
-#qunit-tests li a:hover,
-#qunit-tests li a:focus {
-       color: #000;
-}
-
-#qunit-tests li .runtime {
-       float: right;
-       font-size: smaller;
-}
-
-.qunit-assert-list {
-       margin-top: 0.5em;
-       padding: 0.5em;
-
-       background-color: #FFF;
-
-       border-radius: 5px;
-}
-
-.qunit-collapsed {
-       display: none;
-}
-
-#qunit-tests table {
-       border-collapse: collapse;
-       margin-top: 0.2em;
-}
-
-#qunit-tests th {
-       text-align: right;
-       vertical-align: top;
-       padding: 0 0.5em 0 0;
-}
-
-#qunit-tests td {
-       vertical-align: top;
-}
-
-#qunit-tests pre {
-       margin: 0;
-       white-space: pre-wrap;
-       word-wrap: break-word;
-}
-
-#qunit-tests del {
-       background-color: #E0F2BE;
-       color: #374E0C;
-       text-decoration: none;
-}
-
-#qunit-tests ins {
-       background-color: #FFCACA;
-       color: #500;
-       text-decoration: none;
-}
-
-/*** Test Counts */
-
-#qunit-tests b.counts                       { color: #000; }
-#qunit-tests b.passed                       { color: #5E740B; }
-#qunit-tests b.failed                       { color: #710909; }
-
-#qunit-tests li li {
-       padding: 5px;
-       background-color: #FFF;
-       border-bottom: none;
-       list-style-position: inside;
-}
-
-/*** Passing Styles */
-
-#qunit-tests li li.pass {
-       color: #3C510C;
-       background-color: #FFF;
-       border-left: 10px solid #C6E746;
-}
-
-#qunit-tests .pass                          { color: #528CE0; background-color: #D2E0E6; }
-#qunit-tests .pass .test-name               { color: #366097; }
-
-#qunit-tests .pass .test-actual,
-#qunit-tests .pass .test-expected           { color: #999; }
-
-#qunit-banner.qunit-pass                    { background-color: #C6E746; }
-
-/*** Failing Styles */
-
-#qunit-tests li li.fail {
-       color: #710909;
-       background-color: #FFF;
-       border-left: 10px solid #EE5757;
-       white-space: pre;
-}
-
-#qunit-tests > li:last-child {
-       border-radius: 0 0 5px 5px;
-}
-
-#qunit-tests .fail                          { color: #000; background-color: #EE5757; }
-#qunit-tests .fail .test-name,
-#qunit-tests .fail .module-name             { color: #000; }
-
-#qunit-tests .fail .test-actual             { color: #EE5757; }
-#qunit-tests .fail .test-expected           { color: #008000; }
-
-#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 1em 0.5em 1em;
-
-       color: #2B81AF;
-       background-color: #D2E0E6;
-
-       border-bottom: 1px solid #FFF;
-}
-#qunit-testresult .module-name {
-       font-weight: 700;
-}
-
-/** Fixture */
-
-#qunit-fixture {
-       position: absolute;
-       top: -10000px;
-       left: -10000px;
-       width: 1000px;
-       height: 1000px;
-}
diff --git a/resources/lib/jquery/jquery.qunit.js b/resources/lib/jquery/jquery.qunit.js
deleted file mode 100644 (file)
index 82020d4..0000000
+++ /dev/null
@@ -1,2819 +0,0 @@
-/*!
- * QUnit 1.16.0
- * http://qunitjs.com/
- *
- * Copyright 2006, 2014 jQuery Foundation and other contributors
- * Released under the MIT license
- * http://jquery.org/license
- *
- * Date: 2014-12-03T16:32Z
- */
-
-(function( window ) {
-
-var QUnit,
-       config,
-       onErrorFnPrev,
-       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: 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 ) {
-                               return false;
-                       }
-               }())
-       },
-       /**
-        * Provides a normalized error string, correcting an issue
-        * with IE 7 (and prior) where Error.prototype.toString is
-        * not properly implemented
-        *
-        * Based on http://es5.github.com/#x15.11.4.4
-        *
-        * @param {String|Error} error
-        * @return {String} error message
-        */
-       errorString = function( error ) {
-               var name, message,
-                       errorString = error.toString();
-               if ( errorString.substring( 0, 7 ) === "[object" ) {
-                       name = error.name ? error.name.toString() : "Error";
-                       message = error.message ? error.message.toString() : "";
-                       if ( name && message ) {
-                               return name + ": " + message;
-                       } else if ( name ) {
-                               return name;
-                       } else if ( message ) {
-                               return message;
-                       } else {
-                               return "Error";
-                       }
-               } else {
-                       return errorString;
-               }
-       },
-       /**
-        * Makes a clone of an object using only Array or Object as base,
-        * and copies over the own enumerable properties.
-        *
-        * @param {Object} obj
-        * @return {Object} New object with only the own properties (recursively).
-        */
-       objectValues = function( obj ) {
-               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;
-                       }
-               }
-               return vals;
-       };
-
-QUnit = {};
-
-/**
- * Config object: Maintain internal state
- * Later exposed as QUnit.config
- * `config` initialized at top of scope
- */
-config = {
-       // The queue of tests to run
-       queue: [],
-
-       // block until document ready
-       blocking: true,
-
-       // when enabled, show only failing tests
-       // gets persisted through sessionStorage and can be changed in UI via checkbox
-       hidepassed: false,
-
-       // by default, run previously failed tests first
-       // very useful in combination with "Hide passed tests" checked
-       reorder: true,
-
-       // by default, modify document.title when suite is done
-       altertitle: true,
-
-       // by default, scroll to top of the page when suite is done
-       scrolltop: true,
-
-       // when enabled, all tests must call expect()
-       requireExpects: false,
-
-       // add checkboxes that are persisted in the query-string
-       // when enabled, the id is set to `true` as a `QUnit.config` property
-       urlConfig: [
-               {
-                       id: "hidepassed",
-                       label: "Hide passed tests",
-                       tooltip: "Only show tests and assertions that fail. Stored as query-strings."
-               },
-               {
-                       id: "noglobals",
-                       label: "Check for Globals",
-                       tooltip: "Enabling this will test if any test introduces new properties on the " +
-                               "`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."
-               }
-       ],
-
-       // Set of all modules.
-       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,
-               location = window.location || { search: "", protocol: "file:" },
-               params = location.search.slice( 1 ).split( "&" ),
-               length = params.length,
-               urlParams = {};
-
-       if ( params[ 0 ] ) {
-               for ( i = 0; i < length; i++ ) {
-                       current = params[ i ].split( "=" );
-                       current[ 0 ] = decodeURIComponent( current[ 0 ] );
-
-                       // allow just a key to turn on a flag, e.g., test.html?noglobals
-                       current[ 1 ] = current[ 1 ] ? decodeURIComponent( current[ 1 ] ) : true;
-                       if ( urlParams[ current[ 0 ] ] ) {
-                               urlParams[ current[ 0 ] ] = [].concat( urlParams[ current[ 0 ] ], current[ 1 ] );
-                       } else {
-                               urlParams[ current[ 0 ] ] = current[ 1 ];
-                       }
-               }
-       }
-
-       QUnit.urlParams = urlParams;
-
-       // String search anywhere in moduleName+testName
-       config.filter = urlParams.filter;
-
-       config.testId = [];
-       if ( urlParams.testId ) {
-
-               // 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 ] );
-               }
-       }
-
-       // Figure out if we're running the tests from a server or not
-       QUnit.isLocal = location.protocol === "file:";
-}());
-
-// Root QUnit object.
-// `QUnit` initialized at top of scope
-extend( QUnit, {
-
-       // call on start of module test to prepend name to all tests
-       module: function( name, testEnvironment ) {
-               var currentModule = {
-                       name: name,
-                       testEnvironment: testEnvironment,
-                       tests: []
-               };
-
-               // 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;
-               }
-
-               config.modules.push( currentModule );
-               config.currentModule = currentModule;
-       },
-
-       // DEPRECATED: QUnit.asyncTest() will be removed in QUnit 2.0.
-       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;
-
-               if ( arguments.length === 2 ) {
-                       callback = expected;
-                       expected = null;
-               }
-
-               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;
-                       }
-
-                       // 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();
-       },
-
-       // 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;
-       },
-
-       objectType: function( obj ) {
-               if ( typeof obj === "undefined" ) {
-                       return "undefined";
-               }
-
-               // Consider: typeof null === object
-               if ( obj === null ) {
-                       return "null";
-               }
-
-               var match = toString.call( obj ).match( /^\[object\s(.*)\]$/ ),
-                       type = match && match[ 1 ] || "";
-
-               switch ( type ) {
-                       case "Number":
-                               if ( isNaN( obj ) ) {
-                                       return "nan";
-                               }
-                               return "number";
-                       case "String":
-                       case "Boolean":
-                       case "Array":
-                       case "Date":
-                       case "RegExp":
-                       case "Function":
-                               return type.toLowerCase();
-               }
-               if ( typeof obj === "object" ) {
-                       return "object";
-               }
-               return undefined;
-       },
-
-       url: function( params ) {
-               params = extend( extend( {}, QUnit.urlParams ), params );
-               var key,
-                       querystring = "?";
-
-               for ( key in params ) {
-                       if ( hasOwn.call( params, key ) ) {
-                               querystring += encodeURIComponent( key );
-                               if ( params[ key ] !== true ) {
-                                       querystring += "=" + encodeURIComponent( params[ key ] );
-                               }
-                               querystring += "&";
-                       }
-               }
-               return location.protocol + "//" + location.host +
-                       location.pathname + querystring.slice( 0, -1 );
-       },
-
-       extend: extend,
-
-       load: function() {
-               config.pageLoaded = true;
-
-               // Initialize the configuration options
-               extend( config, {
-                       stats: { all: 0, bad: 0 },
-                       moduleStats: { all: 0, bad: 0 },
-                       started: 0,
-                       updateRate: 1000,
-                       autostart: true,
-                       filter: ""
-               }, true );
-
-               config.blocking = false;
-
-               if ( config.autostart ) {
-                       resumeProcessing();
-               }
-       }
-});
-
-// 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."
-                               );
-                       }
-
-                       config.callbacks[ key ].push( callback );
-               };
-
-               // DEPRECATED: This will be removed on QUnit 2.0.0+
-               // Stores the registered functions allowing restoring
-               // at verifyLoggingCallbacks() if modified
-               loggingCallbacks[ key ] = loggingCallback;
-
-               return loggingCallback;
-       }
-
-       for ( i = 0, l = callbacks.length; i < l; i++ ) {
-               key = callbacks[ i ];
-
-               // Initialize key collection of logging callback
-               if ( QUnit.objectType( config.callbacks[ key ] ) === "undefined" ) {
-                       config.callbacks[ key ] = [];
-               }
-
-               QUnit[ key ] = registerLoggingCallback( key );
-       }
-})();
-
-// `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: true } ) );
-               }
-               return false;
-       }
-
-       return ret;
-};
-
-function done() {
-       var runtime, passed;
-
-       config.autorun = true;
-
-       // 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;
-
-       runtime = now() - config.started;
-       passed = config.stats.all - config.stats.bad;
-
-       runLoggingCallbacks( "done", {
-               failed: config.stats.bad,
-               passed: passed,
-               total: config.stats.all,
-               runtime: runtime
-       });
-}
-
-// 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;
-
-       var stack, include, i;
-
-       if ( e.stacktrace ) {
-
-               // Opera 12.x
-               return e.stacktrace.split( "\n" )[ offset + 3 ];
-       } else if ( e.stack ) {
-
-               // Firefox, Chrome, Safari 6+, IE10+, PhantomJS and Node
-               stack = e.stack.split( "\n" );
-               if ( /^error$/i.test( stack[ 0 ] ) ) {
-                       stack.shift();
-               }
-               if ( fileName ) {
-                       include = [];
-                       for ( i = offset; i < stack.length; i++ ) {
-                               if ( stack[ i ].indexOf( fileName ) !== -1 ) {
-                                       break;
-                               }
-                               include.push( stack[ i ] );
-                       }
-                       if ( include.length ) {
-                               return include.join( "\n" );
-                       }
-               }
-               return stack[ offset ];
-       } else if ( e.sourceURL ) {
-
-               // 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 ) {
-       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 ) {
-               process( last );
-       }
-}
-
-function process( last ) {
-       function next() {
-               process( last );
-       }
-       var start = now();
-       config.depth = config.depth ? config.depth + 1 : 1;
-
-       while ( config.queue.length && !config.blocking ) {
-               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 );
-                       break;
-               }
-       }
-       config.depth--;
-       if ( last && !config.blocking && !config.queue.length && config.depth === 0 ) {
-               done();
-       }
-}
-
-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 = [];
-
-       if ( config.noglobals ) {
-               for ( var key in window ) {
-                       if ( hasOwn.call( window, key ) ) {
-                               // in Opera sometimes DOM element ids show up here, ignore them
-                               if ( /^qunit-test-output/.test( key ) ) {
-                                       continue;
-                               }
-                               config.pollution.push( key );
-                       }
-               }
-       }
-}
-
-function checkPollution() {
-       var newGlobals,
-               deletedGlobals,
-               old = config.pollution;
-
-       saveGlobal();
-
-       newGlobals = diff( config.pollution, old );
-       if ( newGlobals.length > 0 ) {
-               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( ", " ) );
-       }
-}
-
-// returns a new Array with the elements that are in a but not in b
-function diff( a, b ) {
-       var i, j,
-               result = a.slice();
-
-       for ( i = 0; i < result.length; i++ ) {
-               for ( j = 0; j < b.length; j++ ) {
-                       if ( result[ i ] === b[ j ] ) {
-                               result.splice( i, 1 );
-                               i--;
-                               break;
-                       }
-               }
-       }
-       return result;
-}
-
-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 if ( !( undefOnly && typeof a[ prop ] !== "undefined" ) ) {
-                                       a[ prop ] = b[ prop ];
-                               }
-                       }
-               }
-       }
-
-       return a;
-}
-
-function runLoggingCallbacks( key, args ) {
-       var i, l, callbacks;
-
-       callbacks = config.callbacks[ key ];
-       for ( i = 0, l = callbacks.length; i < l; i++ ) {
-               callbacks[ i ]( args );
-       }
-}
-
-// 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;
-
-       for ( loggingCallback in loggingCallbacks ) {
-               if ( QUnit[ loggingCallback ] !== loggingCallbacks[ loggingCallback ] ) {
-
-                       userCallback = QUnit[ loggingCallback ];
-
-                       // Restore the callback function
-                       QUnit[ loggingCallback ] = loggingCallbacks[ loggingCallback ];
-
-                       // Assign the deprecated given callback
-                       QUnit[ loggingCallback ]( userCallback );
-
-                       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/"
-                               );
-                       }
-               }
-       }
-}
-
-// from jquery.js
-function inArray( elem, array ) {
-       if ( array.indexOf ) {
-               return array.indexOf( elem );
-       }
-
-       for ( var i = 0, length = array.length; i < length; i++ ) {
-               if ( array[ i ] === elem ) {
-                       return i;
-               }
-       }
-
-       return -1;
-}
-
-function Test( settings ) {
-       var i, l;
-
-       ++Test.count;
-
-       extend( this, settings );
-       this.assertions = [];
-       this.semaphore = 0;
-       this.usedAsync = false;
-       this.module = config.currentModule;
-       this.stack = sourceFromStacktrace( 3 );
-
-       // Register unique strings
-       for ( i = 0, l = this.module.tests; i < l.length; i++ ) {
-               if ( this.module.tests[ i ].name === this.testName ) {
-                       this.testName += " ";
-               }
-       }
-
-       this.testId = generateHash( this.module.name, this.testName );
-
-       this.module.tests.push({
-               name: this.testName,
-               testId: this.testId
-       });
-
-       if ( settings.skip ) {
-
-               // Skipped tests will fully ignore any sent callback
-               this.callback = function() {};
-               this.async = false;
-               this.expected = 0;
-       } else {
-               this.assert = new Assert( this );
-       }
-}
-
-Test.count = 0;
-
-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'.
-                               // Without this, reporters can get testStart before moduleStart  which is a problem.
-                               !hasOwn.call( config, "previousModule" )
-               ) {
-                       if ( hasOwn.call( 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
-                               });
-                       }
-                       config.previousModule = this.module;
-                       config.moduleStats = { all: 0, bad: 0, started: now() };
-                       runLoggingCallbacks( "moduleStart", {
-                               name: this.module.name,
-                               tests: this.module.tests
-                       });
-               }
-
-               config.current = this;
-
-               this.testEnvironment = extend( {}, this.module.testEnvironment );
-               delete this.testEnvironment.beforeEach;
-               delete this.testEnvironment.afterEach;
-
-               this.started = now();
-               runLoggingCallbacks( "testStart", {
-                       name: this.testName,
-                       module: this.module.name,
-                       testId: this.testId
-               });
-
-               if ( !config.pollution ) {
-                       saveGlobal();
-               }
-       },
-
-       run: function() {
-               var promise;
-
-               config.current = this;
-
-               if ( this.async ) {
-                       QUnit.stop();
-               }
-
-               this.callbackStarted = now();
-
-               if ( config.notrycatch ) {
-                       promise = this.callback.call( this.testEnvironment, this.assert );
-                       this.resolvePromise( promise );
-                       return;
-               }
-
-               try {
-                       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 ) );
-
-                       // else next test will carry the responsibility
-                       saveGlobal();
-
-                       // Restart the tests if they're blocking
-                       if ( config.blocking ) {
-                               QUnit.start();
-                       }
-               }
-       },
-
-       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;
-                       }
-                       try {
-                               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;
-               }
-
-               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 ) {
-                       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 ) {
-                       this.pushFailure( "Expected " + this.expected + " assertions, but " +
-                               this.assertions.length + " were run", this.stack );
-               } else if ( this.expected === null && !this.assertions.length ) {
-                       this.pushFailure( "Expected at least one assertion, but none were run - call " +
-                               "expect(0) to accept zero assertions.", this.stack );
-               }
-
-               var i,
-                       bad = 0;
-
-               this.runtime = now() - this.started;
-               config.stats.all += this.assertions.length;
-               config.moduleStats.all += this.assertions.length;
-
-               for ( i = 0; i < this.assertions.length; i++ ) {
-                       if ( !this.assertions[ i ].result ) {
-                               bad++;
-                               config.stats.bad++;
-                               config.moduleStats.bad++;
-                       }
-               }
-
-               runLoggingCallbacks( "testDone", {
-                       name: this.testName,
-                       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;
-       },
-
-       queue: function() {
-               var bad,
-                       test = this;
-
-               if ( !this.valid() ) {
-                       return;
-               }
-
-               function run() {
-
-                       // each of these can by async
-                       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.name + "-" + this.testName );
-
-               if ( bad ) {
-                       run();
-               } else {
-                       synchronize( run, true );
-               }
-       },
-
-       push: function( result, actual, expected, message ) {
-               var source,
-                       details = {
-                               module: this.module.name,
-                               name: this.testName,
-                               result: result,
-                               message: message,
-                               actual: actual,
-                               expected: expected,
-                               testId: this.testId,
-                               runtime: now() - this.started
-                       };
-
-               if ( !result ) {
-                       source = sourceFromStacktrace();
-
-                       if ( source ) {
-                               details.source = source;
-                       }
-               }
-
-               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( "{0} bytes.", 2), "2 bytes.", "replaces {0} with next argument" );
-        */
-       equal: function( actual, expected, message ) {
-               /*jshint eqeqeq:false */
-               this.push( expected == actual, actual, expected, message );
-       },
-
-       /**
-        * @name notEqual
-        * @function
-        */
-       notEqual: function( actual, expected, message ) {
-               /*jshint eqeqeq:false */
-               this.push( expected != actual, actual, expected, message );
-       },
-
-       /**
-        * @name propEqual
-        * @function
-        */
-       propEqual: function( actual, expected, message ) {
-               actual = objectValues( actual );
-               expected = objectValues( expected );
-               this.push( QUnit.equiv( actual, expected ), actual, expected, message );
-       },
-
-       /**
-        * @name notPropEqual
-        * @function
-        */
-       notPropEqual: function( actual, expected, message ) {
-               actual = objectValues( actual );
-               expected = objectValues( expected );
-               this.push( !QUnit.equiv( actual, expected ), actual, expected, message );
-       },
-
-       /**
-        * @name deepEqual
-        * @function
-        */
-       deepEqual: function( actual, expected, message ) {
-               this.push( QUnit.equiv( actual, expected ), actual, expected, message );
-       },
-
-       /**
-        * @name notDeepEqual
-        * @function
-        */
-       notDeepEqual: function( actual, expected, message ) {
-               this.push( !QUnit.equiv( actual, expected ), actual, expected, message );
-       },
-
-       /**
-        * @name strictEqual
-        * @function
-        */
-       strictEqual: function( actual, expected, message ) {
-               this.push( expected === actual, actual, expected, message );
-       },
-
-       /**
-        * @name notStrictEqual
-        * @function
-        */
-       notStrictEqual: function( actual, expected, message ) {
-               this.push( expected !== actual, actual, expected, message );
-       },
-
-       "throws": function( block, expected, message ) {
-               var actual, expectedType,
-                       expectedOutput = expected,
-                       ok = false;
-
-               // 'expected' is optional unless doing string comparison
-               if ( message == null && typeof expected === "string" ) {
-                       message = expected;
-                       expected = null;
-               }
-
-               this.test.ignoreGlobalErrors = true;
-               try {
-                       block.call( this.test.testEnvironment );
-               } catch (e) {
-                       actual = e;
-               }
-               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 a regexp
-                       } else if ( expectedType === "regexp" ) {
-                               ok = expected.test( errorString( actual ) );
-
-                       // expected is a string
-                       } else if ( expectedType === "string" ) {
-                               ok = expected === errorString( actual );
-
-                       // expected is a constructor, maybe an Error constructor
-                       } else if ( expectedType === "function" && actual instanceof expected ) {
-                               ok = 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;
-                       }
-
-                       this.push( ok, actual, expectedOutput, message );
-               } else {
-                       this.test.pushFailure( message, null, "No exception was thrown." );
-               }
-       }
-};
-
-// 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>
-QUnit.equiv = (function() {
-
-       // Call the o related callback with the given arguments.
-       function bindCallbacks( o, callbacks, args ) {
-               var prop = QUnit.objectType( o );
-               if ( prop ) {
-                       if ( QUnit.objectType( callbacks[ prop ] ) === "function" ) {
-                               return callbacks[ prop ].apply( callbacks, args );
-                       } else {
-                               return callbacks[ prop ]; // or undefined
-                       }
-               }
-       }
-
-       // 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, proto: true */
-                       return obj.__proto__;
-               },
-               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;
-                                       // var j = new Number(1);
-                                       return a == b;
-                               } else {
-                                       return a === b;
-                               }
-                       }
-
-                       return {
-                               "string": useStrictEquality,
-                               "boolean": useStrictEquality,
-                               "number": useStrictEquality,
-                               "null": useStrictEquality,
-                               "undefined": useStrictEquality,
-
-                               "nan": function( b ) {
-                                       return isNaN( b );
-                               },
-
-                               "date": function( b, a ) {
-                                       return QUnit.objectType( b ) === "date" && a.valueOf() === b.valueOf();
-                               },
-
-                               "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 &&
-                                               a.sticky === b.sticky;
-                               },
-
-                               // - skip when the property is a method of an instance (OOP)
-                               // - abort otherwise,
-                               // initial === would have catch identical references anyway
-                               "function": function() {
-                                       var caller = callers[ callers.length - 1 ];
-                                       return caller !== Object && typeof caller !== "undefined";
-                               },
-
-                               "array": function( b, a ) {
-                                       var i, j, len, loop, aCircular, bCircular;
-
-                                       // b could be an object literal here
-                                       if ( QUnit.objectType( b ) !== "array" ) {
-                                               return false;
-                                       }
-
-                                       len = a.length;
-                                       if ( len !== b.length ) {
-                                               // safe and faster
-                                               return false;
-                                       }
-
-                                       // track reference to avoid circular references
-                                       parents.push( a );
-                                       parentsB.push( b );
-                                       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 ];
-                                                       if ( aCircular || bCircular ) {
-                                                               if ( a[ i ] === b[ i ] || aCircular && bCircular ) {
-                                                                       loop = true;
-                                                               } else {
-                                                                       parents.pop();
-                                                                       parentsB.pop();
-                                                                       return false;
-                                                               }
-                                                       }
-                                               }
-                                               if ( !loop && !innerEquiv( a[ i ], b[ i ] ) ) {
-                                                       parents.pop();
-                                                       parentsB.pop();
-                                                       return false;
-                                               }
-                                       }
-                                       parents.pop();
-                                       parentsB.pop();
-                                       return true;
-                               },
-
-                               "object": function( b, a ) {
-
-                                       /*jshint forin:false */
-                                       var i, j, loop, aCircular, bCircular,
-                                               // Default to true
-                                               eq = true,
-                                               aProperties = [],
-                                               bProperties = [];
-
-                                       // 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;
-                                               }
-                                       }
-
-                                       // stack constructor before traversing properties
-                                       callers.push( a.constructor );
-
-                                       // track reference to avoid circular references
-                                       parents.push( a );
-                                       parentsB.push( b );
-
-                                       // be strict: don't ensure hasOwnProperty and go deep
-                                       for ( i in a ) {
-                                               loop = false;
-                                               for ( j = 0; j < parents.length; j++ ) {
-                                                       aCircular = parents[ j ] === a[ i ];
-                                                       bCircular = parentsB[ j ] === b[ i ];
-                                                       if ( aCircular || bCircular ) {
-                                                               if ( a[ i ] === b[ i ] || aCircular && bCircular ) {
-                                                                       loop = true;
-                                                               } else {
-                                                                       eq = false;
-                                                                       break;
-                                                               }
-                                                       }
-                                               }
-                                               aProperties.push( i );
-                                               if ( !loop && !innerEquiv( a[ i ], b[ i ] ) ) {
-                                                       eq = false;
-                                                       break;
-                                               }
-                                       }
-
-                                       parents.pop();
-                                       parentsB.pop();
-                                       callers.pop(); // unstack, we are done
-
-                                       for ( i in b ) {
-                                               bProperties.push( i ); // collect b's properties
-                                       }
-
-                                       // Ensures identical properties name
-                                       return eq && innerEquiv( aProperties.sort(), bProperties.sort() );
-                               }
-                       };
-               }());
-
-       innerEquiv = function() { // can take multiple arguments
-               var args = [].slice.apply( arguments );
-               if ( args.length < 2 ) {
-                       return true; // end transition
-               }
-
-               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 ) ) {
-
-                               // 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 ) ) );
-       };
-
-       return innerEquiv;
-}());
-
-// 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, "\\\"" ) + "\"";
-       }
-       function literal( o ) {
-               return o + "";
-       }
-       function join( pre, arr, post ) {
-               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 );
-       }
-       function array( arr, stack ) {
-               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 );
-               }
-               this.down();
-               return join( "[", ret, "]" );
-       }
-
-       var reName = /^function (\w+)/,
-               dump = {
-
-                       // 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 ) + ")";
-                               }
-
-                               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 ( parserType === "string" ) ? parser : this.parsers.error;
-                       },
-                       typeOf: function( obj ) {
-                               var type;
-                               if ( obj === null ) {
-                                       type = "null";
-                               } else if ( typeof obj === "undefined" ) {
-                                       type = "undefined";
-                               } else if ( QUnit.is( "regexp", obj ) ) {
-                                       type = "regexp";
-                               } else if ( QUnit.is( "date", obj ) ) {
-                                       type = "date";
-                               } else if ( QUnit.is( "function", obj ) ) {
-                                       type = "function";
-                               } 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" && 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 ) {
-                                       type = "error";
-                               } else {
-                                       type = typeof obj;
-                               }
-                               return type;
-                       },
-                       separator: function() {
-                               return this.multiline ? this.HTML ? "<br />" : "\n" : this.HTML ? "&#160;" : " ";
-                       },
-                       // extra can be a number, shortcut for increasing-calling-decreasing
-                       indent: function( extra ) {
-                               if ( !this.multiline ) {
-                                       return "";
-                               }
-                               var chr = this.indentChar;
-                               if ( this.HTML ) {
-                                       chr = chr.replace( /\t/g, "   " ).replace( / /g, "&#160;" );
-                               }
-                               return new Array( this.depth + ( extra || 0 ) ).join( chr );
-                       },
-                       up: function( a ) {
-                               this.depth += a || 1;
-                       },
-                       down: function( a ) {
-                               this.depth -= a || 1;
-                       },
-                       setParser: function( name, parser ) {
-                               this.parsers[ name ] = parser;
-                       },
-                       // The next 3 are exposed so you can use them
-                       quote: quote,
-                       literal: literal,
-                       join: join,
-                       //
-                       depth: 1,
-                       maxDepth: 5,
-
-                       // This is the list of parsers, to modify them, use dump.setParser
-                       parsers: {
-                               window: "[Window]",
-                               document: "[Document]",
-                               error: function( error ) {
-                                       return "Error(\"" + error.message + "\")";
-                               },
-                               unknown: "[Unknown]",
-                               "null": "null",
-                               "undefined": "undefined",
-                               "function": function( fn ) {
-                                       var ret = "function",
-
-                                               // functions never have name in IE
-                                               name = "name" in fn ? fn.name : ( reName.exec( fn ) || [] )[ 1 ];
-
-                                       if ( name ) {
-                                               ret += " " + name;
-                                       }
-                                       ret += "( ";
-
-                                       ret = [ ret, dump.parse( fn, "functionArgs" ), "){" ].join( "" );
-                                       return join( ret, dump.parse( fn, "functionCode" ), "}" );
-                               },
-                               array: array,
-                               nodelist: array,
-                               "arguments": array,
-                               object: function( map, stack ) {
-                                       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( dump.parse( key, "key" ) + ": " +
-                                                       dump.parse( val, undefined, stack ) );
-                                       }
-                                       dump.down();
-                                       return join( "{", ret, "}" );
-                               },
-                               node: function( node ) {
-                                       var len, i, val,
-                                               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".
-                                                       if ( val && val !== "inherit" ) {
-                                                               ret += " " + attrs[ i ].nodeName + "=" +
-                                                                       dump.parse( val, "attribute" );
-                                                       }
-                                               }
-                                       }
-                                       ret += close;
-
-                                       // Show content of TextNode or CDATASection
-                                       if ( node.nodeType === 3 || node.nodeType === 4 ) {
-                                               ret += node.nodeValue;
-                                       }
-
-                                       return ret + open + "/" + tag + close;
-                               },
-
-                               // function calls it internally, it's the arguments part of the function
-                               functionArgs: function( fn ) {
-                                       var args,
-                                               l = fn.length;
-
-                                       if ( !l ) {
-                                               return "";
-                                       }
-
-                                       args = new Array( l );
-                                       while ( l-- ) {
-
-                                               // 97 is 'a'
-                                               args[ l ] = String.fromCharCode( 97 + l );
-                                       }
-                                       return " " + args.join( ", " ) + " ";
-                               },
-                               // object calls it internally, the key part of an item in a map
-                               key: quote,
-                               // function calls it internally, it's the content of the function
-                               functionCode: "[code]",
-                               // node calls it internally, it's an html attribute value
-                               attribute: quote,
-                               string: quote,
-                               date: quote,
-                               regexp: literal,
-                               number: literal,
-                               "boolean": literal
-                       },
-                       // if true, entities are escaped ( <, >, \t, space and \n )
-                       HTML: false,
-                       // indentation unit
-                       indentChar: "  ",
-                       // if true, items in a collection, are separated by a \n, else just a space.
-                       multiline: true
-               };
-
-       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/)
- *  Modified by Chu Alan "sprite"
- *
- * Released under the MIT license.
- *
- * More Info:
- *  http://ejohn.org/projects/javascript-diff-algorithm/
- *
- * Usage: QUnit.diff(expected, actual)
- *
- * 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,
-                       ns = {},
-                       os = {};
-
-               for ( i = 0; i < n.length; i++ ) {
-                       if ( !hasOwn.call( ns, n[ i ] ) ) {
-                               ns[ n[ i ] ] = {
-                                       rows: [],
-                                       o: null
-                               };
-                       }
-                       ns[ n[ i ] ].rows.push( i );
-               }
-
-               for ( i = 0; i < o.length; i++ ) {
-                       if ( !hasOwn.call( os, o[ i ] ) ) {
-                               os[ o[ i ] ] = {
-                                       rows: [],
-                                       n: null
-                               };
-                       }
-                       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 ]
-                                       };
-                                       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 ] ) {
-
-                               n[ i + 1 ] = {
-                                       text: n[ i + 1 ],
-                                       row: 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 ] ) {
-
-                               n[ i - 1 ] = {
-                                       text: n[ i - 1 ],
-                                       row: n[ i ].row - 1
-                               };
-                               o[ n[ i ].row - 1 ] = {
-                                       text: o[ n[ i ].row - 1 ],
-                                       row: i - 1
-                               };
-                       }
-               }
-
-               return {
-                       o: o,
-                       n: n
-               };
-       }
-
-       return function( o, n ) {
-               o = o.replace( /\s+$/, "" );
-               n = n.replace( /\s+$/, "" );
-
-               var i, pre,
-                       str = "",
-                       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 {
-                       oSpace.push( " " );
-               }
-
-               if ( nSpace == null ) {
-                       nSpace = [ " " ];
-               } else {
-                       nSpace.push( " " );
-               }
-
-               if ( out.n.length === 0 ) {
-                       for ( i = 0; i < out.o.length; i++ ) {
-                               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>";
-                               }
-                       }
-
-                       for ( i = 0; i < out.n.length; i++ ) {
-                               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>";
-                                       }
-                                       str += " " + out.n[ i ].text + nSpace[ i ] + pre;
-                               }
-                       }
-               }
-
-               return str;
-       };
-}());
-// jscs:enable
-
-(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;
-}
-
-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 ) {
-
-               // 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 );
-}
-
-})();
diff --git a/resources/lib/oojs-ui/i18n/awa.json b/resources/lib/oojs-ui/i18n/awa.json
new file mode 100644 (file)
index 0000000..f78ed32
--- /dev/null
@@ -0,0 +1,8 @@
+{
+       "@metadata": {
+               "authors": [
+                       "1AnuraagPandey"
+               ]
+       },
+       "ooui-toolbar-more": "अउर"
+}
index 2696144..c7df768 100644 (file)
@@ -6,13 +6,20 @@
                        "Jayantanth",
                        "Nasir8891",
                        "Runab",
-                       "Sayak Sarkar"
+                       "Sayak Sarkar",
+                       "Aftabuzzaman",
+                       "RYasmeen (WMF)"
                ]
        },
        "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-message-reject": "বাতিল",
+       "ooui-dialog-process-dismiss": "বাতিল করুন",
+       "ooui-dialog-process-retry": "আবার চেষ্টা করুন",
+       "ooui-dialog-process-continue": "অগ্রসর হোন"
 }
index 1247241..562dc3d 100644 (file)
@@ -9,6 +9,8 @@
        "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-continue": "Кхин дӀа"
index 62973d3..e947582 100644 (file)
@@ -3,10 +3,18 @@
                "authors": [
                        "An13sa",
                        "Unai Fdz. de Betoño",
-                       "Xabier Armendaritz"
+                       "Xabier Armendaritz",
+                       "Subi"
                ]
        },
        "ooui-outline-control-move-down": "Mugitu itema beherantz",
        "ooui-outline-control-move-up": "Mugitu itema gorantz",
-       "ooui-toolbar-more": "Gehiago"
+       "ooui-toolbar-more": "Gehiago",
+       "ooui-toolgroup-expand": "Gehiago",
+       "ooui-toolgroup-collapse": "Gutxiago",
+       "ooui-dialog-message-accept": "Ados",
+       "ooui-dialog-message-reject": "Utzi",
+       "ooui-dialog-process-error": "Zerbaitek huts egin du",
+       "ooui-dialog-process-retry": "Saiatu berriro",
+       "ooui-dialog-process-continue": "Jarraitu"
 }
index 63902f3..196dc2c 100644 (file)
@@ -8,13 +8,15 @@
                        "아라",
                        "고기랑",
                        "Ryuch",
-                       "Revi"
+                       "Revi",
+                       "Infinity"
                ]
        },
        "ooui-outline-control-move-down": "항목을 아래로 옮기기",
        "ooui-outline-control-move-up": "항목을 위로 옮기기",
        "ooui-outline-control-remove": "항목 지우기",
        "ooui-toolbar-more": "더 보기",
+       "ooui-toolgroup-expand": "더 보기",
        "ooui-dialog-message-accept": "확인",
        "ooui-dialog-message-reject": "취소",
        "ooui-dialog-process-error": "무언가가 잘못되었습니다",
index 764f2eb..cc8fdf5 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.6.3
+ * OOjs UI v0.8.0
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-01-16T00:05:16Z
+ * Date: 2015-02-19T01:33:21Z
  */
 .oo-ui-progressBarWidget-slide-frames from {
        margin-left: -40%;
@@ -62,6 +62,9 @@
 .oo-ui-ltr {
        direction: ltr;
 }
+.oo-ui-element-hidden {
+       display: none !important;
+}
 .oo-ui-buttonElement > .oo-ui-buttonElement-button {
        cursor: pointer;
        display: inline-block;
@@ -73,9 +76,7 @@
            -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-iconElement-icon,
 .oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
        display: none;
 }
        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: #ffffff;
-       background: #eeeeee;
-}
-.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:hover,
 .oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:focus {
+       box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.2), 0 0 0 1px rgba(0, 0, 0, 0.2);
        outline: none;
 }
+.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button .oo-ui-indicatorElement-indicator {
+       margin-right: 0;
+}
 .oo-ui-buttonElement-frameless.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
        margin-left: 0.25em;
+       margin-right: 0.25em;
 }
 .oo-ui-buttonElement-frameless.oo-ui-widget-enabled > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
        color: #757575;
 }
-.oo-ui-buttonElement-frameless.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-buttonElement-pressed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
        color: #444444;
 }
        color: #777777;
 }
 .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;
        color: #777777;
 }
 .oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active > .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;
        color: #777777;
 }
 .oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active > .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-frameless.oo-ui-widget-disabled > .oo-ui-buttonElement-button {
+       color: #cccccc;
+}
+.oo-ui-buttonElement-frameless.oo-ui-widget-disabled > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon,
+.oo-ui-buttonElement-frameless.oo-ui-widget-disabled > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
+       opacity: 0.2;
+}
 .oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {
        margin: 0.1em 0;
        padding: 0.2em 0.8em;
 }
 .oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button {
        color: #ffffff;
-       background: #eeeeee;
-       border: #eeeeee;
+       background: #dddddd;
+       border: 1px solid #dddddd;
 }
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button {
        color: #757575;
        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-buttonElement-active > .oo-ui-buttonElement-button {
+       background-color: #999999;
+       color: #ffffff;
+}
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button {
        color: #0274ff;
 }
        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-progressive.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button {
+       background-color: #999999;
+       color: #ffffff;
+}
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button {
        color: #00af89;
 }
        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-constructive.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button {
+       background-color: #999999;
+       color: #ffffff;
+}
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button {
        color: #d11d13;
 }
        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-destructive.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button {
+       background-color: #999999;
+       color: #ffffff;
+}
 .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: #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 {
+       color: #ffffff;
        background-color: #015ccc;
        border-color: #015ccc;
        box-shadow: none;
 }
+.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 {
+       background-color: #999999;
+       color: #ffffff;
+}
 .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: #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 {
+       color: #ffffff;
        background-color: #008c6d;
        border-color: #008c6d;
        box-shadow: none;
 }
+.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 {
+       background-color: #999999;
+       color: #ffffff;
+}
 .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: #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 {
+       color: #ffffff;
        background-color: #a7170f;
        border-color: #a7170f;
        box-shadow: none;
 }
+.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 {
+       background-color: #999999;
+       color: #ffffff;
+}
 .oo-ui-clippableElement-clippable {
        -webkit-box-sizing: border-box;
           -moz-box-sizing: border-box;
 .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 > .oo-ui-popupButtonWidget {
+       margin-right: 0;
        margin-top: 0.25em;
 }
+.oo-ui-fieldLayout > .oo-ui-popupButtonWidget:last-child {
+       margin-right: 0;
+}
 .oo-ui-fieldLayout-disabled .oo-ui-labelElement-label {
        color: #cccccc;
 }
 }
 .oo-ui-actionFieldLayout-button {
        width: 1%;
+       white-space: nowrap;
 }
 .oo-ui-fieldsetLayout {
        position: relative;
 .oo-ui-fieldsetLayout.oo-ui-labelElement > .oo-ui-labelElement-label {
        display: inline-block;
 }
+.oo-ui-fieldsetLayout > .oo-ui-fieldsetLayout-help {
+       float: right;
+}
+.oo-ui-fieldsetLayout > .oo-ui-fieldsetLayout-help > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
+       z-index: 1;
+}
+.oo-ui-fieldsetLayout > .oo-ui-fieldsetLayout-help .oo-ui-fieldsetLayout-help-content {
+       padding: 0.5em 0.75em;
+       line-height: 1.5em;
+}
 .oo-ui-fieldsetLayout + .oo-ui-fieldsetLayout {
        margin-top: 2em;
 }
        width: 1.5em;
        height: 1.5em;
 }
+.oo-ui-fieldsetLayout > .oo-ui-popupButtonWidget {
+       margin-right: 0;
+}
+.oo-ui-fieldsetLayout > .oo-ui-popupButtonWidget:last-child {
+       margin-right: 0;
+}
 .oo-ui-gridLayout {
        position: absolute;
        top: 0;
        right: 0;
        bottom: 0;
 }
+.oo-ui-menuLayout {
+       position: absolute;
+       top: 0;
+       left: 0;
+       right: 0;
+       bottom: 0;
+}
+.oo-ui-menuLayout-menu,
+.oo-ui-menuLayout-content {
+       position: absolute;
+       -webkit-transition: all ease-in-out 200ms;
+          -moz-transition: all ease-in-out 200ms;
+           -ms-transition: all ease-in-out 200ms;
+            -o-transition: all ease-in-out 200ms;
+               transition: all ease-in-out 200ms;
+}
+.oo-ui-menuLayout-content {
+       top: 0;
+       left: 0;
+       right: 0;
+       bottom: 0;
+}
+.oo-ui-menuLayout-top .oo-ui-menuLayout-menu {
+       left: 0;
+       top: 0;
+       right: 0;
+}
+.oo-ui-menuLayout-after .oo-ui-menuLayout-menu {
+       top: 0;
+       right: 0;
+       bottom: 0;
+}
+.oo-ui-menuLayout-bottom .oo-ui-menuLayout-menu {
+       right: 0;
+       bottom: 0;
+       left: 0;
+}
+.oo-ui-menuLayout-before .oo-ui-menuLayout-menu {
+       bottom: 0;
+       left: 0;
+       top: 0;
+}
+.oo-ui-menuLayout-top .oo-ui-menuLayout-content {
+       right: 0 !important;
+       bottom: 0 !important;
+       left: 0 !important;
+}
+.oo-ui-menuLayout-after .oo-ui-menuLayout-content {
+       bottom: 0 !important;
+       left: 0 !important;
+       top: 0 !important;
+}
+.oo-ui-menuLayout-bottom .oo-ui-menuLayout-content {
+       left: 0 !important;
+       top: 0 !important;
+       right: 0 !important;
+}
+.oo-ui-menuLayout-before .oo-ui-menuLayout-content {
+       top: 0 !important;
+       right: 0 !important;
+       bottom: 0 !important;
+}
 .oo-ui-panelLayout {
        position: relative;
 }
 .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;
        padding: 0.25em 0 0.25em 0;
        border: 1px solid #aaaaaa;
        border-radius: 0.2em;
+       border-top-left-radius: 0;
        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 {
        background-image: none;
 }
 .oo-ui-menuToolGroup .oo-ui-tool-active .oo-ui-tool-link .oo-ui-iconElement-icon {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/check.svg);
+       background-image: url("themes/mediawiki/images/icons/check.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/check.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/check.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/check.png");
 }
 .oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover {
        background-color: #eeeeee;
        line-height: 1.5em;
 }
 .oo-ui-selectWidget-depressed .oo-ui-optionWidget-selected,
-.oo-ui-selectWidget-pressed .oo-ui-optionWidget-pressed {
+.oo-ui-selectWidget-pressed .oo-ui-optionWidget-pressed,
+.oo-ui-selectWidget-pressed .oo-ui-optionWidget-pressed.oo-ui-optionWidget-highlighted,
+.oo-ui-selectWidget-pressed .oo-ui-optionWidget-pressed.oo-ui-optionWidget-highlighted.oo-ui-optionWidget-selected {
        background-color: #d0d0d0;
 }
 .oo-ui-optionWidget.oo-ui-widget-disabled {
        display: inline-block;
        white-space: nowrap;
        border-radius: 2px;
+       margin-right: 0.5em;
+}
+.oo-ui-buttonSelectWidget:last-child {
+       margin-right: 0;
 }
 .oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
        border-radius: 0;
        border-bottom-right-radius: 2px;
        border-top-right-radius: 2px;
 }
-.oo-ui-radioSelectWidget {
-       padding: 0.75em 0 0.5em 0;
-}
 .oo-ui-buttonOptionWidget {
        display: inline-block;
        padding: 0;
 }
 .oo-ui-radioOptionWidget {
        cursor: default;
-       padding: 0;
+       padding: 0.25em 0;
        background-color: transparent;
 }
 .oo-ui-radioOptionWidget .oo-ui-radioInputWidget,
 .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;
 }
 .oo-ui-buttonWidget {
        display: inline-block;
        vertical-align: middle;
+       margin-right: 0.5em;
+}
+.oo-ui-buttonWidget:last-child {
+       margin-right: 0;
 }
 .oo-ui-buttonGroupWidget {
        display: inline-block;
        white-space: nowrap;
        border-radius: 2px;
+       margin-right: 0.5em;
+}
+.oo-ui-buttonGroupWidget:last-child {
+       margin-right: 0;
+}
+.oo-ui-buttonGroupWidget .oo-ui-buttonWidget {
+       margin-right: 0;
+}
+.oo-ui-buttonGroupWidget .oo-ui-buttonWidget:last-child {
+       margin-right: 0;
 }
 .oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed .oo-ui-buttonElement-button {
        border-radius: 0;
        width: 4em;
        border-radius: 1em;
        border: 1px #dddddd solid;
+       margin-right: 0.5em;
 }
 .oo-ui-toggleSwitchWidget.oo-ui-widget-disabled {
        cursor: default;
 .oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
        display: none;
 }
+.oo-ui-toggleSwitchWidget:last-child {
+       margin-right: 0;
+}
 .oo-ui-toggleSwitchWidget-grip {
        top: 0.25em;
        left: 0.25em;
 }
 .oo-ui-progressBarWidget {
        max-width: 50em;
-       border: solid 1px #0274ff;
+       border: solid 1px #cccccc;
        border-radius: 0.1em;
        overflow: hidden;
 }
 .oo-ui-progressBarWidget-bar {
        height: 1em;
-       background: #0274ff;
+       background: #dddddd;
        -webkit-transition: width 200ms, margin-left 200ms;
           -moz-transition: width 200ms, margin-left 200ms;
            -ms-transition: width 200ms, margin-left 200ms;
        border-left-width: 1px;
 }
 .oo-ui-progressBarWidget.oo-ui-widget-disabled {
-       opacity: 0.2;
+       opacity: 0.6;
 }
 .oo-ui-actionWidget.oo-ui-pendingElement-pending {
        background-image: /* @embed */ url(themes/mediawiki/images/textures/pending.gif);
 .oo-ui-popupButtonWidget.oo-ui-buttonElement-framed > .oo-ui-popupWidget {
        left: 1.75em;
 }
+.oo-ui-inputWidget {
+       margin-right: 0.5em;
+}
+.oo-ui-inputWidget:last-child {
+       margin-right: 0;
+}
+.oo-ui-buttonInputWidget {
+       display: inline-block;
+       vertical-align: middle;
+}
 .oo-ui-checkboxInputWidget {
        position: relative;
-       line-height: 2em;
+       line-height: 1.6em;
        white-space: nowrap;
 }
 .oo-ui-checkboxInputWidget * {
 }
 .oo-ui-checkboxInputWidget input[type="checkbox"] {
        opacity: 0;
+       position: relative;
+       z-index: 1;
        margin: 0;
-       width: 2em;
-       height: 2em;
+       width: 1.6em;
+       height: 1.6em;
        max-width: none;
 }
 .oo-ui-checkboxInputWidget input[type="checkbox"] + span {
        cursor: pointer;
-       margin: 0 0.4em;
+       margin: 0 0.2em;
 }
 .oo-ui-checkboxInputWidget input[type="checkbox"] + span::before {
        -webkit-transition: background-size 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
        position: absolute;
        left: 0;
        border-radius: 2px;
-       width: 2em;
-       height: 2em;
+       width: 1.6em;
+       height: 1.6em;
        background-color: white;
        border: 1px solid #777777;
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/check-constructive.svg);
-       background-size: 2em, 2em;
+       background-image: url("themes/mediawiki/images/icons/check-constructive.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/check-constructive.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/check-constructive.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/check-constructive.png");
        background-repeat: no-repeat;
        background-position: center center;
        background-origin: border-box;
        border-color: #eeeeee;
 }
 .oo-ui-checkboxInputWidget input[type="checkbox"]:disabled:checked + span::before {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/check-invert.svg);
+       background-image: url("themes/mediawiki/images/icons/check-invert.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/check-invert.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/check-invert.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/check-invert.png");
+}
+.oo-ui-dropdownInputWidget {
+       position: relative;
+       vertical-align: middle;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+       width: 100%;
+       max-width: 50em;
+}
+.oo-ui-dropdownInputWidget select {
+       display: inline-block;
+       width: 100%;
+       resize: none;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+}
+.oo-ui-dropdownInputWidget select {
+       height: 2.5em;
+       padding: 0.5em;
+       font-size: 1em;
+       font-family: sans-serif;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+       border: solid 1px #cccccc;
+}
+.oo-ui-dropdownInputWidget.oo-ui-widget-enabled select:hover,
+.oo-ui-dropdownInputWidget.oo-ui-widget-enabled select:focus {
+       border-color: #aaaaaa;
+       outline: none;
+}
+.oo-ui-dropdownInputWidget.oo-ui-widget-disabled select {
+       color: #cccccc;
+       border-color: #dddddd;
+       background-color: #f3f3f3;
 }
 .oo-ui-radioInputWidget {
        position: relative;
-       line-height: 2em;
+       line-height: 1.6em;
        white-space: nowrap;
 }
 .oo-ui-radioInputWidget * {
 }
 .oo-ui-radioInputWidget input[type="radio"] {
        opacity: 0;
+       position: relative;
+       z-index: 1;
        margin: 0;
-       width: 2em;
-       height: 2em;
+       width: 1.6em;
+       height: 1.6em;
        max-width: none;
 }
 .oo-ui-radioInputWidget input[type="radio"] + span {
        cursor: pointer;
-       margin: 0 0.4em;
+       margin: 0 0.2em;
 }
 .oo-ui-radioInputWidget input[type="radio"] + span::before {
        -webkit-transition: background-size 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
        position: absolute;
        left: 0;
        border-radius: 100%;
-       width: 2em;
-       height: 2em;
+       width: 1.6em;
+       height: 1.6em;
        background: white;
        border: 1px solid #777777;
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/circle-constructive.svg);
+       background-image: url("themes/mediawiki/images/icons/circle-constructive.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/circle-constructive.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/circle-constructive.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/circle-constructive.png");
        background-repeat: no-repeat;
        background-position: center center;
        background-origin: border-box;
        border-color: #eeeeee;
 }
 .oo-ui-radioInputWidget input[type="radio"]:disabled:checked + span::before {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/circle-invert.svg);
+       background-image: url("themes/mediawiki/images/icons/circle-invert.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/circle-invert.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/circle-invert.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/circle-invert.png");
 }
 .oo-ui-textInputWidget {
        position: relative;
                box-sizing: border-box;
 }
 .oo-ui-textInputWidget > .oo-ui-iconElement-icon,
-.oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator {
+.oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator,
+.oo-ui-textInputWidget > .oo-ui-labelElement-label {
+       display: none;
+}
+.oo-ui-textInputWidget.oo-ui-iconElement > .oo-ui-iconElement-icon,
+.oo-ui-textInputWidget.oo-ui-indicatorElement > .oo-ui-indicatorElement-indicator {
+       display: block;
        position: absolute;
        top: 0;
        height: 100%;
            -ms-user-select: none;
                user-select: none;
 }
+.oo-ui-textInputWidget.oo-ui-labelElement > .oo-ui-labelElement-label {
+       display: block;
+}
 .oo-ui-textInputWidget > .oo-ui-iconElement-icon {
        left: 0;
 }
 .oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator {
        right: 0;
 }
+.oo-ui-textInputWidget > .oo-ui-labelElement-label {
+       position: absolute;
+       top: 0;
+}
+.oo-ui-textInputWidget-labelPosition-after > .oo-ui-labelElement-label {
+       right: 0;
+}
+.oo-ui-textInputWidget-labelPosition-before > .oo-ui-labelElement-label {
+       left: 0;
+}
 .oo-ui-textInputWidget input,
 .oo-ui-textInputWidget textarea {
        padding: 0.5em 0.5em 0.5em 0.9em;
 }
 .oo-ui-textInputWidget.oo-ui-iconElement input,
 .oo-ui-textInputWidget.oo-ui-iconElement textarea {
-       padding-left: 2.4em;
+       padding-left: 2.75em;
 }
 .oo-ui-textInputWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
        left: 0.4em;
        height: 100%;
        background-position: left center;
 }
+.oo-ui-textInputWidget > .oo-ui-labelElement-label {
+       padding: 0.4em;
+       line-height: 1.5em;
+       color: #888888;
+}
+.oo-ui-textInputWidget-labelPosition-after.oo-ui-indicatorElement > .oo-ui-labelElement-label {
+       margin-right: 2em;
+}
+.oo-ui-textInputWidget-labelPosition-before.oo-ui-iconElement > .oo-ui-labelElement-label {
+       margin-left: 2.5em;
+}
 .oo-ui-menuSelectWidget {
        position: absolute;
        background: #ffffff;
        margin-top: -1px;
        border: solid 1px #aaaaaa;
-       border-radius: 0 0 0.1em 0.1em;
+       border-radius: 0 0 0.2em 0.2em;
        padding-bottom: 0.25em;
        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);
 }
 }
 .oo-ui-menuOptionWidget {
        position: relative;
+       padding: 0.5em 1em;
 }
 .oo-ui-menuOptionWidget .oo-ui-iconElement-icon {
        display: none;
        display: block;
 }
 .oo-ui-menuOptionWidget.oo-ui-optionWidget-selected {
-       background-color: transparent;
+       background-color: #999999;
+       color: #ffffff;
+}
+.oo-ui-menuOptionWidget.oo-ui-optionWidget-selected .oo-ui-iconElement-icon {
+       display: none;
 }
 .oo-ui-menuOptionWidget.oo-ui-optionWidget-highlighted {
        background-color: #eeeeee;
+       color: black;
 }
 .oo-ui-menuSectionOptionWidget {
        cursor: default;
        margin: 0.25em 0;
        width: 100%;
        max-width: 50em;
+       margin-right: 0.5em;
 }
 .oo-ui-dropdownWidget-handle {
        width: 100%;
 .oo-ui-dropdownWidget.oo-ui-widget-disabled .oo-ui-dropdownWidget-handle {
        cursor: default;
 }
+.oo-ui-dropdownWidget:last-child {
+       margin-right: 0;
+}
 .oo-ui-dropdownWidget-handle {
        height: 2.5em;
        border: solid 1px #cccccc;
        position: relative;
        width: 100%;
        max-width: 50em;
+       margin-right: 0.5em;
 }
 .oo-ui-comboBoxWidget > .oo-ui-menuSelectWidget {
        z-index: 1;
        width: 100%;
 }
+.oo-ui-comboBoxWidget:last-child {
+       margin-right: 0;
+}
 .oo-ui-comboBoxWidget .oo-ui-textInputWidget input,
 .oo-ui-comboBoxWidget .oo-ui-textInputWidget textarea {
        height: 2.35em;
           -moz-box-sizing: border-box;
                box-sizing: border-box;
 }
-.oo-ui-searchWidget {
-       border: solid 1px #cccccc;
-}
 .oo-ui-searchWidget-query {
        position: absolute;
        top: 0;
           -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;
 }
        right: 0;
 }
 .oo-ui-processDialog-errors {
-       display: none;
        position: absolute;
        top: 0;
        left: 0;
        height: 0;
        overflow: hidden;
 }
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-load {
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-active {
        width: auto;
        height: auto;
        top: 0;
        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%;
        top: 1em;
        bottom: 1em;
        background-color: #ffffff;
+       opacity: 0;
        -webkit-transform: scale(0.5);
           -moz-transform: scale(0.5);
            -ms-transform: scale(0.5);
             -o-transition: all 250ms ease-in-out;
                transition: all 250ms ease-in-out;
 }
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-load {
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready {
+       /* Fade window overlay */
        opacity: 1;
 }
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup > .oo-ui-window-frame {
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready > .oo-ui-window-frame {
+       /* Fade frame */
+       opacity: 1;
        -webkit-transform: scale(1);
           -moz-transform: scale(1);
            -ms-transform: scale(1);
 }
 
 .oo-ui-icon-add {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/add.png);
+       background-image: url("themes/mediawiki/images/icons/add.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/add.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/add.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/add.png");
 }
 .oo-ui-image-constructive .oo-ui-icon-add,
 .oo-ui-image-constructive.oo-ui-icon-add {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/add-constructive.png);
+       background-image: url("themes/mediawiki/images/icons/add-constructive.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/add-constructive.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/add-constructive.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/add-constructive.png");
 }
 .oo-ui-image-invert .oo-ui-icon-add,
 .oo-ui-image-invert.oo-ui-icon-add {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/add-invert.png);
+       background-image: url("themes/mediawiki/images/icons/add-invert.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/add-invert.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/add-invert.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/add-invert.png");
 }
 .oo-ui-icon-advanced {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/advanced.png);
+       background-image: url("themes/mediawiki/images/icons/advanced.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/advanced.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/advanced.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/advanced.png");
 }
 .oo-ui-image-invert .oo-ui-icon-advanced,
 .oo-ui-image-invert.oo-ui-icon-advanced {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/advanced-invert.png);
+       background-image: url("themes/mediawiki/images/icons/advanced-invert.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/advanced-invert.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/advanced-invert.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/advanced-invert.png");
 }
 .oo-ui-icon-alert {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/alert.png);
+       background-image: url("themes/mediawiki/images/icons/alert.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/alert.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/alert.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/alert.png");
 }
 .oo-ui-image-invert .oo-ui-icon-alert,
 .oo-ui-image-invert.oo-ui-icon-alert {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/alert-invert.png);
+       background-image: url("themes/mediawiki/images/icons/alert-invert.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/alert-invert.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/alert-invert.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/alert-invert.png");
 }
 .oo-ui-icon-check {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/check.png);
+       background-image: url("themes/mediawiki/images/icons/check.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/check.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/check.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/check.png");
 }
 .oo-ui-image-constructive .oo-ui-icon-check,
 .oo-ui-image-constructive.oo-ui-icon-check {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/check-constructive.png);
+       background-image: url("themes/mediawiki/images/icons/check-constructive.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/check-constructive.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/check-constructive.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/check-constructive.png");
 }
 .oo-ui-image-invert .oo-ui-icon-check,
 .oo-ui-image-invert.oo-ui-icon-check {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/check-invert.png);
+       background-image: url("themes/mediawiki/images/icons/check-invert.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/check-invert.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/check-invert.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/check-invert.png");
 }
 .oo-ui-icon-clear {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/clear.png);
+       background-image: url("themes/mediawiki/images/icons/clear.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/clear.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/clear.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/clear.png");
 }
 .oo-ui-image-invert .oo-ui-icon-clear,
 .oo-ui-image-invert.oo-ui-icon-clear {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/clear-invert.png);
+       background-image: url("themes/mediawiki/images/icons/clear-invert.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/clear-invert.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/clear-invert.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/clear-invert.png");
 }
 .oo-ui-icon-close {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/close.png);
+       background-image: url("themes/mediawiki/images/icons/close.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/close.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/close.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/close.png");
 }
 .oo-ui-image-invert .oo-ui-icon-close,
 .oo-ui-image-invert.oo-ui-icon-close {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/close-invert.png);
+       background-image: url("themes/mediawiki/images/icons/close-invert.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/close-invert.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/close-invert.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/close-invert.png");
 }
 .oo-ui-icon-code {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/code.png);
+       background-image: url("themes/mediawiki/images/icons/code.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/code.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/code.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/code.png");
 }
 .oo-ui-image-invert .oo-ui-icon-code,
 .oo-ui-image-invert.oo-ui-icon-code {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/code-invert.png);
+       background-image: url("themes/mediawiki/images/icons/code-invert.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/code-invert.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/code-invert.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/code-invert.png");
 }
 .oo-ui-icon-collapse {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/collapse.png);
+       background-image: url("themes/mediawiki/images/icons/collapse.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/collapse.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/collapse.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/collapse.png");
 }
 .oo-ui-image-invert .oo-ui-icon-collapse,
 .oo-ui-image-invert.oo-ui-icon-collapse {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/collapse-invert.png);
+       background-image: url("themes/mediawiki/images/icons/collapse-invert.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/collapse-invert.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/collapse-invert.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/collapse-invert.png");
 }
 .oo-ui-icon-comment {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/comment.png);
+       background-image: url("themes/mediawiki/images/icons/comment.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/comment.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/comment.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/comment.png");
 }
 .oo-ui-image-invert .oo-ui-icon-comment,
 .oo-ui-image-invert.oo-ui-icon-comment {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/comment-invert.png);
+       background-image: url("themes/mediawiki/images/icons/comment-invert.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/comment-invert.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/comment-invert.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/comment-invert.png");
 }
 .oo-ui-icon-expand {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/expand.png);
+       background-image: url("themes/mediawiki/images/icons/expand.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/expand.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/expand.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/expand.png");
 }
 .oo-ui-image-invert .oo-ui-icon-expand,
 .oo-ui-image-invert.oo-ui-icon-expand {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/expand-invert.png);
+       background-image: url("themes/mediawiki/images/icons/expand-invert.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/expand-invert.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/expand-invert.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/expand-invert.png");
 }
 .oo-ui-icon-help {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/help.png);
+       background-image: url("themes/mediawiki/images/icons/help.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/help.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/help.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/help.png");
 }
 .oo-ui-image-invert .oo-ui-icon-help,
 .oo-ui-image-invert.oo-ui-icon-help {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/help-invert.png);
+       background-image: url("themes/mediawiki/images/icons/help-invert.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/help-invert.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/help-invert.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/help-invert.png");
 }
 .oo-ui-icon-info {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/info.png);
+       background-image: url("themes/mediawiki/images/icons/info.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/info.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/info.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/info.png");
 }
 .oo-ui-image-invert .oo-ui-icon-info,
 .oo-ui-image-invert.oo-ui-icon-info {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/info-invert.png);
+       background-image: url("themes/mediawiki/images/icons/info-invert.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/info-invert.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/info-invert.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/info-invert.png");
 }
 .oo-ui-icon-link {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/link.png);
+       background-image: url("themes/mediawiki/images/icons/link.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/link.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/link.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/link.png");
 }
 .oo-ui-image-invert .oo-ui-icon-link,
 .oo-ui-image-invert.oo-ui-icon-link {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/link-invert.png);
+       background-image: url("themes/mediawiki/images/icons/link-invert.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/link-invert.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/link-invert.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/link-invert.png");
 }
 .oo-ui-icon-lock {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/lock.png);
+       background-image: url("themes/mediawiki/images/icons/lock.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/lock.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/lock.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), 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);
+       background-image: url("themes/mediawiki/images/icons/lock-invert.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/lock-invert.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/lock-invert.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/lock-invert.png");
 }
 .oo-ui-icon-menu {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/menu.png);
+       background-image: url("themes/mediawiki/images/icons/menu.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/menu.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/menu.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/menu.png");
 }
 .oo-ui-image-invert .oo-ui-icon-menu,
 .oo-ui-image-invert.oo-ui-icon-menu {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/menu-invert.png);
+       background-image: url("themes/mediawiki/images/icons/menu-invert.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/menu-invert.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/menu-invert.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/menu-invert.png");
 }
 .oo-ui-icon-next {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/move-ltr.png);
+       background-image: url("themes/mediawiki/images/icons/move-ltr.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/move-ltr.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/move-ltr.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/move-ltr.png");
 }
 .oo-ui-image-invert .oo-ui-icon-next,
 .oo-ui-image-invert.oo-ui-icon-next {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/move-ltr-invert.png);
+       background-image: url("themes/mediawiki/images/icons/move-ltr-invert.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/move-ltr-invert.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/move-ltr-invert.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/move-ltr-invert.png");
 }
 .oo-ui-icon-picture {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/picture.png);
+       background-image: url("themes/mediawiki/images/icons/picture.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/picture.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/picture.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/picture.png");
 }
 .oo-ui-image-invert .oo-ui-icon-picture,
 .oo-ui-image-invert.oo-ui-icon-picture {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/picture-invert.png);
+       background-image: url("themes/mediawiki/images/icons/picture-invert.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/picture-invert.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/picture-invert.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/picture-invert.png");
 }
 .oo-ui-icon-previous {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/move-rtl.png);
+       background-image: url("themes/mediawiki/images/icons/move-rtl.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/move-rtl.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/move-rtl.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/move-rtl.png");
 }
 .oo-ui-image-invert .oo-ui-icon-previous,
 .oo-ui-image-invert.oo-ui-icon-previous {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/move-rtl-invert.png);
+       background-image: url("themes/mediawiki/images/icons/move-rtl-invert.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/move-rtl-invert.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/move-rtl-invert.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/move-rtl-invert.png");
 }
 .oo-ui-icon-circle {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/circle.png);
+       background-image: url("themes/mediawiki/images/icons/circle.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/circle.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/circle.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), 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);
+       background-image: url("themes/mediawiki/images/icons/circle-constructive.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/circle-constructive.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/circle-constructive.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), 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);
+       background-image: url("themes/mediawiki/images/icons/circle-invert.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/circle-invert.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/circle-invert.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/circle-invert.png");
 }
 .oo-ui-icon-redo {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/arched-arrow-ltr.png);
+       background-image: url("themes/mediawiki/images/icons/arched-arrow-ltr.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/arched-arrow-ltr.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/arched-arrow-ltr.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/arched-arrow-ltr.png");
 }
 .oo-ui-image-invert .oo-ui-icon-redo,
 .oo-ui-image-invert.oo-ui-icon-redo {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/arched-arrow-ltr-invert.png);
+       background-image: url("themes/mediawiki/images/icons/arched-arrow-ltr-invert.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/arched-arrow-ltr-invert.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/arched-arrow-ltr-invert.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/arched-arrow-ltr-invert.png");
 }
 .oo-ui-icon-remove {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/remove.png);
+       background-image: url("themes/mediawiki/images/icons/remove.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/remove.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/remove.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/remove.png");
 }
 .oo-ui-image-destructive .oo-ui-icon-remove,
 .oo-ui-image-destructive.oo-ui-icon-remove {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/remove-destructive.png);
+       background-image: url("themes/mediawiki/images/icons/remove-destructive.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/remove-destructive.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/remove-destructive.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/remove-destructive.png");
 }
 .oo-ui-image-invert .oo-ui-icon-remove,
 .oo-ui-image-invert.oo-ui-icon-remove {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/remove-invert.png);
+       background-image: url("themes/mediawiki/images/icons/remove-invert.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/remove-invert.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/remove-invert.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/remove-invert.png");
 }
 .oo-ui-icon-search {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/search.png);
+       background-image: url("themes/mediawiki/images/icons/search.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/search.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/search.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/search.png");
 }
 .oo-ui-image-invert .oo-ui-icon-search,
 .oo-ui-image-invert.oo-ui-icon-search {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/search-invert.png);
+       background-image: url("themes/mediawiki/images/icons/search-invert.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/search-invert.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/search-invert.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/search-invert.png");
 }
 .oo-ui-icon-settings {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/settings.png);
+       background-image: url("themes/mediawiki/images/icons/settings.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/settings.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/settings.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/settings.png");
 }
 .oo-ui-image-invert .oo-ui-icon-settings,
 .oo-ui-image-invert.oo-ui-icon-settings {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/settings-invert.png);
+       background-image: url("themes/mediawiki/images/icons/settings-invert.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/settings-invert.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/settings-invert.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/settings-invert.png");
 }
 .oo-ui-icon-tag {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/tag.png);
+       background-image: url("themes/mediawiki/images/icons/tag.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/tag.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/tag.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/tag.png");
 }
 .oo-ui-image-invert .oo-ui-icon-tag,
 .oo-ui-image-invert.oo-ui-icon-tag {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/tag-invert.png);
+       background-image: url("themes/mediawiki/images/icons/tag-invert.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/tag-invert.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/tag-invert.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/tag-invert.png");
 }
 .oo-ui-icon-undo {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/arched-arrow-rtl.png);
+       background-image: url("themes/mediawiki/images/icons/arched-arrow-rtl.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/arched-arrow-rtl.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/arched-arrow-rtl.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/arched-arrow-rtl.png");
 }
 .oo-ui-image-invert .oo-ui-icon-undo,
 .oo-ui-image-invert.oo-ui-icon-undo {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/arched-arrow-rtl-invert.png);
+       background-image: url("themes/mediawiki/images/icons/arched-arrow-rtl-invert.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/arched-arrow-rtl-invert.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/arched-arrow-rtl-invert.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/arched-arrow-rtl-invert.png");
 }
 .oo-ui-icon-window {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/window.png);
+       background-image: url("themes/mediawiki/images/icons/window.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/window.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/window.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/window.png");
 }
 .oo-ui-image-invert .oo-ui-icon-window,
 .oo-ui-image-invert.oo-ui-icon-window {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/window-invert.png);
+       background-image: url("themes/mediawiki/images/icons/window-invert.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/window-invert.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/window-invert.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/window-invert.png");
 }
 .oo-ui-indicator-alert {
-       background-image: /* @embed */ url(themes/mediawiki/images/indicators/alert.png);
+       background-image: url("themes/mediawiki/images/indicators/alert.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/indicators/alert.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/indicators/alert.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/indicators/alert.png");
 }
 .oo-ui-image-invert .oo-ui-indicator-alert,
 .oo-ui-image-invert.oo-ui-indicator-alert {
-       background-image: /* @embed */ url(themes/mediawiki/images/indicators/alert-invert.png);
+       background-image: url("themes/mediawiki/images/indicators/alert-invert.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/indicators/alert-invert.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/indicators/alert-invert.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/indicators/alert-invert.png");
 }
 .oo-ui-indicator-up {
-       background-image: /* @embed */ url(themes/mediawiki/images/indicators/arrow-up.png);
+       background-image: url("themes/mediawiki/images/indicators/arrow-up.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/indicators/arrow-up.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/indicators/arrow-up.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/indicators/arrow-up.png");
 }
 .oo-ui-image-invert .oo-ui-indicator-up,
 .oo-ui-image-invert.oo-ui-indicator-up {
-       background-image: /* @embed */ url(themes/mediawiki/images/indicators/arrow-up-invert.png);
+       background-image: url("themes/mediawiki/images/indicators/arrow-up-invert.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/indicators/arrow-up-invert.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/indicators/arrow-up-invert.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/indicators/arrow-up-invert.png");
 }
 .oo-ui-indicator-down {
-       background-image: /* @embed */ url(themes/mediawiki/images/indicators/arrow-down.png);
+       background-image: url("themes/mediawiki/images/indicators/arrow-down.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/indicators/arrow-down.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/indicators/arrow-down.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/indicators/arrow-down.png");
 }
 .oo-ui-image-invert .oo-ui-indicator-down,
 .oo-ui-image-invert.oo-ui-indicator-down {
-       background-image: /* @embed */ url(themes/mediawiki/images/indicators/arrow-down-invert.png);
+       background-image: url("themes/mediawiki/images/indicators/arrow-down-invert.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/indicators/arrow-down-invert.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/indicators/arrow-down-invert.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/indicators/arrow-down-invert.png");
 }
 .oo-ui-indicator-next {
-       background-image: /* @embed */ url(themes/mediawiki/images/indicators/arrow-ltr.png);
+       background-image: url("themes/mediawiki/images/indicators/arrow-ltr.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/indicators/arrow-ltr.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/indicators/arrow-ltr.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/indicators/arrow-ltr.png");
 }
 .oo-ui-image-invert .oo-ui-indicator-next,
 .oo-ui-image-invert.oo-ui-indicator-next {
-       background-image: /* @embed */ url(themes/mediawiki/images/indicators/arrow-ltr-invert.png);
+       background-image: url("themes/mediawiki/images/indicators/arrow-ltr-invert.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/indicators/arrow-ltr-invert.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/indicators/arrow-ltr-invert.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/indicators/arrow-ltr-invert.png");
 }
 .oo-ui-indicator-previous {
-       background-image: /* @embed */ url(themes/mediawiki/images/indicators/arrow-rtl.png);
+       background-image: url("themes/mediawiki/images/indicators/arrow-rtl.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/indicators/arrow-rtl.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/indicators/arrow-rtl.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/indicators/arrow-rtl.png");
 }
 .oo-ui-image-invert .oo-ui-indicator-previous,
 .oo-ui-image-invert.oo-ui-indicator-previous {
-       background-image: /* @embed */ url(themes/mediawiki/images/indicators/arrow-rtl-invert.png);
+       background-image: url("themes/mediawiki/images/indicators/arrow-rtl-invert.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/indicators/arrow-rtl-invert.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/indicators/arrow-rtl-invert.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/indicators/arrow-rtl-invert.png");
 }
 .oo-ui-indicator-required {
-       background-image: /* @embed */ url(themes/mediawiki/images/indicators/required.png);
+       background-image: url("themes/mediawiki/images/indicators/required.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/indicators/required.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/indicators/required.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/indicators/required.png");
 }
 .oo-ui-image-invert .oo-ui-indicator-required,
 .oo-ui-image-invert.oo-ui-indicator-required {
-       background-image: /* @embed */ url(themes/mediawiki/images/indicators/required-invert.png);
+       background-image: url("themes/mediawiki/images/indicators/required-invert.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/indicators/required-invert.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/indicators/required-invert.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/indicators/required-invert.png");
 }
 .oo-ui-texture-pending {
-       background-image: /* @embed */ url(themes/mediawiki/images/textures/pending.gif);
+       background-image: url("themes/mediawiki/images/textures/pending.gif");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/textures/pending.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/textures/pending.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/textures/pending.gif");
 }
 .oo-ui-texture-transparency {
-       background-image: /* @embed */ url(themes/mediawiki/images/textures/transparency.png);
+       background-image: url("themes/mediawiki/images/textures/transparency.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/textures/transparency.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/textures/transparency.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/textures/transparency.png");
 }
index a0a5a32..3be2d1b 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.6.3
+ * OOjs UI v0.8.0
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-01-16T00:05:04Z
+ * Date: 2015-02-19T01:33:11Z
  */
 /**
  * @class
@@ -41,7 +41,7 @@ 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.isDisabled() && element.isFramed() && element.hasFlag( 'primary' ) ) {
+               if ( element.isFramed() && ( element.isDisabled() || element.hasFlag( 'primary' ) ) ) {
                        variants.invert = true;
                } else {
                        variants.progressive = element.hasFlag( 'progressive' );
@@ -51,7 +51,7 @@ OO.ui.MediaWikiTheme.prototype.getElementClasses = function ( element ) {
        }
 
        for ( variant in variants ) {
-               classes[variants[variant] ? 'on' : 'off'].push( 'oo-ui-image-' + variant );
+               classes[ variants[ variant ] ? 'on' : 'off' ].push( 'oo-ui-image-' + variant );
        }
 
        return classes;
diff --git a/resources/lib/oojs-ui/oojs-ui-mediawiki.svg.css b/resources/lib/oojs-ui/oojs-ui-mediawiki.svg.css
deleted file mode 100644 (file)
index 474304b..0000000
+++ /dev/null
@@ -1,2476 +0,0 @@
-/*!
- * OOjs UI v0.6.3
- * https://www.mediawiki.org/wiki/OOjs_UI
- *
- * Copyright 2011–2015 OOjs Team and other contributors.
- * Released under the MIT license
- * http://oojs.mit-license.org
- *
- * Date: 2015-01-16T00:05:16Z
- */
-.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: 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 {
-       font-weight: bold;
-}
-.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 {
-       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: #ffffff;
-       background: #eeeeee;
-}
-.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-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-       margin-left: 0.25em;
-}
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-       color: #757575;
-}
-.oo-ui-buttonElement-frameless.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-buttonElement-pressed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-       color: #444444;
-}
-.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-progressive > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-       color: #777777;
-}
-.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 {
-       color: #00c697;
-}
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-       color: #777777;
-}
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active > .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 {
-       color: #e81915;
-}
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-       color: #777777;
-}
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active > .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.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;
-            -o-transition: background 0.1s ease-in-out, color 0.1s ease-in-out, box-shadow 0.1s ease-in-out;
-               transition: background 0.1s ease-in-out, color 0.1s ease-in-out, box-shadow 0.1s ease-in-out;
-}
-.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button:hover,
-.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button:focus {
-       outline: none;
-}
-.oo-ui-buttonElement-framed > input.oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-       line-height: 1.9em;
-}
-.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-widget-disabled > .oo-ui-buttonElement-button {
-       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 {
-       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-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-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-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-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-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-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-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-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-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;
-          -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-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 {
-       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-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-fieldLayout-body > .oo-ui-labelElement-label {
-       text-align: right;
-}
-.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-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-labelElement.oo-ui-fieldLayout-align-top > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label {
-       display: inline-block;
-}
-.oo-ui-fieldLayout > .oo-ui-fieldLayout-help {
-       float: right;
-}
-.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 > .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-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 > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label {
-       padding: 0.5em;
-}
-.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 > .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 {
-       margin-top: 0.25em;
-}
-.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;
-       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.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;
-       line-height: 1.33em;
-}
-.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-iconElement-icon {
-       left: 0;
-       top: 0.25em;
-       width: 1.5em;
-       height: 1.5em;
-}
-.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;
-}
-.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 .oo-ui-tool-link .oo-ui-tool-title {
-       color: #000000;
-}
-.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-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-accel,
-.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-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-active.oo-ui-widget-enabled {
-       background-color: #eeeeee;
-}
-.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 {
-       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: table-cell;
-       vertical-align: middle;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-accel {
-       text-align: right;
-}
-.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 {
-       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 .oo-ui-toolGroup-tools {
-       top: 2em;
-       background-color: white;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-       height: 2em;
-       width: 2em;
-       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: block;
-       -webkit-box-sizing: border-box;
-          -moz-box-sizing: border-box;
-               box-sizing: border-box;
-}
-.oo-ui-listToolGroup .oo-ui-tool-link {
-       cursor: pointer;
-}
-.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.5em 0 0.25em;
-}
-.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-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-listToolGroup .oo-ui-toolGroup-tools {
-       padding: 0.25em 0 0.25em 0;
-       border: 1px solid #aaaaaa;
-       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;
-       border-radius: 0.1em;
-}
-.oo-ui-menuToolGroup .oo-ui-tool {
-       display: block;
-}
-.oo-ui-menuToolGroup .oo-ui-tool-link {
-       cursor: pointer;
-}
-.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 {
-       margin-left: -1px;
-       padding: 0.25em 0 0.25em 0;
-       border: 1px solid #aaaaaa;
-       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 {
-       padding: 0 0.75em 0 0.25em;
-}
-.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/mediawiki/images/icons/check.svg);
-}
-.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover {
-       background-color: #eeeeee;
-}
-.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: #cccccc;
-}
-.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 4px rgba(0, 0, 0, 0.15);
-       background: #ffffff;
-}
-.oo-ui-toolbar-bar .oo-ui-toolbar-bar {
-       border: none;
-       background: none;
-}
-.oo-ui-toolbar-shadow {
-       display: none;
-}
-.oo-ui-selectWidget {
-       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: 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: 2px;
-       border-top-right-radius: 2px;
-}
-.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: #eeeeee;
-}
-.oo-ui-optionWidget .oo-ui-labelElement-label {
-       line-height: 1.5em;
-}
-.oo-ui-selectWidget-depressed .oo-ui-optionWidget-selected,
-.oo-ui-selectWidget-pressed .oo-ui-optionWidget-pressed {
-       background-color: #d0d0d0;
-}
-.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: 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: 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: 2px;
-       border-top-right-radius: 2px;
-}
-.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;
-}
-.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;
-}
-.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;
-}
-.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: 2px;
-}
-.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed .oo-ui-buttonElement-button {
-       border-radius: 0;
-       margin-left: -1px;
-}
-.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed:first-child .oo-ui-buttonElement-button {
-       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: 2px;
-       border-top-right-radius: 2px;
-}
-.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;
-       border: 1px #dddddd solid;
-}
-.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-grip {
-       top: 0.25em;
-       left: 0.25em;
-       width: 1.5em;
-       height: 1.5em;
-       margin-top: -1px;
-       border-radius: 1em;
-       border: 1px #dddddd solid;
-       background-color: #f7f7f7;
-       -webkit-transition: left 0.1s ease-in-out, margin-left 0.1s ease-in-out;
-          -moz-transition: left 0.1s ease-in-out, margin-left 0.1s ease-in-out;
-           -ms-transition: left 0.1s ease-in-out, margin-left 0.1s ease-in-out;
-            -o-transition: left 0.1s ease-in-out, margin-left 0.1s ease-in-out;
-               transition: left 0.1s ease-in-out, margin-left 0.1s ease-in-out;
-}
-.oo-ui-toggleSwitchWidget-glow {
-       border-radius: 1em;
-       background-color: #f7f7f7;
-       -webkit-transition: background-color 0.1s ease-in-out;
-          -moz-transition: background-color 0.1s ease-in-out;
-           -ms-transition: background-color 0.1s ease-in-out;
-            -o-transition: background-color 0.1s ease-in-out;
-               transition: background-color 0.1s ease-in-out;
-}
-.oo-ui-toggleSwitchWidget.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-grip {
-       left: 2.25em;
-       margin-left: -2px;
-}
-.oo-ui-toggleSwitchWidget.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
-       display: block;
-}
-.oo-ui-toggleSwitchWidget.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-grip {
-       left: 0.25em;
-       margin-left: 0;
-}
-.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled {
-       border: 1px #cccccc solid;
-}
-.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:hover {
-       border-color: #aaaaaa;
-}
-.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled .oo-ui-toggleSwitchWidget-grip {
-       background-color: #ffffff;
-       border-color: #aaaaaa;
-}
-.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-glow {
-       background-color: #d0d0d0;
-}
-.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
-       background-color: #ffffff;
-}
-.oo-ui-progressBarWidget {
-       max-width: 50em;
-       border: solid 1px #0274ff;
-       border-radius: 0.1em;
-       overflow: hidden;
-}
-.oo-ui-progressBarWidget-bar {
-       height: 1em;
-       background: #0274ff;
-       -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;
-}
-.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-width: 1px;
-}
-.oo-ui-progressBarWidget.oo-ui-widget-disabled {
-       opacity: 0.2;
-}
-.oo-ui-actionWidget.oo-ui-pendingElement-pending {
-       background-image: /* @embed */ url(themes/mediawiki/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 #aaaaaa;
-       border-radius: 0.2em;
-       background-color: #ffffff;
-       box-shadow: inset 0 -0.2em 0 0 rgba(0, 0, 0, 0.2);
-}
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-popup {
-       margin-top: 9px;
-}
-.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: -10px;
-       left: -9px;
-       border-bottom-color: #888888;
-       border-width: 10px;
-}
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:after {
-       bottom: -10px;
-       left: -8px;
-       border-bottom-color: #ffffff;
-       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;
-          -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-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.75em;
-}
-.oo-ui-checkboxInputWidget {
-       position: relative;
-       line-height: 2em;
-       white-space: nowrap;
-}
-.oo-ui-checkboxInputWidget * {
-       font: inherit;
-       vertical-align: middle;
-}
-.oo-ui-checkboxInputWidget input[type="checkbox"] {
-       opacity: 0;
-       margin: 0;
-       width: 2em;
-       height: 2em;
-       max-width: none;
-}
-.oo-ui-checkboxInputWidget input[type="checkbox"] + span {
-       cursor: pointer;
-       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: 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: 2em, 2em;
-       background-repeat: no-repeat;
-       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-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;
-       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-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: #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;
-       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 0.5em 0.5em 0.9em;
-       margin: 0;
-       font-size: 1em;
-       font-family: sans-serif;
-       background-color: #ffffff;
-       color: black;
-       border: solid 1px #cccccc;
-       box-shadow: inset 0 0 0 0 #0274ff;
-       border-radius: 0.1em;
-       -webkit-transition: box-shadow 0.1s;
-          -moz-transition: box-shadow 0.1s;
-           -ms-transition: box-shadow 0.1s;
-            -o-transition: box-shadow 0.1s;
-               transition: box-shadow 0.1s;
-       -webkit-box-sizing: border-box;
-          -moz-box-sizing: border-box;
-               box-sizing: border-box;
-}
-.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: #aaaaaa;
-       box-shadow: inset 0.4em 0 0 0 #0274ff;
-}
-.oo-ui-textInputWidget.oo-ui-widget-enabled input[readonly],
-.oo-ui-textInputWidget.oo-ui-widget-enabled textarea[readonly] {
-       color: #777777;
-       text-shadow: 0 1px 1px #ffffff;
-}
-.oo-ui-textInputWidget.oo-ui-widget-enabled input[readonly]:focus,
-.oo-ui-textInputWidget.oo-ui-widget-enabled textarea[readonly]:focus {
-       box-shadow: inset 0.4em 0 0 0 #cccccc;
-}
-.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/mediawiki/images/textures/pending.gif);
-}
-.oo-ui-textInputWidget.oo-ui-iconElement input,
-.oo-ui-textInputWidget.oo-ui-iconElement textarea {
-       padding-left: 2.4em;
-}
-.oo-ui-textInputWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
-       left: 0.4em;
-       width: 2em;
-       height: 100%;
-       background-position: right center;
-}
-.oo-ui-textInputWidget.oo-ui-indicatorElement input,
-.oo-ui-textInputWidget.oo-ui-indicatorElement textarea {
-       padding-right: 1.9em;
-}
-.oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
-       width: 1.6em;
-       height: 100%;
-       background-position: left center;
-}
-.oo-ui-menuSelectWidget {
-       position: absolute;
-       background: #ffffff;
-       margin-top: -1px;
-       border: solid 1px #aaaaaa;
-       border-radius: 0 0 0.1em 0.1em;
-       padding-bottom: 0.25em;
-       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);
-}
-.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 {
-       background-color: #eeeeee;
-}
-.oo-ui-menuSectionOptionWidget {
-       cursor: default;
-       padding: 0.33em 0.75em;
-       color: #888888;
-}
-.oo-ui-dropdownWidget {
-       display: inline-block;
-       position: relative;
-       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 #cccccc;
-       border-radius: 0.1em;
-}
-.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 1em;
-}
-.oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator,
-.oo-ui-dropdownWidget-handle .oo-ui-iconElement-icon {
-       top: 0;
-       width: 2.5em;
-       height: 2.5em;
-}
-.oo-ui-dropdownWidget:hover .oo-ui-dropdownWidget-handle {
-       border-color: #aaaaaa;
-}
-.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-dropdownWidget .oo-ui-selectWidget {
-       border-top-color: #ffffff;
-}
-.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: #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 {
-       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 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-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: 1.9em;
-}
-.oo-ui-comboBoxWidget .oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
-       width: 1.9em;
-       background-position: center center;
-       border: solid 1px #cccccc;
-       border-left: none;
-       -webkit-box-sizing: border-box;
-          -moz-box-sizing: border-box;
-               box-sizing: border-box;
-}
-.oo-ui-searchWidget {
-       border: solid 1px #cccccc;
-}
-.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;
-       border-bottom: solid 1px #cccccc;
-}
-.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: transparent;
-       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 {
-       outline: 1px solid #aaaaaa;
-}
-.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-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-progressive:hover {
-       background-color: rgba(8, 126, 204, 0.05);
-}
-.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-progressive .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/mediawiki/images/textures/pending.gif);
-}
-.oo-ui-processDialog-content .oo-ui-window-body {
-       top: 3.4em;
-       outline: 1px solid rgba(0, 0, 0, 0.2);
-}
-.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-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-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-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-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 #aaaaaa;
-       border-radius: 0.2em;
-       box-shadow: inset 0 -0.2em 0 0 rgba(0, 0, 0, 0.2);
-}
-
-.oo-ui-icon-add {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/add.svg);
-}
-.oo-ui-image-constructive .oo-ui-icon-add,
-.oo-ui-image-constructive.oo-ui-icon-add {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/add-constructive.svg);
-}
-.oo-ui-image-invert .oo-ui-icon-add,
-.oo-ui-image-invert.oo-ui-icon-add {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/add-invert.svg);
-}
-.oo-ui-icon-advanced {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/advanced.svg);
-}
-.oo-ui-image-invert .oo-ui-icon-advanced,
-.oo-ui-image-invert.oo-ui-icon-advanced {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/advanced-invert.svg);
-}
-.oo-ui-icon-alert {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/alert.svg);
-}
-.oo-ui-image-invert .oo-ui-icon-alert,
-.oo-ui-image-invert.oo-ui-icon-alert {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/alert-invert.svg);
-}
-.oo-ui-icon-check {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/check.svg);
-}
-.oo-ui-image-constructive .oo-ui-icon-check,
-.oo-ui-image-constructive.oo-ui-icon-check {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/check-constructive.svg);
-}
-.oo-ui-image-invert .oo-ui-icon-check,
-.oo-ui-image-invert.oo-ui-icon-check {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/check-invert.svg);
-}
-.oo-ui-icon-clear {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/clear.svg);
-}
-.oo-ui-image-invert .oo-ui-icon-clear,
-.oo-ui-image-invert.oo-ui-icon-clear {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/clear-invert.svg);
-}
-.oo-ui-icon-close {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/close.svg);
-}
-.oo-ui-image-invert .oo-ui-icon-close,
-.oo-ui-image-invert.oo-ui-icon-close {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/close-invert.svg);
-}
-.oo-ui-icon-code {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/code.svg);
-}
-.oo-ui-image-invert .oo-ui-icon-code,
-.oo-ui-image-invert.oo-ui-icon-code {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/code-invert.svg);
-}
-.oo-ui-icon-collapse {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/collapse.svg);
-}
-.oo-ui-image-invert .oo-ui-icon-collapse,
-.oo-ui-image-invert.oo-ui-icon-collapse {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/collapse-invert.svg);
-}
-.oo-ui-icon-comment {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/comment.svg);
-}
-.oo-ui-image-invert .oo-ui-icon-comment,
-.oo-ui-image-invert.oo-ui-icon-comment {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/comment-invert.svg);
-}
-.oo-ui-icon-expand {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/expand.svg);
-}
-.oo-ui-image-invert .oo-ui-icon-expand,
-.oo-ui-image-invert.oo-ui-icon-expand {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/expand-invert.svg);
-}
-.oo-ui-icon-help {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/help.svg);
-}
-.oo-ui-image-invert .oo-ui-icon-help,
-.oo-ui-image-invert.oo-ui-icon-help {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/help-invert.svg);
-}
-.oo-ui-icon-info {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/info.svg);
-}
-.oo-ui-image-invert .oo-ui-icon-info,
-.oo-ui-image-invert.oo-ui-icon-info {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/info-invert.svg);
-}
-.oo-ui-icon-link {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/link.svg);
-}
-.oo-ui-image-invert .oo-ui-icon-link,
-.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-menu,
-.oo-ui-image-invert.oo-ui-icon-menu {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/menu-invert.svg);
-}
-.oo-ui-icon-next {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/move-ltr.svg);
-}
-.oo-ui-image-invert .oo-ui-icon-next,
-.oo-ui-image-invert.oo-ui-icon-next {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/move-ltr-invert.svg);
-}
-.oo-ui-icon-picture {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/picture.svg);
-}
-.oo-ui-image-invert .oo-ui-icon-picture,
-.oo-ui-image-invert.oo-ui-icon-picture {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/picture-invert.svg);
-}
-.oo-ui-icon-previous {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/move-rtl.svg);
-}
-.oo-ui-image-invert .oo-ui-icon-previous,
-.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);
-}
-.oo-ui-image-invert .oo-ui-icon-redo,
-.oo-ui-image-invert.oo-ui-icon-redo {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/arched-arrow-ltr-invert.svg);
-}
-.oo-ui-icon-remove {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/remove.svg);
-}
-.oo-ui-image-destructive .oo-ui-icon-remove,
-.oo-ui-image-destructive.oo-ui-icon-remove {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/remove-destructive.svg);
-}
-.oo-ui-image-invert .oo-ui-icon-remove,
-.oo-ui-image-invert.oo-ui-icon-remove {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/remove-invert.svg);
-}
-.oo-ui-icon-search {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/search.svg);
-}
-.oo-ui-image-invert .oo-ui-icon-search,
-.oo-ui-image-invert.oo-ui-icon-search {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/search-invert.svg);
-}
-.oo-ui-icon-settings {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/settings.svg);
-}
-.oo-ui-image-invert .oo-ui-icon-settings,
-.oo-ui-image-invert.oo-ui-icon-settings {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/settings-invert.svg);
-}
-.oo-ui-icon-tag {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/tag.svg);
-}
-.oo-ui-image-invert .oo-ui-icon-tag,
-.oo-ui-image-invert.oo-ui-icon-tag {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/tag-invert.svg);
-}
-.oo-ui-icon-undo {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/arched-arrow-rtl.svg);
-}
-.oo-ui-image-invert .oo-ui-icon-undo,
-.oo-ui-image-invert.oo-ui-icon-undo {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/arched-arrow-rtl-invert.svg);
-}
-.oo-ui-icon-window {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/window.svg);
-}
-.oo-ui-image-invert .oo-ui-icon-window,
-.oo-ui-image-invert.oo-ui-icon-window {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/window-invert.svg);
-}
-.oo-ui-indicator-alert {
-       background-image: /* @embed */ url(themes/mediawiki/images/indicators/alert.svg);
-}
-.oo-ui-image-invert .oo-ui-indicator-alert,
-.oo-ui-image-invert.oo-ui-indicator-alert {
-       background-image: /* @embed */ url(themes/mediawiki/images/indicators/alert-invert.svg);
-}
-.oo-ui-indicator-up {
-       background-image: /* @embed */ url(themes/mediawiki/images/indicators/arrow-up.svg);
-}
-.oo-ui-image-invert .oo-ui-indicator-up,
-.oo-ui-image-invert.oo-ui-indicator-up {
-       background-image: /* @embed */ url(themes/mediawiki/images/indicators/arrow-up-invert.svg);
-}
-.oo-ui-indicator-down {
-       background-image: /* @embed */ url(themes/mediawiki/images/indicators/arrow-down.svg);
-}
-.oo-ui-image-invert .oo-ui-indicator-down,
-.oo-ui-image-invert.oo-ui-indicator-down {
-       background-image: /* @embed */ url(themes/mediawiki/images/indicators/arrow-down-invert.svg);
-}
-.oo-ui-indicator-next {
-       background-image: /* @embed */ url(themes/mediawiki/images/indicators/arrow-ltr.svg);
-}
-.oo-ui-image-invert .oo-ui-indicator-next,
-.oo-ui-image-invert.oo-ui-indicator-next {
-       background-image: /* @embed */ url(themes/mediawiki/images/indicators/arrow-ltr-invert.svg);
-}
-.oo-ui-indicator-previous {
-       background-image: /* @embed */ url(themes/mediawiki/images/indicators/arrow-rtl.svg);
-}
-.oo-ui-image-invert .oo-ui-indicator-previous,
-.oo-ui-image-invert.oo-ui-indicator-previous {
-       background-image: /* @embed */ url(themes/mediawiki/images/indicators/arrow-rtl-invert.svg);
-}
-.oo-ui-indicator-required {
-       background-image: /* @embed */ url(themes/mediawiki/images/indicators/required.svg);
-}
-.oo-ui-image-invert .oo-ui-indicator-required,
-.oo-ui-image-invert.oo-ui-indicator-required {
-       background-image: /* @embed */ url(themes/mediawiki/images/indicators/required-invert.svg);
-}
-.oo-ui-texture-pending {
-       background-image: /* @embed */ url(themes/mediawiki/images/textures/pending.gif);
-}
-.oo-ui-texture-transparency {
-       background-image: /* @embed */ url(themes/mediawiki/images/textures/transparency.svg);
-}
index e0c98d0..0ad88fe 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.6.3
+ * OOjs UI v0.8.0
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-01-16T00:05:04Z
+ * Date: 2015-02-19T01:33:11Z
  */
 ( function ( OO ) {
 
@@ -70,24 +70,24 @@ OO.ui.getLocalValue = function ( obj, lang, fallback ) {
        var i, len, langs;
 
        // Requested language
-       if ( obj[lang] ) {
-               return obj[lang];
+       if ( obj[ lang ] ) {
+               return obj[ lang ];
        }
        // Known user language
        langs = OO.ui.getUserLanguages();
        for ( i = 0, len = langs.length; i < len; i++ ) {
-               lang = langs[i];
-               if ( obj[lang] ) {
-                       return obj[lang];
+               lang = langs[ i ];
+               if ( obj[ lang ] ) {
+                       return obj[ lang ];
                }
        }
        // Fallback language
-       if ( obj[fallback] ) {
-               return obj[fallback];
+       if ( obj[ fallback ] ) {
+               return obj[ fallback ];
        }
        // First existing language
        for ( lang in obj ) {
-               return obj[lang];
+               return obj[ lang ];
        }
 
        return undefined;
@@ -110,7 +110,7 @@ OO.ui.contains = function ( containers, contained, matchContainers ) {
                containers = [ containers ];
        }
        for ( i = containers.length - 1; i >= 0; i-- ) {
-               if ( ( matchContainers && contained === containers[i] ) || $.contains( containers[i], contained ) ) {
+               if ( ( matchContainers && contained === containers[ i ] ) || $.contains( containers[ i ], contained ) ) {
                        return true;
                }
        }
@@ -171,13 +171,13 @@ OO.ui.contains = function ( containers, contained, matchContainers ) {
         * @return {string} Translated message with parameters substituted
         */
        OO.ui.msg = function ( key ) {
-               var message = messages[key],
+               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 ) {
                                var i = parseInt( n, 10 );
-                               return params[i - 1] !== undefined ? params[i - 1] : '$' + n;
+                               return params[ i - 1 ] !== undefined ? params[ i - 1 ] : '$' + n;
                        } );
                } else {
                        // Return placeholder if message not found
@@ -305,7 +305,68 @@ OO.ui.PendingElement.prototype.popPending = function () {
 };
 
 /**
- * List of actions.
+ * ActionSets manage the behavior of the {@link OO.ui.ActionWidget Action widgets} that comprise them.
+ * Actions can be made available for specific contexts (modes) and circumstances
+ * (abilities). Please see the [OOjs UI documentation on MediaWiki][1] for more information.
+ *
+ *     @example
+ *     // Example: An action set used in a process dialog
+ *     function ProcessDialog( config ) {
+ *         ProcessDialog.super.call( this, config );
+ *     }
+ *     OO.inheritClass( ProcessDialog, OO.ui.ProcessDialog );
+ *     ProcessDialog.static.title = 'An action set in a process dialog';
+ *     // An action set that uses modes ('edit' and 'help' mode, in this example).
+ *     ProcessDialog.static.actions = [
+ *        { action: 'continue', modes: 'edit', label: 'Continue', flags: [ 'primary', 'constructive' ] },
+ *        { action: 'help', modes: 'edit', label: 'Help' },
+ *        { modes: 'edit', label: 'Cancel', flags: 'safe' },
+ *        { action: 'back', modes: 'help', label: 'Back', flags: 'safe' }
+ *     ];
+ *
+ *     ProcessDialog.prototype.initialize = function () {
+ *         ProcessDialog.super.prototype.initialize.apply( this, arguments );
+ *         this.panel1 = new OO.ui.PanelLayout( { $: this.$, padded: true, expanded: false } );
+ *         this.panel1.$element.append( '<p>This dialog uses an action set (continue, help, cancel, back) configured with modes. This is edit mode. Click \'help\' to see help mode. </p>' );
+ *         this.panel2 = new OO.ui.PanelLayout( { $: this.$, padded: true, expanded: false } );
+ *         this.panel2.$element.append( '<p>This is help mode. Only the \'back\' action widget is configured to be visible here. Click \'back\' to return to \'edit\' mode</p>' );
+ *         this.stackLayout= new OO.ui.StackLayout( {
+ *             items: [ this.panel1, this.panel2 ]
+ *         });
+ *         this.$body.append( this.stackLayout.$element );
+ *     };
+ *     ProcessDialog.prototype.getSetupProcess = function ( data ) {
+ *         return ProcessDialog.super.prototype.getSetupProcess.call( this, data )
+ *         .next( function () {
+ *         this.actions.setMode('edit');
+ *         }, this );
+ *     };
+ *     ProcessDialog.prototype.getActionProcess = function ( action ) {
+ *         if ( action === 'help' ) {
+ *             this.actions.setMode( 'help' );
+ *             this.stackLayout.setItem( this.panel2 );
+ *             } else if ( action === 'back' ) {
+ *             this.actions.setMode( 'edit' );
+ *             this.stackLayout.setItem( this.panel1 );
+ *             } else if ( action === 'continue' ) {
+ *             var dialog = this;
+ *             return new OO.ui.Process( function () {
+ *                 dialog.close();
+ *             } );
+ *         }
+ *         return ProcessDialog.super.prototype.getActionProcess.call( this, action );
+ *     };
+ *     ProcessDialog.prototype.getBodyHeight = function () {
+ *         return this.panel1.$element.outerHeight( true );
+ *     };
+ *     var windowManager = new OO.ui.WindowManager();
+ *     $( 'body' ).append( windowManager.$element );
+ *     var processDialog = new ProcessDialog({
+ *        size: 'medium'});
+ *     windowManager.addWindows( [ processDialog ] );
+ *     windowManager.openWindow( processDialog );
+ *
+ * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Windows/Process_Dialogs#Action_sets
  *
  * @abstract
  * @class
@@ -343,7 +404,11 @@ OO.mixinClass( OO.ui.ActionSet, OO.EventEmitter );
 /* Static Properties */
 
 /**
- * Symbolic name of dialog.
+ * Symbolic name of the flags used to identify special actions. Special actions are displayed in the
+ *  header of a {@link OO.ui.ProcessDialog process dialog}.
+ *  See the [OOjs UI documentation on MediaWiki][2] for more information and examples.
+ *
+ *  [2]:https://www.mediawiki.org/wiki/OOjs_UI/Windows/Process_Dialogs
  *
  * @abstract
  * @static
@@ -383,6 +448,7 @@ OO.ui.ActionSet.static.specialFlags = [ 'safe', 'primary' ];
 /**
  * Handle action change events.
  *
+ * @private
  * @fires change
  */
 OO.ui.ActionSet.prototype.onActionChange = function () {
@@ -404,7 +470,7 @@ OO.ui.ActionSet.prototype.isSpecial = function ( action ) {
        var flag;
 
        for ( flag in this.special ) {
-               if ( action === this.special[flag] ) {
+               if ( action === this.special[ flag ] ) {
                        return true;
                }
        }
@@ -432,13 +498,13 @@ OO.ui.ActionSet.prototype.get = function ( filters ) {
                // Collect category candidates
                matches = [];
                for ( category in this.categorized ) {
-                       list = filters[category];
+                       list = filters[ category ];
                        if ( list ) {
                                if ( !Array.isArray( list ) ) {
                                        list = [ list ];
                                }
                                for ( i = 0, len = list.length; i < len; i++ ) {
-                                       actions = this.categorized[category][list[i]];
+                                       actions = this.categorized[ category ][ list[ i ] ];
                                        if ( Array.isArray( actions ) ) {
                                                matches.push.apply( matches, actions );
                                        }
@@ -447,7 +513,7 @@ OO.ui.ActionSet.prototype.get = function ( filters ) {
                }
                // Remove by boolean filters
                for ( i = 0, len = matches.length; i < len; i++ ) {
-                       match = matches[i];
+                       match = matches[ i ];
                        if (
                                ( filters.visible !== undefined && match.isVisible() !== filters.visible ) ||
                                ( filters.disabled !== undefined && match.isDisabled() !== filters.disabled )
@@ -459,7 +525,7 @@ OO.ui.ActionSet.prototype.get = function ( filters ) {
                }
                // Remove duplicates
                for ( i = 0, len = matches.length; i < len; i++ ) {
-                       match = matches[i];
+                       match = matches[ i ];
                        index = matches.lastIndexOf( match );
                        while ( index !== i ) {
                                matches.splice( index, 1 );
@@ -513,7 +579,7 @@ OO.ui.ActionSet.prototype.setMode = function ( mode ) {
 
        this.changing = true;
        for ( i = 0, len = this.list.length; i < len; i++ ) {
-               action = this.list[i];
+               action = this.list[ i ];
                action.toggle( action.hasMode( mode ) );
        }
 
@@ -537,10 +603,10 @@ OO.ui.ActionSet.prototype.setAbilities = function ( actions ) {
        var i, len, action, item;
 
        for ( i = 0, len = this.list.length; i < len; i++ ) {
-               item = this.list[i];
+               item = this.list[ i ];
                action = item.getAction();
-               if ( actions[action] !== undefined ) {
-                       item.setDisabled( !actions[action] );
+               if ( actions[ action ] !== undefined ) {
+                       item.setDisabled( !actions[ action ] );
                }
        }
 
@@ -583,7 +649,7 @@ OO.ui.ActionSet.prototype.add = function ( actions ) {
 
        this.changing = true;
        for ( i = 0, len = actions.length; i < len; i++ ) {
-               action = actions[i];
+               action = actions[ i ];
                action.connect( this, {
                        click: [ 'emit', 'click', action ],
                        resize: [ 'emit', 'resize', action ],
@@ -612,7 +678,7 @@ OO.ui.ActionSet.prototype.remove = function ( actions ) {
 
        this.changing = true;
        for ( i = 0, len = actions.length; i < len; i++ ) {
-               action = actions[i];
+               action = actions[ i ];
                index = this.list.indexOf( action );
                if ( index !== -1 ) {
                        action.disconnect( this );
@@ -640,7 +706,7 @@ OO.ui.ActionSet.prototype.clear = function () {
 
        this.changing = true;
        for ( i = 0, len = this.list.length; i < len; i++ ) {
-               action = this.list[i];
+               action = this.list[ i ];
                action.disconnect( this );
        }
 
@@ -672,31 +738,31 @@ OO.ui.ActionSet.prototype.organize = function () {
                this.special = {};
                this.others = [];
                for ( i = 0, iLen = this.list.length; i < iLen; i++ ) {
-                       action = this.list[i];
+                       action = this.list[ i ];
                        if ( action.isVisible() ) {
                                // Populate categories
                                for ( category in this.categories ) {
-                                       if ( !this.categorized[category] ) {
-                                               this.categorized[category] = {};
+                                       if ( !this.categorized[ category ] ) {
+                                               this.categorized[ category ] = {};
                                        }
-                                       list = action[this.categories[category]]();
+                                       list = action[ this.categories[ category ] ]();
                                        if ( !Array.isArray( list ) ) {
                                                list = [ list ];
                                        }
                                        for ( j = 0, jLen = list.length; j < jLen; j++ ) {
-                                               item = list[j];
-                                               if ( !this.categorized[category][item] ) {
-                                                       this.categorized[category][item] = [];
+                                               item = list[ j ];
+                                               if ( !this.categorized[ category ][ item ] ) {
+                                                       this.categorized[ category ][ item ] = [];
                                                }
-                                               this.categorized[category][item].push( action );
+                                               this.categorized[ category ][ item ].push( action );
                                        }
                                }
                                // Populate special/others
                                special = false;
                                for ( j = 0, jLen = specialFlags.length; j < jLen; j++ ) {
-                                       flag = specialFlags[j];
-                                       if ( !this.special[flag] && action.hasFlag( flag ) ) {
-                                               this.special[flag] = action;
+                                       flag = specialFlags[ j ];
+                                       if ( !this.special[ flag ] && action.hasFlag( flag ) ) {
+                                               this.special[ flag ] = action;
                                                special = true;
                                                break;
                                        }
@@ -713,14 +779,15 @@ OO.ui.ActionSet.prototype.organize = function () {
 };
 
 /**
- * DOM element abstraction.
+ * Each Element represents a rendering in the DOM—a button or an icon, for example, or anything
+ * that is visible to a user. Unlike {@link OO.ui.Widget widgets}, plain elements usually do not have events
+ * connected to them and can't be interacted with.
  *
  * @abstract
  * @class
  *
  * @constructor
  * @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
@@ -732,15 +799,15 @@ OO.ui.Element = function OoUiElement( config ) {
        config = config || {};
 
        // Properties
-       this.$ = config.$ || OO.ui.Element.static.getJQuery( document );
+       this.$ = $;
        this.data = config.data;
-       this.$element = this.$( this.$.context.createElement( this.getTagName() ) );
+       this.$element = $( document.createElement( this.getTagName() ) );
        this.elementGroup = null;
        this.debouncedUpdateThemeClassesHandler = this.debouncedUpdateThemeClasses.bind( this );
        this.updateThemeClassesPending = false;
 
        // Initialization
-       if ( $.isArray( config.classes ) ) {
+       if ( Array.isArray( config.classes ) ) {
                this.$element.addClass( config.classes.join( ' ' ) );
        }
        if ( config.id ) {
@@ -805,7 +872,7 @@ OO.ui.Element.static.getJQuery = function ( context, $iframe ) {
  */
 OO.ui.Element.static.getDocument = function ( obj ) {
        // jQuery - selections created "offscreen" won't have a context, so .context isn't reliable
-       return ( obj[0] && obj[0].ownerDocument ) ||
+       return ( obj[ 0 ] && obj[ 0 ].ownerDocument ) ||
                // Empty jQuery selections might have a context
                obj.context ||
                // HTMLElement
@@ -840,7 +907,7 @@ OO.ui.Element.static.getDir = function ( obj ) {
        var isDoc, isWin;
 
        if ( obj instanceof jQuery ) {
-               obj = obj[0];
+               obj = obj[ 0 ];
        }
        isDoc = obj.nodeType === 9;
        isWin = obj.document !== undefined;
@@ -880,8 +947,8 @@ OO.ui.Element.static.getFrameOffset = function ( from, to, offset ) {
        // Get iframe element
        frames = from.parent.document.getElementsByTagName( 'iframe' );
        for ( i = 0, len = frames.length; i < len; i++ ) {
-               if ( frames[i].contentWindow === from ) {
-                       frame = frames[i];
+               if ( frames[ i ].contentWindow === from ) {
+                       frame = frames[ i ];
                        break;
                }
        }
@@ -1057,14 +1124,14 @@ OO.ui.Element.static.getClosestScrollableContainer = function ( el, dimension )
        }
 
        while ( $parent.length ) {
-               if ( $parent[0] === this.getRootScrollableElement( el ) ) {
-                       return $parent[0];
+               if ( $parent[ 0 ] === this.getRootScrollableElement( el ) ) {
+                       return $parent[ 0 ];
                }
                i = props.length;
                while ( i-- ) {
-                       val = $parent.css( props[i] );
+                       val = $parent.css( props[ i ] );
                        if ( val === 'auto' || val === 'scroll' ) {
-                               return $parent[0];
+                               return $parent[ 0 ];
                        }
                }
                $parent = $parent.parent();
@@ -1143,6 +1210,33 @@ OO.ui.Element.static.scrollIntoView = function ( el, config ) {
        }
 };
 
+/**
+ * Force the browser to reconsider whether it really needs to render scrollbars inside the element
+ * and reserve space for them, because it probably doesn't.
+ *
+ * Workaround primarily for <https://code.google.com/p/chromium/issues/detail?id=387290>, but also
+ * similar bugs in other browsers. "Just" forcing a reflow is not sufficient in all cases, we need
+ * to first actually detach (or hide, but detaching is simpler) all children, *then* force a reflow,
+ * and then reattach (or show) them back.
+ *
+ * @static
+ * @param {HTMLElement} el Element to reconsider the scrollbars on
+ */
+OO.ui.Element.static.reconsiderScrollbars = function ( el ) {
+       var i, len, nodes = [];
+       // Detach all children
+       while ( el.firstChild ) {
+               nodes.push( el.firstChild );
+               el.removeChild( el.firstChild );
+       }
+       // Force reflow
+       void el.offsetHeight;
+       // Reattach all children
+       for ( i = 0, len = nodes.length; i < len; i++ ) {
+               el.appendChild( nodes[ i ] );
+       }
+};
+
 /* Methods */
 
 /**
@@ -1175,9 +1269,9 @@ OO.ui.Element.prototype.supports = function ( methods ) {
        var i, len,
                support = 0;
 
-       methods = $.isArray( methods ) ? methods : [ methods ];
+       methods = Array.isArray( methods ) ? methods : [ methods ];
        for ( i = 0, len = methods.length; i < len; i++ ) {
-               if ( $.isFunction( this[methods[i]] ) ) {
+               if ( $.isFunction( this[ methods[ i ] ] ) ) {
                        support++;
                }
        }
@@ -1223,7 +1317,7 @@ OO.ui.Element.prototype.getTagName = function () {
  * @return {boolean} The element is attached to the DOM
  */
 OO.ui.Element.prototype.isElementAttached = function () {
-       return $.contains( this.getElementDocument(), this.$element[0] );
+       return $.contains( this.getElementDocument(), this.$element[ 0 ] );
 };
 
 /**
@@ -1232,7 +1326,6 @@ 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 );
 };
@@ -1250,7 +1343,7 @@ OO.ui.Element.prototype.getElementWindow = function () {
  * Get closest scrollable container.
  */
 OO.ui.Element.prototype.getClosestScrollableElementContainer = function () {
-       return OO.ui.Element.static.getClosestScrollableContainer( this.$element[0] );
+       return OO.ui.Element.static.getClosestScrollableContainer( this.$element[ 0 ] );
 };
 
 /**
@@ -1279,7 +1372,7 @@ OO.ui.Element.prototype.setElementGroup = function ( group ) {
  * @param {Object} [config] Configuration options
  */
 OO.ui.Element.prototype.scrollElementIntoView = function ( config ) {
-       return OO.ui.Element.static.scrollIntoView( this.$element[0], config );
+       return OO.ui.Element.static.scrollIntoView( this.$element[ 0 ], config );
 };
 
 /**
@@ -1313,7 +1406,9 @@ OO.inheritClass( OO.ui.Layout, OO.ui.Element );
 OO.mixinClass( OO.ui.Layout, OO.EventEmitter );
 
 /**
- * User interface control.
+ * Widgets are compositions of one or more OOjs UI elements that users can both view
+ * and interact with. All widgets can be configured and modified via a standard API,
+ * and their state can change dynamically according to a model.
  *
  * @abstract
  * @class
@@ -1397,6 +1492,7 @@ OO.ui.Widget.prototype.setDisabled = function ( disabled ) {
        if ( isDisabled !== this.wasDisabled ) {
                this.$element.toggleClass( 'oo-ui-widget-disabled', isDisabled );
                this.$element.toggleClass( 'oo-ui-widget-enabled', !isDisabled );
+               this.$element.attr( 'aria-disabled', isDisabled.toString() );
                this.emit( 'disable', isDisabled );
                this.updateThemeClasses();
        }
@@ -1417,7 +1513,7 @@ OO.ui.Widget.prototype.toggle = function ( show ) {
 
        if ( show !== this.isVisible() ) {
                this.visible = show;
-               this.$element.toggle( show );
+               this.$element.toggleClass( 'oo-ui-element-hidden', !this.visible );
                this.emit( 'toggle', show );
        }
 
@@ -1435,39 +1531,44 @@ OO.ui.Widget.prototype.updateDisabled = function () {
 };
 
 /**
- * Container for elements in a child frame.
+ * A window is a container for elements that are in a child frame. They are used with
+ * a window manager (OO.ui.WindowManager), which is used to open and close the window and control
+ * its presentation. The size of a window is specified using a symbolic name (e.g., ‘small’, ‘medium’,
+ * ‘large’), which is interpreted by the window manager. If the requested size is not recognized,
+ * the window manager will choose a sensible fallback.
  *
- * Use together with OO.ui.WindowManager.
- *
- * @abstract
- * @class
- * @extends OO.ui.Element
- * @mixins OO.EventEmitter
+ * The lifecycle of a window has three primary stages (opening, opened, and closing) in which
+ * different processes are executed:
  *
- * When a window is opened, the setup and ready processes are executed. Similarly, the hold and
- * teardown processes are executed when the window is closed.
+ * **opening**: The opening stage begins when the window manager's {@link OO.ui.WindowManager#openWindow
+ * openWindow} or the window's {@link #open open} methods are used, and the window manager begins to open
+ * the window.
  *
- * - {@link OO.ui.WindowManager#openWindow} or {@link #open} methods are used to start opening
- * - Window manager begins opening window
  * - {@link #getSetupProcess} method is called and its result executed
  * - {@link #getReadyProcess} method is called and its result executed
- * - Window is now open
  *
- * - {@link OO.ui.WindowManager#closeWindow} or {@link #close} methods are used to start closing
- * - Window manager begins closing window
+ * **opened**: The window is now open
+ *
+ * **closing**: The closing stage begins when the window manager's
+ * {@link OO.ui.WindowManager#closeWindow closeWindow}
+ * or the window's {@link #close} methods are used, and the window manager begins to close the window.
+ *
  * - {@link #getHoldProcess} method is called and its result executed
- * - {@link #getTeardownProcess} method is called and its result executed
- * - Window is now closed
+ * - {@link #getTeardownProcess} method is called and its result executed. The window is now closed
+ *
+ * Each of the window's processes (setup, ready, hold, and teardown) can be extended in subclasses
+ * by overriding the window's #getSetupProcess, #getReadyProcess, #getHoldProcess and #getTeardownProcess
+ * methods. Note that each {@link OO.ui.Process process} is executed in series, so asynchronous
+ * processing can complete. Always assume window processes are executed asynchronously.
  *
- * Each process (setup, ready, hold and teardown) can be extended in subclasses by overriding
- * {@link #getSetupProcess}, {@link #getReadyProcess}, {@link #getHoldProcess} and
- * {@link #getTeardownProcess} respectively. Each process is executed in series, so asynchronous
- * processing can complete. Always assume window processes are executed asynchronously. See
- * OO.ui.Process for more details about how to work with processes. Some events, as well as the
- * #open and #close methods, provide promises which are resolved when the window enters a new state.
+ * For more information, please see the [OOjs UI documentation on MediaWiki] [1].
  *
- * Sizing of windows is specified using symbolic names which are interpreted by the window manager.
- * If the requested size is not recognized, the window manager will choose a sensible fallback.
+ * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Windows
+ *
+ * @abstract
+ * @class
+ * @extends OO.ui.Element
+ * @mixins OO.EventEmitter
  *
  * @constructor
  * @param {Object} [config] Configuration options
@@ -1486,25 +1587,29 @@ OO.ui.Window = function OoUiWindow( config ) {
 
        // Properties
        this.manager = null;
-       this.initialized = false;
-       this.visible = false;
-       this.opening = null;
-       this.closing = null;
-       this.opened = null;
-       this.timing = null;
-       this.loading = null;
        this.size = config.size || this.constructor.static.size;
-       this.$frame = this.$( '<div>' );
-       this.$overlay = this.$( '<div>' );
+       this.$frame = $( '<div>' );
+       this.$overlay = $( '<div>' );
+       this.$content = $( '<div>' );
 
        // Initialization
+       this.$overlay.addClass( 'oo-ui-window-overlay' );
+       this.$content
+               .addClass( 'oo-ui-window-content' )
+               .attr( 'tabIndex', 0 );
+       this.$frame
+               .addClass( 'oo-ui-window-frame' )
+               .append( this.$content );
+
        this.$element
                .addClass( 'oo-ui-window' )
                .append( this.$frame, this.$overlay );
-       this.$frame.addClass( 'oo-ui-window-frame' );
-       this.$overlay.addClass( 'oo-ui-window-overlay' );
 
-       // NOTE: Additional initialization will occur when #setManager is called
+       // Initially hidden - using #toggle may cause errors if subclasses override toggle with methods
+       // that reference properties not initialized at that time of parent class construction
+       // TODO: Find a better way to handle post-constructor setup
+       this.visible = false;
+       this.$element.addClass( 'oo-ui-element-hidden' );
 };
 
 /* Setup */
@@ -1525,118 +1630,6 @@ OO.mixinClass( OO.ui.Window, OO.EventEmitter );
  */
 OO.ui.Window.static.size = 'medium';
 
-/* Static Methods */
-
-/**
- * Transplant the CSS styles from as parent document to a frame's document.
- *
- * This loops over the style sheets in the parent document, and copies their nodes to the
- * frame's document. It then polls the document to see when all styles have loaded, and once they
- * have, resolves the promise.
- *
- * If the styles still haven't loaded after a long time (5 seconds by default), we give up waiting
- * and resolve the promise anyway. This protects against cases like a display: none; iframe in
- * Firefox, where the styles won't load until the iframe becomes visible.
- *
- * For details of how we arrived at the strategy used in this function, see #load.
- *
- * @static
- * @inheritable
- * @param {HTMLDocument} parentDoc Document to transplant styles from
- * @param {HTMLDocument} frameDoc Document to transplant styles to
- * @param {number} [timeout=5000] How long to wait before giving up (in ms). If 0, never give up.
- * @return {jQuery.Promise} Promise resolved when styles have loaded
- */
-OO.ui.Window.static.transplantStyles = function ( parentDoc, frameDoc, timeout ) {
-       var i, numSheets, styleNode, styleText, newNode, timeoutID, pollNodeId, $pendingPollNodes,
-               $pollNodes = $( [] ),
-               // Fake font-family value
-               fontFamily = 'oo-ui-frame-transplantStyles-loaded',
-               nextIndex = parentDoc.oouiFrameTransplantStylesNextIndex || 0,
-               deferred = $.Deferred();
-
-       for ( i = 0, numSheets = parentDoc.styleSheets.length; i < numSheets; i++ ) {
-               styleNode = parentDoc.styleSheets[i].ownerNode;
-               if ( styleNode.disabled ) {
-                       continue;
-               }
-
-               if ( styleNode.nodeName.toLowerCase() === 'link' ) {
-                       // External stylesheet; use @import
-                       styleText = '@import url(' + styleNode.href + ');';
-               } else {
-                       // Internal stylesheet; just copy the text
-                       // For IE10 we need to fall back to .cssText, BUT that's undefined in
-                       // other browsers, so fall back to '' rather than 'undefined'
-                       styleText = styleNode.textContent || parentDoc.styleSheets[i].cssText || '';
-               }
-
-               // Create a node with a unique ID that we're going to monitor to see when the CSS
-               // has loaded
-               if ( styleNode.oouiFrameTransplantStylesId ) {
-                       // If we're nesting transplantStyles operations and this node already has
-                       // a CSS rule to wait for loading, reuse it
-                       pollNodeId = styleNode.oouiFrameTransplantStylesId;
-               } else {
-                       // Otherwise, create a new ID
-                       pollNodeId = 'oo-ui-frame-transplantStyles-loaded-' + nextIndex;
-                       nextIndex++;
-
-                       // Add #pollNodeId { font-family: ... } to the end of the stylesheet / after the @import
-                       // The font-family rule will only take effect once the @import finishes
-                       styleText += '\n' + '#' + pollNodeId + ' { font-family: ' + fontFamily + '; }';
-               }
-
-               // Create a node with id=pollNodeId
-               $pollNodes = $pollNodes.add( $( '<div>', frameDoc )
-                       .attr( 'id', pollNodeId )
-                       .appendTo( frameDoc.body )
-               );
-
-               // Add our modified CSS as a <style> tag
-               newNode = frameDoc.createElement( 'style' );
-               newNode.textContent = styleText;
-               newNode.oouiFrameTransplantStylesId = pollNodeId;
-               frameDoc.head.appendChild( newNode );
-       }
-       frameDoc.oouiFrameTransplantStylesNextIndex = nextIndex;
-
-       // Poll every 100ms until all external stylesheets have loaded
-       $pendingPollNodes = $pollNodes;
-       timeoutID = setTimeout( function pollExternalStylesheets() {
-               while (
-                       $pendingPollNodes.length > 0 &&
-                       $pendingPollNodes.eq( 0 ).css( 'font-family' ) === fontFamily
-               ) {
-                       $pendingPollNodes = $pendingPollNodes.slice( 1 );
-               }
-
-               if ( $pendingPollNodes.length === 0 ) {
-                       // We're done!
-                       if ( timeoutID !== null ) {
-                               timeoutID = null;
-                               $pollNodes.remove();
-                               deferred.resolve();
-                       }
-               } else {
-                       timeoutID = setTimeout( pollExternalStylesheets, 100 );
-               }
-       }, 100 );
-       // ...but give up after a while
-       if ( timeout !== 0 ) {
-               setTimeout( function () {
-                       if ( timeoutID ) {
-                               clearTimeout( timeoutID );
-                               timeoutID = null;
-                               $pollNodes.remove();
-                               deferred.reject();
-                       }
-               }, timeout || 5000 );
-       }
-
-       return deferred.promise();
-};
-
 /* Methods */
 
 /**
@@ -1646,7 +1639,7 @@ OO.ui.Window.static.transplantStyles = function ( parentDoc, frameDoc, timeout )
  */
 OO.ui.Window.prototype.onMouseDown = function ( e ) {
        // Prevent clicking on the click-block from stealing focus
-       if ( e.target === this.$element[0] ) {
+       if ( e.target === this.$element[ 0 ] ) {
                return false;
        }
 };
@@ -1654,10 +1647,12 @@ OO.ui.Window.prototype.onMouseDown = function ( e ) {
 /**
  * Check if window has been initialized.
  *
+ * Initialization occurs when a window is added to a manager.
+ *
  * @return {boolean} Window has been initialized
  */
 OO.ui.Window.prototype.isInitialized = function () {
-       return this.initialized;
+       return !!this.manager;
 };
 
 /**
@@ -1669,24 +1664,6 @@ OO.ui.Window.prototype.isVisible = function () {
        return this.visible;
 };
 
-/**
- * Check if window is loading.
- *
- * @return {boolean} Window is loading
- */
-OO.ui.Window.prototype.isLoading = function () {
-       return this.loading && this.loading.state() === 'pending';
-};
-
-/**
- * Check if window is loaded.
- *
- * @return {boolean} Window is loaded
- */
-OO.ui.Window.prototype.isLoaded = function () {
-       return this.loading && this.loading.state() === 'resolved';
-};
-
 /**
  * Check if window is opening.
  *
@@ -1749,7 +1726,7 @@ OO.ui.Window.prototype.withoutSizeTransitions = function ( callback ) {
        // Temporarily resize the frame so getBodyHeight() can use scrollHeight measurements.
        // Disable transitions first, otherwise we'll get values from when the window was animating.
        var oldTransition,
-               styleObj = this.$frame[0].style;
+               styleObj = this.$frame[ 0 ].style;
        oldTransition = styleObj.transition || styleObj.OTransition || styleObj.MsTransition ||
                styleObj.MozTransition || styleObj.WebkitTransition;
        styleObj.transition = styleObj.OTransition = styleObj.MsTransition =
@@ -1769,8 +1746,8 @@ OO.ui.Window.prototype.withoutSizeTransitions = function ( callback ) {
 OO.ui.Window.prototype.getContentHeight = function () {
        var bodyHeight,
                win = this,
-               bodyStyleObj = this.$body[0].style,
-               frameStyleObj = 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.
@@ -1802,7 +1779,7 @@ OO.ui.Window.prototype.getContentHeight = function () {
  * @return {number} Height of content
  */
 OO.ui.Window.prototype.getBodyHeight = function () {
-       return this.$body[0].scrollHeight;
+       return this.$body[ 0 ].scrollHeight;
 };
 
 /**
@@ -1885,9 +1862,6 @@ OO.ui.Window.prototype.getTeardownProcess = function () {
 /**
  * Toggle visibility of window.
  *
- * If the window is isolated and hasn't fully loaded yet, the visibility property will be used
- * instead of display.
- *
  * @param {boolean} [show] Make window visible, omit to toggle visibility
  * @fires toggle
  * @chainable
@@ -1897,14 +1871,7 @@ OO.ui.Window.prototype.toggle = function ( show ) {
 
        if ( show !== this.isVisible() ) {
                this.visible = show;
-
-               if ( this.isolated && !this.isLoaded() ) {
-                       // Hide the window using visibility instead of display until loading is complete
-                       // Can't use display: none; because that prevents the iframe from loading in Firefox
-                       this.$element.css( 'visibility', show ? 'visible' : 'hidden' );
-               } else {
-                       this.$element.toggle( show ).css( 'visibility', '' );
-               }
+               this.$element.toggleClass( 'oo-ui-element-hidden', !this.visible );
                this.emit( 'toggle', show );
        }
 
@@ -1914,7 +1881,7 @@ OO.ui.Window.prototype.toggle = function ( show ) {
 /**
  * Set the window manager.
  *
- * This must be called before initialize. Calling it more than once will cause an error.
+ * This will cause the window to initialize. Calling it more than once will cause an error.
  *
  * @param {OO.ui.WindowManager} manager Manager for this window
  * @throws {Error} If called more than once
@@ -1925,29 +1892,8 @@ OO.ui.Window.prototype.setManager = function ( manager ) {
                throw new Error( 'Cannot set window manager, window already has a manager' );
        }
 
-       // Properties
        this.manager = manager;
-       this.isolated = manager.shouldIsolate();
-
-       // Initialization
-       if ( this.isolated ) {
-               this.$iframe = this.$( '<iframe>' );
-               this.$iframe.attr( { frameborder: 0, scrolling: 'no' } );
-               this.$frame.append( this.$iframe );
-               this.$ = function () {
-                       throw new Error( 'this.$() cannot be used until the frame has been initialized.' );
-               };
-               // WARNING: Do not use this.$ again until #initialize is called
-       } else {
-               this.$content = this.$( '<div>' );
-               this.$document = $( this.getElementDocument() );
-               this.$content.addClass( 'oo-ui-window-content' ).attr( 'tabIndex', 0 );
-               this.$frame.append( this.$content );
-       }
-       this.toggle( false );
-
-       // Figure out directionality:
-       this.dir = OO.ui.Element.static.getDir( this.$iframe || this.$content ) || 'ltr';
+       this.initialize();
 
        return this;
 };
@@ -1960,7 +1906,23 @@ OO.ui.Window.prototype.setManager = function ( manager ) {
  */
 OO.ui.Window.prototype.setSize = function ( size ) {
        this.size = size;
+       this.updateSize();
+       return this;
+};
+
+/**
+ * Update the window size.
+ *
+ * @throws {Error} If not attached to a manager
+ * @chainable
+ */
+OO.ui.Window.prototype.updateSize = function () {
+       if ( !this.manager ) {
+               throw new Error( 'Cannot update window size, must be attached to a manager' );
+       }
+
        this.manager.updateWindowSize( this );
+
        return this;
 };
 
@@ -1981,7 +1943,7 @@ OO.ui.Window.prototype.setSize = function ( size ) {
 OO.ui.Window.prototype.setDimensions = function ( dim ) {
        var height,
                win = this,
-               styleObj = this.$frame[0].style;
+               styleObj = this.$frame[ 0 ].style;
 
        // Calculate the height we need to set using the correct width
        if ( dim.height === undefined ) {
@@ -2010,10 +1972,9 @@ OO.ui.Window.prototype.setDimensions = function ( dim ) {
 /**
  * Initialize window contents.
  *
- * The first time the window is opened, #initialize is called when it's safe to begin populating
- * its contents. See #getSetupProcess for a way to make changes each time the window opens.
- *
- * Once this method is called, this.$ can be used to create elements within the frame.
+ * The first time the window is opened, #initialize is called so that changes to the window that
+ * will persist between openings can be made. See #getSetupProcess for a way to make changes each
+ * time the window opens.
  *
  * @throws {Error} If not attached to a manager
  * @chainable
@@ -2024,10 +1985,12 @@ OO.ui.Window.prototype.initialize = function () {
        }
 
        // Properties
-       this.$head = this.$( '<div>' );
-       this.$body = this.$( '<div>' );
-       this.$foot = this.$( '<div>' );
-       this.$innerOverlay = this.$( '<div>' );
+       this.$head = $( '<div>' );
+       this.$body = $( '<div>' );
+       this.$foot = $( '<div>' );
+       this.$innerOverlay = $( '<div>' );
+       this.dir = OO.ui.Element.static.getDir( this.$content ) || 'ltr';
+       this.$document = $( this.getElementDocument() );
 
        // Events
        this.$element.on( 'mousedown', this.onMouseDown.bind( this ) );
@@ -2051,8 +2014,13 @@ OO.ui.Window.prototype.initialize = function () {
  * @param {Object} [data] Window opening data
  * @return {jQuery.Promise} Promise resolved when window is opened; when the promise is resolved the
  *   first argument will be a promise which will be resolved when the window begins closing
+ * @throws {Error} If not attached to a manager
  */
 OO.ui.Window.prototype.open = function ( data ) {
+       if ( !this.manager ) {
+               throw new Error( 'Cannot open window, must be attached to a manager' );
+       }
+
        return this.manager.openWindow( this, data );
 };
 
@@ -2064,8 +2032,13 @@ OO.ui.Window.prototype.open = function ( data ) {
  *
  * @param {Object} [data] Window closing data
  * @return {jQuery.Promise} Promise resolved when window is closed
+ * @throws {Error} If not attached to a manager
  */
 OO.ui.Window.prototype.close = function ( data ) {
+       if ( !this.manager ) {
+               throw new Error( 'Cannot close window, must be attached to a manager' );
+       }
+
        return this.manager.closeWindow( this, data );
 };
 
@@ -2082,11 +2055,11 @@ OO.ui.Window.prototype.setup = function ( data ) {
        var win = this,
                deferred = $.Deferred();
 
-       this.$element.show();
-       this.visible = true;
+       this.toggle( true );
+
        this.getSetupProcess( data ).execute().done( function () {
                // Force redraw by asking the browser to measure the elements' widths
-               win.$element.addClass( 'oo-ui-window-setup' ).width();
+               win.$element.addClass( 'oo-ui-window-active oo-ui-window-setup' ).width();
                win.$content.addClass( 'oo-ui-window-content-setup' ).width();
                deferred.resolve();
        } );
@@ -2137,7 +2110,7 @@ OO.ui.Window.prototype.hold = function ( data ) {
 
                // Blur the focused element
                if ( $focus.length ) {
-                       $focus[0].blur();
+                       $focus[ 0 ].blur();
                }
 
                // Force redraw by asking the browser to measure the elements' widths
@@ -2159,139 +2132,50 @@ OO.ui.Window.prototype.hold = function ( data ) {
  * @return {jQuery.Promise} Promise resolved when window is torn down
  */
 OO.ui.Window.prototype.teardown = function ( data ) {
-       var win = this,
-               deferred = $.Deferred();
-
-       this.getTeardownProcess( data ).execute().done( function () {
-               // Force redraw by asking the browser to measure the elements' widths
-               win.$element.removeClass( 'oo-ui-window-load oo-ui-window-setup' ).width();
-               win.$content.removeClass( 'oo-ui-window-content-setup' ).width();
-               win.$element.hide();
-               win.visible = false;
-               deferred.resolve();
-       } );
-
-       return deferred.promise();
-};
-
-/**
- * Load the frame contents.
- *
- * Once the iframe's stylesheets are loaded the returned promise will be resolved. Calling while
- * loading will return a promise but not trigger a new loading cycle. Calling after loading is
- * complete will return a promise that's already been resolved.
- *
- * Sounds simple right? Read on...
- *
- * When you create a dynamic iframe using open/write/close, the window.load event for the
- * iframe is triggered when you call close, and there's no further load event to indicate that
- * everything is actually loaded.
- *
- * In Chrome, stylesheets don't show up in document.styleSheets until they have loaded, so we could
- * just poll that array and wait for it to have the right length. However, in Firefox, stylesheets
- * are added to document.styleSheets immediately, and the only way you can determine whether they've
- * loaded is to attempt to access .cssRules and wait for that to stop throwing an exception. But
- * cross-domain stylesheets never allow .cssRules to be accessed even after they have loaded.
- *
- * The workaround is to change all `<link href="...">` tags to `<style>@import url(...)</style>`
- * tags. Because `@import` is blocking, Chrome won't add the stylesheet to document.styleSheets
- * until the `@import` has finished, and Firefox won't allow .cssRules to be accessed until the
- * `@import` has finished. And because the contents of the `<style>` tag are from the same origin,
- * accessing .cssRules is allowed.
- *
- * However, now that we control the styles we're injecting, we might as well do away with
- * browser-specific polling hacks like document.styleSheets and .cssRules, and instead inject
- * `<style>@import url(...); #foo { font-family: someValue; }</style>`, then create `<div id="foo">`
- * and wait for its font-family to change to someValue. Because `@import` is blocking, the
- * font-family rule is not applied until after the `@import` finishes.
- *
- * All this stylesheet injection and polling magic is in #transplantStyles.
- *
- * @return {jQuery.Promise} Promise resolved when loading is complete
- */
-OO.ui.Window.prototype.load = function () {
-       var sub, doc, loading,
-               win = this;
-
-       this.$element.addClass( 'oo-ui-window-load' );
-
-       // Non-isolated windows are already "loaded"
-       if ( !this.loading && !this.isolated ) {
-               this.loading = $.Deferred().resolve();
-               this.initialize();
-               // Set initialized state after so sub-classes aren't confused by it being set by calling
-               // their parent initialize method
-               this.initialized = true;
-       }
-
-       // Return existing promise if already loading or loaded
-       if ( this.loading ) {
-               return this.loading.promise();
-       }
-
-       // Load the frame
-       loading = this.loading = $.Deferred();
-       sub = this.$iframe.prop( 'contentWindow' );
-       doc = sub.document;
-
-       // Initialize contents
-       doc.open();
-       doc.write(
-               '<!doctype html>' +
-               '<html>' +
-                       '<body class="oo-ui-window-isolated oo-ui-' + this.dir + '"' +
-                               ' style="direction:' + this.dir + ';" dir="' + this.dir + '">' +
-                               '<div class="oo-ui-window-content"></div>' +
-                       '</body>' +
-               '</html>'
-       );
-       doc.close();
-
-       // Properties
-       this.$ = OO.ui.Element.static.getJQuery( doc, this.$iframe );
-       this.$content = this.$( '.oo-ui-window-content' ).attr( 'tabIndex', 0 );
-       this.$document = this.$( doc );
-
-       // Initialization
-       this.constructor.static.transplantStyles( this.getElementDocument(), this.$document[0] )
-               .always( function () {
-                       // Initialize isolated windows
-                       win.initialize();
-                       // Set initialized state after so sub-classes aren't confused by it being set by calling
-                       // their parent initialize method
-                       win.initialized = true;
-                       // Undo the visibility: hidden; hack and apply display: none;
-                       // We can do this safely now that the iframe has initialized
-                       // (don't do this from within #initialize because it has to happen
-                       // after the all subclasses have been handled as well).
-                       win.toggle( win.isVisible() );
-
-                       loading.resolve();
+       var win = this;
+
+       return this.getTeardownProcess( data ).execute()
+               .done( function () {
+                       // Force redraw by asking the browser to measure the elements' widths
+                       win.$element.removeClass( 'oo-ui-window-active oo-ui-window-setup' ).width();
+                       win.$content.removeClass( 'oo-ui-window-content-setup' ).width();
+                       win.toggle( false );
                } );
-
-       return loading.promise();
 };
 
 /**
- * Base class for all dialogs.
- *
- * Logic:
- * - Manage the window (open and close, etc.).
- * - Store the internal name and display title.
- * - A stack to track one or more pending actions.
- * - Manage a set of actions that can be performed.
- * - Configure and create action widgets.
- *
- * User interface:
- * - Close the dialog with Escape key.
- * - Visually lock the dialog while an action is in
- *   progress (aka "pending").
- *
- * Subclass responsibilities:
- * - Display the title somewhere.
- * - Add content to the dialog.
- * - Provide a UI to close the dialog.
- * - Display the action widgets somewhere.
+ * The Dialog class serves as the base class for the other types of dialogs.
+ * Unless extended to include controls, the rendered dialog box is a simple window
+ * that users can close by hitting the ‘Esc’ key. Dialog windows are used with OO.ui.WindowManager,
+ * which opens, closes, and controls the presentation of the window. See the
+ * [OOjs UI documentation on MediaWiki] [1] for more information.
+ *
+ *     @example
+ *     // A simple dialog window.
+ *     function MyDialog( config ) {
+ *         MyDialog.super.call( this, config );
+ *     }
+ *     OO.inheritClass( MyDialog, OO.ui.Dialog );
+ *     MyDialog.prototype.initialize = function () {
+ *         MyDialog.super.prototype.initialize.call( this );
+ *         this.content = new OO.ui.PanelLayout( { padded: true, expanded: false } );
+ *         this.content.$element.append( '<p>A simple dialog window. Press \'Esc\' to close.</p>' );
+ *         this.$body.append( this.content.$element );
+ *     };
+ *     MyDialog.prototype.getBodyHeight = function () {
+ *         return this.content.$element.outerHeight( true );
+ *     };
+ *     var myDialog = new MyDialog( {
+ *         size: 'medium'
+ *     } );
+ *     // Create and append a window manager, which opens and closes the window.
+ *     var windowManager = new OO.ui.WindowManager();
+ *     $( 'body' ).append( windowManager.$element );
+ *     windowManager.addWindows( [ myDialog ] );
+ *     // Open the window!
+ *     windowManager.openWindow( myDialog );
+ *
+ * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Windows/Dialogs
  *
  * @abstract
  * @class
@@ -2473,7 +2357,7 @@ OO.ui.Dialog.prototype.getSetupProcess = function ( data ) {
                        );
                        for ( i = 0, len = actions.length; i < len; i++ ) {
                                items.push(
-                                       new OO.ui.ActionWidget( $.extend( { $: this.$ }, actions[i] ) )
+                                       new OO.ui.ActionWidget( actions[ i ] )
                                );
                        }
                        this.actions.add( items );
@@ -2508,7 +2392,7 @@ OO.ui.Dialog.prototype.initialize = function () {
        OO.ui.Dialog.super.prototype.initialize.call( this );
 
        // Properties
-       this.title = new OO.ui.LabelWidget( { $: this.$ } );
+       this.title = new OO.ui.LabelWidget();
 
        // Initialization
        this.$content.addClass( 'oo-ui-dialog-content' );
@@ -2533,7 +2417,7 @@ OO.ui.Dialog.prototype.detachActions = function () {
 
        // Detach all actions that may have been previously attached
        for ( i = 0, len = this.attachedActions.length; i < len; i++ ) {
-               this.attachedActions[i].$element.detach();
+               this.attachedActions[ i ].$element.detach();
        }
        this.attachedActions = [];
 };
@@ -2551,46 +2435,56 @@ OO.ui.Dialog.prototype.executeAction = function ( action ) {
 };
 
 /**
- * Collection of windows.
+ * Window managers are used to open and close {@link OO.ui.Window windows} and control their presentation.
+ * Managed windows are mutually exclusive. If a new window is opened while a current window is opening
+ * or is opened, the current window will be closed and any ongoing {@link OO.ui.Process process} will be cancelled. Windows
+ * themselves are persistent and—rather than being torn down when closed—can be repopulated with the
+ * pertinent data and reused.
+ *
+ * Over the lifecycle of a window, the window manager makes available three promises: `opening`,
+ * `opened`, and `closing`, which represent the primary stages of the cycle:
+ *
+ * **Opening**: the opening stage begins when the window manager’s #openWindow or a window’s
+ * {@link OO.ui.Window#open open} method is used, and the window manager begins to open the window.
+ *
+ * - an `opening` event is emitted with an `opening` promise
+ * - the #getSetupDelay method is called and the returned value is used to time a pause in execution before
+ *   the window’s {@link OO.ui.Window#getSetupProcess getSetupProcess} method is called on the
+ *   window and its result executed
+ * - a `setup` progress notification is emitted from the `opening` promise
+ * - the #getReadyDelay method is called the returned value is used to time a pause in execution before
+ *   the window’s {@link OO.ui.Window#getReadyProcess getReadyProcess} method is called on the
+ *   window and its result executed
+ * - a `ready` progress notification is emitted from the `opening` promise
+ * - the `opening` promise is resolved with an `opened` promise
+ *
+ * **Opened**: the window is now open.
+ *
+ * **Closing**: the closing stage begins when the window manager's #closeWindow or the
+ * window's {@link OO.ui.Window#close close} methods is used, and the window manager begins
+ * to close the window.
+ *
+ * - the `opened` promise is resolved with `closing` promise and a `closing` event is emitted
+ * - the #getHoldDelay method is called and the returned value is used to time a pause in execution before
+ *   the window's {@link OO.ui.Window#getHoldProcess getHoldProces} method is called on the
+ *   window and its result executed
+ * - a `hold` progress notification is emitted from the `closing` promise
+ * - the #getTeardownDelay() method is called and the returned value is used to time a pause in execution before
+ *   the window's {@link OO.ui.Window#getTeardownProcess getTeardownProcess} method is called on the
+ *   window and its result executed
+ * - a `teardown` progress notification is emitted from the `closing` promise
+ * - the `closing` promise is resolved. The window is now closed
+ *
+ * See the [OOjs UI documentation on MediaWiki][1] for more information.
+ *
+ * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Windows/Window_managers
  *
  * @class
  * @extends OO.ui.Element
  * @mixins OO.EventEmitter
  *
- * Managed windows are mutually exclusive. If a window is opened while there is a current window
- * already opening or opened, the current window will be closed without data. Empty closing data
- * should always result in the window being closed without causing constructive or destructive
- * action.
- *
- * As a window is opened and closed, it passes through several stages and the manager emits several
- * corresponding events.
- *
- * - {@link #openWindow} or {@link OO.ui.Window#open} methods are used to start opening
- * - {@link #event-opening} is emitted with `opening` promise
- * - {@link #getSetupDelay} is called the returned value is used to time a pause in execution
- * - {@link OO.ui.Window#getSetupProcess} method is called on the window and its result executed
- * - `setup` progress notification is emitted from opening promise
- * - {@link #getReadyDelay} is called the returned value is used to time a pause in execution
- * - {@link OO.ui.Window#getReadyProcess} method is called on the window and its result executed
- * - `ready` progress notification is emitted from opening promise
- * - `opening` promise is resolved with `opened` promise
- * - Window is now open
- *
- * - {@link #closeWindow} or {@link OO.ui.Window#close} methods are used to start closing
- * - `opened` promise is resolved with `closing` promise
- * - {@link #event-closing} is emitted with `closing` promise
- * - {@link #getHoldDelay} is called the returned value is used to time a pause in execution
- * - {@link OO.ui.Window#getHoldProcess} method is called on the window and its result executed
- * - `hold` progress notification is emitted from opening promise
- * - {@link #getTeardownDelay} is called the returned value is used to time a pause in execution
- * - {@link OO.ui.Window#getTeardownProcess} method is called on the window and its result executed
- * - `teardown` progress notification is emitted from opening promise
- * - Closing promise is resolved
- * - Window is now closed
- *
  * @constructor
  * @param {Object} [config] Configuration options
- * @cfg {boolean} [isolate] Configure managed windows to isolate their content using inline frames
  * @cfg {OO.Factory} [factory] Window factory to use for automatic instantiation
  * @cfg {boolean} [modal=true] Prevent interaction outside the dialog
  */
@@ -2607,22 +2501,17 @@ OO.ui.WindowManager = function OoUiWindowManager( config ) {
        // Properties
        this.factory = config.factory;
        this.modal = config.modal === undefined || !!config.modal;
-       this.isolate = !!config.isolate;
        this.windows = {};
        this.opening = null;
        this.opened = null;
        this.closing = null;
        this.preparingToOpen = null;
        this.preparingToClose = null;
-       this.size = null;
        this.currentWindow = null;
        this.$ariaHidden = null;
-       this.requestedSize = null;
        this.onWindowResizeTimeout = null;
        this.onWindowResizeHandler = this.onWindowResize.bind( this );
        this.afterWindowResizeHandler = this.afterWindowResize.bind( this );
-       this.onWindowMouseWheelHandler = this.onWindowMouseWheel.bind( this );
-       this.onDocumentKeyDownHandler = this.onDocumentKeyDown.bind( this );
 
        // Initialization
        this.$element
@@ -2734,36 +2623,6 @@ OO.ui.WindowManager.prototype.afterWindowResize = function () {
        }
 };
 
-/**
- * Handle window mouse wheel events.
- *
- * @param {jQuery.Event} e Mouse wheel event
- */
-OO.ui.WindowManager.prototype.onWindowMouseWheel = function () {
-       // Kill all events in the parent window if the child window is isolated
-       return !this.shouldIsolate();
-};
-
-/**
- * Handle document key down events.
- *
- * @param {jQuery.Event} e Key down event
- */
-OO.ui.WindowManager.prototype.onDocumentKeyDown = function ( e ) {
-       switch ( e.which ) {
-               case OO.ui.Keys.PAGEUP:
-               case OO.ui.Keys.PAGEDOWN:
-               case OO.ui.Keys.END:
-               case OO.ui.Keys.HOME:
-               case OO.ui.Keys.LEFT:
-               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
-                       return !this.shouldIsolate();
-       }
-};
-
 /**
  * Check if window is opening.
  *
@@ -2791,17 +2650,6 @@ OO.ui.WindowManager.prototype.isOpened = function ( win ) {
        return win === this.currentWindow && !!this.opened && this.opened.state() === 'pending';
 };
 
-/**
- * Check if window contents should be isolated.
- *
- * Window content isolation is done using inline frames.
- *
- * @return {boolean} Window contents should be isolated
- */
-OO.ui.WindowManager.prototype.shouldIsolate = function () {
-       return this.isolate;
-};
-
 /**
  * Check if a window is being managed.
  *
@@ -2812,7 +2660,7 @@ OO.ui.WindowManager.prototype.hasWindow = function ( win ) {
        var name;
 
        for ( name in this.windows ) {
-               if ( this.windows[name] === win ) {
+               if ( this.windows[ name ] === win ) {
                        return true;
                }
        }
@@ -2876,7 +2724,7 @@ OO.ui.WindowManager.prototype.getTeardownDelay = function () {
  */
 OO.ui.WindowManager.prototype.getWindow = function ( name ) {
        var deferred = $.Deferred(),
-               win = this.windows[name];
+               win = this.windows[ name ];
 
        if ( !( win instanceof OO.ui.Window ) ) {
                if ( this.factory ) {
@@ -2885,7 +2733,7 @@ OO.ui.WindowManager.prototype.getWindow = function ( name ) {
                                        'Cannot auto-instantiate window: symbolic name is unrecognized by the factory'
                                ) );
                        } else {
-                               win = this.factory.create( name, this, { $: this.$ } );
+                               win = this.factory.create( name, this );
                                this.addWindows( [ win ] );
                                deferred.resolve( win );
                        }
@@ -2921,7 +2769,6 @@ OO.ui.WindowManager.prototype.getCurrentWindow = function () {
  */
 OO.ui.WindowManager.prototype.openWindow = function ( win, data ) {
        var manager = this,
-               preparing = [],
                opening = $.Deferred();
 
        // Argument handling
@@ -2944,17 +2791,8 @@ OO.ui.WindowManager.prototype.openWindow = function ( win, data ) {
 
        // Window opening
        if ( opening.state() !== 'rejected' ) {
-               if ( !win.getManager() ) {
-                       win.setManager( this );
-               }
-               preparing.push( win.load() );
-
-               if ( this.closing ) {
-                       // If a window is currently closing, wait for it to complete
-                       preparing.push( this.closing );
-               }
-
-               this.preparingToOpen = $.when.apply( $, preparing );
+               // If a window is currently closing, wait for it to complete
+               this.preparingToOpen = $.when( this.closing );
                // Ensure handlers get called after preparingToOpen is set
                this.preparingToOpen.done( function () {
                        if ( manager.modal ) {
@@ -2997,13 +2835,12 @@ OO.ui.WindowManager.prototype.openWindow = function ( win, data ) {
  */
 OO.ui.WindowManager.prototype.closeWindow = function ( win, data ) {
        var manager = this,
-               preparing = [],
                closing = $.Deferred(),
                opened;
 
        // Argument handling
        if ( typeof win === 'string' ) {
-               win = this.windows[win];
+               win = this.windows[ win ];
        } else if ( !this.hasWindow( win ) ) {
                win = null;
        }
@@ -3025,12 +2862,8 @@ OO.ui.WindowManager.prototype.closeWindow = function ( win, data ) {
 
        // Window closing
        if ( closing.state() !== 'rejected' ) {
-               if ( this.opening ) {
-                       // If the window is currently opening, close it when it's done
-                       preparing.push( this.opening );
-               }
-
-               this.preparingToClose = $.when.apply( $, preparing );
+               // If the window is currently opening, close it when it's done
+               this.preparingToClose = $.when( this.opening );
                // Ensure handlers get called after preparingToClose is set
                this.preparingToClose.done( function () {
                        manager.closing = closing;
@@ -3072,15 +2905,15 @@ OO.ui.WindowManager.prototype.closeWindow = function ( win, data ) {
 OO.ui.WindowManager.prototype.addWindows = function ( windows ) {
        var i, len, win, name, list;
 
-       if ( $.isArray( windows ) ) {
+       if ( Array.isArray( windows ) ) {
                // Convert to map of windows by looking up symbolic names from static configuration
                list = {};
                for ( i = 0, len = windows.length; i < len; i++ ) {
-                       name = windows[i].constructor.static.name;
+                       name = windows[ i ].constructor.static.name;
                        if ( typeof name !== 'string' ) {
                                throw new Error( 'Cannot add window' );
                        }
-                       list[name] = windows[i];
+                       list[ name ] = windows[ i ];
                }
        } else if ( $.isPlainObject( windows ) ) {
                list = windows;
@@ -3088,9 +2921,10 @@ OO.ui.WindowManager.prototype.addWindows = function ( windows ) {
 
        // Add windows
        for ( name in list ) {
-               win = list[name];
-               this.windows[name] = win;
+               win = list[ name ];
+               this.windows[ name ] = win.toggle( false );
                this.$element.append( win.$element );
+               win.setManager( this );
        }
 };
 
@@ -3108,13 +2942,13 @@ OO.ui.WindowManager.prototype.removeWindows = function ( names ) {
                manager = this,
                promises = [],
                cleanup = function ( name, win ) {
-                       delete manager.windows[name];
+                       delete manager.windows[ name ];
                        win.$element.detach();
                };
 
        for ( i = 0, len = names.length; i < len; i++ ) {
-               name = names[i];
-               win = this.windows[name];
+               name = names[ i ];
+               win = this.windows[ name ];
                if ( !win ) {
                        throw new Error( 'Cannot remove window' );
                }
@@ -3153,16 +2987,16 @@ OO.ui.WindowManager.prototype.updateWindowSize = function ( win ) {
                sizes = this.constructor.static.sizes,
                size = win.getSize();
 
-       if ( !sizes[size] ) {
+       if ( !sizes[ size ] ) {
                size = this.constructor.static.defaultSize;
        }
-       if ( size !== 'full' && viewport.rect.right - viewport.rect.left < sizes[size].width ) {
+       if ( size !== 'full' && viewport.rect.right - viewport.rect.left < sizes[ size ].width ) {
                size = 'full';
        }
 
        this.$element.toggleClass( 'oo-ui-windowManager-fullscreen', size === 'full' );
        this.$element.toggleClass( 'oo-ui-windowManager-floating', size !== 'full' );
-       win.setDimensions( sizes[size] );
+       win.setDimensions( sizes[ size ] );
 
        this.emit( 'resize', win );
 
@@ -3180,37 +3014,19 @@ OO.ui.WindowManager.prototype.toggleGlobalEvents = function ( on ) {
 
        if ( on ) {
                if ( !this.globalEvents ) {
-                       this.$( this.getElementDocument() ).on( {
-                               // Prevent scrolling by keys in top-level window
-                               keydown: this.onDocumentKeyDownHandler
-                       } );
-                       this.$( this.getElementWindow() ).on( {
-                               // Prevent scrolling by wheel in top-level window
-                               mousewheel: this.onWindowMouseWheelHandler,
+                       $( this.getElementWindow() ).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.getElementDocument().body ).css( 'overflow', 'hidden' );
                        this.globalEvents = true;
                }
        } else if ( this.globalEvents ) {
-               // Unbind global events
-               this.$( this.getElementDocument() ).off( {
-                       // Allow scrolling by keys in top-level window
-                       keydown: this.onDocumentKeyDownHandler
-               } );
-               this.$( this.getElementWindow() ).off( {
-                       // Allow scrolling by wheel in top-level window
-                       mousewheel: this.onWindowMouseWheelHandler,
+               $( this.getElementWindow() ).off( {
                        // Stop listening for top-level window dimension changes
                        'orientationchange resize': this.onWindowResizeHandler
                } );
-               if ( !this.shouldIsolate() ) {
-                       $( this.getElementDocument().body ).css( 'overflow', '' );
-               }
+               $( this.getElementDocument().body ).css( 'overflow', '' );
                this.globalEvents = false;
        }
 
@@ -3388,7 +3204,7 @@ OO.ui.Process.prototype.execute = function () {
                                // Use rejected promise for error
                                return $.Deferred().reject( [ result ] ).promise();
                        }
-                       if ( $.isArray( result ) && result.length && result[0] instanceof OO.ui.Error ) {
+                       if ( Array.isArray( result ) && result.length && result[ 0 ] instanceof OO.ui.Error ) {
                                // Use rejected promise for list of errors
                                return $.Deferred().reject( result ).promise();
                        }
@@ -3404,9 +3220,9 @@ OO.ui.Process.prototype.execute = function () {
 
        if ( this.steps.length ) {
                // Generate a chain reaction of promises
-               promise = proceed( this.steps[0] )();
+               promise = proceed( this.steps[ 0 ] )();
                for ( i = 1, len = this.steps.length; i < len; i++ ) {
-                       promise = promise.then( proceed( this.steps[i] ) );
+                       promise = promise.then( proceed( this.steps[ i ] ) );
                }
        } else {
                promise = $.Deferred().resolve().promise();
@@ -3516,8 +3332,8 @@ OO.ui.ToolFactory.prototype.getTools = function ( include, exclude, promote, dem
 
        // Auto
        for ( i = 0, len = included.length; i < len; i++ ) {
-               if ( !used[included[i]] ) {
-                       auto.push( included[i] );
+               if ( !used[ included[ i ] ] ) {
+                       auto.push( included[ i ] );
                }
        }
 
@@ -3545,22 +3361,22 @@ OO.ui.ToolFactory.prototype.extract = function ( collection, used ) {
 
        if ( collection === '*' ) {
                for ( name in this.registry ) {
-                       tool = this.registry[name];
+                       tool = this.registry[ name ];
                        if (
                                // Only add tools by group name when auto-add is enabled
                                tool.static.autoAddToCatchall &&
                                // Exclude already used tools
-                               ( !used || !used[name] )
+                               ( !used || !used[ name ] )
                        ) {
                                names.push( name );
                                if ( used ) {
-                                       used[name] = true;
+                                       used[ name ] = true;
                                }
                        }
                }
-       } else if ( $.isArray( collection ) ) {
+       } else if ( Array.isArray( collection ) ) {
                for ( i = 0, len = collection.length; i < len; i++ ) {
-                       item = collection[i];
+                       item = collection[ i ];
                        // Allow plain strings as shorthand for named tools
                        if ( typeof item === 'string' ) {
                                item = { name: item };
@@ -3568,26 +3384,26 @@ OO.ui.ToolFactory.prototype.extract = function ( collection, used ) {
                        if ( OO.isPlainObject( item ) ) {
                                if ( item.group ) {
                                        for ( name in this.registry ) {
-                                               tool = this.registry[name];
+                                               tool = this.registry[ name ];
                                                if (
                                                        // Include tools with matching group
                                                        tool.static.group === item.group &&
                                                        // Only add tools by group name when auto-add is enabled
                                                        tool.static.autoAddToGroup &&
                                                        // Exclude already used tools
-                                                       ( !used || !used[name] )
+                                                       ( !used || !used[ name ] )
                                                ) {
                                                        names.push( name );
                                                        if ( used ) {
-                                                               used[name] = true;
+                                                               used[ name ] = true;
                                                        }
                                                }
                                        }
                                // Include tools with matching name and exclude already used tools
-                               } else if ( item.name && ( !used || !used[item.name] ) ) {
+                               } else if ( item.name && ( !used || !used[ item.name ] ) ) {
                                        names.push( item.name );
                                        if ( used ) {
-                                               used[item.name] = true;
+                                               used[ item.name ] = true;
                                        }
                                }
                        }
@@ -3612,7 +3428,7 @@ OO.ui.ToolGroupFactory = function OoUiToolGroupFactory() {
 
        // Register default toolgroups
        for ( i = 0, l = defaultClasses.length; i < l; i++ ) {
-               this.register( defaultClasses[i] );
+               this.register( defaultClasses[ i ] );
        }
 };
 
@@ -3685,118 +3501,300 @@ OO.ui.Theme.prototype.updateElementClasses = function ( element ) {
 };
 
 /**
- * Element with a button.
- *
- * Buttons are used for controls which can be clicked. They can be configured to use tab indexing
- * and access keys for accessibility purposes.
+ * Element supporting "sequential focus navigation" using the 'tabindex' attribute.
  *
  * @abstract
  * @class
  *
  * @constructor
  * @param {Object} [config] Configuration options
- * @cfg {jQuery} [$button] Button node, assigned to #$button, omit to use a generated `<a>`
- * @cfg {boolean} [framed=true] Render button with a frame
- * @cfg {number} [tabIndex=0] Button's tab index. Use 0 to use default ordering, use -1 to prevent
- *   tab focusing.
- * @cfg {string} [accessKey] Button's access key
+ * @cfg {jQuery} [$tabIndexed] tabIndexed node, assigned to #$tabIndexed, omit to use #$element
+ * @cfg {number|null} [tabIndex=0] Tab index value. Use 0 to use default ordering, use -1 to
+ *  prevent tab focusing, use null to suppress the `tabindex` attribute.
  */
-OO.ui.ButtonElement = function OoUiButtonElement( config ) {
+OO.ui.TabIndexedElement = function OoUiTabIndexedElement( config ) {
        // Configuration initialization
-       config = config || {};
+       config = $.extend( { tabIndex: 0 }, config );
 
        // Properties
-       this.$button = null;
-       this.framed = null;
+       this.$tabIndexed = null;
        this.tabIndex = null;
-       this.accessKey = null;
-       this.active = false;
-       this.onMouseUpHandler = this.onMouseUp.bind( this );
-       this.onMouseDownHandler = this.onMouseDown.bind( this );
+
+       // Events
+       this.connect( this, { disable: 'onDisable' } );
 
        // Initialization
-       this.$element.addClass( 'oo-ui-buttonElement' );
-       this.toggleFramed( config.framed === undefined || config.framed );
-       this.setTabIndex( config.tabIndex || 0 );
-       this.setAccessKey( config.accessKey );
-       this.setButtonElement( config.$button || this.$( '<a>' ) );
+       this.setTabIndex( config.tabIndex );
+       this.setTabIndexedElement( config.$tabIndexed || this.$element );
 };
 
 /* Setup */
 
-OO.initClass( OO.ui.ButtonElement );
-
-/* Static Properties */
-
-/**
- * Cancel mouse down events.
- *
- * @static
- * @inheritable
- * @property {boolean}
- */
-OO.ui.ButtonElement.static.cancelButtonMouseDownEvents = true;
+OO.initClass( OO.ui.TabIndexedElement );
 
 /* Methods */
 
 /**
- * Set the button element.
+ * Set the element with `tabindex` attribute.
  *
  * If an element is already set, it will be cleaned up before setting up the new element.
  *
- * @param {jQuery} $button Element to use as button
+ * @param {jQuery} $tabIndexed Element to set tab index on
+ * @chainable
  */
-OO.ui.ButtonElement.prototype.setButtonElement = function ( $button ) {
-       if ( this.$button ) {
-               this.$button
-                       .removeClass( 'oo-ui-buttonElement-button' )
-                       .removeAttr( 'role accesskey tabindex' )
-                       .off( 'mousedown', this.onMouseDownHandler );
-       }
-
-       this.$button = $button
-               .addClass( 'oo-ui-buttonElement-button' )
-               .attr( { role: 'button', accesskey: this.accessKey, tabindex: this.tabIndex } )
-               .on( 'mousedown', this.onMouseDownHandler );
+OO.ui.TabIndexedElement.prototype.setTabIndexedElement = function ( $tabIndexed ) {
+       var tabIndex = this.tabIndex;
+       // Remove attributes from old $tabIndexed
+       this.setTabIndex( null );
+       // Force update of new $tabIndexed
+       this.$tabIndexed = $tabIndexed;
+       this.tabIndex = tabIndex;
+       return this.updateTabIndex();
 };
 
 /**
- * Handles mouse down events.
+ * Set tab index value.
  *
- * @param {jQuery.Event} e Mouse down event
+ * @param {number|null} tabIndex Tab index value or null for no tab index
+ * @chainable
  */
-OO.ui.ButtonElement.prototype.onMouseDown = function ( e ) {
-       if ( this.isDisabled() || e.which !== 1 ) {
-               return false;
-       }
-       // Remove the tab-index while the button is down to prevent the button from stealing focus
-       this.$button.removeAttr( 'tabindex' );
-       this.$element.addClass( 'oo-ui-buttonElement-pressed' );
-       // Run the mouseup handler no matter where the mouse is when the button is let go, so we can
-       // reliably reapply the tabindex and remove the pressed class
-       this.getElementDocument().addEventListener( 'mouseup', this.onMouseUpHandler, true );
-       // Prevent change of focus unless specifically configured otherwise
-       if ( this.constructor.static.cancelButtonMouseDownEvents ) {
-               return false;
+OO.ui.TabIndexedElement.prototype.setTabIndex = function ( tabIndex ) {
+       tabIndex = typeof tabIndex === 'number' ? tabIndex : null;
+
+       if ( this.tabIndex !== tabIndex ) {
+               this.tabIndex = tabIndex;
+               this.updateTabIndex();
        }
+
+       return this;
 };
 
 /**
- * Handles mouse up events.
+ * Update the `tabindex` attribute, in case of changes to tab index or
+ * disabled state.
  *
- * @param {jQuery.Event} e Mouse up event
+ * @chainable
  */
-OO.ui.ButtonElement.prototype.onMouseUp = function ( e ) {
+OO.ui.TabIndexedElement.prototype.updateTabIndex = function () {
+       if ( this.$tabIndexed ) {
+               if ( this.tabIndex !== null ) {
+                       // Do not index over disabled elements
+                       this.$tabIndexed.attr( {
+                               tabindex: this.isDisabled() ? -1 : this.tabIndex,
+                               // ChromeVox and NVDA do not seem to inherit this from parent elements
+                               'aria-disabled': this.isDisabled().toString()
+                       } );
+               } else {
+                       this.$tabIndexed.removeAttr( 'tabindex aria-disabled' );
+               }
+       }
+       return this;
+};
+
+/**
+ * Handle disable events.
+ *
+ * @param {boolean} disabled Element is disabled
+ */
+OO.ui.TabIndexedElement.prototype.onDisable = function () {
+       this.updateTabIndex();
+};
+
+/**
+ * Get tab index value.
+ *
+ * @return {number|null} Tab index value
+ */
+OO.ui.TabIndexedElement.prototype.getTabIndex = function () {
+       return this.tabIndex;
+};
+
+/**
+ * ButtonElement is often mixed into other classes to generate a button, which is a clickable
+ * interface element that can be configured with access keys for accessibility.
+ * See the [OOjs UI documentation on MediaWiki] [1] for examples.
+ *
+ * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Buttons_and_Switches#Buttons
+ * @abstract
+ * @class
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ * @cfg {jQuery} [$button] Button node, assigned to #$button, omit to use a generated `<a>`
+ * @cfg {boolean} [framed=true] Render button with a frame
+ * @cfg {string} [accessKey] Button's access key
+ */
+OO.ui.ButtonElement = function OoUiButtonElement( config ) {
+       // Configuration initialization
+       config = config || {};
+
+       // Properties
+       this.$button = config.$button || $( '<a>' );
+       this.framed = null;
+       this.accessKey = null;
+       this.active = false;
+       this.onMouseUpHandler = this.onMouseUp.bind( this );
+       this.onMouseDownHandler = this.onMouseDown.bind( this );
+       this.onKeyDownHandler = this.onKeyDown.bind( this );
+       this.onKeyUpHandler = this.onKeyUp.bind( this );
+       this.onClickHandler = this.onClick.bind( this );
+       this.onKeyPressHandler = this.onKeyPress.bind( this );
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-buttonElement' );
+       this.toggleFramed( config.framed === undefined || config.framed );
+       this.setAccessKey( config.accessKey );
+       this.setButtonElement( this.$button );
+};
+
+/* Setup */
+
+OO.initClass( OO.ui.ButtonElement );
+
+/* Static Properties */
+
+/**
+ * Cancel mouse down events.
+ *
+ * @static
+ * @inheritable
+ * @property {boolean}
+ */
+OO.ui.ButtonElement.static.cancelButtonMouseDownEvents = true;
+
+/* Events */
+
+/**
+ * @event click
+ */
+
+/* Methods */
+
+/**
+ * Set the button element.
+ *
+ * If an element is already set, it will be cleaned up before setting up the new element.
+ *
+ * @param {jQuery} $button Element to use as button
+ */
+OO.ui.ButtonElement.prototype.setButtonElement = function ( $button ) {
+       if ( this.$button ) {
+               this.$button
+                       .removeClass( 'oo-ui-buttonElement-button' )
+                       .removeAttr( 'role accesskey' )
+                       .off( {
+                               mousedown: this.onMouseDownHandler,
+                               keydown: this.onKeyDownHandler,
+                               click: this.onClickHandler,
+                               keypress: this.onKeyPressHandler
+                       } );
+       }
+
+       this.$button = $button
+               .addClass( 'oo-ui-buttonElement-button' )
+               .attr( { role: 'button', accesskey: this.accessKey } )
+               .on( {
+                       mousedown: this.onMouseDownHandler,
+                       keydown: this.onKeyDownHandler,
+                       click: this.onClickHandler,
+                       keypress: this.onKeyPressHandler
+               } );
+};
+
+/**
+ * Handles mouse down events.
+ *
+ * @protected
+ * @param {jQuery.Event} e Mouse down event
+ */
+OO.ui.ButtonElement.prototype.onMouseDown = function ( e ) {
        if ( this.isDisabled() || e.which !== 1 ) {
+               return;
+       }
+       this.$element.addClass( 'oo-ui-buttonElement-pressed' );
+       // Run the mouseup handler no matter where the mouse is when the button is let go, so we can
+       // reliably remove the pressed class
+       this.getElementDocument().addEventListener( 'mouseup', this.onMouseUpHandler, true );
+       // Prevent change of focus unless specifically configured otherwise
+       if ( this.constructor.static.cancelButtonMouseDownEvents ) {
                return false;
        }
-       // Restore the tab-index after the button is up to restore the button's accessibility
-       this.$button.attr( 'tabindex', this.tabIndex );
+};
+
+/**
+ * Handles mouse up events.
+ *
+ * @protected
+ * @param {jQuery.Event} e Mouse up event
+ */
+OO.ui.ButtonElement.prototype.onMouseUp = function ( e ) {
+       if ( this.isDisabled() || e.which !== 1 ) {
+               return;
+       }
        this.$element.removeClass( 'oo-ui-buttonElement-pressed' );
        // Stop listening for mouseup, since we only needed this once
        this.getElementDocument().removeEventListener( 'mouseup', this.onMouseUpHandler, true );
 };
 
+/**
+ * Handles mouse click events.
+ *
+ * @protected
+ * @param {jQuery.Event} e Mouse click event
+ * @fires click
+ */
+OO.ui.ButtonElement.prototype.onClick = function ( e ) {
+       if ( !this.isDisabled() && e.which === 1 ) {
+               this.emit( 'click' );
+       }
+       return false;
+};
+
+/**
+ * Handles key down events.
+ *
+ * @protected
+ * @param {jQuery.Event} e Key down event
+ */
+OO.ui.ButtonElement.prototype.onKeyDown = function ( e ) {
+       if ( this.isDisabled() || ( e.which !== OO.ui.Keys.SPACE && e.which !== OO.ui.Keys.ENTER ) ) {
+               return;
+       }
+       this.$element.addClass( 'oo-ui-buttonElement-pressed' );
+       // Run the keyup handler no matter where the key is when the button is let go, so we can
+       // reliably remove the pressed class
+       this.getElementDocument().addEventListener( 'keyup', this.onKeyUpHandler, true );
+};
+
+/**
+ * Handles key up events.
+ *
+ * @protected
+ * @param {jQuery.Event} e Key up event
+ */
+OO.ui.ButtonElement.prototype.onKeyUp = function ( e ) {
+       if ( this.isDisabled() || ( e.which !== OO.ui.Keys.SPACE && e.which !== OO.ui.Keys.ENTER ) ) {
+               return;
+       }
+       this.$element.removeClass( 'oo-ui-buttonElement-pressed' );
+       // Stop listening for keyup, since we only needed this once
+       this.getElementDocument().removeEventListener( 'keyup', this.onKeyUpHandler, true );
+};
+
+/**
+ * Handles key press events.
+ *
+ * @protected
+ * @param {jQuery.Event} e Key press event
+ * @fires click
+ */
+OO.ui.ButtonElement.prototype.onKeyPress = function ( e ) {
+       if ( !this.isDisabled() && ( e.which === OO.ui.Keys.SPACE || e.which === OO.ui.Keys.ENTER ) ) {
+               this.emit( 'click' );
+       }
+       return false;
+};
+
 /**
  * Check if button has a frame.
  *
@@ -3825,29 +3823,6 @@ OO.ui.ButtonElement.prototype.toggleFramed = function ( framed ) {
        return this;
 };
 
-/**
- * Set tab index.
- *
- * @param {number|null} tabIndex Button's tab index, use null to remove
- * @chainable
- */
-OO.ui.ButtonElement.prototype.setTabIndex = function ( tabIndex ) {
-       tabIndex = typeof tabIndex === 'number' && tabIndex >= 0 ? tabIndex : null;
-
-       if ( this.tabIndex !== tabIndex ) {
-               if ( this.$button ) {
-                       if ( tabIndex !== null ) {
-                               this.$button.attr( 'tabindex', tabIndex );
-                       } else {
-                               this.$button.removeAttr( 'tabindex' );
-                       }
-               }
-               this.tabIndex = tabIndex;
-       }
-
-       return this;
-};
-
 /**
  * Set access key.
  *
@@ -3883,7 +3858,12 @@ OO.ui.ButtonElement.prototype.setActive = function ( value ) {
 };
 
 /**
- * Element containing a sequence of child elements.
+ * Any OOjs UI widget that contains other widgets (such as {@link OO.ui.ButtonWidget buttons} or
+ * {@link OO.ui.OptionWidget options}) mixes in GroupElement. Adding, removing, and clearing
+ * items from the group is done through the interface the class provides.
+ * For more information, please see the [OOjs UI documentation on MediaWiki] [1].
+ *
+ * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Elements/Groups
  *
  * @abstract
  * @class
@@ -3902,7 +3882,7 @@ OO.ui.GroupElement = function OoUiGroupElement( config ) {
        this.aggregateItemEvents = {};
 
        // Initialization
-       this.setGroupElement( config.$group || this.$( '<div>' ) );
+       this.setGroupElement( config.$group || $( '<div>' ) );
 };
 
 /* Methods */
@@ -3919,7 +3899,7 @@ OO.ui.GroupElement.prototype.setGroupElement = function ( $group ) {
 
        this.$group = $group;
        for ( i = 0, len = this.items.length; i < len; i++ ) {
-               this.$group.append( this.items[i].$element );
+               this.$group.append( this.items[ i ].$element );
        }
 };
 
@@ -3954,7 +3934,7 @@ OO.ui.GroupElement.prototype.getItemFromData = function ( data ) {
                hash = OO.getHash( data );
 
        for ( i = 0, len = this.items.length; i < len; i++ ) {
-               item = this.items[i];
+               item = this.items[ i ];
                if ( hash === OO.getHash( item.getData() ) ) {
                        return item;
                }
@@ -3977,7 +3957,7 @@ OO.ui.GroupElement.prototype.getItemsFromData = function ( data ) {
                items = [];
 
        for ( i = 0, len = this.items.length; i < len; i++ ) {
-               item = this.items[i];
+               item = this.items[ i ];
                if ( hash === OO.getHash( item.getData() ) ) {
                        items.push( item );
                }
@@ -4001,7 +3981,7 @@ OO.ui.GroupElement.prototype.aggregate = function ( events ) {
        var i, len, item, add, remove, itemEvent, groupEvent;
 
        for ( itemEvent in events ) {
-               groupEvent = events[itemEvent];
+               groupEvent = events[ itemEvent ];
 
                // Remove existing aggregated event
                if ( Object.prototype.hasOwnProperty.call( this.aggregateItemEvents, itemEvent ) ) {
@@ -4011,27 +3991,27 @@ OO.ui.GroupElement.prototype.aggregate = function ( events ) {
                        }
                        // Remove event aggregation from existing items
                        for ( i = 0, len = this.items.length; i < len; i++ ) {
-                               item = this.items[i];
+                               item = this.items[ i ];
                                if ( item.connect && item.disconnect ) {
                                        remove = {};
-                                       remove[itemEvent] = [ 'emit', groupEvent, item ];
+                                       remove[ itemEvent ] = [ 'emit', groupEvent, item ];
                                        item.disconnect( this, remove );
                                }
                        }
                        // Prevent future items from aggregating event
-                       delete this.aggregateItemEvents[itemEvent];
+                       delete this.aggregateItemEvents[ itemEvent ];
                }
 
                // Add new aggregate event
                if ( groupEvent ) {
                        // Make future items aggregate event
-                       this.aggregateItemEvents[itemEvent] = groupEvent;
+                       this.aggregateItemEvents[ itemEvent ] = groupEvent;
                        // Add event aggregation to existing items
                        for ( i = 0, len = this.items.length; i < len; i++ ) {
-                               item = this.items[i];
+                               item = this.items[ i ];
                                if ( item.connect && item.disconnect ) {
                                        add = {};
-                                       add[itemEvent] = [ 'emit', groupEvent, item ];
+                                       add[ itemEvent ] = [ 'emit', groupEvent, item ];
                                        item.connect( this, add );
                                }
                        }
@@ -4053,7 +4033,7 @@ OO.ui.GroupElement.prototype.addItems = function ( items, index ) {
                itemElements = [];
 
        for ( i = 0, len = items.length; i < len; i++ ) {
-               item = items[i];
+               item = items[ i ];
 
                // Check if item exists then remove it first, effectively "moving" it
                currentIndex = $.inArray( item, this.items );
@@ -4068,7 +4048,7 @@ OO.ui.GroupElement.prototype.addItems = function ( items, index ) {
                if ( item.connect && item.disconnect && !$.isEmptyObject( this.aggregateItemEvents ) ) {
                        events = {};
                        for ( event in this.aggregateItemEvents ) {
-                               events[event] = [ 'emit', this.aggregateItemEvents[event], item ];
+                               events[ event ] = [ 'emit', this.aggregateItemEvents[ event ], item ];
                        }
                        item.connect( this, events );
                }
@@ -4083,7 +4063,7 @@ OO.ui.GroupElement.prototype.addItems = function ( items, index ) {
                this.$group.prepend( itemElements );
                this.items.unshift.apply( this.items, items );
        } else {
-               this.items[index].$element.before( itemElements );
+               this.items[ index ].$element.before( itemElements );
                this.items.splice.apply( this.items, [ index, 0 ].concat( items ) );
        }
 
@@ -4103,7 +4083,7 @@ OO.ui.GroupElement.prototype.removeItems = function ( items ) {
 
        // Remove specific items
        for ( i = 0, len = items.length; i < len; i++ ) {
-               item = items[i];
+               item = items[ i ];
                index = $.inArray( item, this.items );
                if ( index !== -1 ) {
                        if (
@@ -4112,7 +4092,7 @@ OO.ui.GroupElement.prototype.removeItems = function ( items ) {
                        ) {
                                remove = {};
                                if ( Object.prototype.hasOwnProperty.call( this.aggregateItemEvents, itemEvent ) ) {
-                                       remove[itemEvent] = [ 'emit', this.aggregateItemEvents[itemEvent], item ];
+                                       remove[ itemEvent ] = [ 'emit', this.aggregateItemEvents[ itemEvent ], item ];
                                }
                                item.disconnect( this, remove );
                        }
@@ -4137,14 +4117,14 @@ OO.ui.GroupElement.prototype.clearItems = function () {
 
        // Remove all items
        for ( i = 0, len = this.items.length; i < len; i++ ) {
-               item = this.items[i];
+               item = this.items[ i ];
                if (
                        item.connect && item.disconnect &&
                        !$.isEmptyObject( this.aggregateItemEvents )
                ) {
                        remove = {};
                        if ( Object.prototype.hasOwnProperty.call( this.aggregateItemEvents, itemEvent ) ) {
-                               remove[itemEvent] = [ 'emit', this.aggregateItemEvents[itemEvent], item ];
+                               remove[ itemEvent ] = [ 'emit', this.aggregateItemEvents[ itemEvent ], item ];
                        }
                        item.disconnect( this, remove );
                }
@@ -4157,8 +4137,10 @@ OO.ui.GroupElement.prototype.clearItems = function () {
 };
 
 /**
- * A mixin for an element that can be dragged and dropped.
- * Use in conjunction with DragGroupWidget
+ * DraggableElement is a mixin class used to create elements that can be clicked
+ * and dragged by a mouse to a new position within a group. This class must be used
+ * in conjunction with OO.ui.DraggableGroupElement, which provides a container for
+ * the draggable elements.
  *
  * @abstract
  * @class
@@ -4181,6 +4163,8 @@ OO.ui.DraggableElement = function OoUiDraggableElement() {
                } );
 };
 
+OO.initClass( OO.ui.DraggableElement );
+
 /* Events */
 
 /**
@@ -4196,6 +4180,13 @@ OO.ui.DraggableElement = function OoUiDraggableElement() {
  * @event drop
  */
 
+/* Static Properties */
+
+/**
+ * @inheritdoc OO.ui.ButtonElement
+ */
+OO.ui.DraggableElement.static.cancelButtonMouseDownEvents = false;
+
 /* Methods */
 
 /**
@@ -4271,8 +4262,9 @@ OO.ui.DraggableElement.prototype.getIndex = function () {
 };
 
 /**
- * Element containing a sequence of child elements that can be dragged
- * and dropped.
+ * DraggableGroupElement is a mixin class used to create a group element to
+ * contain draggable elements, which are items that can be clicked and dragged by a mouse.
+ * The class is used with OO.ui.DraggableElement.
  *
  * @abstract
  * @class
@@ -4313,7 +4305,7 @@ OO.ui.DraggableGroupElement = function OoUiDraggableGroupElement( config ) {
        } );
 
        // Initialize
-       if ( $.isArray( config.items ) ) {
+       if ( Array.isArray( config.items ) ) {
                this.addItems( config.items );
        }
        this.$placeholder = $( '<div>' )
@@ -4347,7 +4339,7 @@ OO.ui.DraggableGroupElement.prototype.onItemDragStart = function ( item ) {
 
        // Map the index of each object
        for ( i = 0, len = this.items.length; i < len; i++ ) {
-               this.items[i].setIndex( i );
+               this.items[ i ].setIndex( i );
        }
 
        if ( this.orientation === 'horizontal' ) {
@@ -4393,6 +4385,7 @@ OO.ui.DraggableGroupElement.prototype.onItemDrop = function ( item ) {
                // Emit change event
                this.emit( 'reorder', this.getDragItem(), toIndex );
        }
+       this.unsetDragItem();
        // Return false to prevent propogation
        return false;
 };
@@ -4404,7 +4397,7 @@ OO.ui.DraggableGroupElement.prototype.onDragLeave = function () {
        // This means the item was dragged outside the widget
        this.$placeholder
                .css( 'left', 0 )
-               .hide();
+               .addClass( 'oo-ui-element-hidden' );
 };
 
 /**
@@ -4420,9 +4413,9 @@ OO.ui.DraggableGroupElement.prototype.onDragOver = function ( e ) {
        // Get the OptionWidget item we are dragging over
        dragOverObj = this.getElementDocument().elementFromPoint( clientX, clientY );
        $optionWidget = $( dragOverObj ).closest( '.oo-ui-draggableElement' );
-       if ( $optionWidget[0] ) {
+       if ( $optionWidget[ 0 ] ) {
                itemOffset = $optionWidget.offset();
-               itemBoundingRect = $optionWidget[0].getBoundingClientRect();
+               itemBoundingRect = $optionWidget[ 0 ].getBoundingClientRect();
                itemPosition = $optionWidget.position();
                itemIndex = $optionWidget.data( 'index' );
        }
@@ -4465,23 +4458,14 @@ OO.ui.DraggableGroupElement.prototype.onDragOver = function ( e ) {
                        this.sideInsertion = dragPosition < itemMidpoint ? 'before' : 'after';
                }
                // Add drop indicator between objects
-               if ( this.sideInsertion ) {
-                       this.$placeholder
-                               .css( cssOutput )
-                               .show();
-               } else {
-                       this.$placeholder
-                               .css( {
-                                       left: 0,
-                                       top: 0
-                               } )
-                               .hide();
-               }
+               this.$placeholder
+                       .css( cssOutput )
+                       .removeClass( 'oo-ui-element-hidden' );
        } else {
                // This means the item was dragged outside the widget
                this.$placeholder
                        .css( 'left', 0 )
-                       .hide();
+                       .addClass( 'oo-ui-element-hidden' );
        }
        // Prevent default
        e.preventDefault();
@@ -4501,7 +4485,7 @@ OO.ui.DraggableGroupElement.prototype.setDragItem = function ( item ) {
 OO.ui.DraggableGroupElement.prototype.unsetDragItem = function () {
        this.dragItem = null;
        this.itemDragOver = null;
-       this.$placeholder.hide();
+       this.$placeholder.addClass( 'oo-ui-element-hidden' );
        this.sideInsertion = '';
 };
 
@@ -4522,12 +4506,13 @@ OO.ui.DraggableGroupElement.prototype.isDragging = function () {
 };
 
 /**
- * Element containing an icon.
+ * IconElement is often mixed into other classes to generate an icon.
+ * Icons are graphics, about the size of normal text. They are used to aid the user
+ * in locating a control or to convey information in a space-efficient way. See the
+ * [OOjs UI documentation on MediaWiki] [1] for a list of icons
+ * included in the library.
  *
- * Icons are graphics, about the size of normal text. They can be used to aid the user in locating
- * a control or convey information in a more space efficient way. Icons should rarely be used
- * without labels; such as in a toolbar where space is at a premium or within a context where the
- * meaning is very clear to the user.
+ * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Icons,_Indicators,_and_Labels#Icons
  *
  * @abstract
  * @class
@@ -4552,7 +4537,7 @@ OO.ui.IconElement = function OoUiIconElement( config ) {
        // Initialization
        this.setIcon( config.icon || this.constructor.static.icon );
        this.setIconTitle( config.iconTitle || this.constructor.static.iconTitle );
-       this.setIconElement( config.$icon || this.$( '<span>' ) );
+       this.setIconElement( config.$icon || $( '<span>' ) );
 };
 
 /* Setup */
@@ -4562,31 +4547,31 @@ OO.initClass( OO.ui.IconElement );
 /* Static Properties */
 
 /**
- * Icon.
+ * The symbolic name of the icon (e.g., ‘remove’ or ‘menu’), or a map of symbolic names. A map is used
+ * for i18n purposes and contains a `default` icon name and additional names keyed by
+ * language code. The `default` name is used when no icon is keyed by the user's language.
  *
- * Value should be the unique portion of an icon CSS class name, such as 'up' for 'oo-ui-icon-up'.
+ * Example of an i18n map:
  *
- * For i18n purposes, this property can be an object containing a `default` icon name property and
- * additional icon names keyed by language code.
- *
- * Example of i18n icon definition:
  *     { default: 'bold-a', en: 'bold-b', de: 'bold-f' }
  *
+ * Note: the static property will be overridden if the #icon configuration is used.
+ *
  * @static
  * @inheritable
- * @property {Object|string} Symbolic icon name, or map of icon names keyed by language ID;
- *  use the 'default' key to specify the icon to be used when there is no icon in the user's
- *  language
+ * @property {Object|string}
  */
 OO.ui.IconElement.static.icon = null;
 
 /**
- * Icon title.
+ * The icon title, displayed when users move the mouse over the icon. The value can be text, a
+ * function that returns title text, or `null` for no title.
+ *
+ * The static property will be overridden if the #iconTitle configuration is used.
  *
  * @static
  * @inheritable
- * @property {string|Function|null} Icon title text, a function that returns text or null for no
- *  icon title
+ * @property {string|Function|null}
  */
 OO.ui.IconElement.static.iconTitle = null;
 
@@ -4689,12 +4674,18 @@ OO.ui.IconElement.prototype.getIconTitle = function () {
 };
 
 /**
- * Element containing an indicator.
+ * IndicatorElement is often mixed into other classes to generate an indicator.
+ * Indicators are small graphics that are generally used in two ways:
+ *
+ * - To draw attention to the status of an item. For example, an indicator might be
+ *   used to show that an item in a list has errors that need to be resolved.
+ * - To clarify the function of a control that acts in an exceptional way (a button
+ *   that opens a menu instead of performing an action directly, for example).
  *
- * Indicators are graphics, smaller than normal text. They can be used to describe unique status or
- * behavior. Indicators should only be used in exceptional cases; such as a button that opens a menu
- * instead of performing an action directly, or an item in a list which has errors that need to be
- * resolved.
+ * For a list of indicators included in the library, please see the
+ * [OOjs UI documentation on MediaWiki] [1].
+ *
+ * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Icons,_Indicators,_and_Labels#Indicators
  *
  * @abstract
  * @class
@@ -4718,7 +4709,7 @@ OO.ui.IndicatorElement = function OoUiIndicatorElement( config ) {
        // Initialization
        this.setIndicator( config.indicator || this.constructor.static.indicator );
        this.setIndicatorTitle( config.indicatorTitle || this.constructor.static.indicatorTitle );
-       this.setIndicatorElement( config.$indicator || this.$( '<span>' ) );
+       this.setIndicatorElement( config.$indicator || $( '<span>' ) );
 };
 
 /* Setup */
@@ -4864,13 +4855,20 @@ OO.ui.LabelElement = function OoUiLabelElement( config ) {
 
        // Initialization
        this.setLabel( config.label || this.constructor.static.label );
-       this.setLabelElement( config.$label || this.$( '<span>' ) );
+       this.setLabelElement( config.$label || $( '<span>' ) );
 };
 
 /* Setup */
 
 OO.initClass( OO.ui.LabelElement );
 
+/* Events */
+
+/**
+ * @event labelChange
+ * @param {string} value
+ */
+
 /* Static Properties */
 
 /**
@@ -4915,15 +4913,16 @@ OO.ui.LabelElement.prototype.setLabel = function ( label ) {
        label = typeof label === 'function' ? OO.ui.resolveMsg( label ) : label;
        label = ( typeof label === 'string' && label.length ) || label instanceof jQuery ? label : null;
 
+       this.$element.toggleClass( 'oo-ui-labelElement', !!label );
+
        if ( this.label !== label ) {
                if ( this.$label ) {
                        this.setLabelContent( label );
                }
                this.label = label;
+               this.emit( 'labelChange' );
        }
 
-       this.$element.toggleClass( 'oo-ui-labelElement', !!this.label );
-
        return this;
 };
 
@@ -4996,7 +4995,8 @@ OO.ui.LookupElement = function OoUiLookupElement( config ) {
        // Properties
        this.$overlay = config.$overlay || this.$element;
        this.lookupMenu = new OO.ui.TextInputMenuSelectWidget( this, {
-               $: OO.ui.Element.static.getJQuery( this.$overlay ),
+               widget: this,
+               input: this,
                $container: config.$container
        } );
        this.lookupCache = {};
@@ -5209,7 +5209,7 @@ OO.ui.LookupElement.prototype.getLookupMenuItems = function () {
 
        this.abortLookupRequest();
        if ( Object.prototype.hasOwnProperty.call( this.lookupCache, value ) ) {
-               deferred.resolve( this.getLookupMenuOptionsFromData( this.lookupCache[value] ) );
+               deferred.resolve( this.getLookupMenuOptionsFromData( this.lookupCache[ value ] ) );
        } else {
                this.pushPending();
                this.lookupQuery = value;
@@ -5230,8 +5230,8 @@ OO.ui.LookupElement.prototype.getLookupMenuItems = function () {
                                if ( ourRequest === widget.lookupRequest ) {
                                        widget.lookupQuery = null;
                                        widget.lookupRequest = null;
-                                       widget.lookupCache[value] = widget.getLookupCacheDataFromResponse( data );
-                                       deferred.resolve( widget.getLookupMenuOptionsFromData( widget.lookupCache[value] ) );
+                                       widget.lookupCache[ value ] = widget.getLookupCacheDataFromResponse( data );
+                                       deferred.resolve( widget.getLookupMenuOptionsFromData( widget.lookupCache[ value ] ) );
                                }
                        } )
                        .fail( function () {
@@ -5309,7 +5309,7 @@ OO.ui.LookupElement.prototype.getLookupMenuOptionsFromData = function () {
  * @constructor
  * @param {Object} [config] Configuration options
  * @cfg {Object} [popup] Configuration to pass to popup
- * @cfg {boolean} [autoClose=true] Popup auto-closes when it loses focus
+ * @cfg {boolean} [popup.autoClose=true] Popup auto-closes when it loses focus
  */
 OO.ui.PopupElement = function OoUiPopupElement( config ) {
        // Configuration initialization
@@ -5319,7 +5319,7 @@ OO.ui.PopupElement = function OoUiPopupElement( config ) {
        this.popup = new OO.ui.PopupWidget( $.extend(
                { autoClose: true },
                config.popup,
-               { $: this.$, $autoCloseIgnore: this.$element }
+               { $autoCloseIgnore: this.$element }
        ) );
 };
 
@@ -5335,10 +5335,22 @@ OO.ui.PopupElement.prototype.getPopup = function () {
 };
 
 /**
- * Element with named flags that can be added, removed, listed and checked.
+ * The FlaggedElement class is an attribute mixin, meaning that it is used to add
+ * additional functionality to an element created by another class. The class provides
+ * a ‘flags’ property assigned the name (or an array of names) of styling flags,
+ * which are used to customize the look and feel of a widget to better describe its
+ * importance and functionality.
+ *
+ * The library currently contains the following styling flags for general use:
+ *
+ * - **progressive**:  Progressive styling is applied to convey that the widget will move the user forward in a process.
+ * - **destructive**: Destructive styling is applied to convey that the widget will remove something.
+ * - **constructive**: Constructive styling is applied to convey that the widget will create something.
+ *
+ * {@link OO.ui.ActionWidget ActionWidgets}, which are a special kind of button that execute an action, use these flags: **primary** and **safe**.
+ * Please see the [OOjs UI documentation on MediaWiki] [1] for more information.
  *
- * A flag, when set, adds a CSS class on the `$element` by combining `oo-ui-flaggedElement-` with
- * the flag name. Flags are primarily useful for styling.
+ * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Elements/Flagged
  *
  * @abstract
  * @class
@@ -5424,8 +5436,8 @@ OO.ui.FlaggedElement.prototype.clearFlags = function () {
 
        for ( flag in this.flags ) {
                className = classPrefix + flag;
-               changes[flag] = false;
-               delete this.flags[flag];
+               changes[ flag ] = false;
+               delete this.flags[ flag ];
                remove.push( className );
        }
 
@@ -5457,36 +5469,36 @@ OO.ui.FlaggedElement.prototype.setFlags = function ( flags ) {
        if ( typeof flags === 'string' ) {
                className = classPrefix + flags;
                // Set
-               if ( !this.flags[flags] ) {
-                       this.flags[flags] = true;
+               if ( !this.flags[ flags ] ) {
+                       this.flags[ flags ] = true;
                        add.push( className );
                }
-       } else if ( $.isArray( flags ) ) {
+       } else if ( Array.isArray( flags ) ) {
                for ( i = 0, len = flags.length; i < len; i++ ) {
-                       flag = flags[i];
+                       flag = flags[ i ];
                        className = classPrefix + flag;
                        // Set
-                       if ( !this.flags[flag] ) {
-                               changes[flag] = true;
-                               this.flags[flag] = true;
+                       if ( !this.flags[ flag ] ) {
+                               changes[ flag ] = true;
+                               this.flags[ flag ] = true;
                                add.push( className );
                        }
                }
        } else if ( OO.isPlainObject( flags ) ) {
                for ( flag in flags ) {
                        className = classPrefix + flag;
-                       if ( flags[flag] ) {
+                       if ( flags[ flag ] ) {
                                // Set
-                               if ( !this.flags[flag] ) {
-                                       changes[flag] = true;
-                                       this.flags[flag] = true;
+                               if ( !this.flags[ flag ] ) {
+                                       changes[ flag ] = true;
+                                       this.flags[ flag ] = true;
                                        add.push( className );
                                }
                        } else {
                                // Remove
-                               if ( this.flags[flag] ) {
-                                       changes[flag] = false;
-                                       delete this.flags[flag];
+                               if ( this.flags[ flag ] ) {
+                                       changes[ flag ] = false;
+                                       delete this.flags[ flag ];
                                        remove.push( className );
                                }
                        }
@@ -5646,9 +5658,8 @@ OO.ui.ClippableElement = function OoUiClippableElement( config ) {
 OO.ui.ClippableElement.prototype.setClippableElement = function ( $clippable ) {
        if ( this.$clippable ) {
                this.$clippable.removeClass( 'oo-ui-clippableElement-clippable' );
-               this.$clippable.css( { width: '', height: '' } );
-               this.$clippable.width(); // Force reflow for https://code.google.com/p/chromium/issues/detail?id=387290
-               this.$clippable.css( { overflowX: '', overflowY: '' } );
+               this.$clippable.css( { width: '', height: '', overflowX: '', overflowY: '' } );
+               OO.ui.Element.static.reconsiderScrollbars( this.$clippable[ 0 ] );
        }
 
        this.$clippable = $clippable.addClass( 'oo-ui-clippableElement-clippable' );
@@ -5669,21 +5680,20 @@ OO.ui.ClippableElement.prototype.toggleClipping = function ( clipping ) {
        if ( this.clipping !== clipping ) {
                this.clipping = clipping;
                if ( clipping ) {
-                       this.$clippableContainer = this.$( this.getClosestScrollableElementContainer() );
+                       this.$clippableContainer = $( this.getClosestScrollableElementContainer() );
                        // 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( 'html, body' ) ?
-                               this.$( OO.ui.Element.static.getWindow( this.$clippableContainer ) ) :
+                               $( OO.ui.Element.static.getWindow( this.$clippableContainer ) ) :
                                this.$clippableContainer;
                        this.$clippableScroller.on( 'scroll', this.onClippableContainerScrollHandler );
-                       this.$clippableWindow = this.$( this.getElementWindow() )
+                       this.$clippableWindow = $( this.getElementWindow() )
                                .on( 'resize', this.onClippableWindowResizeHandler );
                        // Initial clip after visible
                        this.clip();
                } else {
-                       this.$clippable.css( { width: '', height: '' } );
-                       this.$clippable.width(); // Force reflow for https://code.google.com/p/chromium/issues/detail?id=387290
-                       this.$clippable.css( { overflowX: '', overflowY: '' } );
+                       this.$clippable.css( { width: '', height: '', overflowX: '', overflowY: '' } );
+                       OO.ui.Element.static.reconsiderScrollbars( this.$clippable[ 0 ] );
 
                        this.$clippableContainer = null;
                        this.$clippableScroller.off( 'scroll', this.onClippableContainerScrollHandler );
@@ -5789,16 +5799,17 @@ OO.ui.ClippableElement.prototype.clip = function () {
        if ( clipWidth ) {
                this.$clippable.css( { overflowX: 'scroll', width: desiredWidth } );
        } else {
-               this.$clippable.css( 'width', this.idealWidth || '' );
-               this.$clippable.width(); // Force reflow for https://code.google.com/p/chromium/issues/detail?id=387290
-               this.$clippable.css( 'overflowX', '' );
+               this.$clippable.css( { width: this.idealWidth || '', overflowX: '' } );
        }
        if ( clipHeight ) {
                this.$clippable.css( { overflowY: 'scroll', height: desiredHeight } );
        } else {
-               this.$clippable.css( 'height', this.idealHeight || '' );
-               this.$clippable.height(); // Force reflow for https://code.google.com/p/chromium/issues/detail?id=387290
-               this.$clippable.css( 'overflowY', '' );
+               this.$clippable.css( { height: this.idealHeight || '', overflowY: '' } );
+       }
+
+       // If we stopped clipping in at least one of the dimensions
+       if ( !clipWidth || !clipHeight ) {
+               OO.ui.Element.static.reconsiderScrollbars( this.$clippable[ 0 ] );
        }
 
        this.clippedHorizontally = clipWidth;
@@ -5836,9 +5847,9 @@ OO.ui.Tool = function OoUiTool( toolGroup, config ) {
        this.toolGroup = toolGroup;
        this.toolbar = this.toolGroup.getToolbar();
        this.active = false;
-       this.$title = this.$( '<span>' );
-       this.$accel = this.$( '<span>' );
-       this.$link = this.$( '<a>' );
+       this.$title = $( '<span>' );
+       this.$accel = $( '<span>' );
+       this.$link = $( '<a>' );
        this.title = null;
 
        // Events
@@ -6099,8 +6110,8 @@ OO.ui.Toolbar = function OoUiToolbar( toolFactory, toolGroupFactory, config ) {
        this.toolGroupFactory = toolGroupFactory;
        this.groups = [];
        this.tools = {};
-       this.$bar = this.$( '<div>' );
-       this.$actions = this.$( '<div>' );
+       this.$bar = $( '<div>' );
+       this.$actions = $( '<div>' );
        this.initialized = false;
 
        // Events
@@ -6154,9 +6165,9 @@ OO.ui.Toolbar.prototype.getToolGroupFactory = function () {
  * @param {jQuery.Event} e Mouse down event
  */
 OO.ui.Toolbar.prototype.onPointerDown = function ( e ) {
-       var $closestWidgetToEvent = this.$( e.target ).closest( '.oo-ui-widget' ),
+       var $closestWidgetToEvent = $( e.target ).closest( '.oo-ui-widget' ),
                $closestWidgetToToolbar = this.$element.closest( '.oo-ui-widget' );
-       if ( !$closestWidgetToEvent.length || $closestWidgetToEvent[0] === $closestWidgetToToolbar[0] ) {
+       if ( !$closestWidgetToEvent.length || $closestWidgetToEvent[ 0 ] === $closestWidgetToToolbar[ 0 ] ) {
                return false;
        }
 };
@@ -6194,7 +6205,7 @@ OO.ui.Toolbar.prototype.setup = function ( groups ) {
 
        // Build out new groups
        for ( i = 0, len = groups.length; i < len; i++ ) {
-               group = groups[i];
+               group = groups[ i ];
                if ( group.include === '*' ) {
                        // Apply defaults to catch-all groups
                        if ( group.type === undefined ) {
@@ -6207,7 +6218,7 @@ OO.ui.Toolbar.prototype.setup = function ( groups ) {
                // Check type has been registered
                type = this.getToolGroupFactory().lookup( group.type ) ? group.type : defaultType;
                items.push(
-                       this.getToolGroupFactory().create( type, this, $.extend( { $: this.$ }, group ) )
+                       this.getToolGroupFactory().create( type, this, group )
                );
        }
        this.addItems( items );
@@ -6222,7 +6233,7 @@ OO.ui.Toolbar.prototype.reset = function () {
        this.groups = [];
        this.tools = {};
        for ( i = 0, len = this.items.length; i < len; i++ ) {
-               this.items[i].destroy();
+               this.items[ i ].destroy();
        }
        this.clearItems();
 };
@@ -6244,7 +6255,7 @@ OO.ui.Toolbar.prototype.destroy = function () {
  * @return {boolean} Tool is available
  */
 OO.ui.Toolbar.prototype.isToolAvailable = function ( name ) {
-       return !this.tools[name];
+       return !this.tools[ name ];
 };
 
 /**
@@ -6253,7 +6264,7 @@ OO.ui.Toolbar.prototype.isToolAvailable = function ( name ) {
  * @param {OO.ui.Tool} tool Tool to reserve
  */
 OO.ui.Toolbar.prototype.reserveTool = function ( tool ) {
-       this.tools[tool.getName()] = tool;
+       this.tools[ tool.getName() ] = tool;
 };
 
 /**
@@ -6262,7 +6273,7 @@ OO.ui.Toolbar.prototype.reserveTool = function ( tool ) {
  * @param {OO.ui.Tool} tool Tool to release
  */
 OO.ui.Toolbar.prototype.releaseTool = function ( tool ) {
-       delete this.tools[tool.getName()];
+       delete this.tools[ tool.getName() ];
 };
 
 /**
@@ -6396,7 +6407,7 @@ OO.ui.ToolGroup.prototype.updateDisabled = function () {
 
        if ( this.constructor.static.autoDisable ) {
                for ( i = this.items.length - 1; i >= 0; i-- ) {
-                       item = this.items[i];
+                       item = this.items[ i ];
                        if ( !item.isDisabled() ) {
                                allDisabled = false;
                                break;
@@ -6493,7 +6504,7 @@ OO.ui.ToolGroup.prototype.onMouseOut = function ( e ) {
  */
 OO.ui.ToolGroup.prototype.getTargetTool = function ( e ) {
        var tool,
-               $item = this.$( e.target ).closest( '.oo-ui-tool-link' );
+               $item = $( e.target ).closest( '.oo-ui-tool-link' );
 
        if ( $item.length ) {
                tool = $item.parent().data( 'oo-ui-tool' );
@@ -6540,31 +6551,31 @@ OO.ui.ToolGroup.prototype.populate = function () {
 
        // Build a list of needed tools
        for ( i = 0, len = list.length; i < len; i++ ) {
-               name = list[i];
+               name = list[ i ];
                if (
                        // Tool exists
                        toolFactory.lookup( name ) &&
                        // Tool is available or is already in this group
-                       ( this.toolbar.isToolAvailable( name ) || this.tools[name] )
+                       ( this.toolbar.isToolAvailable( name ) || this.tools[ name ] )
                ) {
-                       tool = this.tools[name];
+                       tool = this.tools[ name ];
                        if ( !tool ) {
                                // Auto-initialize tools on first use
-                               this.tools[name] = tool = toolFactory.create( name, this );
+                               this.tools[ name ] = tool = toolFactory.create( name, this );
                                tool.updateTitle();
                        }
                        this.toolbar.reserveTool( tool );
                        add.push( tool );
-                       names[name] = true;
+                       names[ name ] = true;
                }
        }
        // Remove tools that are no longer needed
        for ( name in this.tools ) {
-               if ( !names[name] ) {
-                       this.tools[name].destroy();
-                       this.toolbar.releaseTool( this.tools[name] );
-                       remove.push( this.tools[name] );
-                       delete this.tools[name];
+               if ( !names[ name ] ) {
+                       this.tools[ name ].destroy();
+                       this.toolbar.releaseTool( this.tools[ name ] );
+                       remove.push( this.tools[ name ] );
+                       delete this.tools[ name ];
                }
        }
        if ( remove.length ) {
@@ -6591,9 +6602,9 @@ OO.ui.ToolGroup.prototype.destroy = function () {
        this.clearItems();
        this.toolbar.getToolFactory().disconnect( this );
        for ( name in this.tools ) {
-               this.toolbar.releaseTool( this.tools[name] );
-               this.tools[name].disconnect( this ).destroy();
-               delete this.tools[name];
+               this.toolbar.releaseTool( this.tools[ name ] );
+               this.tools[ name ].disconnect( this ).destroy();
+               delete this.tools[ name ];
        }
        this.$element.remove();
 };
@@ -6764,16 +6775,13 @@ OO.ui.MessageDialog.prototype.getBodyHeight = function () {
        var bodyHeight, oldOverflow,
                $scrollable = this.container.$element;
 
-       oldOverflow = $scrollable[0].style.overflow;
-       $scrollable[0].style.overflow = 'hidden';
+       oldOverflow = $scrollable[ 0 ].style.overflow;
+       $scrollable[ 0 ].style.overflow = 'hidden';
 
-       // Force… ugh… something to happen
-       $scrollable.contents().hide();
-       $scrollable.height();
-       $scrollable.contents().show();
+       OO.ui.Element.static.reconsiderScrollbars( $scrollable[ 0 ] );
 
        bodyHeight = this.text.$element.outerHeight( true );
-       $scrollable[0].style.overflow = oldOverflow;
+       $scrollable[ 0 ].style.overflow = oldOverflow;
 
        return bodyHeight;
 };
@@ -6788,15 +6796,12 @@ OO.ui.MessageDialog.prototype.setDimensions = function ( dim ) {
        // Twiddle the overflow property, otherwise an unnecessary scrollbar will be produced.
        // Need to do it after transition completes (250ms), add 50ms just in case.
        setTimeout( function () {
-               var oldOverflow = $scrollable[0].style.overflow;
-               $scrollable[0].style.overflow = 'hidden';
+               var oldOverflow = $scrollable[ 0 ].style.overflow;
+               $scrollable[ 0 ].style.overflow = 'hidden';
 
-               // Force… ugh… something to happen
-               $scrollable.contents().hide();
-               $scrollable.height();
-               $scrollable.contents().show();
+               OO.ui.Element.static.reconsiderScrollbars( $scrollable[ 0 ] );
 
-               $scrollable[0].style.overflow = oldOverflow;
+               $scrollable[ 0 ].style.overflow = oldOverflow;
        }, 300 );
 
        return this;
@@ -6810,15 +6815,15 @@ OO.ui.MessageDialog.prototype.initialize = function () {
        OO.ui.MessageDialog.super.prototype.initialize.call( this );
 
        // Properties
-       this.$actions = this.$( '<div>' );
+       this.$actions = $( '<div>' );
        this.container = new OO.ui.PanelLayout( {
-               $: this.$, scrollable: true, classes: [ 'oo-ui-messageDialog-container' ]
+               scrollable: true, classes: [ 'oo-ui-messageDialog-container' ]
        } );
        this.text = new OO.ui.PanelLayout( {
-               $: this.$, padded: true, expanded: false, classes: [ 'oo-ui-messageDialog-text' ]
+               padded: true, expanded: false, classes: [ 'oo-ui-messageDialog-text' ]
        } );
        this.message = new OO.ui.LabelWidget( {
-               $: this.$, classes: [ 'oo-ui-messageDialog-message' ]
+               classes: [ 'oo-ui-messageDialog-message' ]
        } );
 
        // Initialization
@@ -6848,7 +6853,7 @@ OO.ui.MessageDialog.prototype.attachActions = function () {
        }
        if ( others.length ) {
                for ( i = 0, len = others.length; i < len; i++ ) {
-                       other = others[i];
+                       other = others[ i ];
                        this.$actions.append( other.$element );
                        other.toggleFramed( false );
                }
@@ -6861,7 +6866,7 @@ OO.ui.MessageDialog.prototype.attachActions = function () {
        if ( !this.isOpening() ) {
                // If the dialog is currently opening, this will be called automatically soon.
                // This also calls #fitActions.
-               this.manager.updateWindowSize( this );
+               this.updateSize();
        }
 };
 
@@ -6878,17 +6883,19 @@ OO.ui.MessageDialog.prototype.fitActions = function () {
        // Detect clipping
        this.toggleVerticalActionLayout( false );
        for ( i = 0, len = actions.length; i < len; i++ ) {
-               action = actions[i];
+               action = actions[ i ];
                if ( action.$element.innerWidth() < action.$label.outerWidth( true ) ) {
                        this.toggleVerticalActionLayout( true );
                        break;
                }
        }
 
+       // Move the body out of the way of the foot
+       this.$body.css( 'bottom', this.$foot.outerHeight( true ) );
+
        if ( this.verticalActionLayout !== previous ) {
-               this.$body.css( 'bottom', this.$foot.outerHeight( true ) );
                // We changed the layout, window height might need to be updated.
-               this.manager.updateWindowSize( this );
+               this.updateSize();
        }
 };
 
@@ -6969,18 +6976,17 @@ OO.ui.ProcessDialog.prototype.initialize = function () {
        OO.ui.ProcessDialog.super.prototype.initialize.call( this );
 
        // Properties
-       this.$navigation = this.$( '<div>' );
-       this.$location = this.$( '<div>' );
-       this.$safeActions = this.$( '<div>' );
-       this.$primaryActions = this.$( '<div>' );
-       this.$otherActions = this.$( '<div>' );
+       this.$navigation = $( '<div>' );
+       this.$location = $( '<div>' );
+       this.$safeActions = $( '<div>' );
+       this.$primaryActions = $( '<div>' );
+       this.$otherActions = $( '<div>' );
        this.dismissButton = new OO.ui.ButtonWidget( {
-               $: this.$,
                label: OO.ui.msg( 'ooui-dialog-process-dismiss' )
        } );
-       this.retryButton = new OO.ui.ButtonWidget( { $: this.$ } );
-       this.$errors = this.$( '<div>' );
-       this.$errorsTitle = this.$( '<div>' );
+       this.retryButton = new OO.ui.ButtonWidget();
+       this.$errors = $( '<div>' );
+       this.$errorsTitle = $( '<div>' );
 
        // Events
        this.dismissButton.connect( this, { click: 'onDismissErrorButtonClick' } );
@@ -6998,7 +7004,7 @@ OO.ui.ProcessDialog.prototype.initialize = function () {
                .addClass( 'oo-ui-processDialog-errors-title' )
                .text( OO.ui.msg( 'ooui-dialog-process-error' ) );
        this.$errors
-               .addClass( 'oo-ui-processDialog-errors' )
+               .addClass( 'oo-ui-processDialog-errors oo-ui-element-hidden' )
                .append( this.$errorsTitle, this.dismissButton.$element, this.retryButton.$element );
        this.$content
                .addClass( 'oo-ui-processDialog-content' )
@@ -7027,7 +7033,7 @@ OO.ui.ProcessDialog.prototype.attachActions = function () {
        }
        if ( others.length ) {
                for ( i = 0, len = others.length; i < len; i++ ) {
-                       other = others[i];
+                       other = others[ i ];
                        this.$otherActions.append( other.$element );
                        other.toggleFramed( true );
                }
@@ -7076,18 +7082,18 @@ OO.ui.ProcessDialog.prototype.showErrors = function ( errors ) {
                warning = false;
 
        for ( i = 0, len = errors.length; i < len; i++ ) {
-               if ( !errors[i].isRecoverable() ) {
+               if ( !errors[ i ].isRecoverable() ) {
                        recoverable = false;
                }
-               if ( errors[i].isWarning() ) {
+               if ( errors[ i ].isWarning() ) {
                        warning = true;
                }
-               $item = this.$( '<div>' )
+               $item = $( '<div>' )
                        .addClass( 'oo-ui-processDialog-error' )
-                       .append( errors[i].getMessage() );
-               items.push( $item[0] );
+                       .append( errors[ i ].getMessage() );
+               items.push( $item[ 0 ] );
        }
-       this.$errorItems = this.$( items );
+       this.$errorItems = $( items );
        if ( recoverable ) {
                this.retryButton.clearFlags().setFlags( this.currentAction.getFlags() );
        } else {
@@ -7100,912 +7106,1131 @@ OO.ui.ProcessDialog.prototype.showErrors = function ( errors ) {
        }
        this.retryButton.toggle( recoverable );
        this.$errorsTitle.after( this.$errorItems );
-       this.$errors.show().scrollTop( 0 );
+       this.$errors.removeClass( 'oo-ui-element-hidden' ).scrollTop( 0 );
 };
 
 /**
  * Hide errors.
  */
 OO.ui.ProcessDialog.prototype.hideErrors = function () {
-       this.$errors.hide();
+       this.$errors.addClass( 'oo-ui-element-hidden' );
        this.$errorItems.remove();
        this.$errorItems = null;
 };
 
 /**
- * Layout containing a series of pages.
+ * FieldLayouts are used with OO.ui.FieldsetLayout. Each FieldLayout requires a field-widget,
+ * which is a widget that is specified by reference before any optional configuration settings.
+ *
+ * Field layouts can be configured with help text and/or labels. Labels are aligned in one of four ways:
+ *
+ * - **left**: The label is placed before the field-widget and aligned with the left margin.
+ *             A left-alignment is used for forms with many fields.
+ * - **right**: The label is placed before the field-widget and aligned to the right margin.
+ *              A right-alignment is used for long but familiar forms which users tab through,
+ *              verifying the current field with a quick glance at the label.
+ * - **top**: The label is placed above the field-widget. A top-alignment is used for brief forms
+ *            that users fill out from top to bottom.
+ * - **inline**: The label is placed after the field-widget and aligned to the left.
+                 An inline-alignment is best used with checkboxes or radio buttons.
+ *
+ * Help text is accessed via a help icon that appears in the upper right corner of the rendered field layout.
+ * Please see the [OOjs UI documentation on MediaWiki] [1] for examples and more information.
  *
+ * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Layouts/Fields_and_Fieldsets
  * @class
  * @extends OO.ui.Layout
+ * @mixins OO.ui.LabelElement
  *
  * @constructor
+ * @param {OO.ui.Widget} fieldWidget Field widget
  * @param {Object} [config] Configuration options
- * @cfg {boolean} [continuous=false] Show all pages, one after another
- * @cfg {boolean} [autoFocus=true] Focus on the first focusable element when changing to a page
- * @cfg {boolean} [outlined=false] Show an outline
- * @cfg {boolean} [editable=false] Show controls for adding, removing and reordering pages
+ * @cfg {string} [align='left'] Alignment mode, either 'left', 'right', 'top' or 'inline'
+ * @cfg {string} [help] Explanatory text shown as a '?' icon.
  */
-OO.ui.BookletLayout = function OoUiBookletLayout( config ) {
+OO.ui.FieldLayout = function OoUiFieldLayout( fieldWidget, config ) {
+       var hasInputWidget = fieldWidget instanceof OO.ui.InputWidget;
+
        // Configuration initialization
-       config = config || {};
+       config = $.extend( { align: 'left' }, config );
 
        // Parent constructor
-       OO.ui.BookletLayout.super.call( this, config );
+       OO.ui.FieldLayout.super.call( this, config );
+
+       // Mixin constructors
+       OO.ui.LabelElement.call( this, config );
 
        // Properties
-       this.currentPageName = null;
-       this.pages = {};
-       this.ignoreFocus = false;
-       this.stackLayout = new OO.ui.StackLayout( { $: this.$, continuous: !!config.continuous } );
-       this.autoFocus = config.autoFocus === undefined || !!config.autoFocus;
-       this.outlineVisible = false;
-       this.outlined = !!config.outlined;
-       if ( this.outlined ) {
-               this.editable = !!config.editable;
-               this.outlineControlsWidget = null;
-               this.outlineSelectWidget = new OO.ui.OutlineSelectWidget( { $: this.$ } );
-               this.outlinePanel = new OO.ui.PanelLayout( { $: this.$, scrollable: true } );
-               this.gridLayout = new OO.ui.GridLayout(
-                       [ this.outlinePanel, this.stackLayout ],
-                       { $: this.$, widths: [ 1, 2 ] }
+       this.fieldWidget = fieldWidget;
+       this.$field = $( '<div>' );
+       this.$body = $( '<' + ( hasInputWidget ? 'label' : 'div' ) + '>' );
+       this.align = null;
+       if ( config.help ) {
+               this.popupButtonWidget = new OO.ui.PopupButtonWidget( {
+                       classes: [ 'oo-ui-fieldLayout-help' ],
+                       framed: false,
+                       icon: 'info'
+               } );
+
+               this.popupButtonWidget.getPopup().$body.append(
+                       $( '<div>' )
+                               .text( config.help )
+                               .addClass( 'oo-ui-fieldLayout-help-content' )
                );
-               this.outlineVisible = true;
-               if ( this.editable ) {
-                       this.outlineControlsWidget = new OO.ui.OutlineControlsWidget(
-                               this.outlineSelectWidget, { $: this.$ }
-                       );
-               }
+               this.$help = this.popupButtonWidget.$element;
+       } else {
+               this.$help = $( [] );
        }
 
        // Events
-       this.stackLayout.connect( this, { set: 'onStackLayoutSet' } );
-       if ( this.outlined ) {
-               this.outlineSelectWidget.connect( this, { select: 'onOutlineSelectWidgetSelect' } );
-       }
-       if ( this.autoFocus ) {
-               // Event 'focus' does not bubble, but 'focusin' does
-               this.stackLayout.$element.on( 'focusin', this.onStackLayoutFocus.bind( this ) );
+       if ( hasInputWidget ) {
+               this.$label.on( 'click', this.onLabelClick.bind( this ) );
        }
+       this.fieldWidget.connect( this, { disable: 'onFieldDisable' } );
 
        // Initialization
-       this.$element.addClass( 'oo-ui-bookletLayout' );
-       this.stackLayout.$element.addClass( 'oo-ui-bookletLayout-stackLayout' );
-       if ( this.outlined ) {
-               this.outlinePanel.$element
-                       .addClass( 'oo-ui-bookletLayout-outlinePanel' )
-                       .append( this.outlineSelectWidget.$element );
-               if ( this.editable ) {
-                       this.outlinePanel.$element
-                               .addClass( 'oo-ui-bookletLayout-outlinePanel-editable' )
-                               .append( this.outlineControlsWidget.$element );
-               }
-               this.$element.append( this.gridLayout.$element );
-       } else {
-               this.$element.append( this.stackLayout.$element );
-       }
+       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 );
 };
 
 /* Setup */
 
-OO.inheritClass( OO.ui.BookletLayout, OO.ui.Layout );
+OO.inheritClass( OO.ui.FieldLayout, OO.ui.Layout );
+OO.mixinClass( OO.ui.FieldLayout, OO.ui.LabelElement );
 
-/* Events */
+/* Methods */
 
 /**
- * @event set
- * @param {OO.ui.PageLayout} page Current page
+ * Handle field disable events.
+ *
+ * @param {boolean} value Field is disabled
  */
+OO.ui.FieldLayout.prototype.onFieldDisable = function ( value ) {
+       this.$element.toggleClass( 'oo-ui-fieldLayout-disabled', value );
+};
 
 /**
- * @event add
- * @param {OO.ui.PageLayout[]} page Added pages
- * @param {number} index Index pages were added at
+ * Handle label mouse click events.
+ *
+ * @param {jQuery.Event} e Mouse click event
  */
+OO.ui.FieldLayout.prototype.onLabelClick = function () {
+       this.fieldWidget.simulateLabelClick();
+       return false;
+};
 
 /**
- * @event remove
- * @param {OO.ui.PageLayout[]} pages Removed pages
+ * Get the field.
+ *
+ * @return {OO.ui.Widget} Field widget
  */
-
-/* Methods */
+OO.ui.FieldLayout.prototype.getField = function () {
+       return this.fieldWidget;
+};
 
 /**
- * Handle stack layout focus.
+ * Set the field alignment mode.
  *
- * @param {jQuery.Event} e Focusin event
+ * @private
+ * @param {string} value Alignment mode, either 'left', 'right', 'top' or 'inline'
+ * @chainable
  */
-OO.ui.BookletLayout.prototype.onStackLayoutFocus = function ( e ) {
-       var name, $target;
-
-       // Find the page that an element was focused within
-       $target = $( e.target ).closest( '.oo-ui-pageLayout' );
-       for ( name in this.pages ) {
-               // Check for page match, exclude current page to find only page changes
-               if ( this.pages[name].$element[0] === $target[0] && name !== this.currentPageName ) {
-                       this.setPage( name );
-                       break;
+OO.ui.FieldLayout.prototype.setAlignment = function ( value ) {
+       if ( value !== this.align ) {
+               // Default to 'left'
+               if ( [ 'left', 'right', 'top', 'inline' ].indexOf( value ) === -1 ) {
+                       value = 'left';
                }
+               // Reorder elements
+               if ( value === 'inline' ) {
+                       this.$body.append( this.$field, this.$label );
+               } else {
+                       this.$body.append( this.$label, this.$field );
+               }
+               // Set classes. The following classes can be used here:
+               // * oo-ui-fieldLayout-align-left
+               // * oo-ui-fieldLayout-align-right
+               // * oo-ui-fieldLayout-align-top
+               // * oo-ui-fieldLayout-align-inline
+               if ( this.align ) {
+                       this.$element.removeClass( 'oo-ui-fieldLayout-align-' + this.align );
+               }
+               this.$element.addClass( 'oo-ui-fieldLayout-align-' + value );
+               this.align = value;
        }
+
+       return this;
 };
 
 /**
- * Handle stack layout set events.
+ * Layout made of a field, a button, and an optional label.
  *
- * @param {OO.ui.PanelLayout|null} page The page panel that is now the current panel
+ * @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.BookletLayout.prototype.onStackLayoutSet = function ( page ) {
-       var layout = this;
-       if ( page ) {
-               page.scrollElementIntoView( { complete: function () {
-                       if ( layout.autoFocus ) {
-                               layout.focus();
-                       }
-               } } );
-       }
+OO.ui.ActionFieldLayout = function OoUiActionFieldLayout( fieldWidget, buttonWidget, config ) {
+       // Configuration initialization
+       config = $.extend( { align: 'left' }, config );
+
+       // Parent constructor
+       OO.ui.ActionFieldLayout.super.call( this, fieldWidget, config );
+
+       // Mixin constructors
+       OO.ui.LabelElement.call( this, config );
+
+       // Properties
+       this.fieldWidget = fieldWidget;
+       this.buttonWidget = buttonWidget;
+       this.$button = $( '<div>' )
+               .addClass( 'oo-ui-actionFieldLayout-button' )
+               .append( this.buttonWidget.$element );
+       this.$input = $( '<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 );
+
 /**
- * Focus the first input in the current page.
+ * Layout made of a fieldset and optional legend.
  *
- * If no page is selected, the first selectable page will be selected.
- * If the focus is already in an element on the current page, nothing will happen.
+ * Just add OO.ui.FieldLayout items.
+ *
+ * @class
+ * @extends OO.ui.Layout
+ * @mixins OO.ui.IconElement
+ * @mixins OO.ui.LabelElement
+ * @mixins OO.ui.GroupElement
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ * @cfg {OO.ui.FieldLayout[]} [items] Items to add
  */
-OO.ui.BookletLayout.prototype.focus = function () {
-       var $input, page = this.stackLayout.getCurrentItem();
-       if ( !page && this.outlined ) {
-               this.selectFirstSelectablePage();
-               page = this.stackLayout.getCurrentItem();
-               if ( !page ) {
-                       return;
-               }
+OO.ui.FieldsetLayout = function OoUiFieldsetLayout( config ) {
+       // Configuration initialization
+       config = config || {};
+
+       // Parent constructor
+       OO.ui.FieldsetLayout.super.call( this, config );
+
+       // Mixin constructors
+       OO.ui.IconElement.call( this, config );
+       OO.ui.LabelElement.call( this, config );
+       OO.ui.GroupElement.call( this, config );
+
+       if ( config.help ) {
+               this.popupButtonWidget = new OO.ui.PopupButtonWidget( {
+                       classes: [ 'oo-ui-fieldsetLayout-help' ],
+                       framed: false,
+                       icon: 'info'
+               } );
+
+               this.popupButtonWidget.getPopup().$body.append(
+                       $( '<div>' )
+                               .text( config.help )
+                               .addClass( 'oo-ui-fieldsetLayout-help-content' )
+               );
+               this.$help = this.popupButtonWidget.$element;
+       } else {
+               this.$help = $( [] );
        }
-       // Only change the focus if is not already in the current page
-       if ( !page.$element.find( ':focus' ).length ) {
-               $input = page.$element.find( ':input:first' );
-               if ( $input.length ) {
-                       $input[0].focus();
-               }
+
+       // Initialization
+       this.$element
+               .addClass( 'oo-ui-fieldsetLayout' )
+               .prepend( this.$help, this.$icon, this.$label, this.$group );
+       if ( Array.isArray( config.items ) ) {
+               this.addItems( config.items );
        }
 };
 
+/* Setup */
+
+OO.inheritClass( OO.ui.FieldsetLayout, OO.ui.Layout );
+OO.mixinClass( OO.ui.FieldsetLayout, OO.ui.IconElement );
+OO.mixinClass( OO.ui.FieldsetLayout, OO.ui.LabelElement );
+OO.mixinClass( OO.ui.FieldsetLayout, OO.ui.GroupElement );
+
 /**
- * Handle outline widget select events.
+ * Layout with an HTML form.
  *
- * @param {OO.ui.OptionWidget|null} item Selected item
+ * @class
+ * @extends OO.ui.Layout
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ * @cfg {string} [method] HTML form `method` attribute
+ * @cfg {string} [action] HTML form `action` attribute
+ * @cfg {string} [enctype] HTML form `enctype` attribute
  */
-OO.ui.BookletLayout.prototype.onOutlineSelectWidgetSelect = function ( item ) {
-       if ( item ) {
-               this.setPage( item.getData() );
-       }
+OO.ui.FormLayout = function OoUiFormLayout( config ) {
+       // Configuration initialization
+       config = config || {};
+
+       // Parent constructor
+       OO.ui.FormLayout.super.call( this, config );
+
+       // Events
+       this.$element.on( 'submit', this.onFormSubmit.bind( this ) );
+
+       // Initialization
+       this.$element
+               .addClass( 'oo-ui-formLayout' )
+               .attr( {
+                       method: config.method,
+                       action: config.action,
+                       enctype: config.enctype
+               } );
 };
 
+/* Setup */
+
+OO.inheritClass( OO.ui.FormLayout, OO.ui.Layout );
+
+/* Events */
+
 /**
- * Check if booklet has an outline.
- *
- * @return {boolean}
+ * @event submit
  */
-OO.ui.BookletLayout.prototype.isOutlined = function () {
-       return this.outlined;
-};
+
+/* Static Properties */
+
+OO.ui.FormLayout.static.tagName = 'form';
+
+/* Methods */
 
 /**
- * Check if booklet has editing controls.
+ * Handle form submit events.
  *
- * @return {boolean}
+ * @param {jQuery.Event} e Submit event
+ * @fires submit
  */
-OO.ui.BookletLayout.prototype.isEditable = function () {
-       return this.editable;
+OO.ui.FormLayout.prototype.onFormSubmit = function () {
+       this.emit( 'submit' );
+       return false;
 };
 
 /**
- * Check if booklet has a visible outline.
+ * Layout made of proportionally sized columns and rows.
  *
- * @return {boolean}
+ * @class
+ * @extends OO.ui.Layout
+ * @deprecated Use OO.ui.MenuLayout or plain CSS instead.
+ *
+ * @constructor
+ * @param {OO.ui.PanelLayout[]} panels Panels in the grid
+ * @param {Object} [config] Configuration options
+ * @cfg {number[]} [widths] Widths of columns as ratios
+ * @cfg {number[]} [heights] Heights of rows as ratios
  */
-OO.ui.BookletLayout.prototype.isOutlineVisible = function () {
-       return this.outlined && this.outlineVisible;
+OO.ui.GridLayout = function OoUiGridLayout( panels, config ) {
+       var i, len, widths;
+
+       // Configuration initialization
+       config = config || {};
+
+       // Parent constructor
+       OO.ui.GridLayout.super.call( this, config );
+
+       // Properties
+       this.panels = [];
+       this.widths = [];
+       this.heights = [];
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-gridLayout' );
+       for ( i = 0, len = panels.length; i < len; i++ ) {
+               this.panels.push( panels[ i ] );
+               this.$element.append( panels[ i ].$element );
+       }
+       if ( config.widths || config.heights ) {
+               this.layout( config.widths || [ 1 ], config.heights || [ 1 ] );
+       } else {
+               // Arrange in columns by default
+               widths = this.panels.map( function () { return 1; } );
+               this.layout( widths, [ 1 ] );
+       }
 };
 
+/* Setup */
+
+OO.inheritClass( OO.ui.GridLayout, OO.ui.Layout );
+
+/* Events */
+
 /**
- * Hide or show the outline.
+ * @event layout
+ */
+
+/**
+ * @event update
+ */
+
+/* Methods */
+
+/**
+ * Set grid dimensions.
  *
- * @param {boolean} [show] Show outline, omit to invert current state
- * @chainable
+ * @param {number[]} widths Widths of columns as ratios
+ * @param {number[]} heights Heights of rows as ratios
+ * @fires layout
+ * @throws {Error} If grid is not large enough to fit all panels
  */
-OO.ui.BookletLayout.prototype.toggleOutline = function ( show ) {
-       if ( this.outlined ) {
-               show = show === undefined ? !this.outlineVisible : !!show;
-               this.outlineVisible = show;
-               this.gridLayout.layout( show ? [ 1, 2 ] : [ 0, 1 ], [ 1 ] );
+OO.ui.GridLayout.prototype.layout = function ( widths, heights ) {
+       var x, y,
+               xd = 0,
+               yd = 0,
+               cols = widths.length,
+               rows = heights.length;
+
+       // Verify grid is big enough to fit panels
+       if ( cols * rows < this.panels.length ) {
+               throw new Error( 'Grid is not large enough to fit ' + this.panels.length + 'panels' );
        }
 
-       return this;
+       // Sum up denominators
+       for ( x = 0; x < cols; x++ ) {
+               xd += widths[ x ];
+       }
+       for ( y = 0; y < rows; y++ ) {
+               yd += heights[ y ];
+       }
+       // Store factors
+       this.widths = [];
+       this.heights = [];
+       for ( x = 0; x < cols; x++ ) {
+               this.widths[ x ] = widths[ x ] / xd;
+       }
+       for ( y = 0; y < rows; y++ ) {
+               this.heights[ y ] = heights[ y ] / yd;
+       }
+       // Synchronize view
+       this.update();
+       this.emit( 'layout' );
 };
 
 /**
- * Get the outline widget.
+ * Update panel positions and sizes.
  *
- * @param {OO.ui.PageLayout} page Page to be selected
- * @return {OO.ui.PageLayout|null} Closest page to another
+ * @fires update
  */
-OO.ui.BookletLayout.prototype.getClosestPage = function ( page ) {
-       var next, prev, level,
-               pages = this.stackLayout.getItems(),
-               index = $.inArray( page, pages );
+OO.ui.GridLayout.prototype.update = function () {
+       var x, y, panel, width, height, dimensions,
+               i = 0,
+               top = 0,
+               left = 0,
+               cols = this.widths.length,
+               rows = this.heights.length;
 
-       if ( index !== -1 ) {
-               next = pages[index + 1];
-               prev = pages[index - 1];
-               // Prefer adjacent pages at the same level
-               if ( this.outlined ) {
-                       level = this.outlineSelectWidget.getItemFromData( page.getName() ).getLevel();
-                       if (
-                               prev &&
-                               level === this.outlineSelectWidget.getItemFromData( prev.getName() ).getLevel()
-                       ) {
-                               return prev;
+       for ( y = 0; y < rows; y++ ) {
+               height = this.heights[ y ];
+               for ( x = 0; x < cols; x++ ) {
+                       width = this.widths[ x ];
+                       panel = this.panels[ i ];
+                       dimensions = {
+                               width: ( width * 100 ) + '%',
+                               height: ( height * 100 ) + '%',
+                               top: ( top * 100 ) + '%'
+                       };
+                       // If RTL, reverse:
+                       if ( OO.ui.Element.static.getDir( document ) === 'rtl' ) {
+                               dimensions.right = ( left * 100 ) + '%';
+                       } else {
+                               dimensions.left = ( left * 100 ) + '%';
                        }
-                       if (
-                               next &&
-                               level === this.outlineSelectWidget.getItemFromData( next.getName() ).getLevel()
-                       ) {
-                               return next;
+                       // HACK: Work around IE bug by setting visibility: hidden; if width or height is zero
+                       if ( width === 0 || height === 0 ) {
+                               dimensions.visibility = 'hidden';
+                       } else {
+                               dimensions.visibility = '';
                        }
+                       panel.$element.css( dimensions );
+                       i++;
+                       left += width;
                }
+               top += height;
+               left = 0;
        }
-       return prev || next || null;
-};
 
-/**
- * Get the outline widget.
- *
- * @return {OO.ui.OutlineSelectWidget|null} Outline widget, or null if booklet has no outline
- */
-OO.ui.BookletLayout.prototype.getOutline = function () {
-       return this.outlineSelectWidget;
+       this.emit( 'update' );
 };
 
 /**
- * Get the outline controls widget. If the outline is not editable, null is returned.
+ * Get a panel at a given position.
  *
- * @return {OO.ui.OutlineControlsWidget|null} The outline controls widget.
- */
-OO.ui.BookletLayout.prototype.getOutlineControls = function () {
-       return this.outlineControlsWidget;
-};
-
-/**
- * Get a page by name.
+ * The x and y position is affected by the current grid layout.
  *
- * @param {string} name Symbolic name of page
- * @return {OO.ui.PageLayout|undefined} Page, if found
+ * @param {number} x Horizontal position
+ * @param {number} y Vertical position
+ * @return {OO.ui.PanelLayout} The panel at the given position
  */
-OO.ui.BookletLayout.prototype.getPage = function ( name ) {
-       return this.pages[name];
+OO.ui.GridLayout.prototype.getPanel = function ( x, y ) {
+       return this.panels[ ( x * this.widths.length ) + y ];
 };
 
 /**
- * Get the current page name.
+ * Layout with a content and menu area.
  *
- * @return {string|null} Current page name
- */
-OO.ui.BookletLayout.prototype.getCurrentPageName = function () {
-       return this.currentPageName;
-};
-
-/**
- * Add a page to the layout.
+ * The menu area can be positioned at the top, after, bottom or before. The content area will fill
+ * all remaining space.
  *
- * When pages are added with the same names as existing pages, the existing pages will be
- * automatically removed before the new pages are added.
+ * @class
+ * @extends OO.ui.Layout
  *
- * @param {OO.ui.PageLayout[]} pages Pages to add
- * @param {number} index Index to insert pages after
- * @fires add
- * @chainable
+ * @constructor
+ * @param {Object} [config] Configuration options
+ * @cfg {number|string} [menuSize='18em'] Size of menu in pixels or any CSS unit
+ * @cfg {boolean} [showMenu=true] Show menu
+ * @cfg {string} [position='before'] Position of menu, either `top`, `after`, `bottom` or `before`
+ * @cfg {boolean} [collapse] Collapse the menu out of view
  */
-OO.ui.BookletLayout.prototype.addPages = function ( pages, index ) {
-       var i, len, name, page, item, currentIndex,
-               stackLayoutPages = this.stackLayout.getItems(),
-               remove = [],
-               items = [];
+OO.ui.MenuLayout = function OoUiMenuLayout( config ) {
+       var positions = this.constructor.static.menuPositions;
+
+       // Configuration initialization
+       config = config || {};
+
+       // Parent constructor
+       OO.ui.MenuLayout.super.call( this, config );
 
-       // Remove pages with same names
-       for ( i = 0, len = pages.length; i < len; i++ ) {
-               page = pages[i];
-               name = page.getName();
+       // Properties
+       this.showMenu = config.showMenu !== false;
+       this.menuSize = config.menuSize || '18em';
+       this.menuPosition = positions[ config.menuPosition ] || positions.before;
 
-               if ( Object.prototype.hasOwnProperty.call( this.pages, name ) ) {
-                       // Correct the insertion index
-                       currentIndex = $.inArray( this.pages[name], stackLayoutPages );
-                       if ( currentIndex !== -1 && currentIndex + 1 < index ) {
-                               index--;
-                       }
-                       remove.push( this.pages[name] );
-               }
-       }
-       if ( remove.length ) {
-               this.removePages( remove );
-       }
+       /**
+        * Menu DOM node
+        *
+        * @property {jQuery}
+        */
+       this.$menu = $( '<div>' );
+       /**
+        * Content DOM node
+        *
+        * @property {jQuery}
+        */
+       this.$content = $( '<div>' );
 
-       // Add new pages
-       for ( i = 0, len = pages.length; i < len; i++ ) {
-               page = pages[i];
-               name = page.getName();
-               this.pages[page.getName()] = page;
-               if ( this.outlined ) {
-                       item = new OO.ui.OutlineOptionWidget( { $: this.$, data: name } );
-                       page.setOutlineItem( item );
-                       items.push( item );
-               }
-       }
+       // Initialization
+       this.toggleMenu( this.showMenu );
+       this.updateSizes();
+       this.$menu
+               .addClass( 'oo-ui-menuLayout-menu' )
+               .css( this.menuPosition.sizeProperty, this.menuSize );
+       this.$content.addClass( 'oo-ui-menuLayout-content' );
+       this.$element
+               .addClass( 'oo-ui-menuLayout ' + this.menuPosition.className )
+               .append( this.$content, this.$menu );
+};
 
-       if ( this.outlined && items.length ) {
-               this.outlineSelectWidget.addItems( items, index );
-               this.selectFirstSelectablePage();
-       }
-       this.stackLayout.addItems( pages, index );
-       this.emit( 'add', pages, index );
+/* Setup */
 
-       return this;
+OO.inheritClass( OO.ui.MenuLayout, OO.ui.Layout );
+
+/* Static Properties */
+
+OO.ui.MenuLayout.static.menuPositions = {
+       top: {
+               sizeProperty: 'height',
+               className: 'oo-ui-menuLayout-top'
+       },
+       after: {
+               sizeProperty: 'width',
+               className: 'oo-ui-menuLayout-after'
+       },
+       bottom: {
+               sizeProperty: 'height',
+               className: 'oo-ui-menuLayout-bottom'
+       },
+       before: {
+               sizeProperty: 'width',
+               className: 'oo-ui-menuLayout-before'
+       }
 };
 
+/* Methods */
+
 /**
- * Remove a page from the layout.
+ * Toggle menu.
  *
- * @fires remove
+ * @param {boolean} showMenu Show menu, omit to toggle
  * @chainable
  */
-OO.ui.BookletLayout.prototype.removePages = function ( pages ) {
-       var i, len, name, page,
-               items = [];
+OO.ui.MenuLayout.prototype.toggleMenu = function ( showMenu ) {
+       showMenu = showMenu === undefined ? !this.showMenu : !!showMenu;
 
-       for ( i = 0, len = pages.length; i < len; i++ ) {
-               page = pages[i];
-               name = page.getName();
-               delete this.pages[name];
-               if ( this.outlined ) {
-                       items.push( this.outlineSelectWidget.getItemFromData( name ) );
-                       page.setOutlineItem( null );
-               }
-       }
-       if ( this.outlined && items.length ) {
-               this.outlineSelectWidget.removeItems( items );
-               this.selectFirstSelectablePage();
+       if ( this.showMenu !== showMenu ) {
+               this.showMenu = showMenu;
+               this.updateSizes();
        }
-       this.stackLayout.removeItems( pages );
-       this.emit( 'remove', pages );
 
        return this;
 };
 
 /**
- * Clear all pages from the layout.
+ * Check if menu is visible
  *
- * @fires remove
- * @chainable
+ * @return {boolean} Menu is visible
  */
-OO.ui.BookletLayout.prototype.clearPages = function () {
-       var i, len,
-               pages = this.stackLayout.getItems();
-
-       this.pages = {};
-       this.currentPageName = null;
-       if ( this.outlined ) {
-               this.outlineSelectWidget.clearItems();
-               for ( i = 0, len = pages.length; i < len; i++ ) {
-                       pages[i].setOutlineItem( null );
-               }
-       }
-       this.stackLayout.clearItems();
+OO.ui.MenuLayout.prototype.isMenuVisible = function () {
+       return this.showMenu;
+};
 
-       this.emit( 'remove', pages );
+/**
+ * Set menu size.
+ *
+ * @param {number|string} size Size of menu in pixels or any CSS unit
+ * @chainable
+ */
+OO.ui.MenuLayout.prototype.setMenuSize = function ( size ) {
+       this.menuSize = size;
+       this.updateSizes();
 
        return this;
 };
 
 /**
- * Set the current page by name.
+ * Update menu and content CSS based on current menu size and visibility
  *
- * @fires set
- * @param {string} name Symbolic name of page
+ * This method is called internally when size or position is changed.
  */
-OO.ui.BookletLayout.prototype.setPage = function ( name ) {
-       var selectedItem,
-               $focused,
-               page = this.pages[name];
-
-       if ( name !== this.currentPageName ) {
-               if ( this.outlined ) {
-                       selectedItem = this.outlineSelectWidget.getSelectedItem();
-                       if ( selectedItem && selectedItem.getData() !== name ) {
-                               this.outlineSelectWidget.selectItem( this.outlineSelectWidget.getItemFromData( name ) );
-                       }
-               }
-               if ( page ) {
-                       if ( this.currentPageName && this.pages[this.currentPageName] ) {
-                               this.pages[this.currentPageName].setActive( false );
-                               // Blur anything focused if the next page doesn't have anything focusable - this
-                               // is not needed if the next page has something focusable because once it is focused
-                               // this blur happens automatically
-                               if ( this.autoFocus && !page.$element.find( ':input' ).length ) {
-                                       $focused = this.pages[this.currentPageName].$element.find( ':focus' );
-                                       if ( $focused.length ) {
-                                               $focused[0].blur();
-                                       }
-                               }
-                       }
-                       this.currentPageName = name;
-                       this.stackLayout.setItem( page );
-                       page.setActive( true );
-                       this.emit( 'set', page );
-               }
+OO.ui.MenuLayout.prototype.updateSizes = function () {
+       if ( this.showMenu ) {
+               this.$menu
+                       .css( this.menuPosition.sizeProperty, this.menuSize )
+                       .css( 'overflow', '' );
+               // Set offsets on all sides. CSS resets all but one with
+               // 'important' rules so directionality flips are supported
+               this.$content.css( {
+                       top: this.menuSize,
+                       right: this.menuSize,
+                       bottom: this.menuSize,
+                       left: this.menuSize
+               } );
+       } else {
+               this.$menu
+                       .css( this.menuPosition.sizeProperty, 0 )
+                       .css( 'overflow', 'hidden' );
+               this.$content.css( {
+                       top: 0,
+                       right: 0,
+                       bottom: 0,
+                       left: 0
+               } );
        }
 };
 
 /**
- * Select the first selectable page.
+ * Get menu size.
+ *
+ * @return {number|string} Menu size
+ */
+OO.ui.MenuLayout.prototype.getMenuSize = function () {
+       return this.menuSize;
+};
+
+/**
+ * Set menu position.
  *
+ * @param {string} position Position of menu, either `top`, `after`, `bottom` or `before`
+ * @throws {Error} If position value is not supported
  * @chainable
  */
-OO.ui.BookletLayout.prototype.selectFirstSelectablePage = function () {
-       if ( !this.outlineSelectWidget.getSelectedItem() ) {
-               this.outlineSelectWidget.selectItem( this.outlineSelectWidget.getFirstSelectableItem() );
+OO.ui.MenuLayout.prototype.setMenuPosition = function ( position ) {
+       var positions = this.constructor.static.menuPositions;
+
+       if ( !positions[ position ] ) {
+               throw new Error( 'Cannot set position; unsupported position value: ' + position );
        }
 
+       this.$menu.css( this.menuPosition.sizeProperty, '' );
+       this.$element.removeClass( this.menuPosition.className );
+
+       this.menuPosition = positions[ position ];
+
+       this.updateSizes();
+       this.$element.addClass( this.menuPosition.className );
+
        return this;
 };
 
 /**
- * Layout made of a field and optional label.
+ * Get menu position.
  *
- * Available label alignment modes include:
- *  - left: Label is before the field and aligned away from it, best for when the user will be
- *    scanning for a specific label in a form with many fields
- *  - right: Label is before the field and aligned toward it, best for forms the user is very
- *    familiar with and will tab through field checking quickly to verify which field they are in
- *  - top: Label is before the field and above it, best for when the user will need to fill out all
- *    fields from top to bottom in a form with few fields
- *  - inline: Label is after the field and aligned toward it, best for small boolean fields like
- *    checkboxes or radio buttons
+ * @return {string} Menu position
+ */
+OO.ui.MenuLayout.prototype.getMenuPosition = function () {
+       return this.menuPosition;
+};
+
+/**
+ * Layout containing a series of pages.
  *
  * @class
- * @extends OO.ui.Layout
- * @mixins OO.ui.LabelElement
+ * @extends OO.ui.MenuLayout
  *
  * @constructor
- * @param {OO.ui.Widget} fieldWidget Field 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.
+ * @cfg {boolean} [continuous=false] Show all pages, one after another
+ * @cfg {boolean} [autoFocus=true] Focus on the first focusable element when changing to a page
+ * @cfg {boolean} [outlined=false] Show an outline
+ * @cfg {boolean} [editable=false] Show controls for adding, removing and reordering pages
  */
-OO.ui.FieldLayout = function OoUiFieldLayout( fieldWidget, config ) {
-       var hasInputWidget = fieldWidget instanceof OO.ui.InputWidget;
-
+OO.ui.BookletLayout = function OoUiBookletLayout( config ) {
        // Configuration initialization
-       config = $.extend( { align: 'left' }, config );
-
-       // Properties (must be set before parent constructor, which calls #getTagName)
-       this.fieldWidget = fieldWidget;
+       config = config || {};
 
        // Parent constructor
-       OO.ui.FieldLayout.super.call( this, config );
-
-       // Mixin constructors
-       OO.ui.LabelElement.call( this, config );
+       OO.ui.BookletLayout.super.call( this, config );
 
        // Properties
-       this.$field = this.$( '<div>' );
-       this.$body = this.$( '<' + ( hasInputWidget ? 'label' : 'div' ) + '>' );
-       this.align = null;
-       if ( config.help ) {
-               this.popupButtonWidget = new OO.ui.PopupButtonWidget( {
-                       $: this.$,
-                       classes: [ 'oo-ui-fieldLayout-help' ],
-                       framed: false,
-                       icon: 'info'
-               } );
-
-               this.popupButtonWidget.getPopup().$body.append(
-                       this.$( '<div>' )
-                               .text( config.help )
-                               .addClass( 'oo-ui-fieldLayout-help-content' )
-               );
-               this.$help = this.popupButtonWidget.$element;
-       } else {
-               this.$help = this.$( [] );
+       this.currentPageName = null;
+       this.pages = {};
+       this.ignoreFocus = false;
+       this.stackLayout = new OO.ui.StackLayout( { continuous: !!config.continuous } );
+       this.$content.append( this.stackLayout.$element );
+       this.autoFocus = config.autoFocus === undefined || !!config.autoFocus;
+       this.outlineVisible = false;
+       this.outlined = !!config.outlined;
+       if ( this.outlined ) {
+               this.editable = !!config.editable;
+               this.outlineControlsWidget = null;
+               this.outlineSelectWidget = new OO.ui.OutlineSelectWidget();
+               this.outlinePanel = new OO.ui.PanelLayout( { scrollable: true } );
+               this.$menu.append( this.outlinePanel.$element );
+               this.outlineVisible = true;
+               if ( this.editable ) {
+                       this.outlineControlsWidget = new OO.ui.OutlineControlsWidget(
+                               this.outlineSelectWidget
+                       );
+               }
        }
+       this.toggleMenu( this.outlined );
 
        // Events
-       if ( hasInputWidget ) {
-               this.$label.on( 'click', this.onLabelClick.bind( this ) );
+       this.stackLayout.connect( this, { set: 'onStackLayoutSet' } );
+       if ( this.outlined ) {
+               this.outlineSelectWidget.connect( this, { select: 'onOutlineSelectWidgetSelect' } );
+       }
+       if ( this.autoFocus ) {
+               // Event 'focus' does not bubble, but 'focusin' does
+               this.stackLayout.$element.on( 'focusin', this.onStackLayoutFocus.bind( this ) );
        }
-       this.fieldWidget.connect( this, { disable: 'onFieldDisable' } );
 
        // Initialization
-       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.$element.addClass( 'oo-ui-bookletLayout' );
+       this.stackLayout.$element.addClass( 'oo-ui-bookletLayout-stackLayout' );
+       if ( this.outlined ) {
+               this.outlinePanel.$element
+                       .addClass( 'oo-ui-bookletLayout-outlinePanel' )
+                       .append( this.outlineSelectWidget.$element );
+               if ( this.editable ) {
+                       this.outlinePanel.$element
+                               .addClass( 'oo-ui-bookletLayout-outlinePanel-editable' )
+                               .append( this.outlineControlsWidget.$element );
+               }
+       }
+};
 
-       this.setAlignment( config.align );
+/* Setup */
+
+OO.inheritClass( OO.ui.BookletLayout, OO.ui.MenuLayout );
+
+/* Events */
+
+/**
+ * @event set
+ * @param {OO.ui.PageLayout} page Current page
+ */
+
+/**
+ * @event add
+ * @param {OO.ui.PageLayout[]} page Added pages
+ * @param {number} index Index pages were added at
+ */
+
+/**
+ * @event remove
+ * @param {OO.ui.PageLayout[]} pages Removed pages
+ */
+
+/* Methods */
+
+/**
+ * Handle stack layout focus.
+ *
+ * @param {jQuery.Event} e Focusin event
+ */
+OO.ui.BookletLayout.prototype.onStackLayoutFocus = function ( e ) {
+       var name, $target;
+
+       // Find the page that an element was focused within
+       $target = $( e.target ).closest( '.oo-ui-pageLayout' );
+       for ( name in this.pages ) {
+               // Check for page match, exclude current page to find only page changes
+               if ( this.pages[ name ].$element[ 0 ] === $target[ 0 ] && name !== this.currentPageName ) {
+                       this.setPage( name );
+                       break;
+               }
+       }
 };
 
-/* Setup */
+/**
+ * Handle stack layout set events.
+ *
+ * @param {OO.ui.PanelLayout|null} page The page panel that is now the current panel
+ */
+OO.ui.BookletLayout.prototype.onStackLayoutSet = function ( page ) {
+       var layout = this;
+       if ( page ) {
+               page.scrollElementIntoView( { complete: function () {
+                       if ( layout.autoFocus ) {
+                               layout.focus();
+                       }
+               } } );
+       }
+};
 
-OO.inheritClass( OO.ui.FieldLayout, OO.ui.Layout );
-OO.mixinClass( OO.ui.FieldLayout, OO.ui.LabelElement );
+/**
+ * Focus the first input in the current page.
+ *
+ * If no page is selected, the first selectable page will be selected.
+ * If the focus is already in an element on the current page, nothing will happen.
+ */
+OO.ui.BookletLayout.prototype.focus = function () {
+       var $input, page = this.stackLayout.getCurrentItem();
+       if ( !page && this.outlined ) {
+               this.selectFirstSelectablePage();
+               page = this.stackLayout.getCurrentItem();
+       }
+       if ( !page ) {
+               return;
+       }
+       // Only change the focus if is not already in the current page
+       if ( !page.$element.find( ':focus' ).length ) {
+               $input = page.$element.find( ':input:first' );
+               if ( $input.length ) {
+                       $input[ 0 ].focus();
+               }
+       }
+};
 
-/* Methods */
+/**
+ * Handle outline widget select events.
+ *
+ * @param {OO.ui.OptionWidget|null} item Selected item
+ */
+OO.ui.BookletLayout.prototype.onOutlineSelectWidgetSelect = function ( item ) {
+       if ( item ) {
+               this.setPage( item.getData() );
+       }
+};
 
 /**
- * Handle field disable events.
+ * Check if booklet has an outline.
  *
- * @param {boolean} value Field is disabled
+ * @return {boolean}
  */
-OO.ui.FieldLayout.prototype.onFieldDisable = function ( value ) {
-       this.$element.toggleClass( 'oo-ui-fieldLayout-disabled', value );
+OO.ui.BookletLayout.prototype.isOutlined = function () {
+       return this.outlined;
 };
 
 /**
- * Handle label mouse click events.
+ * Check if booklet has editing controls.
  *
- * @param {jQuery.Event} e Mouse click event
+ * @return {boolean}
  */
-OO.ui.FieldLayout.prototype.onLabelClick = function () {
-       this.fieldWidget.simulateLabelClick();
-       return false;
+OO.ui.BookletLayout.prototype.isEditable = function () {
+       return this.editable;
 };
 
 /**
- * Get the field.
+ * Check if booklet has a visible outline.
  *
- * @return {OO.ui.Widget} Field widget
+ * @return {boolean}
  */
-OO.ui.FieldLayout.prototype.getField = function () {
-       return this.fieldWidget;
+OO.ui.BookletLayout.prototype.isOutlineVisible = function () {
+       return this.outlined && this.outlineVisible;
 };
 
 /**
- * Set the field alignment mode.
+ * Hide or show the outline.
  *
- * @private
- * @param {string} value Alignment mode, either 'left', 'right', 'top' or 'inline'
+ * @param {boolean} [show] Show outline, omit to invert current state
  * @chainable
  */
-OO.ui.FieldLayout.prototype.setAlignment = function ( value ) {
-       if ( value !== this.align ) {
-               // Default to 'left'
-               if ( [ 'left', 'right', 'top', 'inline' ].indexOf( value ) === -1 ) {
-                       value = 'left';
-               }
-               // Reorder elements
-               if ( value === 'inline' ) {
-                       this.$body.append( this.$field, this.$label );
-               } else {
-                       this.$body.append( this.$label, this.$field );
-               }
-               // Set classes. The following classes can be used here:
-               // * oo-ui-fieldLayout-align-left
-               // * oo-ui-fieldLayout-align-right
-               // * oo-ui-fieldLayout-align-top
-               // * oo-ui-fieldLayout-align-inline
-               if ( this.align ) {
-                       this.$element.removeClass( 'oo-ui-fieldLayout-align-' + this.align );
-               }
-               this.$element.addClass( 'oo-ui-fieldLayout-align-' + value );
-               this.align = value;
+OO.ui.BookletLayout.prototype.toggleOutline = function ( show ) {
+       if ( this.outlined ) {
+               show = show === undefined ? !this.outlineVisible : !!show;
+               this.outlineVisible = show;
+               this.toggleMenu( show );
        }
 
        return this;
 };
 
 /**
- * Layout made of a field, a button, and an optional label.
- *
- * @class
- * @extends OO.ui.FieldLayout
+ * Get the outline widget.
  *
- * @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.
+ * @param {OO.ui.PageLayout} page Page to be selected
+ * @return {OO.ui.PageLayout|null} Closest page to another
  */
-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 );
+OO.ui.BookletLayout.prototype.getClosestPage = function ( page ) {
+       var next, prev, level,
+               pages = this.stackLayout.getItems(),
+               index = $.inArray( page, pages );
 
-       this.$field
-               .addClass( 'oo-ui-actionFieldLayout' )
-               .append( this.$input, this.$button );
+       if ( index !== -1 ) {
+               next = pages[ index + 1 ];
+               prev = pages[ index - 1 ];
+               // Prefer adjacent pages at the same level
+               if ( this.outlined ) {
+                       level = this.outlineSelectWidget.getItemFromData( page.getName() ).getLevel();
+                       if (
+                               prev &&
+                               level === this.outlineSelectWidget.getItemFromData( prev.getName() ).getLevel()
+                       ) {
+                               return prev;
+                       }
+                       if (
+                               next &&
+                               level === this.outlineSelectWidget.getItemFromData( next.getName() ).getLevel()
+                       ) {
+                               return next;
+                       }
+               }
+       }
+       return prev || next || null;
 };
 
-/* Setup */
-
-OO.inheritClass( OO.ui.ActionFieldLayout, OO.ui.FieldLayout );
-
 /**
- * Layout made of a fieldset and optional legend.
- *
- * Just add OO.ui.FieldLayout items.
- *
- * @class
- * @extends OO.ui.Layout
- * @mixins OO.ui.IconElement
- * @mixins OO.ui.LabelElement
- * @mixins OO.ui.GroupElement
+ * Get the outline widget.
  *
- * @constructor
- * @param {Object} [config] Configuration options
- * @cfg {OO.ui.FieldLayout[]} [items] Items to add
+ * @return {OO.ui.OutlineSelectWidget|null} Outline widget, or null if booklet has no outline
  */
-OO.ui.FieldsetLayout = function OoUiFieldsetLayout( config ) {
-       // Configuration initialization
-       config = config || {};
-
-       // Parent constructor
-       OO.ui.FieldsetLayout.super.call( this, config );
-
-       // Mixin constructors
-       OO.ui.IconElement.call( this, config );
-       OO.ui.LabelElement.call( this, config );
-       OO.ui.GroupElement.call( this, config );
-
-       // Initialization
-       this.$element
-               .addClass( 'oo-ui-fieldsetLayout' )
-               .prepend( this.$icon, this.$label, this.$group );
-       if ( $.isArray( config.items ) ) {
-               this.addItems( config.items );
-       }
+OO.ui.BookletLayout.prototype.getOutline = function () {
+       return this.outlineSelectWidget;
 };
 
-/* Setup */
-
-OO.inheritClass( OO.ui.FieldsetLayout, OO.ui.Layout );
-OO.mixinClass( OO.ui.FieldsetLayout, OO.ui.IconElement );
-OO.mixinClass( OO.ui.FieldsetLayout, OO.ui.LabelElement );
-OO.mixinClass( OO.ui.FieldsetLayout, OO.ui.GroupElement );
-
 /**
- * Layout with an HTML form.
- *
- * @class
- * @extends OO.ui.Layout
+ * Get the outline controls widget. If the outline is not editable, null is returned.
  *
- * @constructor
- * @param {Object} [config] Configuration options
- * @cfg {string} [method] HTML form `method` attribute
- * @cfg {string} [action] HTML form `action` attribute
- * @cfg {string} [enctype] HTML form `enctype` attribute
+ * @return {OO.ui.OutlineControlsWidget|null} The outline controls widget.
  */
-OO.ui.FormLayout = function OoUiFormLayout( config ) {
-       // Configuration initialization
-       config = config || {};
-
-       // Parent constructor
-       OO.ui.FormLayout.super.call( this, config );
-
-       // Events
-       this.$element.on( 'submit', this.onFormSubmit.bind( this ) );
-
-       // Initialization
-       this.$element
-               .addClass( 'oo-ui-formLayout' )
-               .attr( {
-                       method: config.method,
-                       action: config.action,
-                       enctype: config.enctype
-               } );
+OO.ui.BookletLayout.prototype.getOutlineControls = function () {
+       return this.outlineControlsWidget;
 };
 
-/* Setup */
-
-OO.inheritClass( OO.ui.FormLayout, OO.ui.Layout );
-
-/* Events */
-
 /**
- * @event submit
+ * Get a page by name.
+ *
+ * @param {string} name Symbolic name of page
+ * @return {OO.ui.PageLayout|undefined} Page, if found
  */
+OO.ui.BookletLayout.prototype.getPage = function ( name ) {
+       return this.pages[ name ];
+};
 
-/* Static Properties */
-
-OO.ui.FormLayout.static.tagName = 'form';
-
-/* Methods */
+/**
+ * Get the current page
+ *
+ * @return {OO.ui.PageLayout|undefined} Current page, if found
+ */
+OO.ui.BookletLayout.prototype.getCurrentPage = function () {
+       var name = this.getCurrentPageName();
+       return name ? this.getPage( name ) : undefined;
+};
 
 /**
- * Handle form submit events.
+ * Get the current page name.
  *
- * @param {jQuery.Event} e Submit event
- * @fires submit
+ * @return {string|null} Current page name
  */
-OO.ui.FormLayout.prototype.onFormSubmit = function () {
-       this.emit( 'submit' );
-       return false;
+OO.ui.BookletLayout.prototype.getCurrentPageName = function () {
+       return this.currentPageName;
 };
 
 /**
- * Layout made of proportionally sized columns and rows.
+ * Add a page to the layout.
  *
- * @class
- * @extends OO.ui.Layout
+ * When pages are added with the same names as existing pages, the existing pages will be
+ * automatically removed before the new pages are added.
  *
- * @constructor
- * @param {OO.ui.PanelLayout[]} panels Panels in the grid
- * @param {Object} [config] Configuration options
- * @cfg {number[]} [widths] Widths of columns as ratios
- * @cfg {number[]} [heights] Heights of rows as ratios
+ * @param {OO.ui.PageLayout[]} pages Pages to add
+ * @param {number} index Index to insert pages after
+ * @fires add
+ * @chainable
  */
-OO.ui.GridLayout = function OoUiGridLayout( panels, config ) {
-       var i, len, widths;
-
-       // Configuration initialization
-       config = config || {};
-
-       // Parent constructor
-       OO.ui.GridLayout.super.call( this, config );
+OO.ui.BookletLayout.prototype.addPages = function ( pages, index ) {
+       var i, len, name, page, item, currentIndex,
+               stackLayoutPages = this.stackLayout.getItems(),
+               remove = [],
+               items = [];
 
-       // Properties
-       this.panels = [];
-       this.widths = [];
-       this.heights = [];
+       // Remove pages with same names
+       for ( i = 0, len = pages.length; i < len; i++ ) {
+               page = pages[ i ];
+               name = page.getName();
 
-       // Initialization
-       this.$element.addClass( 'oo-ui-gridLayout' );
-       for ( i = 0, len = panels.length; i < len; i++ ) {
-               this.panels.push( panels[i] );
-               this.$element.append( panels[i].$element );
+               if ( Object.prototype.hasOwnProperty.call( this.pages, name ) ) {
+                       // Correct the insertion index
+                       currentIndex = $.inArray( this.pages[ name ], stackLayoutPages );
+                       if ( currentIndex !== -1 && currentIndex + 1 < index ) {
+                               index--;
+                       }
+                       remove.push( this.pages[ name ] );
+               }
        }
-       if ( config.widths || config.heights ) {
-               this.layout( config.widths || [ 1 ], config.heights || [ 1 ] );
-       } else {
-               // Arrange in columns by default
-               widths = this.panels.map( function () { return 1; } );
-               this.layout( widths, [ 1 ] );
+       if ( remove.length ) {
+               this.removePages( remove );
        }
-};
 
-/* Setup */
+       // Add new pages
+       for ( i = 0, len = pages.length; i < len; i++ ) {
+               page = pages[ i ];
+               name = page.getName();
+               this.pages[ page.getName() ] = page;
+               if ( this.outlined ) {
+                       item = new OO.ui.OutlineOptionWidget( { data: name } );
+                       page.setOutlineItem( item );
+                       items.push( item );
+               }
+       }
 
-OO.inheritClass( OO.ui.GridLayout, OO.ui.Layout );
+       if ( this.outlined && items.length ) {
+               this.outlineSelectWidget.addItems( items, index );
+               this.selectFirstSelectablePage();
+       }
+       this.stackLayout.addItems( pages, index );
+       this.emit( 'add', pages, index );
 
-/* Events */
+       return this;
+};
 
 /**
- * @event layout
+ * Remove a page from the layout.
+ *
+ * @fires remove
+ * @chainable
  */
+OO.ui.BookletLayout.prototype.removePages = function ( pages ) {
+       var i, len, name, page,
+               items = [];
 
-/**
- * @event update
- */
+       for ( i = 0, len = pages.length; i < len; i++ ) {
+               page = pages[ i ];
+               name = page.getName();
+               delete this.pages[ name ];
+               if ( this.outlined ) {
+                       items.push( this.outlineSelectWidget.getItemFromData( name ) );
+                       page.setOutlineItem( null );
+               }
+       }
+       if ( this.outlined && items.length ) {
+               this.outlineSelectWidget.removeItems( items );
+               this.selectFirstSelectablePage();
+       }
+       this.stackLayout.removeItems( pages );
+       this.emit( 'remove', pages );
 
-/* Methods */
+       return this;
+};
 
 /**
- * Set grid dimensions.
+ * Clear all pages from the layout.
  *
- * @param {number[]} widths Widths of columns as ratios
- * @param {number[]} heights Heights of rows as ratios
- * @fires layout
- * @throws {Error} If grid is not large enough to fit all panels
+ * @fires remove
+ * @chainable
  */
-OO.ui.GridLayout.prototype.layout = function ( widths, heights ) {
-       var x, y,
-               xd = 0,
-               yd = 0,
-               cols = widths.length,
-               rows = heights.length;
+OO.ui.BookletLayout.prototype.clearPages = function () {
+       var i, len,
+               pages = this.stackLayout.getItems();
 
-       // Verify grid is big enough to fit panels
-       if ( cols * rows < this.panels.length ) {
-               throw new Error( 'Grid is not large enough to fit ' + this.panels.length + 'panels' );
+       this.pages = {};
+       this.currentPageName = null;
+       if ( this.outlined ) {
+               this.outlineSelectWidget.clearItems();
+               for ( i = 0, len = pages.length; i < len; i++ ) {
+                       pages[ i ].setOutlineItem( null );
+               }
        }
+       this.stackLayout.clearItems();
 
-       // Sum up denominators
-       for ( x = 0; x < cols; x++ ) {
-               xd += widths[x];
-       }
-       for ( y = 0; y < rows; y++ ) {
-               yd += heights[y];
-       }
-       // Store factors
-       this.widths = [];
-       this.heights = [];
-       for ( x = 0; x < cols; x++ ) {
-               this.widths[x] = widths[x] / xd;
-       }
-       for ( y = 0; y < rows; y++ ) {
-               this.heights[y] = heights[y] / yd;
-       }
-       // Synchronize view
-       this.update();
-       this.emit( 'layout' );
+       this.emit( 'remove', pages );
+
+       return this;
 };
 
 /**
- * Update panel positions and sizes.
+ * Set the current page by name.
  *
- * @fires update
+ * @fires set
+ * @param {string} name Symbolic name of page
  */
-OO.ui.GridLayout.prototype.update = function () {
-       var x, y, panel, width, height, dimensions,
-               i = 0,
-               top = 0,
-               left = 0,
-               cols = this.widths.length,
-               rows = this.heights.length;
+OO.ui.BookletLayout.prototype.setPage = function ( name ) {
+       var selectedItem,
+               $focused,
+               page = this.pages[ name ];
 
-       for ( y = 0; y < rows; y++ ) {
-               height = this.heights[y];
-               for ( x = 0; x < cols; x++ ) {
-                       width = this.widths[x];
-                       panel = this.panels[i];
-                       dimensions = {
-                               width: ( width * 100 ) + '%',
-                               height: ( height * 100 ) + '%',
-                               top: ( top * 100 ) + '%'
-                       };
-                       // If RTL, reverse:
-                       if ( OO.ui.Element.static.getDir( this.$.context ) === 'rtl' ) {
-                               dimensions.right = ( left * 100 ) + '%';
-                       } else {
-                               dimensions.left = ( left * 100 ) + '%';
+       if ( name !== this.currentPageName ) {
+               if ( this.outlined ) {
+                       selectedItem = this.outlineSelectWidget.getSelectedItem();
+                       if ( selectedItem && selectedItem.getData() !== name ) {
+                               this.outlineSelectWidget.selectItem( this.outlineSelectWidget.getItemFromData( name ) );
                        }
-                       // HACK: Work around IE bug by setting visibility: hidden; if width or height is zero
-                       if ( width === 0 || height === 0 ) {
-                               dimensions.visibility = 'hidden';
-                       } else {
-                               dimensions.visibility = '';
+               }
+               if ( page ) {
+                       if ( this.currentPageName && this.pages[ this.currentPageName ] ) {
+                               this.pages[ this.currentPageName ].setActive( false );
+                               // Blur anything focused if the next page doesn't have anything focusable - this
+                               // is not needed if the next page has something focusable because once it is focused
+                               // this blur happens automatically
+                               if ( this.autoFocus && !page.$element.find( ':input' ).length ) {
+                                       $focused = this.pages[ this.currentPageName ].$element.find( ':focus' );
+                                       if ( $focused.length ) {
+                                               $focused[ 0 ].blur();
+                                       }
+                               }
                        }
-                       panel.$element.css( dimensions );
-                       i++;
-                       left += width;
+                       this.currentPageName = name;
+                       this.stackLayout.setItem( page );
+                       page.setActive( true );
+                       this.emit( 'set', page );
                }
-               top += height;
-               left = 0;
        }
-
-       this.emit( 'update' );
 };
 
 /**
- * Get a panel at a given position.
- *
- * The x and y position is affected by the current grid layout.
+ * Select the first selectable page.
  *
- * @param {number} x Horizontal position
- * @param {number} y Vertical position
- * @return {OO.ui.PanelLayout} The panel at the given position
+ * @chainable
  */
-OO.ui.GridLayout.prototype.getPanel = function ( x, y ) {
-       return this.panels[ ( x * this.widths.length ) + y ];
+OO.ui.BookletLayout.prototype.selectFirstSelectablePage = function () {
+       if ( !this.outlineSelectWidget.getSelectedItem() ) {
+               this.outlineSelectWidget.selectItem( this.outlineSelectWidget.getFirstSelectableItem() );
+       }
+
+       return this;
 };
 
 /**
@@ -8192,7 +8417,7 @@ OO.ui.StackLayout = function OoUiStackLayout( config ) {
        if ( this.continuous ) {
                this.$element.addClass( 'oo-ui-stackLayout-continuous' );
        }
-       if ( $.isArray( config.items ) ) {
+       if ( Array.isArray( config.items ) ) {
                this.addItems( config.items );
        }
 };
@@ -8247,11 +8472,14 @@ OO.ui.StackLayout.prototype.unsetCurrentItem = function () {
  * @chainable
  */
 OO.ui.StackLayout.prototype.addItems = function ( items, index ) {
+       // Update the visibility
+       this.updateHiddenState( items, this.currentItem );
+
        // Mixin method
        OO.ui.GroupElement.prototype.addItems.call( this, items, index );
 
        if ( !this.currentItem && items.length ) {
-               this.setItem( items[0] );
+               this.setItem( items[ 0 ] );
        }
 
        return this;
@@ -8272,7 +8500,7 @@ OO.ui.StackLayout.prototype.removeItems = function ( items ) {
 
        if ( $.inArray( this.currentItem, items ) !== -1 ) {
                if ( this.items.length ) {
-                       this.setItem( this.items[0] );
+                       this.setItem( this.items[ 0 ] );
                } else {
                        this.unsetCurrentItem();
                }
@@ -8309,18 +8537,10 @@ OO.ui.StackLayout.prototype.clearItems = function () {
  * @fires set
  */
 OO.ui.StackLayout.prototype.setItem = function ( item ) {
-       var i, len;
-
        if ( item !== this.currentItem ) {
-               if ( !this.continuous ) {
-                       for ( i = 0, len = this.items.length; i < len; i++ ) {
-                               this.items[i].$element.css( 'display', '' );
-                       }
-               }
+               this.updateHiddenState( this.items, item );
+
                if ( $.inArray( item, this.items ) !== -1 ) {
-                       if ( !this.continuous ) {
-                               item.$element.css( 'display', 'block' );
-                       }
                        this.currentItem = item;
                        this.emit( 'set', item );
                } else {
@@ -8331,6 +8551,30 @@ OO.ui.StackLayout.prototype.setItem = function ( item ) {
        return this;
 };
 
+/**
+ * Update the visibility of all items in case of non-continuous view.
+ *
+ * Ensure all items are hidden except for the selected one.
+ * This method does nothing when the stack is continuous.
+ *
+ * @param {OO.ui.Layout[]} items Item list iterate over
+ * @param {OO.ui.Layout} [selectedItem] Selected item to show
+ */
+OO.ui.StackLayout.prototype.updateHiddenState = function ( items, selectedItem ) {
+       var i, len;
+
+       if ( !this.continuous ) {
+               for ( i = 0, len = items.length; i < len; i++ ) {
+                       if ( !selectedItem || selectedItem !== items[ i ] ) {
+                               items[ i ].$element.addClass( 'oo-ui-element-hidden' );
+                       }
+               }
+               if ( selectedItem ) {
+                       selectedItem.$element.removeClass( 'oo-ui-element-hidden' );
+               }
+       }
+};
+
 /**
  * Horizontal bar layout of tools as icon buttons.
  *
@@ -8396,7 +8640,7 @@ OO.ui.PopupToolGroup = function OoUiPopupToolGroup( toolbar, config ) {
        this.active = false;
        this.dragging = false;
        this.onBlurHandler = this.onBlur.bind( this );
-       this.$handle = this.$( '<span>' );
+       this.$handle = $( '<span>' );
 
        // Events
        this.$handle.on( {
@@ -8413,7 +8657,7 @@ OO.ui.PopupToolGroup = function OoUiPopupToolGroup( toolbar, config ) {
        // OO.ui.HeaderedElement mixin constructor.
        if ( config.header !== undefined ) {
                this.$group
-                       .prepend( this.$( '<span>' )
+                       .prepend( $( '<span>' )
                                .addClass( 'oo-ui-popupToolGroup-header' )
                                .text( config.header )
                        );
@@ -8457,7 +8701,7 @@ OO.ui.PopupToolGroup.prototype.setDisabled = function () {
  */
 OO.ui.PopupToolGroup.prototype.onBlur = function ( e ) {
        // Only deactivate when clicking outside the dropdown element
-       if ( this.$( e.target ).closest( '.oo-ui-popupToolGroup' )[0] !== this.$element[0] ) {
+       if ( $( e.target ).closest( '.oo-ui-popupToolGroup' )[ 0 ] !== this.$element[ 0 ] ) {
                this.setActive( false );
        }
 };
@@ -8595,23 +8839,15 @@ OO.ui.ListToolGroup.prototype.populate = function () {
 
        this.collapsibleTools = [];
        for ( i = 0, len = allowCollapse.length; i < len; i++ ) {
-               if ( this.tools[ allowCollapse[i] ] !== undefined ) {
-                       this.collapsibleTools.push( this.tools[ allowCollapse[i] ] );
+               if ( this.tools[ allowCollapse[ i ] ] !== undefined ) {
+                       this.collapsibleTools.push( this.tools[ allowCollapse[ i ] ] );
                }
        }
 
        // Keep at the end, even when tools are added
        this.$group.append( this.getExpandCollapseTool().$element );
 
-       this.getExpandCollapseTool().toggle( this.collapsibleTools.length !== 0 );
-
-       // Calling jQuery's .hide() and then .show() on a detached element caches the default value of its
-       // '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', 'block' );
-       }
-
+       this.getExpandCollapseTool().toggle( this.collapsibleTools.length !== 0 );
        this.updateCollapsibleState();
 };
 
@@ -8646,7 +8882,7 @@ OO.ui.ListToolGroup.prototype.onPointerUp = function ( e ) {
        var ret = OO.ui.ListToolGroup.super.prototype.onPointerUp.call( this, e );
 
        // Do not close the popup when the user wants to show more/fewer tools
-       if ( this.$( e.target ).closest( '.oo-ui-tool-name-more-fewer' ).length ) {
+       if ( $( e.target ).closest( '.oo-ui-tool-name-more-fewer' ).length ) {
                // Prevent the popup list from being hidden
                this.setActive( true );
        }
@@ -8662,7 +8898,7 @@ OO.ui.ListToolGroup.prototype.updateCollapsibleState = function () {
                .setTitle( OO.ui.msg( this.expanded ? 'ooui-toolgroup-collapse' : 'ooui-toolgroup-expand' ) );
 
        for ( i = 0, len = this.collapsibleTools.length; i < len; i++ ) {
-               this.collapsibleTools[i].toggle( this.expanded );
+               this.collapsibleTools[ i ].toggle( this.expanded );
        }
 };
 
@@ -8713,8 +8949,8 @@ OO.ui.MenuToolGroup.prototype.onUpdateState = function () {
                labelTexts = [];
 
        for ( name in this.tools ) {
-               if ( this.tools[name].isActive() ) {
-                       labelTexts.push( this.tools[name].getTitle() );
+               if ( this.tools[ name ].isActive() ) {
+                       labelTexts.push( this.tools[ name ].getTitle() );
                }
        }
 
@@ -8816,7 +9052,7 @@ OO.ui.GroupWidget.prototype.setDisabled = function ( disabled ) {
        // During construction, #setDisabled is called before the OO.ui.GroupElement constructor
        if ( this.items ) {
                for ( i = 0, len = this.items.length; i < len; i++ ) {
-                       this.items[i].updateDisabled();
+                       this.items[ i ].updateDisabled();
                }
        }
 
@@ -8882,7 +9118,7 @@ OO.ui.ItemWidget.prototype.setElementGroup = function ( group ) {
  *
  * @class
  * @abstract
- * @deprecated Use LookupElement instead.
+ * @deprecated Use OO.ui.LookupElement instead.
  *
  * @constructor
  * @param {OO.ui.TextInputWidget} input Input widget
@@ -8898,7 +9134,6 @@ OO.ui.LookupInputWidget = function OoUiLookupInputWidget( input, config ) {
        this.lookupInput = input;
        this.$overlay = config.$overlay || this.$element;
        this.lookupMenu = new OO.ui.TextInputMenuSelectWidget( this, {
-               $: OO.ui.Element.static.getJQuery( this.$overlay ),
                input: this.lookupInput,
                $container: config.$container
        } );
@@ -9097,7 +9332,7 @@ OO.ui.LookupInputWidget.prototype.getLookupMenuItems = function () {
 
        this.abortLookupRequest();
        if ( Object.prototype.hasOwnProperty.call( this.lookupCache, value ) ) {
-               deferred.resolve( this.getLookupMenuItemsFromData( this.lookupCache[value] ) );
+               deferred.resolve( this.getLookupMenuItemsFromData( this.lookupCache[ value ] ) );
        } else {
                this.lookupInput.pushPending();
                this.lookupQuery = value;
@@ -9118,8 +9353,8 @@ OO.ui.LookupInputWidget.prototype.getLookupMenuItems = function () {
                                if ( ourRequest === widget.lookupRequest ) {
                                        widget.lookupQuery = null;
                                        widget.lookupRequest = null;
-                                       widget.lookupCache[value] = widget.getLookupCacheItemFromData( data );
-                                       deferred.resolve( widget.getLookupMenuItemsFromData( widget.lookupCache[value] ) );
+                                       widget.lookupCache[ value ] = widget.getLookupCacheItemFromData( data );
+                                       deferred.resolve( widget.getLookupMenuItemsFromData( widget.lookupCache[ value ] ) );
                                }
                        } )
                        .fail( function () {
@@ -9211,21 +9446,18 @@ OO.ui.OutlineControlsWidget = function OoUiOutlineControlsWidget( outline, confi
 
        // Properties
        this.outline = outline;
-       this.$movers = this.$( '<div>' );
+       this.$movers = $( '<div>' );
        this.upButton = new OO.ui.ButtonWidget( {
-               $: this.$,
                framed: false,
                icon: 'collapse',
                title: OO.ui.msg( 'ooui-outline-control-move-up' )
        } );
        this.downButton = new OO.ui.ButtonWidget( {
-               $: this.$,
                framed: false,
                icon: 'expand',
                title: OO.ui.msg( 'ooui-outline-control-move-down' )
        } );
        this.removeButton = new OO.ui.ButtonWidget( {
-               $: this.$,
                framed: false,
                icon: 'remove',
                title: OO.ui.msg( 'ooui-outline-control-remove' )
@@ -9283,15 +9515,15 @@ OO.ui.OutlineControlsWidget.prototype.onOutlineChange = function () {
                i = -1;
                len = items.length;
                while ( ++i < len ) {
-                       if ( items[i].isMovable() ) {
-                               firstMovable = items[i];
+                       if ( items[ i ].isMovable() ) {
+                               firstMovable = items[ i ];
                                break;
                        }
                }
                i = len;
                while ( i-- ) {
-                       if ( items[i].isMovable() ) {
-                               lastMovable = items[i];
+                       if ( items[ i ].isMovable() ) {
+                               lastMovable = items[ i ];
                                break;
                        }
                }
@@ -9355,14 +9587,34 @@ OO.ui.ToggleWidget.prototype.setValue = function ( value ) {
                this.emit( 'change', value );
                this.$element.toggleClass( 'oo-ui-toggleWidget-on', value );
                this.$element.toggleClass( 'oo-ui-toggleWidget-off', !value );
+               this.$element.attr( 'aria-checked', value.toString() );
        }
        return this;
 };
 
 /**
- * Group widget for multiple related buttons.
- *
- * Use together with OO.ui.ButtonWidget.
+ * A ButtonGroupWidget groups related buttons and is used together with OO.ui.ButtonWidget and
+ * its subclasses. Each button in a group is addressed by a unique reference. Buttons can be added,
+ * removed, and cleared from the group.
+ *
+ *     @example
+ *     // Example: A ButtonGroupWidget with two buttons
+ *     var button1 = new OO.ui.PopupButtonWidget( {
+ *         label : 'Select a category',
+ *         icon : 'menu',
+ *         popup : {
+ *             $content: $( '<p>List of categories...</p>' ),
+ *             padded: true,
+ *             align: 'left'
+ *         }
+ *     } );
+ *     var button2 = new OO.ui.ButtonWidget( {
+ *         label : 'Add item'
+ *     });
+ *     var buttonGroup = new OO.ui.ButtonGroupWidget( {
+ *         items: [button1, button2]
+ *     } );
+ *     $('body').append(buttonGroup.$element);
  *
  * @class
  * @extends OO.ui.Widget
@@ -9384,7 +9636,7 @@ OO.ui.ButtonGroupWidget = function OoUiButtonGroupWidget( config ) {
 
        // Initialization
        this.$element.addClass( 'oo-ui-buttonGroupWidget' );
-       if ( $.isArray( config.items ) ) {
+       if ( Array.isArray( config.items ) ) {
                this.addItems( config.items );
        }
 };
@@ -9395,7 +9647,23 @@ OO.inheritClass( OO.ui.ButtonGroupWidget, OO.ui.Widget );
 OO.mixinClass( OO.ui.ButtonGroupWidget, OO.ui.GroupElement );
 
 /**
- * Generic widget for buttons.
+ * ButtonWidget is a generic widget for buttons. A wide variety of looks,
+ * feels, and functionality can be customized via the class’s configuration options
+ * and methods. Please see the [OOjs UI documentation on MediaWiki] [1] for more information
+ * and examples.
+ *
+ * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Buttons_and_Switches
+ *
+ *     @example
+ *     // A button widget
+ *     var button = new OO.ui.ButtonWidget( {
+ *         label : 'Button with Icon',
+ *         icon : 'remove',
+ *         iconTitle : 'Remove'
+ *     } );
+ *     $( 'body' ).append( button.$element );
+ *
+ * NOTE: HTML form buttons should use the OO.ui.ButtonInputWidget class.
  *
  * @class
  * @extends OO.ui.Widget
@@ -9405,15 +9673,18 @@ OO.mixinClass( OO.ui.ButtonGroupWidget, OO.ui.GroupElement );
  * @mixins OO.ui.LabelElement
  * @mixins OO.ui.TitledElement
  * @mixins OO.ui.FlaggedElement
+ * @mixins OO.ui.TabIndexedElement
  *
  * @constructor
  * @param {Object} [config] Configuration options
- * @cfg {string} [href] Hyperlink to visit when clicked
- * @cfg {string} [target] Target to open hyperlink in
+ * @cfg {string} [href] Hyperlink to visit when the button is clicked.
+ * @cfg {string} [target] The frame or window in which to open the hyperlink.
+ * @cfg {boolean} [noFollow] Search engine traversal hint (default: true)
  */
 OO.ui.ButtonWidget = function OoUiButtonWidget( config ) {
        // Configuration initialization
-       config = config || {};
+       // FIXME: The `nofollow` alias is deprecated and will be removed (T89767)
+       config = $.extend( { noFollow: config && config.nofollow }, config );
 
        // Parent constructor
        OO.ui.ButtonWidget.super.call( this, config );
@@ -9425,18 +9696,14 @@ OO.ui.ButtonWidget = function OoUiButtonWidget( config ) {
        OO.ui.LabelElement.call( this, config );
        OO.ui.TitledElement.call( this, $.extend( {}, config, { $titled: this.$button } ) );
        OO.ui.FlaggedElement.call( this, config );
+       OO.ui.TabIndexedElement.call( this, $.extend( {}, config, { $tabIndexed: this.$button } ) );
 
        // Properties
        this.href = null;
        this.target = null;
+       this.noFollow = false;
        this.isHyperlink = false;
 
-       // Events
-       this.$button.on( {
-               click: this.onClick.bind( this ),
-               keypress: this.onKeyPress.bind( this )
-       } );
-
        // Initialization
        this.$button.append( this.$icon, this.$label, this.$indicator );
        this.$element
@@ -9444,6 +9711,7 @@ OO.ui.ButtonWidget = function OoUiButtonWidget( config ) {
                .append( this.$button );
        this.setHref( config.href );
        this.setTarget( config.target );
+       this.setNoFollow( config.noFollow );
 };
 
 /* Setup */
@@ -9455,45 +9723,54 @@ OO.mixinClass( OO.ui.ButtonWidget, OO.ui.IndicatorElement );
 OO.mixinClass( OO.ui.ButtonWidget, OO.ui.LabelElement );
 OO.mixinClass( OO.ui.ButtonWidget, OO.ui.TitledElement );
 OO.mixinClass( OO.ui.ButtonWidget, OO.ui.FlaggedElement );
+OO.mixinClass( OO.ui.ButtonWidget, OO.ui.TabIndexedElement );
 
-/* Events */
+/* Methods */
 
 /**
- * @event click
+ * @inheritdoc
  */
+OO.ui.ButtonWidget.prototype.onMouseDown = function ( e ) {
+       if ( !this.isDisabled() ) {
+               // Remove the tab-index while the button is down to prevent the button from stealing focus
+               this.$button.removeAttr( 'tabindex' );
+       }
 
-/* Methods */
+       return OO.ui.ButtonElement.prototype.onMouseDown.call( this, e );
+};
 
 /**
- * Handles mouse click events.
- *
- * @param {jQuery.Event} e Mouse click event
- * @fires click
+ * @inheritdoc
  */
-OO.ui.ButtonWidget.prototype.onClick = function () {
+OO.ui.ButtonWidget.prototype.onMouseUp = function ( e ) {
        if ( !this.isDisabled() ) {
-               this.emit( 'click' );
-               if ( this.isHyperlink ) {
-                       return true;
-               }
+               // Restore the tab-index after the button is up to restore the button's accessibility
+               this.$button.attr( 'tabindex', this.tabIndex );
        }
-       return false;
+
+       return OO.ui.ButtonElement.prototype.onMouseUp.call( this, e );
 };
 
 /**
- * Handles keypress events.
- *
- * @param {jQuery.Event} e Keypress event
- * @fires click
+ * @inheritdoc
+ */
+OO.ui.ButtonWidget.prototype.onClick = function ( e ) {
+       var ret = OO.ui.ButtonElement.prototype.onClick.call( this, e );
+       if ( this.isHyperlink ) {
+               return true;
+       }
+       return ret;
+};
+
+/**
+ * @inheritdoc
  */
 OO.ui.ButtonWidget.prototype.onKeyPress = function ( e ) {
-       if ( !this.isDisabled() && ( e.which === OO.ui.Keys.SPACE || e.which === OO.ui.Keys.ENTER ) ) {
-               this.emit( 'click' );
-               if ( this.isHyperlink ) {
-                       return true;
-               }
+       var ret = OO.ui.ButtonElement.prototype.onKeyPress.call( this, e );
+       if ( this.isHyperlink ) {
+               return true;
        }
-       return false;
+       return ret;
 };
 
 /**
@@ -9514,6 +9791,15 @@ OO.ui.ButtonWidget.prototype.getTarget = function () {
        return this.target;
 };
 
+/**
+ * Get search engine traversal hint.
+ *
+ * @return {boolean} Whether search engines should avoid traversing this hyperlink
+ */
+OO.ui.ButtonWidget.prototype.getNoFollow = function () {
+       return this.noFollow;
+};
+
 /**
  * Set hyperlink location.
  *
@@ -9557,7 +9843,32 @@ OO.ui.ButtonWidget.prototype.setTarget = function ( target ) {
 };
 
 /**
- * Button widget that executes an action and is managed by an OO.ui.ActionSet.
+ * Set search engine traversal hint.
+ *
+ * @param {boolean} noFollow True if search engines should avoid traversing this hyperlink
+ */
+OO.ui.ButtonWidget.prototype.setNoFollow = function ( noFollow ) {
+       noFollow = typeof noFollow === 'boolean' ? noFollow : true;
+
+       if ( noFollow !== this.noFollow ) {
+               this.noFollow = noFollow;
+               if ( noFollow ) {
+                       this.$button.attr( 'rel', 'nofollow' );
+               } else {
+                       this.$button.removeAttr( 'rel' );
+               }
+       }
+
+       return this;
+};
+
+/**
+ * An ActionWidget is a {@link OO.ui.ButtonWidget button widget} that executes an action.
+ * Action widgets are used with OO.ui.ActionSet, which manages the behavior and availability
+ * of the actions. Please see the [OOjs UI documentation on MediaWiki] [1] for more information
+ * and examples.
+ *
+ * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Windows/Process_Dialogs#Action_sets
  *
  * @class
  * @extends OO.ui.ButtonWidget
@@ -9727,9 +10038,13 @@ OO.ui.PopupButtonWidget = function OoUiPopupButtonWidget( config ) {
        // Mixin constructors
        OO.ui.PopupElement.call( this, config );
 
+       // Events
+       this.connect( this, { click: 'onAction' } );
+
        // Initialization
        this.$element
                .addClass( 'oo-ui-popupButtonWidget' )
+               .attr( 'aria-haspopup', 'true' )
                .append( this.popup.$element );
 };
 
@@ -9741,22 +10056,10 @@ OO.mixinClass( OO.ui.PopupButtonWidget, OO.ui.PopupElement );
 /* Methods */
 
 /**
- * Handles mouse click events.
- *
- * @param {jQuery.Event} e Mouse click event
+ * Handle the button action being triggered.
  */
-OO.ui.PopupButtonWidget.prototype.onClick = function ( e ) {
-       // Skip clicks within the popup
-       if ( $.contains( this.popup.$element[0], e.target ) ) {
-               return;
-       }
-
-       if ( !this.isDisabled() ) {
-               this.popup.toggle();
-               // Parent method
-               OO.ui.PopupButtonWidget.super.prototype.onClick.call( this );
-       }
-       return false;
+OO.ui.PopupButtonWidget.prototype.onAction = function () {
+       this.popup.toggle();
 };
 
 /**
@@ -9780,6 +10083,9 @@ OO.ui.ToggleButtonWidget = function OoUiToggleButtonWidget( config ) {
        // Mixin constructors
        OO.ui.ToggleWidget.call( this, config );
 
+       // Events
+       this.connect( this, { click: 'onAction' } );
+
        // Initialization
        this.$element.addClass( 'oo-ui-toggleButtonWidget' );
 };
@@ -9792,15 +10098,10 @@ OO.mixinClass( OO.ui.ToggleButtonWidget, OO.ui.ToggleWidget );
 /* Methods */
 
 /**
- * @inheritdoc
+ * Handle the button action being triggered.
  */
-OO.ui.ToggleButtonWidget.prototype.onClick = function () {
-       if ( !this.isDisabled() ) {
-               this.setValue( !this.value );
-       }
-
-       // Parent method
-       return OO.ui.ToggleButtonWidget.super.prototype.onClick.call( this );
+OO.ui.ToggleButtonWidget.prototype.onAction = function () {
+       this.setValue( !this.value );
 };
 
 /**
@@ -9809,6 +10110,7 @@ OO.ui.ToggleButtonWidget.prototype.onClick = function () {
 OO.ui.ToggleButtonWidget.prototype.setValue = function ( value ) {
        value = !!value;
        if ( value !== this.value ) {
+               this.$button.attr( 'aria-pressed', value.toString() );
                this.setActive( value );
        }
 
@@ -9819,12 +10121,37 @@ OO.ui.ToggleButtonWidget.prototype.setValue = function ( value ) {
 };
 
 /**
- * Dropdown menu of options.
+ * DropdownWidgets are not menus themselves, rather they contain a menu of options created with
+ * OO.ui.MenuOptionWidget. The DropdownWidget takes care of opening and displaying the menu so that
+ * users can interact with it.
+ *
+ *     @example
+ *     // Example: A DropdownWidget with a menu that contains three options
+ *     var dropDown=new OO.ui.DropdownWidget( {
+ *         label: 'Dropdown menu: Select a menu option',
+ *         menu: {
+ *             items: [
+ *                 new OO.ui.MenuOptionWidget( {
+ *                     data: 'a',
+ *                     label: 'First'
+ *                 } ),
+ *                 new OO.ui.MenuOptionWidget( {
+ *                     data: 'b',
+ *                     label: 'Second'
+ *                 } ),
+ *                 new OO.ui.MenuOptionWidget( {
+ *                     data: 'c',
+ *                     label: 'Third'
+ *                 } )
+ *             ]
+ *         }
+ *     } );
+ *
+ *     $('body').append(dropDown.$element);
  *
- * Dropdown menus provide a control for accessing a menu and compose a menu within the widget, which
- * can be accessed using the #getMenu method.
+ * For more information, please see the [OOjs UI documentation on MediaWiki] [1].
  *
- * Use with OO.ui.MenuOptionWidget.
+ * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Selects_and_Options#Menu_selects_and_options
  *
  * @class
  * @extends OO.ui.Widget
@@ -9832,6 +10159,7 @@ OO.ui.ToggleButtonWidget.prototype.setValue = function ( value ) {
  * @mixins OO.ui.IndicatorElement
  * @mixins OO.ui.LabelElement
  * @mixins OO.ui.TitledElement
+ * @mixins OO.ui.TabIndexedElement
  *
  * @constructor
  * @param {Object} [config] Configuration options
@@ -9844,18 +10172,24 @@ OO.ui.DropdownWidget = function OoUiDropdownWidget( config ) {
        // Parent constructor
        OO.ui.DropdownWidget.super.call( this, config );
 
+       // Properties (must be set before TabIndexedElement constructor call)
+       this.$handle = this.$( '<span>' );
+
        // Mixin constructors
        OO.ui.IconElement.call( this, config );
        OO.ui.IndicatorElement.call( this, config );
        OO.ui.LabelElement.call( this, config );
        OO.ui.TitledElement.call( this, $.extend( {}, config, { $titled: this.$label } ) );
+       OO.ui.TabIndexedElement.call( this, $.extend( {}, config, { $tabIndexed: this.$handle } ) );
 
        // Properties
-       this.menu = new OO.ui.MenuSelectWidget( $.extend( { $: this.$, widget: this }, config.menu ) );
-       this.$handle = this.$( '<span>' );
+       this.menu = new OO.ui.MenuSelectWidget( $.extend( { widget: this }, config.menu ) );
 
        // Events
-       this.$element.on( { click: this.onClick.bind( this ) } );
+       this.$handle.on( {
+               click: this.onClick.bind( this ),
+               keypress: this.onKeyPress.bind( this )
+       } );
        this.menu.connect( this, { select: 'onMenuSelect' } );
 
        // Initialization
@@ -9874,6 +10208,7 @@ OO.mixinClass( OO.ui.DropdownWidget, OO.ui.IconElement );
 OO.mixinClass( OO.ui.DropdownWidget, OO.ui.IndicatorElement );
 OO.mixinClass( OO.ui.DropdownWidget, OO.ui.LabelElement );
 OO.mixinClass( OO.ui.DropdownWidget, OO.ui.TitledElement );
+OO.mixinClass( OO.ui.DropdownWidget, OO.ui.TabIndexedElement );
 
 /* Methods */
 
@@ -9889,6 +10224,7 @@ OO.ui.DropdownWidget.prototype.getMenu = function () {
 /**
  * Handles menu select events.
  *
+ * @private
  * @param {OO.ui.MenuOptionWidget} item Selected menu item
  */
 OO.ui.DropdownWidget.prototype.onMenuSelect = function ( item ) {
@@ -9909,30 +10245,49 @@ OO.ui.DropdownWidget.prototype.onMenuSelect = function ( item ) {
 };
 
 /**
- * Handles mouse click events.
+ * Handle mouse click events.
  *
+ * @private
  * @param {jQuery.Event} e Mouse click event
  */
 OO.ui.DropdownWidget.prototype.onClick = function ( e ) {
-       // Skip clicks within the menu
-       if ( $.contains( this.menu.$element[0], e.target ) ) {
-               return;
+       if ( !this.isDisabled() && e.which === 1 ) {
+               this.menu.toggle();
        }
+       return false;
+};
 
-       if ( !this.isDisabled() ) {
-               if ( this.menu.isVisible() ) {
-                       this.menu.toggle( false );
-               } else {
-                       this.menu.toggle( true );
-               }
+/**
+ * Handle key press events.
+ *
+ * @private
+ * @param {jQuery.Event} e Key press event
+ */
+OO.ui.DropdownWidget.prototype.onKeyPress = function ( e ) {
+       if ( !this.isDisabled() && ( e.which === OO.ui.Keys.SPACE || e.which === OO.ui.Keys.ENTER ) ) {
+               this.menu.toggle();
        }
        return false;
 };
 
 /**
- * Icon widget.
+ * IconWidget is a generic widget for {@link OO.ui.IconElement icons}. In general, IconWidgets should be used with OO.ui.LabelWidget,
+ * which creates a label that identifies the icon’s function. See the [OOjs UI documentation on MediaWiki] [1]
+ * for a list of icons included in the library.
  *
- * See OO.ui.IconElement for more information.
+ *     @example
+ *     // An icon widget with a label
+ *     var myIcon = new OO.ui.IconWidget({
+ *         icon: 'help',
+ *         iconTitle: 'Help'
+ *      });
+ *      // Create a label.
+ *      var iconLabel = new OO.ui.LabelWidget({
+ *          label: 'Help'
+ *      });
+ *      $('body').append(myIcon.$element, iconLabel.$element);
+ *
+ * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Icons,_Indicators,_and_Labels#Icons
  *
  * @class
  * @extends OO.ui.Widget
@@ -10006,12 +10361,18 @@ OO.mixinClass( OO.ui.IndicatorWidget, OO.ui.TitledElement );
 OO.ui.IndicatorWidget.static.tagName = 'span';
 
 /**
- * Base class for input widgets.
+ * InputWidget is the base class for all input widgets, which
+ * include {@link OO.ui.TextInputWidget text inputs}, {@link OO.ui.CheckboxInputWidget checkbox inputs},
+ * {@link OO.ui.RadioInputWidget radio inputs}, and {@link OO.ui.ButtonInputWidget button inputs}.
+ * See the [OOjs UI documentation on MediaWiki] [1] for more information and examples.
+ *
+ * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Inputs
  *
  * @abstract
  * @class
  * @extends OO.ui.Widget
  * @mixins OO.ui.FlaggedElement
+ * @mixins OO.ui.TabIndexedElement
  *
  * @constructor
  * @param {Object} [config] Configuration options
@@ -10026,14 +10387,15 @@ OO.ui.InputWidget = function OoUiInputWidget( config ) {
        // Parent constructor
        OO.ui.InputWidget.super.call( this, config );
 
-       // Mixin constructors
-       OO.ui.FlaggedElement.call( this, config );
-
        // Properties
        this.$input = this.getInputElement( config );
        this.value = '';
        this.inputFilter = config.inputFilter;
 
+       // Mixin constructors
+       OO.ui.FlaggedElement.call( this, config );
+       OO.ui.TabIndexedElement.call( this, $.extend( {}, config, { $tabIndexed: this.$input } ) );
+
        // Events
        this.$input.on( 'keydown mouseup cut paste change input select', this.onEdit.bind( this ) );
 
@@ -10049,6 +10411,7 @@ OO.ui.InputWidget = function OoUiInputWidget( config ) {
 
 OO.inheritClass( OO.ui.InputWidget, OO.ui.Widget );
 OO.mixinClass( OO.ui.InputWidget, OO.ui.FlaggedElement );
+OO.mixinClass( OO.ui.InputWidget, OO.ui.TabIndexedElement );
 
 /* Events */
 
@@ -10062,12 +10425,15 @@ OO.mixinClass( OO.ui.InputWidget, OO.ui.FlaggedElement );
 /**
  * Get input element.
  *
+ * Subclasses of OO.ui.InputWidget use the `config` parameter to produce different elements in
+ * different circumstances. The element must have a `value` property (like form elements).
+ *
  * @private
- * @param {Object} [config] Configuration options
+ * @param {Object} config Configuration options
  * @return {jQuery} Input element
  */
 OO.ui.InputWidget.prototype.getInputElement = function () {
-       return this.$( '<input>' );
+       return $( '<input>' );
 };
 
 /**
@@ -10091,6 +10457,12 @@ OO.ui.InputWidget.prototype.onEdit = function () {
  * @return {string} Input value
  */
 OO.ui.InputWidget.prototype.getValue = function () {
+       // Resynchronize our internal data with DOM data. Other scripts executing on the page can modify
+       // it, and we won't know unless they're kind enough to trigger a 'change' event.
+       var value = this.$input.val();
+       if ( this.value !== value ) {
+               this.setValue( value );
+       }
        return this.value;
 };
 
@@ -10100,13 +10472,7 @@ OO.ui.InputWidget.prototype.getValue = function () {
  * @param {boolean} isRTL
  */
 OO.ui.InputWidget.prototype.setRTL = function ( isRTL ) {
-       if ( isRTL ) {
-               this.$input.removeClass( 'oo-ui-ltr' );
-               this.$input.addClass( 'oo-ui-rtl' );
-       } else {
-               this.$input.removeClass( 'oo-ui-rtl' );
-               this.$input.addClass( 'oo-ui-ltr' );
-       }
+       this.$input.prop( 'dir', isRTL ? 'rtl' : 'ltr' );
 };
 
 /**
@@ -10157,7 +10523,7 @@ OO.ui.InputWidget.prototype.simulateLabelClick = function () {
                if ( this.$input.is( ':checkbox,:radio' ) ) {
                        this.$input.click();
                } else if ( this.$input.is( ':input' ) ) {
-                       this.$input[0].focus();
+                       this.$input[ 0 ].focus();
                }
        }
 };
@@ -10179,7 +10545,7 @@ OO.ui.InputWidget.prototype.setDisabled = function ( state ) {
  * @chainable
  */
 OO.ui.InputWidget.prototype.focus = function () {
-       this.$input[0].focus();
+       this.$input[ 0 ].focus();
        return this;
 };
 
@@ -10189,12 +10555,27 @@ OO.ui.InputWidget.prototype.focus = function () {
  * @chainable
  */
 OO.ui.InputWidget.prototype.blur = function () {
-       this.$input[0].blur();
+       this.$input[ 0 ].blur();
        return this;
 };
 
 /**
- * A button that is an input widget. Intended to be used within a OO.ui.FormLayout.
+ * ButtonInputWidget is used to submit HTML forms and is intended to be used within
+ * a OO.ui.FormLayout. If you do not need the button to work with HTML forms, you probably
+ * want to use OO.ui.ButtonWidget instead. Button input widgets can be rendered as either an
+ * HTML `<button/>` (the default) or an HTML `<input/>` tags. See the
+ * [OOjs UI documentation on MediaWiki] [1] for more information.
+ *
+ *     @example
+ *     // A ButtonInputWidget rendered as an HTML button, the default.
+ *     var button = new OO.ui.ButtonInputWidget( {
+ *         label: 'Input button',
+ *         icon: 'check',
+ *         value: 'check'
+ *     } );
+ *     $( 'body' ).append( button.$element );
+ *
+ * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Inputs#Button_inputs
  *
  * @class
  * @extends OO.ui.InputWidget
@@ -10231,12 +10612,6 @@ OO.ui.ButtonInputWidget = function OoUiButtonInputWidget( config ) {
        OO.ui.TitledElement.call( this, $.extend( {}, config, { $titled: this.$input } ) );
        OO.ui.FlaggedElement.call( this, config );
 
-       // Events
-       this.$input.on( {
-               click: this.onClick.bind( this ),
-               keypress: this.onKeyPress.bind( this )
-       } );
-
        // Initialization
        if ( !config.useInputTag ) {
                this.$input.append( this.$icon, this.$label, this.$indicator );
@@ -10254,28 +10629,15 @@ OO.mixinClass( OO.ui.ButtonInputWidget, OO.ui.LabelElement );
 OO.mixinClass( OO.ui.ButtonInputWidget, OO.ui.TitledElement );
 OO.mixinClass( OO.ui.ButtonInputWidget, OO.ui.FlaggedElement );
 
-/* Events */
-
-/**
- * @event click
- */
-
 /* Methods */
 
 /**
- * Get input element.
- *
+ * @inheritdoc
  * @private
- * @param {Object} [config] Configuration options
- * @return {jQuery} Input element
  */
 OO.ui.ButtonInputWidget.prototype.getInputElement = function ( config ) {
-       // Configuration initialization
-       config = config || {};
-
        var html = '<' + ( config.useInputTag ? 'input' : 'button' ) + ' type="' + config.type + '">';
-
-       return this.$( html );
+       return $( html );
 };
 
 /**
@@ -10321,32 +10683,6 @@ OO.ui.ButtonInputWidget.prototype.setValue = function ( value ) {
        return this;
 };
 
-/**
- * Handles mouse click events.
- *
- * @param {jQuery.Event} e Mouse click event
- * @fires click
- */
-OO.ui.ButtonInputWidget.prototype.onClick = function () {
-       if ( !this.isDisabled() ) {
-               this.emit( 'click' );
-       }
-       return false;
-};
-
-/**
- * Handles keypress events.
- *
- * @param {jQuery.Event} e Keypress event
- * @fires click
- */
-OO.ui.ButtonInputWidget.prototype.onKeyPress = function ( e ) {
-       if ( !this.isDisabled() && ( e.which === OO.ui.Keys.SPACE || e.which === OO.ui.Keys.ENTER ) ) {
-               this.emit( 'click' );
-       }
-       return false;
-};
-
 /**
  * Checkbox input widget.
  *
@@ -10358,6 +10694,9 @@ OO.ui.ButtonInputWidget.prototype.onKeyPress = function ( e ) {
  * @cfg {boolean} [selected=false] Whether the checkbox is initially selected
  */
 OO.ui.CheckboxInputWidget = function OoUiCheckboxInputWidget( config ) {
+       // Configuration initialization
+       config = config || {};
+
        // Parent constructor
        OO.ui.CheckboxInputWidget.super.call( this, config );
 
@@ -10373,13 +10712,11 @@ OO.inheritClass( OO.ui.CheckboxInputWidget, OO.ui.InputWidget );
 /* Methods */
 
 /**
- * Get input element.
- *
+ * @inheritdoc
  * @private
- * @return {jQuery} Input element
  */
 OO.ui.CheckboxInputWidget.prototype.getInputElement = function () {
-       return this.$( '<input type="checkbox" />' );
+       return $( '<input type="checkbox" />' );
 };
 
 /**
@@ -10416,8 +10753,138 @@ OO.ui.CheckboxInputWidget.prototype.setSelected = function ( state ) {
  *
  * @return {boolean} Checkbox is selected
  */
-OO.ui.CheckboxInputWidget.prototype.isSelected = function () {
-       return this.selected;
+OO.ui.CheckboxInputWidget.prototype.isSelected = function () {
+       // Resynchronize our internal data with DOM data. Other scripts executing on the page can modify
+       // it, and we won't know unless they're kind enough to trigger a 'change' event.
+       var selected = this.$input.prop( 'checked' );
+       if ( this.selected !== selected ) {
+               this.setSelected( selected );
+       }
+       return this.selected;
+};
+
+/**
+ * A OO.ui.DropdownWidget synchronized with a `<input type=hidden>` for form submission. Intended to
+ * be used within a OO.ui.FormLayout.
+ *
+ * @class
+ * @extends OO.ui.InputWidget
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ * @cfg {Object[]} [options=[]] Array of menu options in the format `{ data: …, label: … }`
+ */
+OO.ui.DropdownInputWidget = function OoUiDropdownInputWidget( config ) {
+       // Configuration initialization
+       config = config || {};
+
+       // Properties (must be done before parent constructor which calls #setDisabled)
+       this.dropdownWidget = new OO.ui.DropdownWidget();
+
+       // Parent constructor
+       OO.ui.DropdownInputWidget.super.call( this, config );
+
+       // Events
+       this.dropdownWidget.getMenu().connect( this, { select: 'onMenuSelect' } );
+
+       // Initialization
+       this.setOptions( config.options || [] );
+       this.$element
+               .addClass( 'oo-ui-dropdownInputWidget' )
+               .append( this.dropdownWidget.$element );
+};
+
+/* Setup */
+
+OO.inheritClass( OO.ui.DropdownInputWidget, OO.ui.InputWidget );
+
+/* Methods */
+
+/**
+ * @inheritdoc
+ * @private
+ */
+OO.ui.DropdownInputWidget.prototype.getInputElement = function () {
+       return $( '<input type="hidden">' );
+};
+
+/**
+ * Handles menu select events.
+ *
+ * @param {OO.ui.MenuOptionWidget} item Selected menu item
+ */
+OO.ui.DropdownInputWidget.prototype.onMenuSelect = function ( item ) {
+       this.setValue( item.getData() );
+};
+
+/**
+ * @inheritdoc
+ */
+OO.ui.DropdownInputWidget.prototype.setValue = function ( value ) {
+       var item = this.dropdownWidget.getMenu().getItemFromData( value );
+       if ( item ) {
+               this.dropdownWidget.getMenu().selectItem( item );
+       }
+       OO.ui.DropdownInputWidget.super.prototype.setValue.call( this, value );
+       return this;
+};
+
+/**
+ * @inheritdoc
+ */
+OO.ui.DropdownInputWidget.prototype.setDisabled = function ( state ) {
+       this.dropdownWidget.setDisabled( state );
+       OO.ui.DropdownInputWidget.super.prototype.setDisabled.call( this, state );
+       return this;
+};
+
+/**
+ * Set the options available for this input.
+ *
+ * @param {Object[]} options Array of menu options in the format `{ data: …, label: … }`
+ * @chainable
+ */
+OO.ui.DropdownInputWidget.prototype.setOptions = function ( options ) {
+       var value = this.getValue();
+
+       // Rebuild the dropdown menu
+       this.dropdownWidget.getMenu()
+               .clearItems()
+               .addItems( options.map( function ( opt ) {
+                       return new OO.ui.MenuOptionWidget( {
+                               data: opt.data,
+                               label: opt.label !== undefined ? opt.label : opt.data
+                       } );
+               } ) );
+
+       // Restore the previous value, or reset to something sensible
+       if ( this.dropdownWidget.getMenu().getItemFromData( value ) ) {
+               // Previous value is still available, ensure consistency with the dropdown
+               this.setValue( value );
+       } else {
+               // No longer valid, reset
+               if ( options.length ) {
+                       this.setValue( options[ 0 ].data );
+               }
+       }
+
+       return this;
+};
+
+/**
+ * @inheritdoc
+ */
+OO.ui.DropdownInputWidget.prototype.focus = function () {
+       this.dropdownWidget.getMenu().toggle( true );
+       return this;
+};
+
+/**
+ * @inheritdoc
+ */
+OO.ui.DropdownInputWidget.prototype.blur = function () {
+       this.dropdownWidget.getMenu().toggle( false );
+       return this;
 };
 
 /**
@@ -10434,6 +10901,9 @@ OO.ui.CheckboxInputWidget.prototype.isSelected = function () {
  * @cfg {boolean} [selected=false] Whether the radio button is initially selected
  */
 OO.ui.RadioInputWidget = function OoUiRadioInputWidget( config ) {
+       // Configuration initialization
+       config = config || {};
+
        // Parent constructor
        OO.ui.RadioInputWidget.super.call( this, config );
 
@@ -10449,13 +10919,11 @@ OO.inheritClass( OO.ui.RadioInputWidget, OO.ui.InputWidget );
 /* Methods */
 
 /**
- * Get input element.
- *
+ * @inheritdoc
  * @private
- * @return {jQuery} Input element
  */
 OO.ui.RadioInputWidget.prototype.getInputElement = function () {
-       return this.$( '<input type="radio" />' );
+       return $( '<input type="radio" />' );
 };
 
 /**
@@ -10494,6 +10962,7 @@ OO.ui.RadioInputWidget.prototype.isSelected = function () {
  * @mixins OO.ui.IconElement
  * @mixins OO.ui.IndicatorElement
  * @mixins OO.ui.PendingElement
+ * @mixins OO.ui.LabelElement
  *
  * @constructor
  * @param {Object} [config] Configuration options
@@ -10502,15 +10971,22 @@ OO.ui.RadioInputWidget.prototype.isSelected = function () {
  * @cfg {boolean} [autofocus=false] Ask the browser to focus this widget, using the 'autofocus' HTML
  *  attribute
  * @cfg {boolean} [readOnly=false] Prevent changes
+ * @cfg {number} [maxLength] Maximum allowed number of characters to input
  * @cfg {boolean} [multiline=false] Allow multiple lines of text
  * @cfg {boolean} [autosize=false] Automatically resize to fit content
  * @cfg {boolean} [maxRows=10] Maximum number of rows to make visible when autosizing
- * @cfg {RegExp|string} [validate] Regular expression (or symbolic name referencing
+ * @cfg {string} [labelPosition='after'] Label position, 'before' or 'after'
+ * @cfg {boolean} [required=false] Mark the field as required
+ * @cfg {RegExp|string} [validate] Regular expression to validate against (or symbolic name referencing
  *  one, see #static-validationPatterns)
  */
 OO.ui.TextInputWidget = function OoUiTextInputWidget( config ) {
        // Configuration initialization
-       config = $.extend( { readOnly: false }, config );
+       config = $.extend( {
+               type: 'text',
+               labelPosition: 'after',
+               maxRows: 10
+       }, config );
 
        // Parent constructor
        OO.ui.TextInputWidget.super.call( this, config );
@@ -10519,12 +10995,13 @@ OO.ui.TextInputWidget = function OoUiTextInputWidget( config ) {
        OO.ui.IconElement.call( this, config );
        OO.ui.IndicatorElement.call( this, config );
        OO.ui.PendingElement.call( this, config );
+       OO.ui.LabelElement.call( this, config );
 
        // Properties
        this.readOnly = false;
        this.multiline = !!config.multiline;
        this.autosize = !!config.autosize;
-       this.maxRows = config.maxRows !== undefined ? config.maxRows : 10;
+       this.maxRows = config.maxRows;
        this.validate = null;
 
        // Clone for resizing
@@ -10532,10 +11009,12 @@ OO.ui.TextInputWidget = function OoUiTextInputWidget( config ) {
                this.$clone = this.$input
                        .clone()
                        .insertAfter( this.$input )
-                       .hide();
+                       .attr( 'aria-hidden', 'true' )
+                       .addClass( 'oo-ui-element-hidden' );
        }
 
        this.setValidation( config.validate );
+       this.setPosition( config.labelPosition );
 
        // Events
        this.$input.on( {
@@ -10545,19 +11024,25 @@ OO.ui.TextInputWidget = function OoUiTextInputWidget( config ) {
        this.$element.on( 'DOMNodeInsertedIntoDocument', this.onElementAttach.bind( this ) );
        this.$icon.on( 'mousedown', this.onIconMouseDown.bind( this ) );
        this.$indicator.on( 'mousedown', this.onIndicatorMouseDown.bind( this ) );
+       this.on( 'labelChange', this.updatePosition.bind( this ) );
 
        // Initialization
        this.$element
                .addClass( 'oo-ui-textInputWidget' )
                .append( this.$icon, this.$indicator );
-       this.setReadOnly( config.readOnly );
+       this.setReadOnly( !!config.readOnly );
        if ( config.placeholder ) {
                this.$input.attr( 'placeholder', config.placeholder );
        }
+       if ( config.maxLength !== undefined ) {
+               this.$input.attr( 'maxlength', config.maxLength );
+       }
        if ( config.autofocus ) {
                this.$input.attr( 'autofocus', 'autofocus' );
        }
-       this.$element.attr( 'role', 'textbox' );
+       if ( config.required ) {
+               this.$input.attr( 'required', 'true' );
+       }
 };
 
 /* Setup */
@@ -10566,6 +11051,7 @@ OO.inheritClass( OO.ui.TextInputWidget, OO.ui.InputWidget );
 OO.mixinClass( OO.ui.TextInputWidget, OO.ui.IconElement );
 OO.mixinClass( OO.ui.TextInputWidget, OO.ui.IndicatorElement );
 OO.mixinClass( OO.ui.TextInputWidget, OO.ui.PendingElement );
+OO.mixinClass( OO.ui.TextInputWidget, OO.ui.LabelElement );
 
 /* Static properties */
 
@@ -10587,12 +11073,16 @@ OO.ui.TextInputWidget.static.validationPatterns = {
 /**
  * User clicks the icon.
  *
+ * @deprecated Fundamentally not accessible. Make the icon focusable, associate a label or tooltip,
+ *  and handle click/keypress events on it manually.
  * @event icon
  */
 
 /**
  * User clicks the indicator.
  *
+ * @deprecated Fundamentally not accessible. Make the indicator focusable, associate a label or
+ *  tooltip, and handle click/keypress events on it manually.
  * @event indicator
  */
 
@@ -10606,7 +11096,7 @@ OO.ui.TextInputWidget.static.validationPatterns = {
  */
 OO.ui.TextInputWidget.prototype.onIconMouseDown = function ( e ) {
        if ( e.which === 1 ) {
-               this.$input[0].focus();
+               this.$input[ 0 ].focus();
                this.emit( 'icon' );
                return false;
        }
@@ -10620,7 +11110,7 @@ OO.ui.TextInputWidget.prototype.onIconMouseDown = function ( e ) {
  */
 OO.ui.TextInputWidget.prototype.onIndicatorMouseDown = function ( e ) {
        if ( e.which === 1 ) {
-               this.$input[0].focus();
+               this.$input[ 0 ].focus();
                this.emit( 'indicator' );
                return false;
        }
@@ -10644,7 +11134,10 @@ OO.ui.TextInputWidget.prototype.onKeyPress = function ( e ) {
  * @param {jQuery.Event} e Element attach event
  */
 OO.ui.TextInputWidget.prototype.onElementAttach = function () {
+       // Any previously calculated size is now probably invalid if we reattached elsewhere
+       this.valCache = null;
        this.adjustSize();
+       this.positionLabel();
 };
 
 /**
@@ -10709,11 +11202,11 @@ OO.ui.TextInputWidget.prototype.adjustSize = function () {
                        // Set inline height property to 0 to measure scroll height
                        .css( 'height', 0 );
 
-               this.$clone[0].style.display = 'block';
+               this.$clone.removeClass( 'oo-ui-element-hidden' );
 
                this.valCache = this.$input.val();
 
-               scrollHeight = this.$clone[0].scrollHeight;
+               scrollHeight = this.$clone[ 0 ].scrollHeight;
 
                // Remove inline height property to measure natural heights
                this.$clone.css( 'height', '' );
@@ -10729,10 +11222,10 @@ OO.ui.TextInputWidget.prototype.adjustSize = function () {
 
                // Difference between reported innerHeight and scrollHeight with no scrollbars present
                // Equals 1 on Blink-based browsers and 0 everywhere else
-               measurementError = maxInnerHeight - this.$clone[0].scrollHeight;
+               measurementError = maxInnerHeight - this.$clone[ 0 ].scrollHeight;
                idealHeight = Math.min( maxInnerHeight, scrollHeight + measurementError );
 
-               this.$clone[0].style.display = 'none';
+               this.$clone.addClass( 'oo-ui-element-hidden' );
 
                // Only apply inline height when expansion beyond natural height is needed
                if ( idealHeight > innerHeight ) {
@@ -10746,19 +11239,11 @@ OO.ui.TextInputWidget.prototype.adjustSize = function () {
 };
 
 /**
- * Get input element.
- *
+ * @inheritdoc
  * @private
- * @param {Object} [config] Configuration options
- * @return {jQuery} Input element
  */
 OO.ui.TextInputWidget.prototype.getInputElement = function ( config ) {
-       // Configuration initialization
-       config = config || {};
-
-       var type = config.type || 'text';
-
-       return config.multiline ? this.$( '<textarea>' ) : this.$( '<input type="' + type + '" />' );
+       return config.multiline ? $( '<textarea>' ) : $( '<input type="' + config.type + '" />' );
 };
 
 /**
@@ -10798,7 +11283,7 @@ OO.ui.TextInputWidget.prototype.setValidation = function ( validate ) {
        if ( validate instanceof RegExp ) {
                this.validate = validate;
        } else {
-               this.validate = this.constructor.static.validationPatterns[validate] || /.*/;
+               this.validate = this.constructor.static.validationPatterns[ validate ] || /.*/;
        }
 };
 
@@ -10822,11 +11307,73 @@ OO.ui.TextInputWidget.prototype.isValid = function () {
        return $.Deferred().resolve( !!this.getValue().match( this.validate ) ).promise();
 };
 
+/**
+ * Set the position of the inline label.
+ *
+ * @param {string} labelPosition Label position, 'before' or 'after'
+ * @chainable
+ */
+OO.ui.TextInputWidget.prototype.setPosition = function ( labelPosition ) {
+       this.labelPosition = labelPosition;
+       this.updatePosition();
+       return this;
+};
+
+/**
+ * Update the position of the inline label.
+ *
+ * @chainable
+ */
+OO.ui.TextInputWidget.prototype.updatePosition = function () {
+       var after = this.labelPosition === 'after';
+
+       this.$element
+               .toggleClass( 'oo-ui-textInputWidget-labelPosition-after', !!this.label && after )
+               .toggleClass( 'oo-ui-textInputWidget-labelPosition-before', !!this.label && !after );
+
+       if ( this.label ) {
+               this.positionLabel();
+       }
+
+       return this;
+};
+
+/**
+ * Position the label by setting the correct padding on the input.
+ *
+ * @chainable
+ */
+OO.ui.TextInputWidget.prototype.positionLabel = function () {
+       // Clear old values
+       this.$input
+               // Clear old values if present
+               .css( {
+                       'padding-right': '',
+                       'padding-left': ''
+               } );
+
+       if ( this.label ) {
+               this.$element.append( this.$label );
+       } else {
+               this.$label.detach();
+               return;
+       }
+
+       var after = this.labelPosition === 'after',
+               rtl = this.$element.css( 'direction' ) === 'rtl',
+               property = after === rtl ? 'padding-left' : 'padding-right';
+
+       this.$input.css( property, this.$label.outerWidth( true ) );
+
+       return this;
+};
+
 /**
  * Text input with a menu of optional values.
  *
  * @class
  * @extends OO.ui.Widget
+ * @mixins OO.ui.TabIndexedElement
  *
  * @constructor
  * @param {Object} [config] Configuration options
@@ -10841,15 +11388,24 @@ OO.ui.ComboBoxWidget = function OoUiComboBoxWidget( config ) {
        // Parent constructor
        OO.ui.ComboBoxWidget.super.call( this, config );
 
+       // Properties (must be set before TabIndexedElement constructor call)
+       this.$indicator = this.$( '<span>' );
+
+       // Mixin constructors
+       OO.ui.TabIndexedElement.call( this, $.extend( {}, config, { $tabIndexed: this.$indicator } ) );
+
        // Properties
        this.$overlay = config.$overlay || this.$element;
        this.input = new OO.ui.TextInputWidget( $.extend(
-               { $: this.$, indicator: 'down', disabled: this.isDisabled() },
+               {
+                       indicator: 'down',
+                       $indicator: this.$indicator,
+                       disabled: this.isDisabled()
+               },
                config.input
        ) );
        this.menu = new OO.ui.TextInputMenuSelectWidget( this.input, $.extend(
                {
-                       $: OO.ui.Element.static.getJQuery( this.$overlay ),
                        widget: this,
                        input: this.input,
                        disabled: this.isDisabled()
@@ -10858,9 +11414,12 @@ OO.ui.ComboBoxWidget = function OoUiComboBoxWidget( config ) {
        ) );
 
        // Events
+       this.$indicator.on( {
+               click: this.onClick.bind( this ),
+               keypress: this.onKeyPress.bind( this )
+       } );
        this.input.connect( this, {
                change: 'onInputChange',
-               indicator: 'onInputIndicator',
                enter: 'onInputEnter'
        } );
        this.menu.connect( this, {
@@ -10878,6 +11437,7 @@ OO.ui.ComboBoxWidget = function OoUiComboBoxWidget( config ) {
 /* Setup */
 
 OO.inheritClass( OO.ui.ComboBoxWidget, OO.ui.Widget );
+OO.mixinClass( OO.ui.ComboBoxWidget, OO.ui.TabIndexedElement );
 
 /* Methods */
 
@@ -10898,6 +11458,9 @@ OO.ui.ComboBoxWidget.prototype.onInputChange = function ( value ) {
        var match = this.menu.getItemFromData( value );
 
        this.menu.selectItem( match );
+       if ( this.menu.getHighlightedItem() ) {
+               this.menu.highlightItem( match );
+       }
 
        if ( !this.isDisabled() ) {
                this.menu.toggle( true );
@@ -10905,12 +11468,29 @@ OO.ui.ComboBoxWidget.prototype.onInputChange = function ( value ) {
 };
 
 /**
- * Handle input indicator events.
+ * Handle mouse click events.
+ *
+ * @param {jQuery.Event} e Mouse click event
  */
-OO.ui.ComboBoxWidget.prototype.onInputIndicator = function () {
-       if ( !this.isDisabled() ) {
+OO.ui.ComboBoxWidget.prototype.onClick = function ( e ) {
+       if ( !this.isDisabled() && e.which === 1 ) {
+               this.menu.toggle();
+               this.input.$input[ 0 ].focus();
+       }
+       return false;
+};
+
+/**
+ * Handle key press events.
+ *
+ * @param {jQuery.Event} e Key press event
+ */
+OO.ui.ComboBoxWidget.prototype.onKeyPress = function ( e ) {
+       if ( !this.isDisabled() && ( e.which === OO.ui.Keys.SPACE || e.which === OO.ui.Keys.ENTER ) ) {
                this.menu.toggle();
+               this.input.$input[ 0 ].focus();
        }
+       return false;
 };
 
 /**
@@ -10939,6 +11519,9 @@ OO.ui.ComboBoxWidget.prototype.onMenuChoose = function ( item ) {
 OO.ui.ComboBoxWidget.prototype.onMenuItemsChange = function () {
        var match = this.menu.getItemFromData( this.input.getValue() );
        this.menu.selectItem( match );
+       if ( this.menu.getHighlightedItem() ) {
+               this.menu.highlightItem( match );
+       }
        this.$element.toggleClass( 'oo-ui-comboBoxWidget-empty', this.menu.isEmpty() );
 };
 
@@ -11133,7 +11716,9 @@ OO.ui.OptionWidget.prototype.isPressed = function () {
 OO.ui.OptionWidget.prototype.setSelected = function ( state ) {
        if ( this.constructor.static.selectable ) {
                this.selected = !!state;
-               this.$element.toggleClass( 'oo-ui-optionWidget-selected', state );
+               this.$element
+                       .toggleClass( 'oo-ui-optionWidget-selected', state )
+                       .attr( 'aria-selected', state.toString() );
                if ( state && this.constructor.static.scrollIntoViewOnSelect ) {
                        this.scrollElementIntoView();
                }
@@ -11172,36 +11757,6 @@ OO.ui.OptionWidget.prototype.setPressed = function ( state ) {
        return this;
 };
 
-/**
- * Make the option's highlight flash.
- *
- * While flashing, the visual style of the pressed state is removed if present.
- *
- * @return {jQuery.Promise} Promise resolved when flashing is done
- */
-OO.ui.OptionWidget.prototype.flash = function () {
-       var widget = this,
-               $element = this.$element,
-               deferred = $.Deferred();
-
-       if ( !this.isDisabled() && this.constructor.static.pressable ) {
-               $element.removeClass( 'oo-ui-optionWidget-highlighted oo-ui-optionWidget-pressed' );
-               setTimeout( function () {
-                       // Restore original classes
-                       $element
-                               .toggleClass( 'oo-ui-optionWidget-highlighted', widget.highlighted )
-                               .toggleClass( 'oo-ui-optionWidget-pressed', widget.pressed );
-
-                       setTimeout( function () {
-                               deferred.resolve();
-                       }, 100 );
-
-               }, 100 );
-       }
-
-       return deferred.promise();
-};
-
 /**
  * Option widget with an option icon and indicator.
  *
@@ -11244,16 +11799,21 @@ OO.mixinClass( OO.ui.OptionWidget, OO.ui.IndicatorElement );
  * @class
  * @extends OO.ui.DecoratedOptionWidget
  * @mixins OO.ui.ButtonElement
+ * @mixins OO.ui.TabIndexedElement
  *
  * @constructor
  * @param {Object} [config] Configuration options
  */
 OO.ui.ButtonOptionWidget = function OoUiButtonOptionWidget( config ) {
+       // Configuration initialization
+       config = $.extend( { tabIndex: -1 }, config );
+
        // Parent constructor
        OO.ui.ButtonOptionWidget.super.call( this, config );
 
        // Mixin constructors
        OO.ui.ButtonElement.call( this, config );
+       OO.ui.TabIndexedElement.call( this, $.extend( {}, config, { $tabIndexed: this.$button } ) );
 
        // Initialization
        this.$element.addClass( 'oo-ui-buttonOptionWidget' );
@@ -11265,12 +11825,15 @@ OO.ui.ButtonOptionWidget = function OoUiButtonOptionWidget( config ) {
 
 OO.inheritClass( OO.ui.ButtonOptionWidget, OO.ui.DecoratedOptionWidget );
 OO.mixinClass( OO.ui.ButtonOptionWidget, OO.ui.ButtonElement );
+OO.mixinClass( OO.ui.ButtonOptionWidget, OO.ui.TabIndexedElement );
 
 /* Static Properties */
 
 // Allow button mouse down events to pass through so they can be handled by the parent select widget
 OO.ui.ButtonOptionWidget.static.cancelButtonMouseDownEvents = false;
 
+OO.ui.ButtonOptionWidget.static.highlightable = false;
+
 /* Methods */
 
 /**
@@ -11302,7 +11865,7 @@ OO.ui.RadioOptionWidget = function OoUiRadioOptionWidget( config ) {
        OO.ui.RadioOptionWidget.super.call( this, config );
 
        // Properties
-       this.radio = new OO.ui.RadioInputWidget( { value: config.data } );
+       this.radio = new OO.ui.RadioInputWidget( { value: config.data, tabIndex: -1 } );
 
        // Initialization
        this.$element
@@ -11318,8 +11881,12 @@ OO.inheritClass( OO.ui.RadioOptionWidget, OO.ui.OptionWidget );
 
 OO.ui.RadioOptionWidget.static.highlightable = false;
 
+OO.ui.RadioOptionWidget.static.scrollIntoViewOnSelect = true;
+
 OO.ui.RadioOptionWidget.static.pressable = false;
 
+OO.ui.RadioOptionWidget.static.tagName = 'label';
+
 /* Methods */
 
 /**
@@ -11359,6 +11926,10 @@ OO.ui.MenuOptionWidget = function OoUiMenuOptionWidget( config ) {
 
 OO.inheritClass( OO.ui.MenuOptionWidget, OO.ui.DecoratedOptionWidget );
 
+/* Static Properties */
+
+OO.ui.MenuOptionWidget.static.scrollIntoViewOnSelect = true;
+
 /**
  * Section to group one or more items in a OO.ui.MenuSelectWidget.
  *
@@ -11541,16 +12112,17 @@ OO.ui.PopupWidget = function OoUiPopupWidget( config ) {
        // Parent constructor
        OO.ui.PopupWidget.super.call( this, config );
 
+       // Properties (must be set before ClippableElement constructor call)
+       this.$body = $( '<div>' );
+
        // Mixin constructors
        OO.ui.LabelElement.call( this, config );
-       OO.ui.ClippableElement.call( this, config );
+       OO.ui.ClippableElement.call( this, $.extend( {}, config, { $clippable: this.$body } ) );
 
        // Properties
-       this.visible = false;
-       this.$popup = this.$( '<div>' );
-       this.$head = this.$( '<div>' );
-       this.$body = this.$( '<div>' );
-       this.$anchor = this.$( '<div>' );
+       this.$popup = $( '<div>' );
+       this.$head = $( '<div>' );
+       this.$anchor = $( '<div>' );
        // If undefined, will be computed lazily in updateDimensions()
        this.$container = config.$container;
        this.containerPadding = config.containerPadding !== undefined ? config.containerPadding : 10;
@@ -11561,7 +12133,7 @@ OO.ui.PopupWidget = function OoUiPopupWidget( config ) {
        this.width = config.width !== undefined ? config.width : 320;
        this.height = config.height !== undefined ? config.height : null;
        this.align = config.align || 'center';
-       this.closeButton = new OO.ui.ButtonWidget( { $: this.$, framed: false, icon: 'close' } );
+       this.closeButton = new OO.ui.ButtonWidget( { framed: false, icon: 'close' } );
        this.onMouseDownHandler = this.onMouseDown.bind( this );
 
        // Events
@@ -11575,13 +12147,12 @@ OO.ui.PopupWidget = function OoUiPopupWidget( config ) {
                .addClass( 'oo-ui-popupWidget-head' )
                .append( this.$label, this.closeButton.$element );
        if ( !config.head ) {
-               this.$head.hide();
+               this.$head.addClass( 'oo-ui-element-hidden' );
        }
        this.$popup
                .addClass( 'oo-ui-popupWidget-popup' )
                .append( this.$head, this.$body );
        this.$element
-               .hide()
                .addClass( 'oo-ui-popupWidget' )
                .append( this.$popup, this.$anchor );
        // Move content, which was added to #$element by OO.ui.Widget, to the body
@@ -11591,7 +12162,12 @@ OO.ui.PopupWidget = function OoUiPopupWidget( config ) {
        if ( config.padded ) {
                this.$body.addClass( 'oo-ui-popupWidget-body-padded' );
        }
-       this.setClippableElement( this.$body );
+
+       // Initially hidden - using #toggle may cause errors if subclasses override toggle with methods
+       // that reference properties not initialized at that time of parent class construction
+       // TODO: Find a better way to handle post-constructor setup
+       this.visible = false;
+       this.$element.addClass( 'oo-ui-element-hidden' );
 };
 
 /* Setup */
@@ -11610,7 +12186,7 @@ OO.mixinClass( OO.ui.PopupWidget, OO.ui.ClippableElement );
 OO.ui.PopupWidget.prototype.onMouseDown = function ( e ) {
        if (
                this.isVisible() &&
-               !$.contains( this.$element[0], e.target ) &&
+               !$.contains( this.$element[ 0 ], e.target ) &&
                ( !this.$autoCloseIgnore || !this.$autoCloseIgnore.has( e.target ).length )
        ) {
                this.toggle( false );
@@ -11731,7 +12307,7 @@ OO.ui.PopupWidget.prototype.updateDimensions = function ( transition ) {
 
        if ( !this.$container ) {
                // Lazy-initialize $container if not specified in constructor
-               this.$container = this.$( this.getClosestScrollableElementContainer() );
+               this.$container = $( this.getClosestScrollableElementContainer() );
        }
 
        // Set height and width before measuring things, since it might cause our measurements
@@ -11742,7 +12318,7 @@ OO.ui.PopupWidget.prototype.updateDimensions = function ( transition ) {
        } );
 
        // Compute initial popupOffset based on alignment
-       popupOffset = this.width * ( { left: 0, center: -0.5, right: -1 } )[this.align];
+       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 = this.$element.offset().left;
@@ -11764,7 +12340,7 @@ OO.ui.PopupWidget.prototype.updateDimensions = function ( transition ) {
        // Adjust offset to avoid anchor being rendered too close to the edge
        // $anchor.width() doesn't work with the pure CSS anchor (returns 0)
        // TODO: Find a measurement that works for CSS anchors and image anchors
-       anchorWidth = this.$anchor[0].scrollWidth * 2;
+       anchorWidth = this.$anchor[ 0 ].scrollWidth * 2;
        if ( popupOffset + this.width < anchorWidth ) {
                popupOffset = anchorWidth - this.width;
        } else if ( -popupOffset < anchorWidth ) {
@@ -11815,7 +12391,7 @@ OO.ui.ProgressBarWidget = function OoUiProgressBarWidget( config ) {
        OO.ui.ProgressBarWidget.super.call( this, config );
 
        // Properties
-       this.$bar = this.$( '<div>' );
+       this.$bar = $( '<div>' );
        this.progress = null;
 
        // Initialization
@@ -11891,14 +12467,13 @@ OO.ui.SearchWidget = function OoUiSearchWidget( config ) {
 
        // Properties
        this.query = new OO.ui.TextInputWidget( {
-               $: this.$,
                icon: 'search',
                placeholder: config.placeholder,
                value: config.value
        } );
-       this.results = new OO.ui.SelectWidget( { $: this.$ } );
-       this.$query = this.$( '<div>' );
-       this.$results = this.$( '<div>' );
+       this.results = new OO.ui.SelectWidget();
+       this.$query = $( '<div>' );
+       this.$results = $( '<div>' );
 
        // Events
        this.query.connect( this, {
@@ -12024,12 +12599,16 @@ OO.ui.SearchWidget.prototype.getResults = function () {
 };
 
 /**
- * Generic selection of options.
+ * A SelectWidget is of a generic selection of options. The OOjs UI library contains several types of
+ * select widgets, including {@link OO.ui.ButtonSelectWidget button selects},
+ * {@link OO.ui.RadioSelectWidget radio selects}, and {@link OO.ui.MenuSelectWidget
+ * menu selects}.
  *
- * Items can contain any rendering. Any widget that provides options, from which the user must
- * choose one, should be built on this class.
+ * This class should be used together with OO.ui.OptionWidget.
  *
- * Use together with OO.ui.OptionWidget.
+ * For more information, please see the [OOjs UI documentation on MediaWiki][1].
+ *
+ * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Selects_and_Options
  *
  * @class
  * @extends OO.ui.Widget
@@ -12054,6 +12633,7 @@ OO.ui.SelectWidget = function OoUiSelectWidget( config ) {
        this.selecting = null;
        this.onMouseUpHandler = this.onMouseUp.bind( this );
        this.onMouseMoveHandler = this.onMouseMove.bind( this );
+       this.onKeyDownHandler = this.onKeyDown.bind( this );
 
        // Events
        this.$element.on( {
@@ -12063,8 +12643,10 @@ OO.ui.SelectWidget = function OoUiSelectWidget( config ) {
        } );
 
        // Initialization
-       this.$element.addClass( 'oo-ui-selectWidget oo-ui-selectWidget-depressed' );
-       if ( $.isArray( config.items ) ) {
+       this.$element
+               .addClass( 'oo-ui-selectWidget oo-ui-selectWidget-depressed' )
+               .attr( 'role', 'listbox' );
+       if ( Array.isArray( config.items ) ) {
                this.addItems( config.items );
        }
 };
@@ -12226,6 +12808,77 @@ OO.ui.SelectWidget.prototype.onMouseLeave = function () {
        return false;
 };
 
+/**
+ * Handle key down events.
+ *
+ * @param {jQuery.Event} e Key down event
+ */
+OO.ui.SelectWidget.prototype.onKeyDown = function ( e ) {
+       var nextItem,
+               handled = false,
+               currentItem = this.getHighlightedItem() || this.getSelectedItem();
+
+       if ( !this.isDisabled() && this.isVisible() ) {
+               switch ( e.keyCode ) {
+                       case OO.ui.Keys.ENTER:
+                               if ( currentItem && currentItem.constructor.static.highlightable ) {
+                                       // Was only highlighted, now let's select it. No-op if already selected.
+                                       this.chooseItem( currentItem );
+                                       handled = true;
+                               }
+                               break;
+                       case OO.ui.Keys.UP:
+                       case OO.ui.Keys.LEFT:
+                               nextItem = this.getRelativeSelectableItem( currentItem, -1 );
+                               handled = true;
+                               break;
+                       case OO.ui.Keys.DOWN:
+                       case OO.ui.Keys.RIGHT:
+                               nextItem = this.getRelativeSelectableItem( currentItem, 1 );
+                               handled = true;
+                               break;
+                       case OO.ui.Keys.ESCAPE:
+                       case OO.ui.Keys.TAB:
+                               if ( currentItem && currentItem.constructor.static.highlightable ) {
+                                       currentItem.setHighlighted( false );
+                               }
+                               this.unbindKeyDownListener();
+                               // Don't prevent tabbing away / defocusing
+                               handled = false;
+                               break;
+               }
+
+               if ( nextItem ) {
+                       if ( nextItem.constructor.static.highlightable ) {
+                               this.highlightItem( nextItem );
+                       } else {
+                               this.chooseItem( nextItem );
+                       }
+                       nextItem.scrollElementIntoView();
+               }
+
+               if ( handled ) {
+                       // Can't just return false, because e is not always a jQuery event
+                       e.preventDefault();
+                       e.stopPropagation();
+               }
+       }
+};
+
+/**
+ * Bind key down listener.
+ */
+OO.ui.SelectWidget.prototype.bindKeyDownListener = function () {
+       this.getElementWindow().addEventListener( 'keydown', this.onKeyDownHandler, true );
+};
+
+/**
+ * Unbind key down listener.
+ */
+OO.ui.SelectWidget.prototype.unbindKeyDownListener = function () {
+       this.getElementWindow().removeEventListener( 'keydown', this.onKeyDownHandler, true );
+};
+
 /**
  * Get the closest item to a jQuery.Event.
  *
@@ -12234,7 +12887,7 @@ OO.ui.SelectWidget.prototype.onMouseLeave = function () {
  * @return {OO.ui.OptionWidget|null} Outline item widget, `null` if none was found
  */
 OO.ui.SelectWidget.prototype.getTargetItem = function ( e ) {
-       var $item = this.$( e.target ).closest( '.oo-ui-optionWidget' );
+       var $item = $( e.target ).closest( '.oo-ui-optionWidget' );
        if ( $item.length ) {
                return $item.data( 'oo-ui-optionWidget' );
        }
@@ -12250,8 +12903,8 @@ OO.ui.SelectWidget.prototype.getSelectedItem = function () {
        var i, len;
 
        for ( i = 0, len = this.items.length; i < len; i++ ) {
-               if ( this.items[i].isSelected() ) {
-                       return this.items[i];
+               if ( this.items[ i ].isSelected() ) {
+                       return this.items[ i ];
                }
        }
        return null;
@@ -12266,8 +12919,8 @@ OO.ui.SelectWidget.prototype.getHighlightedItem = function () {
        var i, len;
 
        for ( i = 0, len = this.items.length; i < len; i++ ) {
-               if ( this.items[i].isHighlighted() ) {
-                       return this.items[i];
+               if ( this.items[ i ].isHighlighted() ) {
+                       return this.items[ i ];
                }
        }
        return null;
@@ -12304,9 +12957,9 @@ OO.ui.SelectWidget.prototype.highlightItem = function ( item ) {
                changed = false;
 
        for ( i = 0, len = this.items.length; i < len; i++ ) {
-               highlighted = this.items[i] === item;
-               if ( this.items[i].isHighlighted() !== highlighted ) {
-                       this.items[i].setHighlighted( highlighted );
+               highlighted = this.items[ i ] === item;
+               if ( this.items[ i ].isHighlighted() !== highlighted ) {
+                       this.items[ i ].setHighlighted( highlighted );
                        changed = true;
                }
        }
@@ -12329,9 +12982,9 @@ OO.ui.SelectWidget.prototype.selectItem = function ( item ) {
                changed = false;
 
        for ( i = 0, len = this.items.length; i < len; i++ ) {
-               selected = this.items[i] === item;
-               if ( this.items[i].isSelected() !== selected ) {
-                       this.items[i].setSelected( selected );
+               selected = this.items[ i ] === item;
+               if ( this.items[ i ].isSelected() !== selected ) {
+                       this.items[ i ].setSelected( selected );
                        changed = true;
                }
        }
@@ -12354,9 +13007,9 @@ OO.ui.SelectWidget.prototype.pressItem = function ( item ) {
                changed = false;
 
        for ( i = 0, len = this.items.length; i < len; i++ ) {
-               pressed = this.items[i] === item;
-               if ( this.items[i].isPressed() !== pressed ) {
-                       this.items[i].setPressed( pressed );
+               pressed = this.items[ i ] === item;
+               if ( this.items[ i ].isPressed() !== pressed ) {
+                       this.items[ i ].setPressed( pressed );
                        changed = true;
                }
        }
@@ -12406,7 +13059,7 @@ OO.ui.SelectWidget.prototype.getRelativeSelectableItem = function ( item, direct
        }
 
        for ( i = 0; i < len; i++ ) {
-               item = this.items[nextIndex];
+               item = this.items[ nextIndex ];
                if ( item instanceof OO.ui.OptionWidget && item.isSelectable() ) {
                        return item;
                }
@@ -12424,7 +13077,7 @@ OO.ui.SelectWidget.prototype.getFirstSelectableItem = function () {
        var i, len, item;
 
        for ( i = 0, len = this.items.length; i < len; i++ ) {
-               item = this.items[i];
+               item = this.items[ i ];
                if ( item instanceof OO.ui.OptionWidget && item.isSelectable() ) {
                        return item;
                }
@@ -12465,7 +13118,7 @@ OO.ui.SelectWidget.prototype.removeItems = function ( items ) {
 
        // Deselect items being removed
        for ( i = 0, len = items.length; i < len; i++ ) {
-               item = items[i];
+               item = items[ i ];
                if ( item.isSelected() ) {
                        this.selectItem( null );
                }
@@ -12508,6 +13161,7 @@ OO.ui.SelectWidget.prototype.clearItems = function () {
  *
  * @class
  * @extends OO.ui.SelectWidget
+ * @mixins OO.ui.TabIndexedElement
  *
  * @constructor
  * @param {Object} [config] Configuration options
@@ -12516,6 +13170,15 @@ OO.ui.ButtonSelectWidget = function OoUiButtonSelectWidget( config ) {
        // Parent constructor
        OO.ui.ButtonSelectWidget.super.call( this, config );
 
+       // Mixin constructors
+       OO.ui.TabIndexedElement.call( this, config );
+
+       // Events
+       this.$element.on( {
+               focus: this.bindKeyDownListener.bind( this ),
+               blur: this.unbindKeyDownListener.bind( this )
+       } );
+
        // Initialization
        this.$element.addClass( 'oo-ui-buttonSelectWidget' );
 };
@@ -12523,6 +13186,7 @@ OO.ui.ButtonSelectWidget = function OoUiButtonSelectWidget( config ) {
 /* Setup */
 
 OO.inheritClass( OO.ui.ButtonSelectWidget, OO.ui.SelectWidget );
+OO.mixinClass( OO.ui.ButtonSelectWidget, OO.ui.TabIndexedElement );
 
 /**
  * Select widget containing radio button options.
@@ -12531,6 +13195,7 @@ OO.inheritClass( OO.ui.ButtonSelectWidget, OO.ui.SelectWidget );
  *
  * @class
  * @extends OO.ui.SelectWidget
+ * @mixins OO.ui.TabIndexedElement
  *
  * @constructor
  * @param {Object} [config] Configuration options
@@ -12539,6 +13204,15 @@ OO.ui.RadioSelectWidget = function OoUiRadioSelectWidget( config ) {
        // Parent constructor
        OO.ui.RadioSelectWidget.super.call( this, config );
 
+       // Mixin constructors
+       OO.ui.TabIndexedElement.call( this, config );
+
+       // Events
+       this.$element.on( {
+               focus: this.bindKeyDownListener.bind( this ),
+               blur: this.unbindKeyDownListener.bind( this )
+       } );
+
        // Initialization
        this.$element.addClass( 'oo-ui-radioSelectWidget' );
 };
@@ -12546,6 +13220,7 @@ OO.ui.RadioSelectWidget = function OoUiRadioSelectWidget( config ) {
 /* Setup */
 
 OO.inheritClass( OO.ui.RadioSelectWidget, OO.ui.SelectWidget );
+OO.mixinClass( OO.ui.RadioSelectWidget, OO.ui.TabIndexedElement );
 
 /**
  * Overlaid menu of options.
@@ -12561,7 +13236,7 @@ OO.inheritClass( OO.ui.RadioSelectWidget, OO.ui.SelectWidget );
  *
  * @constructor
  * @param {Object} [config] Configuration options
- * @cfg {OO.ui.InputWidget} [input] Input to bind keyboard handlers to
+ * @cfg {OO.ui.TextInputWidget} [input] Input to bind keyboard handlers to
  * @cfg {OO.ui.Widget} [widget] Widget to bind mouse handlers to
  * @cfg {boolean} [autoHide=true] Hide the menu when the mouse is pressed outside the menu
  */
@@ -12576,22 +13251,22 @@ OO.ui.MenuSelectWidget = function OoUiMenuSelectWidget( config ) {
        OO.ui.ClippableElement.call( this, $.extend( {}, config, { $clippable: this.$group } ) );
 
        // Properties
-       this.flashing = false;
-       this.visible = false;
        this.newItems = null;
        this.autoHide = config.autoHide === undefined || !!config.autoHide;
        this.$input = config.input ? config.input.$input : null;
        this.$widget = config.widget ? config.widget.$element : null;
-       this.$previousFocus = null;
-       this.isolated = !config.input;
-       this.onKeyDownHandler = this.onKeyDown.bind( this );
        this.onDocumentMouseDownHandler = this.onDocumentMouseDown.bind( this );
 
        // Initialization
        this.$element
-               .hide()
-               .attr( 'role', 'menu' )
-               .addClass( 'oo-ui-menuSelectWidget' );
+               .addClass( 'oo-ui-menuSelectWidget' )
+               .attr( 'role', 'menu' );
+
+       // Initially hidden - using #toggle may cause errors if subclasses override toggle with methods
+       // that reference properties not initialized at that time of parent class construction
+       // TODO: Find a better way to handle post-constructor setup
+       this.visible = false;
+       this.$element.addClass( 'oo-ui-element-hidden' );
 };
 
 /* Setup */
@@ -12608,109 +13283,80 @@ OO.mixinClass( OO.ui.MenuSelectWidget, OO.ui.ClippableElement );
  */
 OO.ui.MenuSelectWidget.prototype.onDocumentMouseDown = function ( e ) {
        if (
-               !OO.ui.contains( this.$element[0], e.target, true ) &&
-               ( !this.$widget || !OO.ui.contains( this.$widget[0], e.target, true ) )
+               !OO.ui.contains( this.$element[ 0 ], e.target, true ) &&
+               ( !this.$widget || !OO.ui.contains( this.$widget[ 0 ], e.target, true ) )
        ) {
                this.toggle( false );
        }
 };
 
 /**
- * Handles key down events.
- *
- * @param {jQuery.Event} e Key down event
+ * @inheritdoc
  */
 OO.ui.MenuSelectWidget.prototype.onKeyDown = function ( e ) {
-       var nextItem,
-               handled = false,
-               highlightItem = this.getHighlightedItem();
+       var currentItem = this.getHighlightedItem() || this.getSelectedItem();
 
        if ( !this.isDisabled() && this.isVisible() ) {
-               if ( !highlightItem ) {
-                       highlightItem = this.getSelectedItem();
-               }
                switch ( e.keyCode ) {
-                       case OO.ui.Keys.ENTER:
-                               this.chooseItem( highlightItem );
-                               handled = true;
-                               break;
-                       case OO.ui.Keys.UP:
-                               nextItem = this.getRelativeSelectableItem( highlightItem, -1 );
-                               handled = true;
-                               break;
-                       case OO.ui.Keys.DOWN:
-                               nextItem = this.getRelativeSelectableItem( highlightItem, 1 );
-                               handled = true;
+                       case OO.ui.Keys.LEFT:
+                       case OO.ui.Keys.RIGHT:
+                               // Do nothing if a text field is associated, arrow keys will be handled natively
+                               if ( !this.$input ) {
+                                       OO.ui.MenuSelectWidget.super.prototype.onKeyDown.call( this, e );
+                               }
                                break;
                        case OO.ui.Keys.ESCAPE:
-                               if ( highlightItem ) {
-                                       highlightItem.setHighlighted( false );
+                       case OO.ui.Keys.TAB:
+                               if ( currentItem ) {
+                                       currentItem.setHighlighted( false );
                                }
                                this.toggle( false );
-                               handled = true;
+                               // Don't prevent tabbing away, prevent defocusing
+                               if ( e.keyCode === OO.ui.Keys.ESCAPE ) {
+                                       e.preventDefault();
+                                       e.stopPropagation();
+                               }
                                break;
-               }
-
-               if ( nextItem ) {
-                       this.highlightItem( nextItem );
-                       nextItem.scrollElementIntoView();
-               }
-
-               if ( handled ) {
-                       e.preventDefault();
-                       e.stopPropagation();
-                       return false;
+                       default:
+                               OO.ui.MenuSelectWidget.super.prototype.onKeyDown.call( this, e );
+                               return;
                }
        }
 };
 
 /**
- * Bind key down listener.
+ * @inheritdoc
  */
 OO.ui.MenuSelectWidget.prototype.bindKeyDownListener = function () {
        if ( this.$input ) {
                this.$input.on( 'keydown', this.onKeyDownHandler );
        } else {
-               // Capture menu navigation keys
-               this.getElementWindow().addEventListener( 'keydown', this.onKeyDownHandler, true );
+               OO.ui.MenuSelectWidget.super.prototype.bindKeyDownListener.call( this );
        }
 };
 
 /**
- * Unbind key down listener.
+ * @inheritdoc
  */
 OO.ui.MenuSelectWidget.prototype.unbindKeyDownListener = function () {
        if ( this.$input ) {
-               this.$input.off( 'keydown' );
+               this.$input.off( 'keydown', this.onKeyDownHandler );
        } else {
-               this.getElementWindow().removeEventListener( 'keydown', this.onKeyDownHandler, true );
+               OO.ui.MenuSelectWidget.super.prototype.unbindKeyDownListener.call( this );
        }
 };
 
 /**
  * Choose an item.
  *
- * This will close the menu when done, unlike selectItem which only changes selection.
+ * This will close the menu, unlike #selectItem which only changes selection.
  *
  * @param {OO.ui.OptionWidget} item Item to choose
  * @chainable
  */
 OO.ui.MenuSelectWidget.prototype.chooseItem = function ( item ) {
-       var widget = this;
-
-       // Parent method
        OO.ui.MenuSelectWidget.super.prototype.chooseItem.call( this, item );
-
-       if ( item && !this.flashing ) {
-               this.flashing = true;
-               item.flash().done( function () {
-                       widget.toggle( false );
-                       widget.flashing = false;
-               } );
-       } else {
-               this.toggle( false );
-       }
-
+       this.toggle( false );
        return this;
 };
 
@@ -12729,7 +13375,7 @@ OO.ui.MenuSelectWidget.prototype.addItems = function ( items, index ) {
        }
 
        for ( i = 0, len = items.length; i < len; i++ ) {
-               item = items[i];
+               item = items[ i ];
                if ( this.isVisible() ) {
                        // Defer fitting label until item has been attached
                        item.fitLabel();
@@ -12777,9 +13423,7 @@ OO.ui.MenuSelectWidget.prototype.toggle = function ( visible ) {
        visible = ( visible === undefined ? !this.visible : !!visible ) && !!this.items.length;
 
        var i, len,
-               change = visible !== this.isVisible(),
-               elementDoc = this.getElementDocument(),
-               widgetDoc = this.$widget ? this.$widget[0].ownerDocument : null;
+               change = visible !== this.isVisible();
 
        // Parent method
        OO.ui.MenuSelectWidget.super.prototype.toggle.call( this, visible );
@@ -12788,14 +13432,9 @@ OO.ui.MenuSelectWidget.prototype.toggle = function ( visible ) {
                if ( visible ) {
                        this.bindKeyDownListener();
 
-                       // Change focus to enable keyboard navigation
-                       if ( this.isolated && this.$input && !this.$input.is( ':focus' ) ) {
-                               this.$previousFocus = this.$( ':focus' );
-                               this.$input[0].focus();
-                       }
                        if ( this.newItems && this.newItems.length ) {
                                for ( i = 0, len = this.newItems.length; i < len; i++ ) {
-                                       this.newItems[i].fitLabel();
+                                       this.newItems[ i ].fitLabel();
                                }
                                this.newItems = null;
                        }
@@ -12803,31 +13442,15 @@ OO.ui.MenuSelectWidget.prototype.toggle = function ( visible ) {
 
                        // Auto-hide
                        if ( this.autoHide ) {
-                               elementDoc.addEventListener(
+                               this.getElementDocument().addEventListener(
                                        'mousedown', this.onDocumentMouseDownHandler, true
                                );
-                               // Support $widget being in a different document
-                               if ( widgetDoc && widgetDoc !== elementDoc ) {
-                                       widgetDoc.addEventListener(
-                                               'mousedown', this.onDocumentMouseDownHandler, true
-                                       );
-                               }
                        }
                } else {
                        this.unbindKeyDownListener();
-                       if ( this.isolated && this.$previousFocus ) {
-                               this.$previousFocus[0].focus();
-                               this.$previousFocus = null;
-                       }
-                       elementDoc.removeEventListener(
+                       this.getElementDocument().removeEventListener(
                                'mousedown', this.onDocumentMouseDownHandler, true
                        );
-                       // Support $widget being in a different document
-                       if ( widgetDoc && widgetDoc !== elementDoc ) {
-                               widgetDoc.removeEventListener(
-                                       'mousedown', this.onDocumentMouseDownHandler, true
-                               );
-                       }
                        this.toggleClipping( false );
                }
        }
@@ -12838,9 +13461,8 @@ OO.ui.MenuSelectWidget.prototype.toggle = function ( visible ) {
 /**
  * Menu for a text input widget.
  *
- * This menu is specially designed to be positioned beneath the text input widget. Even if the input
- * is in a different frame, the menu's position is automatically calculated and maintained when the
- * menu is toggled or the window is resized.
+ * This menu is specially designed to be positioned beneath a text input widget. The menu's position
+ * is automatically calculated and maintained when the menu is toggled or the window is resized.
  *
  * @class
  * @extends OO.ui.MenuSelectWidget
@@ -12902,9 +13524,9 @@ OO.ui.TextInputMenuSelectWidget.prototype.toggle = function ( visible ) {
        if ( change ) {
                if ( this.isVisible() ) {
                        this.position();
-                       this.$( this.getElementWindow() ).on( 'resize', this.onWindowResizeHandler );
+                       $( this.getElementWindow() ).on( 'resize', this.onWindowResizeHandler );
                } else {
-                       this.$( this.getElementWindow() ).off( 'resize', this.onWindowResizeHandler );
+                       $( this.getElementWindow() ).off( 'resize', this.onWindowResizeHandler );
                }
        }
 
@@ -12939,17 +13561,24 @@ OO.ui.TextInputMenuSelectWidget.prototype.position = function () {
  *
  * @class
  * @extends OO.ui.SelectWidget
+ * @mixins OO.ui.TabIndexedElement
  *
  * @constructor
  * @param {Object} [config] Configuration options
  */
 OO.ui.OutlineSelectWidget = function OoUiOutlineSelectWidget( config ) {
-       // Configuration initialization
-       config = config || {};
-
        // Parent constructor
        OO.ui.OutlineSelectWidget.super.call( this, config );
 
+       // Mixin constructors
+       OO.ui.TabIndexedElement.call( this, config );
+
+       // Events
+       this.$element.on( {
+               focus: this.bindKeyDownListener.bind( this ),
+               blur: this.unbindKeyDownListener.bind( this )
+       } );
+
        // Initialization
        this.$element.addClass( 'oo-ui-outlineSelectWidget' );
 };
@@ -12957,6 +13586,7 @@ OO.ui.OutlineSelectWidget = function OoUiOutlineSelectWidget( config ) {
 /* Setup */
 
 OO.inheritClass( OO.ui.OutlineSelectWidget, OO.ui.SelectWidget );
+OO.mixinClass( OO.ui.OutlineSelectWidget, OO.ui.TabIndexedElement );
 
 /**
  * Switch that slides on and off.
@@ -12964,6 +13594,7 @@ OO.inheritClass( OO.ui.OutlineSelectWidget, OO.ui.SelectWidget );
  * @class
  * @extends OO.ui.Widget
  * @mixins OO.ui.ToggleWidget
+ * @mixins OO.ui.TabIndexedElement
  *
  * @constructor
  * @param {Object} [config] Configuration options
@@ -12975,22 +13606,27 @@ OO.ui.ToggleSwitchWidget = function OoUiToggleSwitchWidget( config ) {
 
        // Mixin constructors
        OO.ui.ToggleWidget.call( this, config );
+       OO.ui.TabIndexedElement.call( this, config );
 
        // Properties
        this.dragging = false;
        this.dragStart = null;
        this.sliding = false;
-       this.$glow = this.$( '<span>' );
-       this.$grip = this.$( '<span>' );
+       this.$glow = $( '<span>' );
+       this.$grip = $( '<span>' );
 
        // Events
-       this.$element.on( 'click', this.onClick.bind( this ) );
+       this.$element.on( {
+               click: this.onClick.bind( this ),
+               keypress: this.onKeyPress.bind( this )
+       } );
 
        // Initialization
        this.$glow.addClass( 'oo-ui-toggleSwitchWidget-glow' );
        this.$grip.addClass( 'oo-ui-toggleSwitchWidget-grip' );
        this.$element
                .addClass( 'oo-ui-toggleSwitchWidget' )
+               .attr( 'role', 'checkbox' )
                .append( this.$glow, this.$grip );
 };
 
@@ -12998,18 +13634,32 @@ OO.ui.ToggleSwitchWidget = function OoUiToggleSwitchWidget( config ) {
 
 OO.inheritClass( OO.ui.ToggleSwitchWidget, OO.ui.Widget );
 OO.mixinClass( OO.ui.ToggleSwitchWidget, OO.ui.ToggleWidget );
+OO.mixinClass( OO.ui.ToggleSwitchWidget, OO.ui.TabIndexedElement );
 
 /* Methods */
 
 /**
- * Handle mouse down events.
+ * Handle mouse click events.
  *
- * @param {jQuery.Event} e Mouse down event
+ * @param {jQuery.Event} e Mouse click event
  */
 OO.ui.ToggleSwitchWidget.prototype.onClick = function ( e ) {
        if ( !this.isDisabled() && e.which === 1 ) {
                this.setValue( !this.value );
        }
+       return false;
+};
+
+/**
+ * Handle key press events.
+ *
+ * @param {jQuery.Event} e Key press event
+ */
+OO.ui.ToggleSwitchWidget.prototype.onKeyPress = function ( e ) {
+       if ( !this.isDisabled() && ( e.which === OO.ui.Keys.SPACE || e.which === OO.ui.Keys.ENTER ) ) {
+               this.setValue( !this.value );
+       }
+       return false;
 };
 
 }( OO ) );
index 398ea8b..0b61721 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs v1.1.3 optimised for jQuery
+ * OOjs v1.1.4 optimised for jQuery
  * https://www.mediawiki.org/wiki/OOjs
  *
- * 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-11-17T19:17:29Z
+ * Date: 2015-01-23T20:11:25Z
  */
 ( function ( global ) {
 
@@ -170,7 +170,7 @@ oo.mixinClass = function ( targetFn, originFn ) {
  *
  * @param {Object} obj
  * @param {Mixed...} [keys]
- * @returns obj[arguments[1]][arguments[2]].... or undefined
+ * @return obj[arguments[1]][arguments[2]].... or undefined
  */
 oo.getProp = function ( obj ) {
        var i,
@@ -687,12 +687,15 @@ oo.isPlainObject = $.isPlainObject;
         * @return {boolean} If event was handled by at least one listener
         */
        oo.EventEmitter.prototype.emit = function ( event ) {
-               var i, len, binding, bindings, args, method;
+               var args = [],
+                       i, len, binding, bindings, method;
 
                if ( hasOwn.call( this.bindings, event ) ) {
                        // Slicing ensures that we don't get tripped up by event handlers that add/remove bindings
                        bindings = this.bindings[event].slice();
-                       args = Array.prototype.slice.call( arguments, 1 );
+                       for ( i = 1, len = arguments.length; i < len; i++ ) {
+                               args.push( arguments[i] );
+                       }
                        for ( i = 0, len = bindings.length; i < len; i++ ) {
                                binding = bindings[i];
                                if ( typeof binding.method === 'string' ) {
@@ -906,7 +909,8 @@ oo.Factory.prototype.register = function ( constructor ) {
  * @throws {Error} Unknown object name
  */
 oo.Factory.prototype.create = function ( name ) {
-       var args, obj,
+       var obj, i,
+               args = [],
                constructor = this.lookup( name );
 
        if ( !constructor ) {
@@ -914,7 +918,9 @@ oo.Factory.prototype.create = function ( name ) {
        }
 
        // Convert arguments to array and shift the first argument (name) off
-       args = Array.prototype.slice.call( arguments, 1 );
+       for ( i = 1; i < arguments.length; i++ ) {
+               args.push( arguments[i] );
+       }
 
        // We can't use the "new" operator with .apply directly because apply needs a
        // context. So instead just do what "new" does: create an object that inherits from
diff --git a/resources/lib/qunitjs/qunit.css b/resources/lib/qunitjs/qunit.css
new file mode 100644 (file)
index 0000000..0eb0b01
--- /dev/null
@@ -0,0 +1,280 @@
+/*!
+ * QUnit 1.17.1
+ * http://qunitjs.com/
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: 2015-01-20T19:39Z
+ */
+
+/** Font Family and Sizes */
+
+#qunit-tests, #qunit-header, #qunit-banner, #qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult {
+       font-family: "Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial, sans-serif;
+}
+
+#qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult, #qunit-tests li { font-size: small; }
+#qunit-tests { font-size: smaller; }
+
+
+/** Resets */
+
+#qunit-tests, #qunit-header, #qunit-banner, #qunit-userAgent, #qunit-testresult, #qunit-modulefilter {
+       margin: 0;
+       padding: 0;
+}
+
+
+/** Header */
+
+#qunit-header {
+       padding: 0.5em 0 0.5em 1em;
+
+       color: #8699A4;
+       background-color: #0D3349;
+
+       font-size: 1.5em;
+       line-height: 1em;
+       font-weight: 400;
+
+       border-radius: 5px 5px 0 0;
+}
+
+#qunit-header a {
+       text-decoration: none;
+       color: #C2CCD1;
+}
+
+#qunit-header a:hover,
+#qunit-header a:focus {
+       color: #FFF;
+}
+
+#qunit-testrunner-toolbar label {
+       display: inline-block;
+       padding: 0 0.5em 0 0.1em;
+}
+
+#qunit-banner {
+       height: 5px;
+}
+
+#qunit-testrunner-toolbar {
+       padding: 0.5em 1em 0.5em 1em;
+       color: #5E740B;
+       background-color: #EEE;
+       overflow: hidden;
+}
+
+#qunit-userAgent {
+       padding: 0.5em 1em 0.5em 1em;
+       background-color: #2B81AF;
+       color: #FFF;
+       text-shadow: rgba(0, 0, 0, 0.5) 2px 2px 1px;
+}
+
+#qunit-modulefilter-container {
+       float: right;
+       padding: 0.2em;
+}
+
+.qunit-url-config {
+       display: inline-block;
+       padding: 0.1em;
+}
+
+.qunit-filter {
+       display: block;
+       float: right;
+       margin-left: 1em;
+}
+
+/** Tests: Pass/Fail */
+
+#qunit-tests {
+       list-style-position: inside;
+}
+
+#qunit-tests li {
+       padding: 0.4em 1em 0.4em 1em;
+       border-bottom: 1px solid #FFF;
+       list-style-position: inside;
+}
+
+#qunit-tests > li {
+       display: none;
+}
+
+#qunit-tests li.running,
+#qunit-tests li.pass,
+#qunit-tests li.fail,
+#qunit-tests li.skipped {
+       display: list-item;
+}
+
+#qunit-tests.hidepass li.running,
+#qunit-tests.hidepass li.pass {
+       display: none;
+}
+
+#qunit-tests li strong {
+       cursor: pointer;
+}
+
+#qunit-tests li.skipped strong {
+       cursor: default;
+}
+
+#qunit-tests li a {
+       padding: 0.5em;
+       color: #C2CCD1;
+       text-decoration: none;
+}
+#qunit-tests li a:hover,
+#qunit-tests li a:focus {
+       color: #000;
+}
+
+#qunit-tests li .runtime {
+       float: right;
+       font-size: smaller;
+}
+
+.qunit-assert-list {
+       margin-top: 0.5em;
+       padding: 0.5em;
+
+       background-color: #FFF;
+
+       border-radius: 5px;
+}
+
+.qunit-collapsed {
+       display: none;
+}
+
+#qunit-tests table {
+       border-collapse: collapse;
+       margin-top: 0.2em;
+}
+
+#qunit-tests th {
+       text-align: right;
+       vertical-align: top;
+       padding: 0 0.5em 0 0;
+}
+
+#qunit-tests td {
+       vertical-align: top;
+}
+
+#qunit-tests pre {
+       margin: 0;
+       white-space: pre-wrap;
+       word-wrap: break-word;
+}
+
+#qunit-tests del {
+       background-color: #E0F2BE;
+       color: #374E0C;
+       text-decoration: none;
+}
+
+#qunit-tests ins {
+       background-color: #FFCACA;
+       color: #500;
+       text-decoration: none;
+}
+
+/*** Test Counts */
+
+#qunit-tests b.counts                       { color: #000; }
+#qunit-tests b.passed                       { color: #5E740B; }
+#qunit-tests b.failed                       { color: #710909; }
+
+#qunit-tests li li {
+       padding: 5px;
+       background-color: #FFF;
+       border-bottom: none;
+       list-style-position: inside;
+}
+
+/*** Passing Styles */
+
+#qunit-tests li li.pass {
+       color: #3C510C;
+       background-color: #FFF;
+       border-left: 10px solid #C6E746;
+}
+
+#qunit-tests .pass                          { color: #528CE0; background-color: #D2E0E6; }
+#qunit-tests .pass .test-name               { color: #366097; }
+
+#qunit-tests .pass .test-actual,
+#qunit-tests .pass .test-expected           { color: #999; }
+
+#qunit-banner.qunit-pass                    { background-color: #C6E746; }
+
+/*** Failing Styles */
+
+#qunit-tests li li.fail {
+       color: #710909;
+       background-color: #FFF;
+       border-left: 10px solid #EE5757;
+       white-space: pre;
+}
+
+#qunit-tests > li:last-child {
+       border-radius: 0 0 5px 5px;
+}
+
+#qunit-tests .fail                          { color: #000; background-color: #EE5757; }
+#qunit-tests .fail .test-name,
+#qunit-tests .fail .module-name             { color: #000; }
+
+#qunit-tests .fail .test-actual             { color: #EE5757; }
+#qunit-tests .fail .test-expected           { color: #008000; }
+
+#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 1em 0.5em 1em;
+
+       color: #2B81AF;
+       background-color: #D2E0E6;
+
+       border-bottom: 1px solid #FFF;
+}
+#qunit-testresult .module-name {
+       font-weight: 700;
+}
+
+/** Fixture */
+
+#qunit-fixture {
+       position: absolute;
+       top: -10000px;
+       left: -10000px;
+       width: 1000px;
+       height: 1000px;
+}
diff --git a/resources/lib/qunitjs/qunit.js b/resources/lib/qunitjs/qunit.js
new file mode 100644 (file)
index 0000000..006ca47
--- /dev/null
@@ -0,0 +1,2875 @@
+/*!
+ * QUnit 1.17.1
+ * http://qunitjs.com/
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: 2015-01-20T19:39Z
+ */
+
+(function( window ) {
+
+var QUnit,
+       config,
+       onErrorFnPrev,
+       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: 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 ) {
+                               return false;
+                       }
+               }())
+       },
+       /**
+        * Provides a normalized error string, correcting an issue
+        * with IE 7 (and prior) where Error.prototype.toString is
+        * not properly implemented
+        *
+        * Based on http://es5.github.com/#x15.11.4.4
+        *
+        * @param {String|Error} error
+        * @return {String} error message
+        */
+       errorString = function( error ) {
+               var name, message,
+                       errorString = error.toString();
+               if ( errorString.substring( 0, 7 ) === "[object" ) {
+                       name = error.name ? error.name.toString() : "Error";
+                       message = error.message ? error.message.toString() : "";
+                       if ( name && message ) {
+                               return name + ": " + message;
+                       } else if ( name ) {
+                               return name;
+                       } else if ( message ) {
+                               return message;
+                       } else {
+                               return "Error";
+                       }
+               } else {
+                       return errorString;
+               }
+       },
+       /**
+        * Makes a clone of an object using only Array or Object as base,
+        * and copies over the own enumerable properties.
+        *
+        * @param {Object} obj
+        * @return {Object} New object with only the own properties (recursively).
+        */
+       objectValues = function( obj ) {
+               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;
+                       }
+               }
+               return vals;
+       };
+
+QUnit = {};
+
+/**
+ * Config object: Maintain internal state
+ * Later exposed as QUnit.config
+ * `config` initialized at top of scope
+ */
+config = {
+       // The queue of tests to run
+       queue: [],
+
+       // block until document ready
+       blocking: true,
+
+       // by default, run previously failed tests first
+       // very useful in combination with "Hide passed tests" checked
+       reorder: true,
+
+       // by default, modify document.title when suite is done
+       altertitle: true,
+
+       // by default, scroll to top of the page when suite is done
+       scrolltop: true,
+
+       // when enabled, all tests must call expect()
+       requireExpects: false,
+
+       // add checkboxes that are persisted in the query-string
+       // when enabled, the id is set to `true` as a `QUnit.config` property
+       urlConfig: [
+               {
+                       id: "hidepassed",
+                       label: "Hide passed tests",
+                       tooltip: "Only show tests and assertions that fail. Stored as query-strings."
+               },
+               {
+                       id: "noglobals",
+                       label: "Check for Globals",
+                       tooltip: "Enabling this will test if any test introduces new properties on the " +
+                               "`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."
+               }
+       ],
+
+       // Set of all modules.
+       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,
+               location = window.location || { search: "", protocol: "file:" },
+               params = location.search.slice( 1 ).split( "&" ),
+               length = params.length,
+               urlParams = {};
+
+       if ( params[ 0 ] ) {
+               for ( i = 0; i < length; i++ ) {
+                       current = params[ i ].split( "=" );
+                       current[ 0 ] = decodeURIComponent( current[ 0 ] );
+
+                       // allow just a key to turn on a flag, e.g., test.html?noglobals
+                       current[ 1 ] = current[ 1 ] ? decodeURIComponent( current[ 1 ] ) : true;
+                       if ( urlParams[ current[ 0 ] ] ) {
+                               urlParams[ current[ 0 ] ] = [].concat( urlParams[ current[ 0 ] ], current[ 1 ] );
+                       } else {
+                               urlParams[ current[ 0 ] ] = current[ 1 ];
+                       }
+               }
+       }
+
+       if ( urlParams.filter === true ) {
+               delete urlParams.filter;
+       }
+
+       QUnit.urlParams = urlParams;
+
+       // String search anywhere in moduleName+testName
+       config.filter = urlParams.filter;
+
+       config.testId = [];
+       if ( urlParams.testId ) {
+
+               // 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 ] );
+               }
+       }
+
+       // Figure out if we're running the tests from a server or not
+       QUnit.isLocal = location.protocol === "file:";
+}());
+
+// Root QUnit object.
+// `QUnit` initialized at top of scope
+extend( QUnit, {
+
+       // call on start of module test to prepend name to all tests
+       module: function( name, testEnvironment ) {
+               var currentModule = {
+                       name: name,
+                       testEnvironment: testEnvironment,
+                       tests: []
+               };
+
+               // 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;
+               }
+
+               config.modules.push( currentModule );
+               config.currentModule = currentModule;
+       },
+
+       // DEPRECATED: QUnit.asyncTest() will be removed in QUnit 2.0.
+       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;
+
+               if ( arguments.length === 2 ) {
+                       callback = expected;
+                       expected = null;
+               }
+
+               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;
+                       }
+
+                       // 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();
+       },
+
+       // 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;
+       },
+
+       objectType: function( obj ) {
+               if ( typeof obj === "undefined" ) {
+                       return "undefined";
+               }
+
+               // Consider: typeof null === object
+               if ( obj === null ) {
+                       return "null";
+               }
+
+               var match = toString.call( obj ).match( /^\[object\s(.*)\]$/ ),
+                       type = match && match[ 1 ] || "";
+
+               switch ( type ) {
+                       case "Number":
+                               if ( isNaN( obj ) ) {
+                                       return "nan";
+                               }
+                               return "number";
+                       case "String":
+                       case "Boolean":
+                       case "Array":
+                       case "Date":
+                       case "RegExp":
+                       case "Function":
+                               return type.toLowerCase();
+               }
+               if ( typeof obj === "object" ) {
+                       return "object";
+               }
+               return undefined;
+       },
+
+       extend: extend,
+
+       load: function() {
+               config.pageLoaded = true;
+
+               // Initialize the configuration options
+               extend( config, {
+                       stats: { all: 0, bad: 0 },
+                       moduleStats: { all: 0, bad: 0 },
+                       started: 0,
+                       updateRate: 1000,
+                       autostart: true,
+                       filter: ""
+               }, true );
+
+               config.blocking = false;
+
+               if ( config.autostart ) {
+                       resumeProcessing();
+               }
+       }
+});
+
+// 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."
+                               );
+                       }
+
+                       config.callbacks[ key ].push( callback );
+               };
+
+               // DEPRECATED: This will be removed on QUnit 2.0.0+
+               // Stores the registered functions allowing restoring
+               // at verifyLoggingCallbacks() if modified
+               loggingCallbacks[ key ] = loggingCallback;
+
+               return loggingCallback;
+       }
+
+       for ( i = 0, l = callbacks.length; i < l; i++ ) {
+               key = callbacks[ i ];
+
+               // Initialize key collection of logging callback
+               if ( QUnit.objectType( config.callbacks[ key ] ) === "undefined" ) {
+                       config.callbacks[ key ] = [];
+               }
+
+               QUnit[ key ] = registerLoggingCallback( key );
+       }
+})();
+
+// `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: true } ) );
+               }
+               return false;
+       }
+
+       return ret;
+};
+
+function done() {
+       var runtime, passed;
+
+       config.autorun = true;
+
+       // 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;
+
+       runtime = now() - config.started;
+       passed = config.stats.all - config.stats.bad;
+
+       runLoggingCallbacks( "done", {
+               failed: config.stats.bad,
+               passed: passed,
+               total: config.stats.all,
+               runtime: runtime
+       });
+}
+
+// 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;
+
+       var stack, include, i;
+
+       if ( e.stacktrace ) {
+
+               // Opera 12.x
+               return e.stacktrace.split( "\n" )[ offset + 3 ];
+       } else if ( e.stack ) {
+
+               // Firefox, Chrome, Safari 6+, IE10+, PhantomJS and Node
+               stack = e.stack.split( "\n" );
+               if ( /^error$/i.test( stack[ 0 ] ) ) {
+                       stack.shift();
+               }
+               if ( fileName ) {
+                       include = [];
+                       for ( i = offset; i < stack.length; i++ ) {
+                               if ( stack[ i ].indexOf( fileName ) !== -1 ) {
+                                       break;
+                               }
+                               include.push( stack[ i ] );
+                       }
+                       if ( include.length ) {
+                               return include.join( "\n" );
+                       }
+               }
+               return stack[ offset ];
+       } else if ( e.sourceURL ) {
+
+               // 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 ) {
+       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 ) {
+               process( last );
+       }
+}
+
+function process( last ) {
+       function next() {
+               process( last );
+       }
+       var start = now();
+       config.depth = ( config.depth || 0 ) + 1;
+
+       while ( config.queue.length && !config.blocking ) {
+               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 );
+                       break;
+               }
+       }
+       config.depth--;
+       if ( last && !config.blocking && !config.queue.length && config.depth === 0 ) {
+               done();
+       }
+}
+
+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 = [];
+
+       if ( config.noglobals ) {
+               for ( var key in window ) {
+                       if ( hasOwn.call( window, key ) ) {
+                               // in Opera sometimes DOM element ids show up here, ignore them
+                               if ( /^qunit-test-output/.test( key ) ) {
+                                       continue;
+                               }
+                               config.pollution.push( key );
+                       }
+               }
+       }
+}
+
+function checkPollution() {
+       var newGlobals,
+               deletedGlobals,
+               old = config.pollution;
+
+       saveGlobal();
+
+       newGlobals = diff( config.pollution, old );
+       if ( newGlobals.length > 0 ) {
+               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( ", " ) );
+       }
+}
+
+// returns a new Array with the elements that are in a but not in b
+function diff( a, b ) {
+       var i, j,
+               result = a.slice();
+
+       for ( i = 0; i < result.length; i++ ) {
+               for ( j = 0; j < b.length; j++ ) {
+                       if ( result[ i ] === b[ j ] ) {
+                               result.splice( i, 1 );
+                               i--;
+                               break;
+                       }
+               }
+       }
+       return result;
+}
+
+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 if ( !( undefOnly && typeof a[ prop ] !== "undefined" ) ) {
+                                       a[ prop ] = b[ prop ];
+                               }
+                       }
+               }
+       }
+
+       return a;
+}
+
+function runLoggingCallbacks( key, args ) {
+       var i, l, callbacks;
+
+       callbacks = config.callbacks[ key ];
+       for ( i = 0, l = callbacks.length; i < l; i++ ) {
+               callbacks[ i ]( args );
+       }
+}
+
+// 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;
+
+       for ( loggingCallback in loggingCallbacks ) {
+               if ( QUnit[ loggingCallback ] !== loggingCallbacks[ loggingCallback ] ) {
+
+                       userCallback = QUnit[ loggingCallback ];
+
+                       // Restore the callback function
+                       QUnit[ loggingCallback ] = loggingCallbacks[ loggingCallback ];
+
+                       // Assign the deprecated given callback
+                       QUnit[ loggingCallback ]( userCallback );
+
+                       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/"
+                               );
+                       }
+               }
+       }
+}
+
+// from jquery.js
+function inArray( elem, array ) {
+       if ( array.indexOf ) {
+               return array.indexOf( elem );
+       }
+
+       for ( var i = 0, length = array.length; i < length; i++ ) {
+               if ( array[ i ] === elem ) {
+                       return i;
+               }
+       }
+
+       return -1;
+}
+
+function Test( settings ) {
+       var i, l;
+
+       ++Test.count;
+
+       extend( this, settings );
+       this.assertions = [];
+       this.semaphore = 0;
+       this.usedAsync = false;
+       this.module = config.currentModule;
+       this.stack = sourceFromStacktrace( 3 );
+
+       // Register unique strings
+       for ( i = 0, l = this.module.tests; i < l.length; i++ ) {
+               if ( this.module.tests[ i ].name === this.testName ) {
+                       this.testName += " ";
+               }
+       }
+
+       this.testId = generateHash( this.module.name, this.testName );
+
+       this.module.tests.push({
+               name: this.testName,
+               testId: this.testId
+       });
+
+       if ( settings.skip ) {
+
+               // Skipped tests will fully ignore any sent callback
+               this.callback = function() {};
+               this.async = false;
+               this.expected = 0;
+       } else {
+               this.assert = new Assert( this );
+       }
+}
+
+Test.count = 0;
+
+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'.
+                               // Without this, reporters can get testStart before moduleStart  which is a problem.
+                               !hasOwn.call( config, "previousModule" )
+               ) {
+                       if ( hasOwn.call( 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
+                               });
+                       }
+                       config.previousModule = this.module;
+                       config.moduleStats = { all: 0, bad: 0, started: now() };
+                       runLoggingCallbacks( "moduleStart", {
+                               name: this.module.name,
+                               tests: this.module.tests
+                       });
+               }
+
+               config.current = this;
+
+               this.testEnvironment = extend( {}, this.module.testEnvironment );
+               delete this.testEnvironment.beforeEach;
+               delete this.testEnvironment.afterEach;
+
+               this.started = now();
+               runLoggingCallbacks( "testStart", {
+                       name: this.testName,
+                       module: this.module.name,
+                       testId: this.testId
+               });
+
+               if ( !config.pollution ) {
+                       saveGlobal();
+               }
+       },
+
+       run: function() {
+               var promise;
+
+               config.current = this;
+
+               if ( this.async ) {
+                       QUnit.stop();
+               }
+
+               this.callbackStarted = now();
+
+               if ( config.notrycatch ) {
+                       promise = this.callback.call( this.testEnvironment, this.assert );
+                       this.resolvePromise( promise );
+                       return;
+               }
+
+               try {
+                       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 ) );
+
+                       // else next test will carry the responsibility
+                       saveGlobal();
+
+                       // Restart the tests if they're blocking
+                       if ( config.blocking ) {
+                               QUnit.start();
+                       }
+               }
+       },
+
+       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;
+                       }
+                       try {
+                               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;
+               }
+
+               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 ) {
+                       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 ) {
+                       this.pushFailure( "Expected " + this.expected + " assertions, but " +
+                               this.assertions.length + " were run", this.stack );
+               } else if ( this.expected === null && !this.assertions.length ) {
+                       this.pushFailure( "Expected at least one assertion, but none were run - call " +
+                               "expect(0) to accept zero assertions.", this.stack );
+               }
+
+               var i,
+                       bad = 0;
+
+               this.runtime = now() - this.started;
+               config.stats.all += this.assertions.length;
+               config.moduleStats.all += this.assertions.length;
+
+               for ( i = 0; i < this.assertions.length; i++ ) {
+                       if ( !this.assertions[ i ].result ) {
+                               bad++;
+                               config.stats.bad++;
+                               config.moduleStats.bad++;
+                       }
+               }
+
+               runLoggingCallbacks( "testDone", {
+                       name: this.testName,
+                       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;
+       },
+
+       queue: function() {
+               var bad,
+                       test = this;
+
+               if ( !this.valid() ) {
+                       return;
+               }
+
+               function run() {
+
+                       // each of these can by async
+                       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.name + "-" + this.testName );
+
+               if ( bad ) {
+                       run();
+               } else {
+                       synchronize( run, true );
+               }
+       },
+
+       push: function( result, actual, expected, message ) {
+               var source,
+                       details = {
+                               module: this.module.name,
+                               name: this.testName,
+                               result: result,
+                               message: message,
+                               actual: actual,
+                               expected: expected,
+                               testId: this.testId,
+                               runtime: now() - this.started
+                       };
+
+               if ( !result ) {
+                       source = sourceFromStacktrace();
+
+                       if ( source ) {
+                               details.source = source;
+                       }
+               }
+
+               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,
+                       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.toLowerCase().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( "{0} bytes.", 2), "2 bytes.", "replaces {0} with next argument" );
+        */
+       equal: function( actual, expected, message ) {
+               /*jshint eqeqeq:false */
+               this.push( expected == actual, actual, expected, message );
+       },
+
+       /**
+        * @name notEqual
+        * @function
+        */
+       notEqual: function( actual, expected, message ) {
+               /*jshint eqeqeq:false */
+               this.push( expected != actual, actual, expected, message );
+       },
+
+       /**
+        * @name propEqual
+        * @function
+        */
+       propEqual: function( actual, expected, message ) {
+               actual = objectValues( actual );
+               expected = objectValues( expected );
+               this.push( QUnit.equiv( actual, expected ), actual, expected, message );
+       },
+
+       /**
+        * @name notPropEqual
+        * @function
+        */
+       notPropEqual: function( actual, expected, message ) {
+               actual = objectValues( actual );
+               expected = objectValues( expected );
+               this.push( !QUnit.equiv( actual, expected ), actual, expected, message );
+       },
+
+       /**
+        * @name deepEqual
+        * @function
+        */
+       deepEqual: function( actual, expected, message ) {
+               this.push( QUnit.equiv( actual, expected ), actual, expected, message );
+       },
+
+       /**
+        * @name notDeepEqual
+        * @function
+        */
+       notDeepEqual: function( actual, expected, message ) {
+               this.push( !QUnit.equiv( actual, expected ), actual, expected, message );
+       },
+
+       /**
+        * @name strictEqual
+        * @function
+        */
+       strictEqual: function( actual, expected, message ) {
+               this.push( expected === actual, actual, expected, message );
+       },
+
+       /**
+        * @name notStrictEqual
+        * @function
+        */
+       notStrictEqual: function( actual, expected, message ) {
+               this.push( expected !== actual, actual, expected, message );
+       },
+
+       "throws": function( block, expected, message ) {
+               var actual, expectedType,
+                       expectedOutput = expected,
+                       ok = false;
+
+               // 'expected' is optional unless doing string comparison
+               if ( message == null && typeof expected === "string" ) {
+                       message = expected;
+                       expected = null;
+               }
+
+               this.test.ignoreGlobalErrors = true;
+               try {
+                       block.call( this.test.testEnvironment );
+               } catch (e) {
+                       actual = e;
+               }
+               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 a regexp
+                       } else if ( expectedType === "regexp" ) {
+                               ok = expected.test( errorString( actual ) );
+
+                       // expected is a string
+                       } else if ( expectedType === "string" ) {
+                               ok = expected === errorString( actual );
+
+                       // expected is a constructor, maybe an Error constructor
+                       } else if ( expectedType === "function" && actual instanceof expected ) {
+                               ok = 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;
+                       }
+
+                       this.push( ok, actual, expectedOutput, message );
+               } else {
+                       this.test.pushFailure( message, null, "No exception was thrown." );
+               }
+       }
+};
+
+// 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>
+QUnit.equiv = (function() {
+
+       // Call the o related callback with the given arguments.
+       function bindCallbacks( o, callbacks, args ) {
+               var prop = QUnit.objectType( o );
+               if ( prop ) {
+                       if ( QUnit.objectType( callbacks[ prop ] ) === "function" ) {
+                               return callbacks[ prop ].apply( callbacks, args );
+                       } else {
+                               return callbacks[ prop ]; // or undefined
+                       }
+               }
+       }
+
+       // 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, proto: true */
+                       return obj.__proto__;
+               },
+               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;
+                                       // var j = new Number(1);
+                                       return a == b;
+                               } else {
+                                       return a === b;
+                               }
+                       }
+
+                       return {
+                               "string": useStrictEquality,
+                               "boolean": useStrictEquality,
+                               "number": useStrictEquality,
+                               "null": useStrictEquality,
+                               "undefined": useStrictEquality,
+
+                               "nan": function( b ) {
+                                       return isNaN( b );
+                               },
+
+                               "date": function( b, a ) {
+                                       return QUnit.objectType( b ) === "date" && a.valueOf() === b.valueOf();
+                               },
+
+                               "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 &&
+                                               a.sticky === b.sticky;
+                               },
+
+                               // - skip when the property is a method of an instance (OOP)
+                               // - abort otherwise,
+                               // initial === would have catch identical references anyway
+                               "function": function() {
+                                       var caller = callers[ callers.length - 1 ];
+                                       return caller !== Object && typeof caller !== "undefined";
+                               },
+
+                               "array": function( b, a ) {
+                                       var i, j, len, loop, aCircular, bCircular;
+
+                                       // b could be an object literal here
+                                       if ( QUnit.objectType( b ) !== "array" ) {
+                                               return false;
+                                       }
+
+                                       len = a.length;
+                                       if ( len !== b.length ) {
+                                               // safe and faster
+                                               return false;
+                                       }
+
+                                       // track reference to avoid circular references
+                                       parents.push( a );
+                                       parentsB.push( b );
+                                       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 ];
+                                                       if ( aCircular || bCircular ) {
+                                                               if ( a[ i ] === b[ i ] || aCircular && bCircular ) {
+                                                                       loop = true;
+                                                               } else {
+                                                                       parents.pop();
+                                                                       parentsB.pop();
+                                                                       return false;
+                                                               }
+                                                       }
+                                               }
+                                               if ( !loop && !innerEquiv( a[ i ], b[ i ] ) ) {
+                                                       parents.pop();
+                                                       parentsB.pop();
+                                                       return false;
+                                               }
+                                       }
+                                       parents.pop();
+                                       parentsB.pop();
+                                       return true;
+                               },
+
+                               "object": function( b, a ) {
+
+                                       /*jshint forin:false */
+                                       var i, j, loop, aCircular, bCircular,
+                                               // Default to true
+                                               eq = true,
+                                               aProperties = [],
+                                               bProperties = [];
+
+                                       // 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;
+                                               }
+                                       }
+
+                                       // stack constructor before traversing properties
+                                       callers.push( a.constructor );
+
+                                       // track reference to avoid circular references
+                                       parents.push( a );
+                                       parentsB.push( b );
+
+                                       // be strict: don't ensure hasOwnProperty and go deep
+                                       for ( i in a ) {
+                                               loop = false;
+                                               for ( j = 0; j < parents.length; j++ ) {
+                                                       aCircular = parents[ j ] === a[ i ];
+                                                       bCircular = parentsB[ j ] === b[ i ];
+                                                       if ( aCircular || bCircular ) {
+                                                               if ( a[ i ] === b[ i ] || aCircular && bCircular ) {
+                                                                       loop = true;
+                                                               } else {
+                                                                       eq = false;
+                                                                       break;
+                                                               }
+                                                       }
+                                               }
+                                               aProperties.push( i );
+                                               if ( !loop && !innerEquiv( a[ i ], b[ i ] ) ) {
+                                                       eq = false;
+                                                       break;
+                                               }
+                                       }
+
+                                       parents.pop();
+                                       parentsB.pop();
+                                       callers.pop(); // unstack, we are done
+
+                                       for ( i in b ) {
+                                               bProperties.push( i ); // collect b's properties
+                                       }
+
+                                       // Ensures identical properties name
+                                       return eq && innerEquiv( aProperties.sort(), bProperties.sort() );
+                               }
+                       };
+               }());
+
+       innerEquiv = function() { // can take multiple arguments
+               var args = [].slice.apply( arguments );
+               if ( args.length < 2 ) {
+                       return true; // end transition
+               }
+
+               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 ) ) {
+
+                               // 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 ) ) );
+       };
+
+       return innerEquiv;
+}());
+
+// 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, "\\\"" ) + "\"";
+       }
+       function literal( o ) {
+               return o + "";
+       }
+       function join( pre, arr, post ) {
+               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 );
+       }
+       function array( arr, stack ) {
+               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 );
+               }
+               this.down();
+               return join( "[", ret, "]" );
+       }
+
+       var reName = /^function (\w+)/,
+               dump = {
+
+                       // 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 ) + ")";
+                               }
+
+                               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 ( parserType === "string" ) ? parser : this.parsers.error;
+                       },
+                       typeOf: function( obj ) {
+                               var type;
+                               if ( obj === null ) {
+                                       type = "null";
+                               } else if ( typeof obj === "undefined" ) {
+                                       type = "undefined";
+                               } else if ( QUnit.is( "regexp", obj ) ) {
+                                       type = "regexp";
+                               } else if ( QUnit.is( "date", obj ) ) {
+                                       type = "date";
+                               } else if ( QUnit.is( "function", obj ) ) {
+                                       type = "function";
+                               } 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" && 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 ) {
+                                       type = "error";
+                               } else {
+                                       type = typeof obj;
+                               }
+                               return type;
+                       },
+                       separator: function() {
+                               return this.multiline ? this.HTML ? "<br />" : "\n" : this.HTML ? "&#160;" : " ";
+                       },
+                       // extra can be a number, shortcut for increasing-calling-decreasing
+                       indent: function( extra ) {
+                               if ( !this.multiline ) {
+                                       return "";
+                               }
+                               var chr = this.indentChar;
+                               if ( this.HTML ) {
+                                       chr = chr.replace( /\t/g, "   " ).replace( / /g, "&#160;" );
+                               }
+                               return new Array( this.depth + ( extra || 0 ) ).join( chr );
+                       },
+                       up: function( a ) {
+                               this.depth += a || 1;
+                       },
+                       down: function( a ) {
+                               this.depth -= a || 1;
+                       },
+                       setParser: function( name, parser ) {
+                               this.parsers[ name ] = parser;
+                       },
+                       // The next 3 are exposed so you can use them
+                       quote: quote,
+                       literal: literal,
+                       join: join,
+                       //
+                       depth: 1,
+                       maxDepth: 5,
+
+                       // This is the list of parsers, to modify them, use dump.setParser
+                       parsers: {
+                               window: "[Window]",
+                               document: "[Document]",
+                               error: function( error ) {
+                                       return "Error(\"" + error.message + "\")";
+                               },
+                               unknown: "[Unknown]",
+                               "null": "null",
+                               "undefined": "undefined",
+                               "function": function( fn ) {
+                                       var ret = "function",
+
+                                               // functions never have name in IE
+                                               name = "name" in fn ? fn.name : ( reName.exec( fn ) || [] )[ 1 ];
+
+                                       if ( name ) {
+                                               ret += " " + name;
+                                       }
+                                       ret += "( ";
+
+                                       ret = [ ret, dump.parse( fn, "functionArgs" ), "){" ].join( "" );
+                                       return join( ret, dump.parse( fn, "functionCode" ), "}" );
+                               },
+                               array: array,
+                               nodelist: array,
+                               "arguments": array,
+                               object: function( map, stack ) {
+                                       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( dump.parse( key, "key" ) + ": " +
+                                                       dump.parse( val, undefined, stack ) );
+                                       }
+                                       dump.down();
+                                       return join( "{", ret, "}" );
+                               },
+                               node: function( node ) {
+                                       var len, i, val,
+                                               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".
+                                                       if ( val && val !== "inherit" ) {
+                                                               ret += " " + attrs[ i ].nodeName + "=" +
+                                                                       dump.parse( val, "attribute" );
+                                                       }
+                                               }
+                                       }
+                                       ret += close;
+
+                                       // Show content of TextNode or CDATASection
+                                       if ( node.nodeType === 3 || node.nodeType === 4 ) {
+                                               ret += node.nodeValue;
+                                       }
+
+                                       return ret + open + "/" + tag + close;
+                               },
+
+                               // function calls it internally, it's the arguments part of the function
+                               functionArgs: function( fn ) {
+                                       var args,
+                                               l = fn.length;
+
+                                       if ( !l ) {
+                                               return "";
+                                       }
+
+                                       args = new Array( l );
+                                       while ( l-- ) {
+
+                                               // 97 is 'a'
+                                               args[ l ] = String.fromCharCode( 97 + l );
+                                       }
+                                       return " " + args.join( ", " ) + " ";
+                               },
+                               // object calls it internally, the key part of an item in a map
+                               key: quote,
+                               // function calls it internally, it's the content of the function
+                               functionCode: "[code]",
+                               // node calls it internally, it's an html attribute value
+                               attribute: quote,
+                               string: quote,
+                               date: quote,
+                               regexp: literal,
+                               number: literal,
+                               "boolean": literal
+                       },
+                       // if true, entities are escaped ( <, >, \t, space and \n )
+                       HTML: false,
+                       // indentation unit
+                       indentChar: "  ",
+                       // if true, items in a collection, are separated by a \n, else just a space.
+                       multiline: true
+               };
+
+       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 && module.exports ) {
+       module.exports = QUnit;
+
+       // For consistency with CommonJS environments' exports
+       module.exports.QUnit = QUnit;
+}
+
+// For CommonJS with exports, but without module.exports, like Rhino
+if ( typeof exports !== "undefined" && exports ) {
+       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/)
+ *  Modified by Chu Alan "sprite"
+ *
+ * Released under the MIT license.
+ *
+ * More Info:
+ *  http://ejohn.org/projects/javascript-diff-algorithm/
+ *
+ * Usage: QUnit.diff(expected, actual)
+ *
+ * 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,
+                       ns = {},
+                       os = {};
+
+               for ( i = 0; i < n.length; i++ ) {
+                       if ( !hasOwn.call( ns, n[ i ] ) ) {
+                               ns[ n[ i ] ] = {
+                                       rows: [],
+                                       o: null
+                               };
+                       }
+                       ns[ n[ i ] ].rows.push( i );
+               }
+
+               for ( i = 0; i < o.length; i++ ) {
+                       if ( !hasOwn.call( os, o[ i ] ) ) {
+                               os[ o[ i ] ] = {
+                                       rows: [],
+                                       n: null
+                               };
+                       }
+                       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 ]
+                                       };
+                                       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 ] ) {
+
+                               n[ i + 1 ] = {
+                                       text: n[ i + 1 ],
+                                       row: 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 ] ) {
+
+                               n[ i - 1 ] = {
+                                       text: n[ i - 1 ],
+                                       row: n[ i ].row - 1
+                               };
+                               o[ n[ i ].row - 1 ] = {
+                                       text: o[ n[ i ].row - 1 ],
+                                       row: i - 1
+                               };
+                       }
+               }
+
+               return {
+                       o: o,
+                       n: n
+               };
+       }
+
+       return function( o, n ) {
+               o = o.replace( /\s+$/, "" );
+               n = n.replace( /\s+$/, "" );
+
+               var i, pre,
+                       str = "",
+                       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 {
+                       oSpace.push( " " );
+               }
+
+               if ( nSpace == null ) {
+                       nSpace = [ " " ];
+               } else {
+                       nSpace.push( " " );
+               }
+
+               if ( out.n.length === 0 ) {
+                       for ( i = 0; i < out.o.length; i++ ) {
+                               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>";
+                               }
+                       }
+
+                       for ( i = 0; i < out.n.length; i++ ) {
+                               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>";
+                                       }
+                                       str += " " + out.n[ i ].text + nSpace[ i ] + pre;
+                               }
+                       }
+               }
+
+               return str;
+       };
+}());
+// jscs:enable
+
+(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;
+}
+
+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 ) {
+
+               // 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 );
+
+               if ( config[ val.id ] === undefined ) {
+                       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 = setUrl( 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 setUrl( params ) {
+       var key,
+               querystring = "?";
+
+       params = QUnit.extend( QUnit.extend( {}, QUnit.urlParams ), params );
+
+       for ( key in params ) {
+               if ( hasOwn.call( params, key ) ) {
+                       if ( params[ key ] === undefined ) {
+                               continue;
+                       }
+                       querystring += encodeURIComponent( key );
+                       if ( params[ key ] !== true ) {
+                               querystring += "=" + encodeURIComponent( params[ key ] );
+                       }
+                       querystring += "&";
+               }
+       }
+       return location.protocol + "//" + location.host +
+               location.pathname + querystring.slice( 0, -1 );
+}
+
+function applyUrlParams() {
+       var selectBox = id( "qunit-modulefilter" ),
+               selection = decodeURIComponent( selectBox.options[ selectBox.selectedIndex ].value ),
+               filter = id( "qunit-filter-input" ).value;
+
+       window.location = setUrl({
+               module: ( selection === "" ) ? undefined : selection,
+               filter: ( filter === "" ) ? undefined : filter,
+
+               // Remove testId filter
+               testId: undefined
+       });
+}
+
+function toolbarUrlConfigContainer() {
+       var urlConfigContainer = document.createElement( "span" );
+
+       urlConfigContainer.innerHTML = getUrlConfigHtml();
+       addClass( urlConfigContainer, "qunit-url-config" );
+
+       // For oldIE support:
+       // * Add handlers to the individual elements instead of the container
+       // * Use "click" instead of "change" for checkboxes
+       addEvents( urlConfigContainer.getElementsByTagName( "input" ), "click", toolbarChanged );
+       addEvents( urlConfigContainer.getElementsByTagName( "select" ), "change", toolbarChanged );
+
+       return urlConfigContainer;
+}
+
+function toolbarLooseFilter() {
+       var filter = document.createElement( "form" ),
+               label = document.createElement( "label" ),
+               input = document.createElement( "input" ),
+               button = document.createElement( "button" );
+
+       addClass( filter, "qunit-filter" );
+
+       label.innerHTML = "Filter: ";
+
+       input.type = "text";
+       input.value = config.filter || "";
+       input.name = "filter";
+       input.id = "qunit-filter-input";
+
+       button.innerHTML = "Go";
+
+       label.appendChild( input );
+
+       filter.appendChild( label );
+       filter.appendChild( button );
+       addEvent( filter, "submit", function( ev ) {
+               applyUrlParams();
+
+               if ( ev && ev.preventDefault ) {
+                       ev.preventDefault();
+               }
+
+               return false;
+       });
+
+       return filter;
+}
+
+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 ( !toolbar || !moduleFilterHtml ) {
+               return false;
+       }
+
+       moduleFilter.setAttribute( "id", "qunit-modulefilter-container" );
+       moduleFilter.innerHTML = moduleFilterHtml;
+
+       addEvent( moduleFilter.lastChild, "change", applyUrlParams );
+
+       toolbar.appendChild( moduleFilter );
+}
+
+function appendToolbar() {
+       var toolbar = id( "qunit-testrunner-toolbar" );
+
+       if ( toolbar ) {
+               toolbar.appendChild( toolbarUrlConfigContainer() );
+               toolbar.appendChild( toolbarLooseFilter() );
+       }
+}
+
+function appendHeader() {
+       var header = id( "qunit-header" );
+
+       if ( header ) {
+               header.innerHTML = "<a href='" +
+                       setUrl({ filter: undefined, module: undefined, testId: undefined }) +
+                       "'>" + header.innerHTML + "</a> ";
+       }
+}
+
+function appendBanner() {
+       var banner = id( "qunit-banner" );
+
+       if ( banner ) {
+               banner.className = "";
+       }
+}
+
+function appendTestResults() {
+       var tests = id( "qunit-tests" ),
+               result = id( "qunit-testresult" );
+
+       if ( result ) {
+               result.parentNode.removeChild( result );
+       }
+
+       if ( tests ) {
+               tests.innerHTML = "";
+               result = document.createElement( "p" );
+               result.id = "qunit-testresult";
+               result.className = "result";
+               tests.parentNode.insertBefore( result, tests );
+               result.innerHTML = "Running...<br />&#160;";
+       }
+}
+
+function storeFixture() {
+       var fixture = id( "qunit-fixture" );
+       if ( fixture ) {
+               config.fixture = fixture.innerHTML;
+       }
+}
+
+function appendUserAgent() {
+       var userAgent = id( "qunit-userAgent" );
+       if ( userAgent ) {
+               userAgent.innerHTML = "";
+               userAgent.appendChild( document.createTextNode( 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 = setUrl({ 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 ) {
+               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>";
+       }
+
+       appendHeader();
+       appendBanner();
+       appendTestResults();
+       appendUserAgent();
+       appendToolbar();
+       appendTestsList( details.modules );
+       toolbarModuleFilter();
+
+       if ( qunit && 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 ) {
+               testItem.className = "skipped";
+               skipped = document.createElement( "em" );
+               skipped.className = "qunit-skipped-label";
+               skipped.innerHTML = "skipped";
+               testItem.insertBefore( skipped, testTitle );
+       } else {
+               addEvent( testTitle, "click", function() {
+                       toggleClass( assertList, "qunit-collapsed" );
+               });
+
+               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 023b6e2..7773866 100644 (file)
@@ -45,7 +45,8 @@
        $.fn.badge = function ( text, inline, displayZero ) {
                var $badge = this.find( '.mw-badge' ),
                        badgeStyleClass = 'mw-badge-' + ( inline ? 'inline' : 'overlay' ),
-                       isImportant = true, displayBadge = true;
+                       isImportant = true,
+                       displayBadge = true;
 
                // If we're displaying zero, ensure style to be non-important
                if ( mw.language.convertNumber( text, true ) === 0 ) {
index 3796b0b..df0696f 100644 (file)
                                                }
                                        }
                                        // compare will be -1, 0 or 1, depending on comparison result
-                                       if ( !( eval( '' + compare + op + '0' ) ) ) {
+                                       if ( !( eval( String( compare + op + '0' ) ) ) ) {
                                                return false;
                                        }
                                } else if ( typeof val === 'number' ) {
index 339e65a..1ecce6c 100644 (file)
@@ -40,6 +40,8 @@
         * @param {string} [options.i18n.confirm] Text to use for the confirmation question.
         * @param {string} [options.i18n.yes] Text to use for the 'Yes' button.
         * @param {string} [options.i18n.no] Text to use for the 'No' button.
+        * @param {string} [options.i18n.yesTitle] Title text to use for the 'Yes' button.
+        * @param {string} [options.i18n.noTitle] Title text to use for the 'No' button.
         *
         * @chainable
         */
                                if ( options.handler ) {
                                        $buttonYes.on( options.events, options.handler );
                                }
+                               if ( options.i18n.yesTitle ) {
+                                       $buttonYes.attr( 'title', options.i18n.yesTitle );
+                               }
                                $buttonYes = options.buttonCallback( $buttonYes, 'yes' );
 
                                // Clone it without any events and prevent default action to represent the 'No' button.
                                                $interface.css( 'width', 0 );
                                                e.preventDefault();
                                        } );
+                               if ( options.i18n.noTitle ) {
+                                       $buttonNo.attr( 'title', options.i18n.noTitle );
+                               } else {
+                                       $buttonNo.removeAttr( 'title' );
+                               }
                                $buttonNo = options.buttonCallback( $buttonNo, 'no' );
 
                                // Prevent memory leaks
                        space: ' ',
                        confirm: 'Are you sure?',
                        yes: 'Yes',
-                       no: 'No'
+                       no: 'No',
+                       yesTitle: undefined,
+                       noTitle: undefined
                }
        };
 }( jQuery ) );
index d4a106e..daf23a9 100644 (file)
@@ -9,6 +9,8 @@
                space: mw.message( 'word-separator' ).text(),
                confirm: mw.message( 'confirmable-confirm', mw.user ).text(),
                yes: mw.message( 'confirmable-yes' ).text(),
-               no: mw.message( 'confirmable-no' ).text()
+               no: mw.message( 'confirmable-no' ).text(),
+               yesTitle: undefined,
+               noTitle: undefined
        };
 }( mediaWiki, jQuery ) );
index a2e2be5..64827fb 100644 (file)
@@ -3,7 +3,9 @@
  */
 
 function serializeControls( controls ) {
-       var i, data = {}, len = controls.length;
+       var i,
+               data = {},
+               len = controls.length;
 
        for ( i = 0; i < len; i++ ) {
                data[ controls[i].name ] = controls[i].value;
index 0f47150..2e5efba 100644 (file)
@@ -6,18 +6,38 @@
        -ms-user-select: none;
        user-select: none;
 }
+/* Align the toggle based on the direction of the content language */
+/* @noflip */
+.mw-content-ltr .mw-collapsible-toggle,
+.mw-content-rtl .mw-content-ltr .mw-collapsible-toggle {
+       float: right;
+}
+/* @noflip */
+.mw-content-rtl .mw-collapsible-toggle,
+.mw-content-ltr .mw-content-rtl .mw-collapsible-toggle {
+       float: left;
+}
+
 .mw-customtoggle,
 .mw-collapsible-toggle {
        cursor: pointer;
 }
 
 /* collapse links in captions should be inline */
-caption .mw-collapsible-toggle {
+caption .mw-collapsible-toggle,
+.mw-content-ltr caption .mw-collapsible-toggle,
+.mw-content-rtl caption .mw-collapsible-toggle,
+.mw-content-rtl .mw-content-ltr caption .mw-collapsible-toggle,
+.mw-content-ltr .mw-content-rtl caption .mw-collapsible-toggle {
        float: none;
 }
 
 /* list-items go as wide as their parent element, don't float them inside list items */
-li .mw-collapsible-toggle {
+li .mw-collapsible-toggle,
+.mw-content-ltr li .mw-collapsible-toggle,
+.mw-content-rtl li .mw-collapsible-toggle,
+.mw-content-rtl .mw-content-ltr li .mw-collapsible-toggle,
+.mw-content-ltr .mw-content-rtl li .mw-collapsible-toggle {
        float: none;
 }
 
index dc7aaa4..e6e33ad 100644 (file)
                        return str.charAt( 0 ).toUpperCase() + str.slice( 1 );
                },
                escapeRE: function ( str ) {
-                       return str.replace ( /([\\{}()|.?*+\-\^$\[\]])/g, '\\$1' );
+                       return str.replace( /([\\{}()|.?*+\-\^$\[\]])/g, '\\$1' );
                },
                isDomElement: function ( el ) {
                        return !!el && !!el.nodeType;
                },
                isEmpty: function ( v ) {
                        var key;
-                       if ( v === '' || v === 0 || v === '0' || v === null
-                               || v === false || v === undefined )
-                       {
+                       if (
+                               v === '' || v === 0 || v === '0' || v === null || v === false || v === undefined
+                       {
                                return true;
                        }
                        // the for-loop could potentially contain prototypes
index d458019..d50422e 100644 (file)
@@ -13,7 +13,7 @@
  * @version 2.1.0
  * @license MIT
  */
-(function ($) {
+( function ($) {
 
        var isInputSupported = 'placeholder' in document.createElement('input'),
                isTextareaSupported = 'placeholder' in document.createElement('textarea'),
@@ -49,7 +49,7 @@
 
                        $this
                                .filter((isInputSupported ? 'textarea' : ':input') + '[placeholder]')
-                               .filter(function () {
+                               .filter( function () {
                                        return !$(this).data('placeholder-enabled');
                                })
                                .bind({
                        propHooks.value = hooks;
                }
 
-               $(function () {
+               $( function () {
                        // Look for forms
                        $(document).delegate('form', 'submit.placeholder', function () {
                                // Clear the placeholder values so they don't get submitted
                                var $inputs = $('.placeholder', this).each(clearPlaceholder);
-                               setTimeout(function () {
+                               setTimeout( function () {
                                        $inputs.each(setPlaceholder);
                                }, 10);
                        });
 
                // Clear placeholder values upon page reload
                $(window).bind('beforeunload.placeholder', function () {
-                       $('.placeholder').each(function () {
+                       $('.placeholder').each( function () {
                                this.value = '';
                        });
                });
index 8e1c3f0..ff5ff0a 100644 (file)
 
                        clearTableBody: function ( table ) {
                                $( table.tBodies[0] ).empty();
+                       },
+
+                       getParser: function ( id ) {
+                               buildTransformTable();
+                               buildDateTable();
+                               cacheRegexs();
+                               buildCollationTable();
+
+                               return getParserById( id );
                        }
                };
 
                                        return '99999999';
                                }
                        } else if ( ( match = s.match( ts.dateRegex[1] ) ) !== null ) {
-                               s = [ match[3], '' + ts.monthNames[match[2]], match[1] ];
+                               s = [ match[3], String( ts.monthNames[match[2]] ), match[1] ];
                        } else if ( ( match = s.match( ts.dateRegex[2] ) ) !== null ) {
-                               s = [ match[3], '' + ts.monthNames[match[1]], match[2] ];
+                               s = [ match[3], String( ts.monthNames[match[1]] ), match[2] ];
                        } else {
                                // Should never get here
                                return '99999999';
index bd6518d..5111930 100644 (file)
                                                        endPos = this.selectionEnd;
                                                        scrollTop = this.scrollTop;
                                                        checkSelectedText();
-                                                       if ( options.selectionStart !== undefined
-                                                                       && endPos - startPos !== options.selectionEnd - options.selectionStart )
-                                                       {
+                                                       if (
+                                                               options.selectionStart !== undefined &&
+                                                               endPos - startPos !== options.selectionEnd - options.selectionStart
+                                                       ) {
                                                                // This means there is a difference in the selection range returned by browser and what we passed.
                                                                // This happens for Chrome in the case of composite characters. Ref bug #30130
                                                                // Set the startPos to the correct position.
 
                // Apply defaults
                switch ( command ) {
-                       //case 'getContents': // no params
-                       //case 'setContents': // no params with defaults
-                       //case 'getSelection': // no params
+                       // case 'getContents': // no params
+                       // case 'setContents': // no params with defaults
+                       // case 'getSelection': // no params
                        case 'encapsulateSelection':
                                options = $.extend( {
                                        pre: '', // Text to insert before the cursor/selection
index f6fab70..e4ccf2b 100644 (file)
                        $.extend( postData, {
                                pst: '',
                                preview: '',
-                               prop: 'text|displaytitle|modules|categorieshtml|templates|langlinks|limitreporthtml'
+                               prop: 'text|displaytitle|modules|categorieshtml|templates|langlinks|limitreporthtml',
+                               disableeditsection: true
                        } );
                        if ( section !== '' ) {
                                postData.sectionpreview = '';
                                                response.parse.modulemessages ) );
                                }
                                if ( response.parse.displaytitle ) {
-                                       $( '#firstHeading' ).html( '<span dir="auto">' + response.parse.displaytitle + '</span>' );
+                                       $( '#firstHeading' ).html( response.parse.displaytitle );
                                }
                                if ( response.parse.categorieshtml ) {
                                        $( '#catlinks' ).replaceWith( response.parse.categorieshtml['*'] );
index 2c8d2e6..9f786ec 100644 (file)
@@ -4,3 +4,13 @@
 table.collapsed tr.collapsable {
        display: none;
 }
+
+/*
+ * Exclude user interface elements from selection.
+ */
+.mw-metadata-show-hide-extended {
+       -moz-user-select: none;
+       -webkit-user-select: none;
+       -ms-user-select: none;
+       user-select: none;
+}
index 95ef62c..c008dfd 100644 (file)
@@ -76,4 +76,4 @@
                mw.cookie.set( cookieKey, null );
        }
 
-} ( mediaWiki, jQuery ) );
+}( mediaWiki, jQuery ) );
index ccbae06..2525792 100644 (file)
@@ -14,8 +14,7 @@
                 * @return {jQuery.Promise} See mw.Api#post
                 */
                login: function ( username, password ) {
-                       var params, request,
-                               deferred = $.Deferred(),
+                       var params, apiPromise, innerPromise,
                                api = this;
 
                        params = {
                                lgpassword: password
                        };
 
-                       request = api.post( params );
-                       request.fail( deferred.reject );
-                       request.done( function ( data ) {
-                               params.lgtoken = data.login.token;
-                               api.post( params )
-                                       .fail( deferred.reject )
-                                       .done( function ( data ) {
-                                               var code;
-                                               if ( data.login && data.login.result === 'Success' ) {
-                                                       deferred.resolve( data );
-                                               } else {
-                                                       // Set proper error code whenever possible
-                                                       code = data.error && data.error.code || 'unknown';
-                                                       deferred.reject( code, data );
-                                               }
-                                       } );
-                       } );
+                       apiPromise = api.post( params );
 
-                       return deferred.promise( { abort: request.abort } );
+                       return apiPromise
+                               .then( function ( data ) {
+                                       params.lgtoken = data.login.token;
+                                       innerPromise = api.post( params )
+                                               .then( function ( data ) {
+                                                       var code;
+                                                       if ( data.login.result !== 'Success' ) {
+                                                               // Set proper error code whenever possible
+                                                               code = data.error && data.error.code || 'unknown';
+                                                               return $.Deferred().reject( code, data );
+                                                       }
+                                                       return data;
+                                               } );
+                                       return innerPromise;
+                               } )
+                               .promise( {
+                                       abort: function () {
+                                               apiPromise.abort();
+                                               if ( innerPromise ) {
+                                                       innerPromise.abort();
+                                               }
+                                       }
+                               } );
                }
        } );
 
index 453a675..d9c2b06 100644 (file)
@@ -17,7 +17,7 @@ mediaWiki.language.convertGrammar = function ( word, form ) {
        if ( word.match( /wiki$/i ) ) {
                aou = false;
        }
-       //append i after final consonant
+       // append i after final consonant
        if ( word.match( /[bcdfghjklmnpqrstvwxz]$/i ) ) {
                word += 'i';
        }
index 2d6b733..2c0abd3 100644 (file)
@@ -14,6 +14,6 @@ mediaWiki.language.convertGrammar = function ( word, form ) {
                case 'lokatiw': // lokatiw
                        word = 'wo ' + word;
                        break;
-               }
+       }
        return word;
 };
index 9cae360..c4a1cf7 100644 (file)
@@ -24,6 +24,6 @@ mediaWiki.language.convertGrammar = function ( word, form ) {
                                word = word + 'ի';
                        }
                        break;
-               }
+       }
        return word;
 };
index 787be36..554e99d 100644 (file)
@@ -21,15 +21,14 @@ mediaWiki.language.convertGrammar = function ( word, form ) {
        if ( word.match( /тæ$/i ) ) {
                word = word.slice( 0, -1 );
                endAllative = 'æм';
-       }
-       // Works if word is in singular form.
-       // Checking if word ends on one of the vowels: е, ё, и, о, ы, э, ю, я.
-       else if ( word.match( /[аæеёиоыэюя]$/i ) ) {
+       } else if ( word.match( /[аæеёиоыэюя]$/i ) ) {
+               // Works if word is in singular form.
+               // Checking if word ends on one of the vowels: е, ё, и, о, ы, э, ю, я.
                jot = 'й';
-       }
-       // Checking if word ends on 'у'. 'У' can be either consonant 'W' or vowel 'U' in cyrillic Ossetic.
-       // Examples: {{grammar:genitive|аунеу}} = аунеуы, {{grammar:genitive|лæппу}} = лæппуйы.
-       else if ( word.match( /у$/i ) ) {
+       } else if ( word.match( /у$/i ) ) {
+               // Checking if word ends on 'у'. 'У' can be either consonant 'W' or vowel 'U' in cyrillic Ossetic.
+               // Examples: {{grammar:genitive|аунеу}} = аунеуы, {{grammar:genitive|лæппу}} = лæппуйы.
+
                if ( !word.slice( -2, -1 ).match( /[аæеёиоыэюя]$/i ) ) {
                        jot = 'й';
                }
@@ -50,8 +49,7 @@ mediaWiki.language.convertGrammar = function ( word, form ) {
                case 'ablative':
                        if ( jot === 'й' ) {
                                ending = hyphen + jot + 'æ';
-                       }
-                       else {
+                       } else {
                                ending = hyphen + jot + 'æй';
                        }
                        break;
index df95d75..b3765c8 100644 (file)
@@ -54,6 +54,7 @@
                 */
                getData: function ( langCode, dataKey ) {
                        var langData = mw.language.data;
+                       langCode = langCode.toLowerCase();
                        if ( langData && langData[langCode] instanceof mw.Map ) {
                                return langData[langCode].get( dataKey );
                        }
@@ -71,6 +72,7 @@
                 */
                setData: function ( langCode, dataKey, value ) {
                        var langData = mw.language.data;
+                       langCode = langCode.toLowerCase();
                        if ( !( langData[langCode] instanceof mw.Map ) ) {
                                langData[langCode] = new mw.Map();
                        }
index 8b3a085..bb8a84b 100644 (file)
@@ -134,7 +134,9 @@ $.extend( mw.language, {
         * @return {string}
         */
        listToText: function ( list ) {
-               var text = '', i = 0;
+               var text = '',
+                       i = 0;
+
                for ( ; i < list.length; i++ ) {
                        text += list[i];
                        if ( list.length - 2 === i ) {
index a0b8141..c7f150f 100644 (file)
                                        tmp[ transformTable[ i ] ] = i;
                                }
                                transformTable = tmp;
-                               numberString = num + '';
+                               numberString = String( num );
                        } else {
                                numberString = mw.language.commafy( num, pattern );
                        }
index cf9e27f..3660c20 100644 (file)
 /*global alert */
 ( function ( mw ) {
 
-/**
- * if sajax_debug_mode is true, this function outputs given the message into
- * the element with id = sajax_debug; if no such element exists in the document,
- * it is injected.
- */
-function debug( text ) {
-       if ( !window.sajax_debug_mode ) {
-               return false;
-       }
+       /**
       * if sajax_debug_mode is true, this function outputs given the message into
       * the element with id = sajax_debug; if no such element exists in the document,
       * it is injected.
       */
+       function debug( text ) {
+               if ( !window.sajax_debug_mode ) {
+                       return false;
+               }
 
-       var b, m,
-               e = document.getElementById( 'sajax_debug' );
+               var b, m,
+                       e = document.getElementById( 'sajax_debug' );
 
-       if ( !e ) {
-               e = document.createElement( 'p' );
-               e.className = 'sajax_debug';
-               e.id = 'sajax_debug';
+               if ( !e ) {
+                       e = document.createElement( 'p' );
+                       e.className = 'sajax_debug';
+                       e.id = 'sajax_debug';
 
-               b = document.getElementsByTagName( 'body' )[0];
+                       b = document.getElementsByTagName( 'body' )[0];
 
-               if ( b.firstChild ) {
-                       b.insertBefore( e, b.firstChild );
-               } else {
-                       b.appendChild( e );
+                       if ( b.firstChild ) {
+                               b.insertBefore( e, b.firstChild );
+                       } else {
+                               b.appendChild( e );
+                       }
                }
-       }
 
-       m = document.createElement( 'div' );
-       m.appendChild( document.createTextNode( text ) );
+               m = document.createElement( 'div' );
+               m.appendChild( document.createTextNode( text ) );
 
-       e.appendChild( m );
+               e.appendChild( m );
 
-       return true;
-}
+               return true;
+       }
 
-/**
- * Compatibility wrapper for creating a new XMLHttpRequest object.
- */
-function createXhr() {
-       debug( 'sajax_init_object() called..' );
-       var a;
-       try {
-               // Try the new style before ActiveX so we don't
-               // unnecessarily trigger warnings in IE 7 when
-               // set to prompt about ActiveX usage
-               a = new XMLHttpRequest();
-       } catch ( xhrE ) {
+       /**
+        * Compatibility wrapper for creating a new XMLHttpRequest object.
+        */
+       function createXhr() {
+               debug( 'sajax_init_object() called..' );
+               var a;
                try {
-                       a = new window.ActiveXObject( 'Msxml2.XMLHTTP' );
-               } catch ( msXmlE ) {
+                       // Try the new style before ActiveX so we don't
+                       // unnecessarily trigger warnings in IE 7 when
+                       // set to prompt about ActiveX usage
+                       a = new XMLHttpRequest();
+               } catch ( xhrE ) {
                        try {
-                               a = new window.ActiveXObject( 'Microsoft.XMLHTTP' );
-                       } catch ( msXhrE ) {
-                               a = null;
+                               a = new window.ActiveXObject( 'Msxml2.XMLHTTP' );
+                       } catch ( msXmlE ) {
+                               try {
+                                       a = new window.ActiveXObject( 'Microsoft.XMLHTTP' );
+                               } catch ( msXhrE ) {
+                                       a = null;
+                               }
                        }
                }
-       }
-       if ( !a ) {
-               debug( 'Could not create connection object.' );
-       }
+               if ( !a ) {
+                       debug( 'Could not create connection object.' );
+               }
 
-       return a;
-}
+               return a;
+       }
 
-/**
- * Perform an AJAX call to MediaWiki. Calls are handled by AjaxDispatcher.php
- *   func_name - the name of the function to call. Must be registered in $wgAjaxExportList
- *   args - an array of arguments to that function
- *   target - the target that will handle the result of the call. If this is a function,
- *            if will be called with the XMLHttpRequest as a parameter; if it's an input
- *            element, its value will be set to the resultText; if it's another type of
- *            element, its innerHTML will be set to the resultText.
- *
- * Example:
- *    sajax_do_call( 'doFoo', [1, 2, 3], document.getElementById( 'showFoo' ) );
- *
- * This will call the doFoo function via MediaWiki's AjaxDispatcher, with
- * (1, 2, 3) as the parameter list, and will show the result in the element
- * with id = showFoo
- */
-function doAjaxRequest( func_name, args, target ) {
-       var i, x, uri, post_data;
-       uri = mw.util.wikiScript() + '?action=ajax';
-       if ( window.sajax_request_type === 'GET' ) {
-               if ( uri.indexOf( '?' ) === -1 ) {
-                       uri = uri + '?rs=' + encodeURIComponent( func_name );
+       /**
+        * Perform an AJAX call to MediaWiki. Calls are handled by AjaxDispatcher.php
+        *   func_name - the name of the function to call. Must be registered in $wgAjaxExportList
+        *   args - an array of arguments to that function
+        *   target - the target that will handle the result of the call. If this is a function,
+        *            if will be called with the XMLHttpRequest as a parameter; if it's an input
+        *            element, its value will be set to the resultText; if it's another type of
+        *            element, its innerHTML will be set to the resultText.
+        *
+        * Example:
+        *    sajax_do_call( 'doFoo', [1, 2, 3], document.getElementById( 'showFoo' ) );
+        *
+        * This will call the doFoo function via MediaWiki's AjaxDispatcher, with
+        * (1, 2, 3) as the parameter list, and will show the result in the element
+        * with id = showFoo
+        */
+       function doAjaxRequest( func_name, args, target ) {
+               var i, x, uri, post_data;
+               uri = mw.util.wikiScript() + '?action=ajax';
+               if ( window.sajax_request_type === 'GET' ) {
+                       if ( uri.indexOf( '?' ) === -1 ) {
+                               uri = uri + '?rs=' + encodeURIComponent( func_name );
+                       } else {
+                               uri = uri + '&rs=' + encodeURIComponent( func_name );
+                       }
+                       for ( i = 0; i < args.length; i++ ) {
+                               uri = uri + '&rsargs[]=' + encodeURIComponent( args[i] );
+                       }
+                       // uri = uri + '&rsrnd=' + new Date().getTime();
+                       post_data = null;
                } else {
-                       uri = uri + '&rs=' + encodeURIComponent( func_name );
-               }
-               for ( i = 0; i < args.length; i++ ) {
-                       uri = uri + '&rsargs[]=' + encodeURIComponent( args[i] );
+                       post_data = 'rs=' + encodeURIComponent( func_name );
+                       for ( i = 0; i < args.length; i++ ) {
+                               post_data = post_data + '&rsargs[]=' + encodeURIComponent( args[i] );
+                       }
                }
-               //uri = uri + '&rsrnd=' + new Date().getTime();
-               post_data = null;
-       } else {
-               post_data = 'rs=' + encodeURIComponent( func_name );
-               for ( i = 0; i < args.length; i++ ) {
-                       post_data = post_data + '&rsargs[]=' + encodeURIComponent( args[i] );
+               x = createXhr();
+               if ( !x ) {
+                       alert( 'AJAX not supported' );
+                       return false;
                }
-       }
-       x = createXhr();
-       if ( !x ) {
-               alert( 'AJAX not supported' );
-               return false;
-       }
 
-       try {
-               x.open( window.sajax_request_type, uri, true );
-       } catch ( e ) {
-               if ( location.hostname === 'localhost' ) {
-                       alert( 'Your browser blocks XMLHttpRequest to "localhost", try using a real hostname for development/testing.' );
+               try {
+                       x.open( window.sajax_request_type, uri, true );
+               } catch ( e ) {
+                       if ( location.hostname === 'localhost' ) {
+                               alert( 'Your browser blocks XMLHttpRequest to "localhost", try using a real hostname for development/testing.' );
+                       }
+                       throw e;
                }
-               throw e;
-       }
-       if ( window.sajax_request_type === 'POST' ) {
-               x.setRequestHeader( 'Method', 'POST ' + uri + ' HTTP/1.1' );
-               x.setRequestHeader( 'Content-Type', 'application/x-www-form-urlencoded' );
-       }
-       x.setRequestHeader( 'Pragma', 'cache=yes' );
-       x.setRequestHeader( 'Cache-Control', 'no-transform' );
-       x.onreadystatechange = function () {
-               if ( x.readyState !== 4 ) {
-                       return;
+               if ( window.sajax_request_type === 'POST' ) {
+                       x.setRequestHeader( 'Method', 'POST ' + uri + ' HTTP/1.1' );
+                       x.setRequestHeader( 'Content-Type', 'application/x-www-form-urlencoded' );
                }
+               x.setRequestHeader( 'Pragma', 'cache=yes' );
+               x.setRequestHeader( 'Cache-Control', 'no-transform' );
+               x.onreadystatechange = function () {
+                       if ( x.readyState !== 4 ) {
+                               return;
+                       }
 
-               debug( 'received (' + x.status + ' ' + x.statusText + ') ' + x.responseText );
+                       debug( 'received (' + x.status + ' ' + x.statusText + ') ' + x.responseText );
 
-               //if ( x.status != 200 )
-               //      alert( 'Error: ' + x.status + ' ' + x.statusText + ': ' + x.responseText );
-               //else
+                       // if ( x.status != 200 )
+                       //   alert( 'Error: ' + x.status + ' ' + x.statusText + ': ' + x.responseText );
+                       // else
 
-               if ( typeof target === 'function' ) {
-                       target( x );
-               } else if ( typeof target === 'object' ) {
-                       if ( target.tagName === 'INPUT' ) {
-                               if ( x.status === 200 ) {
-                                       target.value = x.responseText;
-                               }
-                               //else alert( 'Error: ' + x.status + ' ' + x.statusText + ' (' + x.responseText + ')' );
-                       } else {
-                               if ( x.status === 200 ) {
-                                       target.innerHTML = x.responseText;
+                       if ( typeof target === 'function' ) {
+                               target( x );
+                       } else if ( typeof target === 'object' ) {
+                               if ( target.tagName === 'INPUT' ) {
+                                       if ( x.status === 200 ) {
+                                               target.value = x.responseText;
+                                       }
+                                       // else alert( 'Error: ' + x.status + ' ' + x.statusText + ' (' + x.responseText + ')' );
                                } else {
-                                       target.innerHTML = '<div class="error">Error: ' + x.status +
-                                               ' ' + x.statusText + ' (' + x.responseText + ')</div>';
+                                       if ( x.status === 200 ) {
+                                               target.innerHTML = x.responseText;
+                                       } else {
+                                               target.innerHTML = '<div class="error">Error: ' + x.status +
+                                                       ' ' + x.statusText + ' (' + x.responseText + ')</div>';
+                                       }
                                }
+                       } else {
+                               alert( 'Bad target for sajax_do_call: not a function or object: ' + target );
                        }
-               } else {
-                       alert( 'Bad target for sajax_do_call: not a function or object: ' + target );
-               }
-       };
+               };
+
+               debug( func_name + ' uri = ' + uri + ' / post = ' + post_data );
+               x.send( post_data );
+               debug( func_name + ' waiting..' );
 
-       debug( func_name + ' uri = ' + uri + ' / post = ' + post_data );
-       x.send( post_data );
-       debug( func_name + ' waiting..' );
+               return true;
+       }
 
-       return true;
-}
+       /**
+        * @return {boolean} Whether the browser supports AJAX
+        */
+       function wfSupportsAjax() {
+               var request = createXhr(),
+                       supportsAjax = request ? true : false;
 
-/**
- * @return {boolean} Whether the browser supports AJAX
- */
-function wfSupportsAjax() {
-       var request = createXhr(),
-               supportsAjax = request ? true : false;
-
-       request = undefined;
-       return supportsAjax;
-}
-
-// Expose + Mark as deprecated
-var deprecationNotice = 'Sajax is deprecated, use jQuery.ajax or mediawiki.api instead.';
-
-// Variables
-mw.log.deprecate( window, 'sajax_debug_mode', false, deprecationNotice );
-mw.log.deprecate( window, 'sajax_request_type', 'GET', deprecationNotice );
-// Methods
-mw.log.deprecate( window, 'sajax_debug', debug, deprecationNotice );
-mw.log.deprecate( window, 'sajax_init_object', createXhr, deprecationNotice );
-mw.log.deprecate( window, 'sajax_do_call', doAjaxRequest, deprecationNotice );
-mw.log.deprecate( window, 'wfSupportsAjax', wfSupportsAjax, deprecationNotice );
+               request = undefined;
+               return supportsAjax;
+       }
+
+       // Expose + Mark as deprecated
+       var deprecationNotice = 'Sajax is deprecated, use jQuery.ajax or mediawiki.api instead.';
+
+       // Variables
+       mw.log.deprecate( window, 'sajax_debug_mode', false, deprecationNotice );
+       mw.log.deprecate( window, 'sajax_request_type', 'GET', deprecationNotice );
+       // Methods
+       mw.log.deprecate( window, 'sajax_debug', debug, deprecationNotice );
+       mw.log.deprecate( window, 'sajax_init_object', createXhr, deprecationNotice );
+       mw.log.deprecate( window, 'sajax_do_call', doAjaxRequest, deprecationNotice );
+       mw.log.deprecate( window, 'wfSupportsAjax', wfSupportsAjax, deprecationNotice );
 
 }( mediaWiki ) );
index f9069b6..bc73048 100644 (file)
@@ -6,7 +6,8 @@ var ProtectionForm = window.ProtectionForm = {
         * on the protection form
         */
        init: function () {
-               var $cell = $( '<td>' ), $row = $( '<tr>' ).append( $cell );
+               var $cell = $( '<td>' ),
+                       $row = $( '<tr>' ).append( $cell );
 
                if ( !$( '#mwProtectSet' ).length ) {
                        return false;
index cf54cf9..467714e 100644 (file)
@@ -516,7 +516,7 @@ table.wikitable > tr > td,
 table.wikitable > * > tr > th,
 table.wikitable > * > tr > td {
        border: 1px solid #aaa;
-       padding: 0.2em;
+       padding: 0.3em 0.4em;
 }
 
 table.wikitable > tr > th,
@@ -1124,6 +1124,7 @@ table.floatleft {
 
 .mw-editsection,
 .toctoggle,
+.tochidden,
 #jump-to-nav {
        -moz-user-select: none;
        -webkit-user-select: none;
index dc21472..dffc6e8 100644 (file)
                ua = navigator.userAgent.toLowerCase(),
                onloadFuncts = [];
 
-/**
- * User-agent sniffing.
- *
- * @deprecated since 1.17 Use jquery.client instead
- */
-
-msg = 'Use feature detection or module jquery.client instead.';
-
-mw.log.deprecate( win, 'clientPC', ua, msg );
-
-// Ignored dummy values
-mw.log.deprecate( win, 'is_gecko', false, msg );
-mw.log.deprecate( win, 'is_chrome_mac', false, msg );
-mw.log.deprecate( win, 'is_chrome', false, msg );
-mw.log.deprecate( win, 'webkit_version', false, msg );
-mw.log.deprecate( win, 'is_safari_win', false, msg );
-mw.log.deprecate( win, 'is_safari', false, msg );
-mw.log.deprecate( win, 'webkit_match', false, msg );
-mw.log.deprecate( win, 'is_ff2', false, msg );
-mw.log.deprecate( win, 'ff2_bugs', false, msg );
-mw.log.deprecate( win, 'is_ff2_win', false, msg );
-mw.log.deprecate( win, 'is_ff2_x11', false, msg );
-mw.log.deprecate( win, 'opera95_bugs', false, msg );
-mw.log.deprecate( win, 'opera7_bugs', false, msg );
-mw.log.deprecate( win, 'opera6_bugs', false, msg );
-mw.log.deprecate( win, 'is_opera_95', false, msg );
-mw.log.deprecate( win, 'is_opera_preseven', false, msg );
-mw.log.deprecate( win, 'is_opera', false, msg );
-mw.log.deprecate( win, 'ie6_bugs', false, msg );
-
-/**
- * DOM utilities for handling of events, text nodes and selecting elements
- *
- * @deprecated since 1.17 Use jQuery instead
- */
-msg = 'Use jQuery instead.';
-
-// Ignored dummy values
-mw.log.deprecate( win, 'doneOnloadHook', undefined, msg );
-mw.log.deprecate( win, 'onloadFuncts', [], msg );
-mw.log.deprecate( win, 'runOnloadHook', $.noop, msg );
-mw.log.deprecate( win, 'changeText', $.noop, msg );
-mw.log.deprecate( win, 'killEvt', $.noop, msg );
-mw.log.deprecate( win, 'addHandler', $.noop, msg );
-mw.log.deprecate( win, 'hookEvent', $.noop, msg );
-mw.log.deprecate( win, 'addClickHandler', $.noop, msg );
-mw.log.deprecate( win, 'removeHandler', $.noop, msg );
-mw.log.deprecate( win, 'getElementsByClassName', function () { return []; }, msg );
-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 );
-       } else {
-               // If func queue is gone the event has happened already,
-               // run immediately instead of queueing.
-               hookFunct();
-       }
-}, msg );
-
-$( win ).on( 'load', function () {
-       var i, functs;
-
-       // Don't run twice
-       if ( !onloadFuncts ) {
-               return;
-       }
-
-       // Deference and clear onloadFuncts before running any
-       // hooks to make sure we don't miss any addOnloadHook
-       // calls.
-       functs = onloadFuncts.slice();
-       onloadFuncts = undefined;
-
-       // Execute the queued functions
-       for ( i = 0; i < functs.length; i++ ) {
-               functs[i]();
-       }
-} );
-
-/**
- * Toggle checkboxes with shift selection
- *
- * @deprecated since 1.17 Use jquery.checkboxShiftClick instead
- */
-msg = 'Use jquery.checkboxShiftClick instead.';
-mw.log.deprecate( win, 'checkboxes', [], msg );
-mw.log.deprecate( win, 'lastCheckbox', null, msg );
-mw.log.deprecate( win, 'setupCheckboxShiftClick', $.noop, msg );
-mw.log.deprecate( win, 'addCheckboxClickHandlers', $.noop, msg );
-mw.log.deprecate( win, 'checkboxClickHandler', $.noop, msg );
-
-/**
- * Add a button to the default editor toolbar
- *
- * @deprecated since 1.17 Use mw.toolbar instead
- */
-mw.log.deprecate( win, 'mwEditButtons', [], 'Use mw.toolbar instead.' );
-mw.log.deprecate( win, 'mwCustomEditButtons', [], 'Use mw.toolbar instead.' );
-
-/**
- * Spinner creation, injection and removal
- *
- * @deprecated since 1.18 Use jquery.spinner instead
- */
-mw.log.deprecate( win, 'injectSpinner', $.noop, 'Use jquery.spinner instead.' );
-mw.log.deprecate( win, 'removeSpinner', $.noop, 'Use jquery.spinner instead.' );
-
-/**
- * Escape utilities
- *
- * @deprecated since 1.18 Use mw.html instead
- */
-mw.log.deprecate( win, 'escapeQuotes', $.noop, 'Use mw.html instead.' );
-mw.log.deprecate( win, 'escapeQuotesHTML', $.noop, 'Use mw.html instead.' );
-
-/**
- * Display a message to the user
- *
- * @deprecated since 1.17 Use mediawiki.notify instead
- * @param {string|HTMLElement} message To be put inside the message box
- */
-mw.log.deprecate( win, 'jsMsg', function ( message ) {
-       if ( !arguments.length || message === '' || message === null ) {
+       /**
+        * User-agent sniffing.
+        *
+        * @deprecated since 1.17 Use jquery.client instead
+        */
+
+       msg = 'Use feature detection or module jquery.client instead.';
+
+       mw.log.deprecate( win, 'clientPC', ua, msg );
+
+       // Ignored dummy values
+       mw.log.deprecate( win, 'is_gecko', false, msg );
+       mw.log.deprecate( win, 'is_chrome_mac', false, msg );
+       mw.log.deprecate( win, 'is_chrome', false, msg );
+       mw.log.deprecate( win, 'webkit_version', false, msg );
+       mw.log.deprecate( win, 'is_safari_win', false, msg );
+       mw.log.deprecate( win, 'is_safari', false, msg );
+       mw.log.deprecate( win, 'webkit_match', false, msg );
+       mw.log.deprecate( win, 'is_ff2', false, msg );
+       mw.log.deprecate( win, 'ff2_bugs', false, msg );
+       mw.log.deprecate( win, 'is_ff2_win', false, msg );
+       mw.log.deprecate( win, 'is_ff2_x11', false, msg );
+       mw.log.deprecate( win, 'opera95_bugs', false, msg );
+       mw.log.deprecate( win, 'opera7_bugs', false, msg );
+       mw.log.deprecate( win, 'opera6_bugs', false, msg );
+       mw.log.deprecate( win, 'is_opera_95', false, msg );
+       mw.log.deprecate( win, 'is_opera_preseven', false, msg );
+       mw.log.deprecate( win, 'is_opera', false, msg );
+       mw.log.deprecate( win, 'ie6_bugs', false, msg );
+
+       /**
+        * DOM utilities for handling of events, text nodes and selecting elements
+        *
+        * @deprecated since 1.17 Use jQuery instead
+        */
+       msg = 'Use jQuery instead.';
+
+       // Ignored dummy values
+       mw.log.deprecate( win, 'doneOnloadHook', undefined, msg );
+       mw.log.deprecate( win, 'onloadFuncts', [], msg );
+       mw.log.deprecate( win, 'runOnloadHook', $.noop, msg );
+       mw.log.deprecate( win, 'changeText', $.noop, msg );
+       mw.log.deprecate( win, 'killEvt', $.noop, msg );
+       mw.log.deprecate( win, 'addHandler', $.noop, msg );
+       mw.log.deprecate( win, 'hookEvent', $.noop, msg );
+       mw.log.deprecate( win, 'addClickHandler', $.noop, msg );
+       mw.log.deprecate( win, 'removeHandler', $.noop, msg );
+       mw.log.deprecate( win, 'getElementsByClassName', function () { return []; }, msg );
+       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 );
+               } else {
+                       // If func queue is gone the event has happened already,
+                       // run immediately instead of queueing.
+                       hookFunct();
+               }
+       }, msg );
+
+       $( win ).on( 'load', function () {
+               var i, functs;
+
+               // Don't run twice
+               if ( !onloadFuncts ) {
+                       return;
+               }
+
+               // Deference and clear onloadFuncts before running any
+               // hooks to make sure we don't miss any addOnloadHook
+               // calls.
+               functs = onloadFuncts.slice();
+               onloadFuncts = undefined;
+
+               // Execute the queued functions
+               for ( i = 0; i < functs.length; i++ ) {
+                       functs[i]();
+               }
+       } );
+
+       /**
+        * Toggle checkboxes with shift selection
+        *
+        * @deprecated since 1.17 Use jquery.checkboxShiftClick instead
+        */
+       msg = 'Use jquery.checkboxShiftClick instead.';
+       mw.log.deprecate( win, 'checkboxes', [], msg );
+       mw.log.deprecate( win, 'lastCheckbox', null, msg );
+       mw.log.deprecate( win, 'setupCheckboxShiftClick', $.noop, msg );
+       mw.log.deprecate( win, 'addCheckboxClickHandlers', $.noop, msg );
+       mw.log.deprecate( win, 'checkboxClickHandler', $.noop, msg );
+
+       /**
+        * Add a button to the default editor toolbar
+        *
+        * @deprecated since 1.17 Use mw.toolbar instead
+        */
+       mw.log.deprecate( win, 'mwEditButtons', [], 'Use mw.toolbar instead.' );
+       mw.log.deprecate( win, 'mwCustomEditButtons', [], 'Use mw.toolbar instead.' );
+
+       /**
+        * Spinner creation, injection and removal
+        *
+        * @deprecated since 1.18 Use jquery.spinner instead
+        */
+       mw.log.deprecate( win, 'injectSpinner', $.noop, 'Use jquery.spinner instead.' );
+       mw.log.deprecate( win, 'removeSpinner', $.noop, 'Use jquery.spinner instead.' );
+
+       /**
+        * Escape utilities
+        *
+        * @deprecated since 1.18 Use mw.html instead
+        */
+       mw.log.deprecate( win, 'escapeQuotes', $.noop, 'Use mw.html instead.' );
+       mw.log.deprecate( win, 'escapeQuotesHTML', $.noop, 'Use mw.html instead.' );
+
+       /**
+        * Display a message to the user
+        *
+        * @deprecated since 1.17 Use mediawiki.notify instead
+        * @param {string|HTMLElement} message To be put inside the message box
+        */
+       mw.log.deprecate( win, 'jsMsg', function ( message ) {
+               if ( !arguments.length || message === '' || message === null ) {
+                       return true;
+               }
+               if ( typeof message !== 'object' ) {
+                       message = $.parseHTML( message );
+               }
+               mw.notify( message, { autoHide: true, tag: 'legacy' } );
                return true;
-       }
-       if ( typeof message !== 'object' ) {
-               message = $.parseHTML( message );
-       }
-       mw.notify( message, { autoHide: true, tag: 'legacy' } );
-       return true;
-}, 'Use mediawiki.notify instead.' );
-
-/**
- * Misc. utilities
- *
- * @deprecated since 1.17 Use mediawiki.util or jquery.accessKeyLabel instead
- */
-msg = 'Use mediawiki.util instead.';
-mw.log.deprecate( win, 'addPortletLink', mw.util.addPortletLink, msg );
-mw.log.deprecate( win, 'appendCSS', mw.util.addCSS, msg );
-msg = 'Use jquery.accessKeyLabel instead.';
-mw.log.deprecate( win, 'tooltipAccessKeyPrefix', 'alt-', msg );
-mw.log.deprecate( win, 'tooltipAccessKeyRegexp', /\[(alt-)?(.)\]$/, msg );
-// mw.util.updateTooltipAccessKeys already generates a deprecation message.
-win.updateTooltipAccessKeys = function () {
-       return mw.util.updateTooltipAccessKeys.apply( null, arguments );
-};
-
-/**
- * Wikipage import methods
- */
-
-// included-scripts tracker
-win.loadedScripts = {};
-
-win.importScript = function ( page ) {
-       var uri = mw.config.get( 'wgScript' ) + '?title=' +
-               mw.util.wikiUrlencode( page ) +
-               '&action=raw&ctype=text/javascript';
-       return win.importScriptURI( uri );
-};
-
-win.importScriptURI = function ( url ) {
-       if ( win.loadedScripts[url] ) {
-               return null;
-       }
-       win.loadedScripts[url] = true;
-       var s = document.createElement( 'script' );
-       s.setAttribute( 'src', url );
-       s.setAttribute( 'type', 'text/javascript' );
-       document.getElementsByTagName( 'head' )[0].appendChild( s );
-       return s;
-};
-
-win.importStylesheet = function ( page ) {
-       var uri = mw.config.get( 'wgScript' ) + '?title=' +
-               mw.util.wikiUrlencode( page ) +
-               '&action=raw&ctype=text/css';
-       return win.importStylesheetURI( uri );
-};
-
-win.importStylesheetURI = function ( url, media ) {
-       var l = document.createElement( 'link' );
-       l.rel = 'stylesheet';
-       l.href = url;
-       if ( media ) {
-               l.media = media;
-       }
-       document.getElementsByTagName( 'head' )[0].appendChild( l );
-       return l;
-};
+       }, 'Use mediawiki.notify instead.' );
+
+       /**
+        * Misc. utilities
+        *
+        * @deprecated since 1.17 Use mediawiki.util or jquery.accessKeyLabel instead
+        */
+       msg = 'Use mediawiki.util instead.';
+       mw.log.deprecate( win, 'addPortletLink', mw.util.addPortletLink, msg );
+       mw.log.deprecate( win, 'appendCSS', mw.util.addCSS, msg );
+       msg = 'Use jquery.accessKeyLabel instead.';
+       mw.log.deprecate( win, 'tooltipAccessKeyPrefix', 'alt-', msg );
+       mw.log.deprecate( win, 'tooltipAccessKeyRegexp', /\[(alt-)?(.)\]$/, msg );
+       // mw.util.updateTooltipAccessKeys already generates a deprecation message.
+       win.updateTooltipAccessKeys = function () {
+               return mw.util.updateTooltipAccessKeys.apply( null, arguments );
+       };
+
+       /**
+        * Wikipage import methods
+        */
+
+       // included-scripts tracker
+       win.loadedScripts = {};
+
+       win.importScript = function ( page ) {
+               var uri = mw.config.get( 'wgScript' ) + '?title=' +
+                       mw.util.wikiUrlencode( page ) +
+                       '&action=raw&ctype=text/javascript';
+               return win.importScriptURI( uri );
+       };
+
+       win.importScriptURI = function ( url ) {
+               if ( win.loadedScripts[url] ) {
+                       return null;
+               }
+               win.loadedScripts[url] = true;
+               var s = document.createElement( 'script' );
+               s.setAttribute( 'src', url );
+               s.setAttribute( 'type', 'text/javascript' );
+               document.getElementsByTagName( 'head' )[0].appendChild( s );
+               return s;
+       };
+
+       win.importStylesheet = function ( page ) {
+               var uri = mw.config.get( 'wgScript' ) + '?title=' +
+                       mw.util.wikiUrlencode( page ) +
+                       '&action=raw&ctype=text/css';
+               return win.importStylesheetURI( uri );
+       };
+
+       win.importStylesheetURI = function ( url, media ) {
+               var l = document.createElement( 'link' );
+               l.rel = 'stylesheet';
+               l.href = url;
+               if ( media ) {
+                       l.media = media;
+               }
+               document.getElementsByTagName( 'head' )[0].appendChild( l );
+               return l;
+       };
 
 }( mediaWiki, jQuery ) );
index c84c884..7d4c61c 100644 (file)
        background-image: url(@fallback);
        background-image: -webkit-linear-gradient(transparent, transparent), e('/* @embed */') url(@svg);
        background-image: linear-gradient(transparent, transparent), e('/* @embed */') url(@svg);
+       // Do not serve SVG to Opera 12, bad rendering with border-radius or background-size (T87504)
+       background-image: -o-linear-gradient(transparent, transparent), url(@fallback);
 }
 
 .list-style-image(@url) {
        list-style-image: e('/* @embed */') url(@url);
 }
 
+.list-style-image-svg(@svg, @fallback) {
+       list-style-image: e('/* @embed */') url(@svg);
+       /* Fallback to PNG bullet for IE 8 and below using CSS hack */
+       list-style-image: e('/* @embed */') url(@fallback)\9;
+}
+
 .transition(@value) {
        -webkit-transition: @value; // Safari 3.1-6.0, iOS 3.2-6.1, Android 2.1-4.3
        -moz-transition: @value; // Firefox 4-15
index 40a5c41..a51fe9c 100644 (file)
@@ -89,8 +89,8 @@
        text-shadow: 0 1px rgba(0, 0, 0, .1);
 
        &:disabled {
-               background: @colorGray12;
-               border-color: @colorGray12;
+               background: @colorGray13;
+               border-color: @colorGray13;
 
                // make sure disabled buttons don't have hover and active states
                &:hover,
index 3658ed8..9514070 100644 (file)
@@ -3,11 +3,18 @@
  * Also Dynamically resize images to justify them.
  */
 ( 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 = $();
+       var $galleries,
+               bound = false,
+               // 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
+               );
 
-       // Now on to justification.
+       /**
+        * Perform the layout justification.
+        * @ignore
+        * @context {HTMLElement} A `ul.mw-gallery-*` element
+        */
        function justify() {
                var lastTop,
                        $img,
                }() );
        }
 
+       function handleResizeStart() {
+               $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 {
+                               $imageDiv.height( imgHeight );
+                       }
+               } );
+       }
+
+       function handleResizeEnd() {
+               $galleries.each( justify );
+       }
+
        mw.hook( 'wikipage.content' ).add( function ( $content ) {
                if ( isTouchScreen ) {
                        // Always show the caption for a touch screen.
                // Call the justification asynchronous because live preview fires the hook with detached $content.
                setTimeout( function () {
                        $galleries.each( justify );
-               } );
-       } );
 
-       $( 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 {
-                                       $imageDiv.height( imgHeight );
-                               }
-                       } );
-               } ) );
-               $( window ).resize( $.debounce( 300, function () {
-                       $galleries.each( justify );
-               } ) );
+                       // Bind here instead of in the top scope as the callbacks use $galleries.
+                       if ( !bound ) {
+                               bound = true;
+                               $( window )
+                                       .resize( $.debounce( 300, true, handleResizeStart ) )
+                                       .resize( $.debounce( 300, handleResizeEnd ) );
+                       }
+               } );
        } );
 }( mediaWiki, jQuery ) );
index 26c32a5..9ad9c30 100644 (file)
@@ -3,7 +3,8 @@
  */
 ( function ( mw, $ ) {
        var jqXhr, $multipageimage, $spinner,
-               cache = {}, cacheOrder = [];
+               cache = {},
+               cacheOrder = [];
 
        /* Fetch the next page, caching up to 10 last-loaded pages.
         * @param {string} url
index 51cb8d0..7dd5ee7 100644 (file)
@@ -8,7 +8,8 @@
 /* Table of Contents */
 #toc,
 .toc,
-.mw-warning {
+.mw-warning,
+.toccolours {
        border: 1px solid #aaa;
        background-color: #f9f9f9;
        padding: 5px;
@@ -87,13 +88,6 @@ table.toc td {
        font-size: 94%;
 }
 
-.toccolours {
-       border: 1px solid #aaa;
-       background-color: #f9f9f9;
-       padding: 5px;
-       font-size: 95%;
-}
-
 /* Warning */
 .mw-warning {
        margin-left: 50px;
index 11962f8..eb57abb 100644 (file)
@@ -182,12 +182,6 @@ dd {
        margin-bottom: .1em;
 }
 
-/* IE 6 and 7 lack support for quotes aroud the <q> element ('::before' and '::after'
-   pseudoelements, 'quotes' property). Let's italicize it instead (using the star hack). */
-q {
-       *font-style: italic;
-}
-
 pre, code, tt, kbd, samp, .mw-code {
        /*
         * Some browsers will render the monospace text too small, namely Firefox, Chrome and Safari.
index ba7f734..7c2269f 100644 (file)
@@ -6,4 +6,4 @@
                        $( '#mw-pl-options-2' ).prop( 'checked', true );
                } );
        } );
-} ( jQuery ) );
+}( jQuery ) );
index 043d769..2e660ce 100644 (file)
@@ -5,7 +5,7 @@ jQuery( function ( $ ) {
        var $preftoc, $preferences, $fieldsets, $legends,
                hash, labelFunc,
                $tzSelect, $tzTextbox, $localtimeHolder, servertime,
-               $checkBoxes, savedWindowOnBeforeUnload;
+               $checkBoxes, allowCloseWindowFn;
 
        labelFunc = function () {
                return this.id.replace( /^mw-prefsection/g, 'preftab' );
@@ -41,7 +41,7 @@ jQuery( function ( $ ) {
                        } else {
                                $( this ).css( 'height', 'auto' );
                        }
-       } ).insertBefore( $preftoc );
+               } ).insertBefore( $preftoc );
 
        /**
         * It uses document.getElementById for security reasons (HTML injections in $()).
@@ -267,39 +267,14 @@ jQuery( function ( $ ) {
        // Set up a message to notify users if they try to leave the page without
        // saving.
        $( '#mw-prefs-form' ).data( 'origdata', $( '#mw-prefs-form' ).serialize() );
-       $( window )
-               .on( 'beforeunload.prefswarning', function () {
-                       var retval;
+       allowCloseWindowFn = mediaWiki.confirmCloseWindow( {
+               test: function () {
+                       return $( '#mw-prefs-form' ).serialize() !== $( '#mw-prefs-form' ).data( 'origdata' );
+               },
 
-                       // Check if anything changed
-                       if ( $( '#mw-prefs-form' ).serialize() !== $( '#mw-prefs-form' ).data( 'origdata' ) ) {
-                               // Return our message
-                               retval = mediaWiki.msg( 'prefswarning-warning', mediaWiki.msg( 'saveprefs' ) );
-                       }
-
-                       // Unset the onbeforeunload handler so we don't break page caching in Firefox
-                       savedWindowOnBeforeUnload = window.onbeforeunload;
-                       window.onbeforeunload = null;
-                       if ( retval !== undefined ) {
-                               // ...but if the user chooses not to leave the page, we need to rebind it
-                               setTimeout( function () {
-                                       window.onbeforeunload = savedWindowOnBeforeUnload;
-                               }, 1 );
-                               return retval;
-                       }
-               } )
-               .on( 'pageshow.prefswarning', function () {
-                       // Re-add onbeforeunload handler
-                       if ( !window.onbeforeunload ) {
-                               window.onbeforeunload = savedWindowOnBeforeUnload;
-                       }
-               } );
-       $( '#mw-prefs-form' ).submit( function () {
-               // Unbind our beforeunload handler
-               $( window ).off( '.prefswarning' );
-       } );
-       $( '#mw-prefs-restoreprefs' ).click( function () {
-               // Unbind our beforeunload handler
-               $( window ).off( '.prefswarning' );
+               message: mediaWiki.msg( 'prefswarning-warning', mediaWiki.msg( 'saveprefs' ) ),
+               namespace: 'prefswarning'
        } );
+       $( '#mw-prefs-form' ).submit( allowCloseWindowFn );
+       $( '#mw-prefs-restoreprefs' ).click( allowCloseWindowFn );
 } );
index f405c7a..2f03c51 100644 (file)
@@ -6,8 +6,9 @@
  * @singleton
  */
 ( function ( mw, $ ) {
-       var ajaxUploadDestCheck = mw.config.get( 'wgAjaxUploadDestCheck' ),
-               $license = $( '#wpLicense' ), uploadWarning, uploadLicense;
+       var uploadWarning, uploadLicense,
+               ajaxUploadDestCheck = mw.config.get( 'wgAjaxUploadDestCheck' ),
+               $license = $( '#wpLicense' );
 
        window.wgUploadWarningObj = uploadWarning = {
                responseCache: { '': '&nbsp;' },
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 089504a..4829f5f 100644 (file)
@@ -42,7 +42,7 @@
 .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)
                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 {
                        border-radius: @borderRadius;
                        width: @checkboxSize;
                        height: @checkboxSize;
+                       line-height: @checkboxSize;
                        background-color: #fff;
                        border: 1px solid @colorGray7;
+                       // 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;
index 28d597e..b16570a 100644 (file)
        border: 1px solid @colorFieldBorder;
        .box-sizing(border-box);
        width: 100%;
-       padding: .4em .3em .2em .6em;
+       padding: .3em .3em .3em .6em;
        display: block;
        vertical-align: middle;
        border-radius: @borderRadius;
-       // Override user agent stylesheet properties. Instead use parent element.
-       color: inherit;
-       background-color: inherit;
        font-family: inherit;
        font-size: inherit;
        line-height: inherit;
index eaf079f..3efb7ec 100644 (file)
                set: function ( titles, state ) {
                        titles = $.isArray( titles ) ? titles : [titles];
                        state = state === undefined ? true : !!state;
-                       var pages = this.pages, i, len = titles.length;
+                       var i,
+                               pages = this.pages,
+                               len = titles.length;
+
                        for ( i = 0; i < len; i++ ) {
                                pages[ titles[i] ] = state;
                        }
index 6f9f0ab..8f091e4 100644 (file)
                 * @param {string|null} value Value of cookie. If `value` is `null` then this method will
                 *   instead remove a cookie by name of `key`.
                 * @param {Object|Date} [options] Options object, or expiry date
-                * @param {Date|null} [options.expires=wgCookieExpiration] The expiry date of the cookie.
+                * @param {Date|number|null} [options.expires] The expiry date of the cookie, or lifetime in seconds.
                 *
-                *   Default cookie expiration is based on `wgCookieExpiration`.  If `wgCookieExpiration` is
-                *   0, a session cookie is set (expires when the browser is closed). For non-zero values of
-                *   `wgCookieExpiration`, the cookie expires `wgCookieExpiration` seconds from now.
+                *   If `options.expires` is null, then a session cookie is set.
+                *
+                *   By default cookie expiration is based on `wgCookieExpiration`. Similar to `WebResponse`
+                *   in PHP, we set a session cookie if `wgCookieExpiration` is 0. And for non-zero values
+                *   it is interpreted as lifetime in seconds.
                 *
-                *   If options.expires is null, then a session cookie is set.
                 * @param {string} [options.prefix=wgCookiePrefix] The prefix of the key
                 * @param {string} [options.domain=wgCookieDomain] The domain attribute of the cookie
                 * @param {string} [options.path=wgCookiePath] The path attribute of the cookie
                                options = $.extend( defaultOptions, options );
                        }
 
-                       // $.cookie makes session cookies when expiry is omitted,
-                       // however our default is to expire wgCookieExpiration seconds from now.
-                       // Note: If wgCookieExpiration is 0, that is considered a special value indicating
+                       // Default to using wgCookieExpiration (lifetime in seconds).
+                       // If wgCookieExpiration is 0, that is considered a special value indicating
                        // all cookies should be session cookies by default.
                        if ( options.expires === undefined && config.wgCookieExpiration !== 0 ) {
                                date = new Date();
                                date.setTime( Number( date ) + ( config.wgCookieExpiration * 1000 ) );
                                options.expires = date;
+                       } else if ( typeof options.expires === 'number' ) {
+                               // Lifetime in seconds
+                               date = new Date();
+                               date.setTime( Number( date ) + ( options.expires * 1000 ) );
+                               options.expires = date;
                        } else if ( options.expires === null ) {
-                               // $.cookie makes a session cookie when expires is omitted
+                               // $.cookie makes a session cookie when options.expires is omitted
                                delete options.expires;
                        }
 
                }
        };
 
-} ( mediaWiki, jQuery ) );
+}( mediaWiki, jQuery ) );
index 8e9fc89..22d3cbb 100644 (file)
@@ -7,6 +7,9 @@
 /*jshint devel:true */
 ( function ( mw, $ ) {
 
+       var inspect,
+               hasOwn = Object.prototype.hasOwnProperty;
+
        function sortByProperty( array, prop, descending ) {
                var order = descending ? -1 : 1;
                return array.sort( function ( a, b ) {
 
        function humanSize( bytes ) {
                if ( !$.isNumeric( bytes ) || bytes === 0 ) { return bytes; }
-               var i = 0, units = [ '', ' kB', ' MB', ' GB', ' TB', ' PB' ];
+               var i = 0,
+                       units = [ '', ' kB', ' MB', ' GB', ' TB', ' PB' ];
+
                for ( ; bytes >= 1024; bytes /= 1024 ) { i++; }
-               return bytes.toFixed( 1 ) + units[i];
+               // Maintain one decimal for kB and above, but don't
+               // add ".0" for bytes.
+               return bytes.toFixed( i > 0 ? 1 : 0 ) + units[i];
        }
 
        /**
         * @class mw.inspect
         * @singleton
         */
-       var inspect = {
+       inspect = {
 
                /**
                 * Return a map of all dependency relationships between loaded modules.
                 *  two properties, 'requires' and 'requiredBy'.
                 */
                getDependencyGraph: function () {
-                       var modules = inspect.getLoadedModules(), graph = {};
+                       var modules = inspect.getLoadedModules(),
+                               graph = {};
 
                        $.each( modules, function ( moduleIndex, moduleName ) {
                                var dependencies = mw.loader.moduleRegistry[moduleName].dependencies || [];
 
-                               graph[moduleName] = graph[moduleName] || { requiredBy: [] };
+                               if ( !hasOwn.call( graph, moduleName ) ) {
+                                       graph[moduleName] = { requiredBy: [] };
+                               }
                                graph[moduleName].requires = dependencies;
 
                                $.each( dependencies, function ( depIndex, depName ) {
-                                       graph[depName] = graph[depName] || { requiredBy: [] };
+                                       if ( !hasOwn.call( graph, depName ) ) {
+                                               graph[depName] = { requiredBy: [] };
+                                       }
                                        graph[depName].requiredBy.push( moduleName );
                                } );
                        } );
index 3eaa6d2..b5c2dba 100644 (file)
                 * @return {string|Array} string of '[key]' if message missing, simple string if possible, array of arrays if needs parsing
                 */
                getAst: function ( key ) {
-                       var cacheKey = [key, this.settings.onlyCurlyBraceTransform].join( ':' ), wikiText;
+                       var wikiText,
+                               cacheKey = [key, this.settings.onlyCurlyBraceTransform].join( ':' );
 
                        if ( this.astCache[ cacheKey ] === undefined ) {
                                wikiText = this.settings.messages.get( key );
                 * @return {Mixed} abstract syntax tree
                 */
                wikiTextToAst: function ( input ) {
-                       var pos, settings = this.settings, concat = Array.prototype.concat,
+                       var pos,
                                regularLiteral, regularLiteralWithoutBar, regularLiteralWithoutSpace, regularLiteralWithSquareBrackets,
                                doubleQuote, singleQuote, backslash, anyCharacter, asciiAlphabetLiteral,
                                escapedOrLiteralWithoutSpace, escapedOrLiteralWithoutBar, escapedOrRegularLiteral,
                                htmlAttributeEquals, openHtmlStartTag, optionalForwardSlash, openHtmlEndTag, closeHtmlTag,
                                openExtlink, closeExtlink, wikilinkPage, wikilinkContents, openWikilink, closeWikilink, templateName, pipe, colon,
                                templateContents, openTemplate, closeTemplate,
-                               nonWhitespaceExpression, paramExpression, expression, curlyBraceTransformExpression, result;
+                               nonWhitespaceExpression, paramExpression, expression, curlyBraceTransformExpression, result,
+                               settings = this.settings,
+                               concat = Array.prototype.concat;
 
                        // Indicates current position in input as we parse through it.
                        // Shared among all parsing functions below.
                        // Subset of allowed HTML markup.
                        // Most elements and many attributes allowed on the server are not supported yet.
                        function html() {
-                               var result = null, parsedOpenTagResult, parsedHtmlContents,
-                                       parsedCloseTagResult, wrappedAttributes, attributes,
-                                       startTagName, endTagName, startOpenTagPos, startCloseTagPos,
-                                       endOpenTagPos, endCloseTagPos;
+                               var parsedOpenTagResult, parsedHtmlContents, parsedCloseTagResult,
+                                       wrappedAttributes, attributes, startTagName, endTagName, startOpenTagPos,
+                                       startCloseTagPos, endOpenTagPos, endCloseTagPos,
+                                       result = null;
 
                                // Break into three sequence calls.  That should allow accurate reconstruction of the original HTML, and requiring an exact tag name match.
                                // 1. open through closeHtmlTag
                        page = nodes[0];
                        url = mw.util.getUrl( page );
 
-                       // [[Some Page]] or [[Namespace:Some Page]]
                        if ( nodes.length === 1 ) {
+                               // [[Some Page]] or [[Namespace:Some Page]]
                                anchor = page;
-                       }
-
-                       /*
-                        * [[Some Page|anchor text]] or
-                        * [[Namespace:Some Page|anchor]
-                        */
-                       else {
+                       } else {
+                               // [[Some Page|anchor text]] or [[Namespace:Some Page|anchor]]
                                anchor = nodes[1];
                        }
 
                 * @return {string} selected pluralized form according to current language
                 */
                plural: function ( nodes ) {
-                       var forms, firstChild, firstChildText,
-                               explicitPluralForms = {}, explicitPluralFormNumber, formIndex, form, count;
+                       var forms, firstChild, firstChildText, explicitPluralFormNumber, formIndex, form, count,
+                               explicitPluralForms = {};
 
                        count = parseFloat( this.language.convertNumber( nodes[0], true ) );
                        forms = nodes.slice( 1 );
index c7858ab..43c6422 100644 (file)
                config: null,
 
                /**
-                * Empty object that plugins can be installed in.
+                * Empty object for third-party libraries, for cases where you don't
+                * want to add a new global, or the global is bad and needs containment
+                * or wrapping.
                 *
                 * @property
                 */
                        }
 
                        function sortQuery( o ) {
-                               var sorted = {}, key, a = [];
+                               var key,
+                                       sorted = {},
+                                       a = [];
+
                                for ( key in o ) {
                                        if ( hasOwn.call( o, key ) ) {
                                                a.push( key );
                         * @private
                         */
                        function buildModulesString( moduleMap ) {
-                               var arr = [], p, prefix;
+                               var p, prefix,
+                                       arr = [];
+
                                for ( prefix in moduleMap ) {
                                        p = prefix === '' ? '' : prefix + '.';
                                        arr.push( p + moduleMap[prefix].join( ',' ) );
                                        if ( typeof module !== 'string' ) {
                                                throw new Error( 'module must be of type string, not ' + typeof module );
                                        }
-                                       if ( !$.isFunction( script ) && !$.isArray( script ) ) {
+                                       if ( script && !$.isFunction( script ) && !$.isArray( script ) ) {
                                                throw new Error( 'script must be of type function or array, not ' + typeof script );
                                        }
                                        if ( style && !$.isPlainObject( style ) ) {
                                                throw new Error( 'module already implemented: ' + module );
                                        }
                                        // Attach components
-                                       registry[module].script = script;
+                                       registry[module].script = script || [];
                                        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
                                        if ( $.inArray( registry[module].state, ['error', 'missing'] ) === -1 ) {
 
        // Attach to window and globally alias
        window.mw = window.mediaWiki = mw;
-
-       // Auto-register from pre-loaded startup scripts
-       if ( $.isFunction( window.startUp ) ) {
-               window.startUp();
-               window.startUp = undefined;
-       }
-
 }( jQuery ) );
diff --git a/resources/src/mediawiki/mediawiki.sectionAnchor.css b/resources/src/mediawiki/mediawiki.sectionAnchor.css
new file mode 100644 (file)
index 0000000..1a8fe0a
--- /dev/null
@@ -0,0 +1,59 @@
+/* Anchors for section headings */
+.mw-headline-anchor {
+    font-weight: normal;
+    margin-left: -14px;
+    width: 14px;
+    filter: alpha(opacity=0);
+    opacity: 0;
+    position: absolute;
+    text-align: center;
+    text-decoration: none;
+    -moz-user-select: none;
+    -webkit-user-select: none;
+    user-select: none;
+}
+
+/* @noflip */
+.mw-content-ltr .mw-headline-anchor,
+.mw-content-rtl .mw-content-ltr .mw-headline-anchor {
+    margin-left: -14px;
+    margin-right: 0;
+}
+
+/* @noflip */
+.mw-content-rtl .mw-headline-anchor,
+.mw-content-ltr .mw-content-rtl .mw-headline-anchor {
+    margin-left: 0;
+    margin-right: -14px;
+}
+
+.mw-headline-anchor,
+.mw-headline-anchor:visited {
+    color: #888;
+}
+
+.mw-headline-anchor:hover,
+.mw-headline-anchor:focus {
+    color: #555;
+    text-decoration: none;
+}
+
+.mw-headline-anchor:active {
+    color: #000;
+}
+
+.mw-body h1:hover .mw-headline-anchor,
+.mw-body h2:hover .mw-headline-anchor,
+.mw-body h3:hover .mw-headline-anchor,
+.mw-body h4:hover .mw-headline-anchor,
+.mw-body h5:hover .mw-headline-anchor,
+.mw-body h6:hover .mw-headline-anchor,
+.mw-body h1:focus .mw-headline-anchor,
+.mw-body h2:focus .mw-headline-anchor,
+.mw-body h3:focus .mw-headline-anchor,
+.mw-body h4:focus .mw-headline-anchor,
+.mw-body h5:focus .mw-headline-anchor,
+.mw-body h6:focus .mw-headline-anchor {
+    filter: alpha(opacity=100);
+    opacity: 1;
+}
diff --git a/resources/src/mediawiki/mediawiki.sectionAnchor.hide.css b/resources/src/mediawiki/mediawiki.sectionAnchor.hide.css
new file mode 100644 (file)
index 0000000..a7695cc
--- /dev/null
@@ -0,0 +1,4 @@
+/* Hide section anchor from print media */
+.mw-headline-anchor {
+    display: none;
+}
diff --git a/resources/src/mediawiki/mediawiki.startUp.js b/resources/src/mediawiki/mediawiki.startUp.js
new file mode 100644 (file)
index 0000000..028784c
--- /dev/null
@@ -0,0 +1,11 @@
+/*!
+ * Auto-register from pre-loaded startup scripts
+ */
+( function ( $ ) {
+       'use strict';
+
+       if ( $.isFunction( window.startUp ) ) {
+               window.startUp();
+               window.startUp = undefined;
+       }
+}( jQuery ) );
index 809a65e..04d9ec6 100644 (file)
@@ -3,8 +3,9 @@
  * @singleton
  */
 ( function ( mw, $ ) {
-       var user,
+       var user, i,
                deferreds = {},
+               byteToHex = [],
                // Extend the skeleton mw.user from mediawiki.js
                // This is kind of ugly but we're stuck with this for b/c reasons
                options = mw.user.options || new mw.Map(),
                return deferreds[info].promise();
        }
 
+       // Map from numbers 0-255 to a hex string (with padding)
+       for ( i = 0; i < 256; i++ ) {
+               // Padding: Add a full byte (0x100, 256) and strip the extra character
+               byteToHex[i] = ( i + 256 ).toString( 16 ).slice( 1 );
+       }
+
        mw.user = user = {
                options: options,
                tokens: tokens,
 
                /**
-                * Generate a random user session ID (32 alpha-numeric characters)
+                * Generate a random user session ID.
                 *
                 * This information would potentially be stored in a cookie to identify a user during a
-                * session or series of sessions. Its uniqueness should not be depended on.
+                * session or series of sessions. Its uniqueness should not be depended on unless the
+                * browser supports the crypto API.
+                *
+                * Known problems with Math.random():
+                * Using the Math.random function we have seen sets
+                * with 1% of non uniques among 200,000 values with Safari providing most of these.
+                * Given the prevalence of Safari in mobile the percentage of duplicates in
+                * mobile usages of this code is probably higher.
                 *
-                * @return {string} Random set of 32 alpha-numeric characters
+                * Rationale:
+                * We need about 64 bits to make sure that probability of collision
+                * on 500 million (5*10^8) is <= 1%
+                * See https://en.wikipedia.org/wiki/Birthday_problem#Probability_table
+                *
+                * @return {string} 64 bit integer in hex format, padded
                 */
                generateRandomSessionId: function () {
-                       var i, r,
-                               id = '',
-                               seed = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
-                       for ( i = 0; i < 32; i++ ) {
-                               r = Math.floor( Math.random() * seed.length );
-                               id += seed.charAt( r );
+                       /*jshint bitwise:false */
+                       var rnds, i, r,
+                               hexRnds = new Array( 8 ),
+                               // Support: IE 11
+                               crypto = window.crypto || window.msCrypto;
+
+                       // Based on https://github.com/broofa/node-uuid/blob/bfd9f96127/uuid.js
+                       if ( crypto ) {
+                               // Fill an array with 8 random values, each of which is 8 bits.
+                               // Note that Uint8Array is array-like but does not implement Array.
+                               rnds = new Uint8Array( 8 );
+                               crypto.getRandomValues( rnds );
+                       } else {
+                               rnds = new Array( 8 );
+                               for ( i = 0; i < 8; i++ ) {
+                                       if ( ( i & 3 ) === 0 ) {
+                                               r = Math.random() * 0x100000000;
+                                       }
+                                       rnds[i] = r >>> ( ( i & 3 ) << 3 ) & 255;
+                               }
+                       }
+                       // Convert from number to hex
+                       for ( i = 0; i < 8; i++ ) {
+                               hexRnds[i] = byteToHex[rnds[i]];
                        }
-                       return id;
+
+                       // Concatenation of two random integers with entrophy n and m
+                       // returns a string with entrophy n+m if those strings are independent
+                       return hexRnds.join( '' );
                },
 
                /**
                        var registration = mw.config.get( 'wgUserRegistration' );
                        if ( user.isAnon() ) {
                                return false;
-                       } else if ( registration === null ) {
+                       }
+                       if ( registration === null ) {
                                // Information may not be available if they signed up before
                                // MW began storing this.
                                return null;
-                       } else {
-                               return new Date( registration );
                        }
+                       return new Date( registration );
                },
 
                /**
index 0dde873..2c3c90f 100644 (file)
@@ -88,7 +88,7 @@
                /**
                 * Get the link to a page name (relative to `wgServer`),
                 *
-                * @param {string} str Page name
+                * @param {string|null} [str=wgPageName] Page name
                 * @param {Object} [params] A mapping of query parameter names to values,
                 *  e.g. `{ action: 'edit' }`
                 * @return {string} Url of the page with name of `str`
 
                        // HTML5 defines a string as valid e-mail address if it matches
                        // the ABNF:
-                       //      1 * ( atext / "." ) "@" ldh-str 1*( "." ldh-str )
+                       //     1 * ( atext / "." ) "@" ldh-str 1*( "." ldh-str )
                        // With:
                        // - atext   : defined in RFC 5322 section 3.2.3
                        // - ldh-str : defined in RFC 1034 section 3.5
                        rfc5322Atext = 'a-z0-9!#$%&\'*+\\-/=?^_`{|}~';
 
                        // Next define the RFC 1034 'ldh-str'
-                       //      <domain> ::= <subdomain> | " "
-                       //      <subdomain> ::= <label> | <subdomain> "." <label>
-                       //      <label> ::= <letter> [ [ <ldh-str> ] <let-dig> ]
-                       //      <ldh-str> ::= <let-dig-hyp> | <let-dig-hyp> <ldh-str>
-                       //      <let-dig-hyp> ::= <let-dig> | "-"
-                       //      <let-dig> ::= <letter> | <digit>
+                       //     <domain> ::= <subdomain> | " "
+                       //     <subdomain> ::= <label> | <subdomain> "." <label>
+                       //     <label> ::= <letter> [ [ <ldh-str> ] <let-dig> ]
+                       //     <ldh-str> ::= <let-dig-hyp> | <let-dig-hyp> <ldh-str>
+                       //     <let-dig-hyp> ::= <let-dig> | "-"
+                       //     <let-dig> ::= <letter> | <digit>
                        rfc1034LdhStr = 'a-z0-9\\-';
 
                        html5EmailRegexp = new RegExp(
index 7eb152a..b85516c 100644 (file)
@@ -112,22 +112,30 @@ Template:echo_with_div
 !! endarticle
 
 !! article
-Template:attr_str
+Template:table_attribs
 !! text
-{{{1}}}="{{{2}}}"
+<noinclude>
+|</noinclude>style="color:red;"|Foo
 !! endarticle
 
 !! article
-Template:table_attribs
+Template:table_attribs_2
 !! text
 <noinclude>
-|</noinclude>style="color: red"| Foo
+|</noinclude>style="color:red;"|Foo
+|Bar||Baz
+!! endarticle
+
+!! article
+Template:table_header_cells
+!! text
+{{table_attribs}}!!style='color:red;'|''Bar''||style='color:brown;'|''Foo'' and Baz
 !! endarticle
 
 !! article
 Template:table_cells
 !! text
-{{table_attribs}} || Bar || Baz
+{{table_attribs}}||style='color:red;'|''Bar''||style='color:brown;'|''Foo'' and Baz
 !! endarticle
 
 !! article
@@ -137,6 +145,15 @@ Template:image_attribs
 [[File:foobar.jpg|</noinclude>right|Caption text<noinclude>]]</noinclude>
 !! endarticle
 
+## See T48811 for details
+!! article
+Template:mixed_attr_content_template
+!! text
+style="color:red;" title="T48811"
+|-
+|foo
+!! endarticle
+
 !! article
 A?b
 !! text
@@ -408,11 +425,11 @@ a
 <p>a
 </p><p><br />
 </p>
-<h1><span class="mw-headline" id="b">b</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: b">edit</a><span class="mw-editsection-bracket">]</span></span></h1>
+<h1><a href="#b" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="b">b</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: b">edit</a><span class="mw-editsection-bracket">]</span></span></h1>
 <p><a href="/index.php?title=A&amp;action=edit&amp;redlink=1" class="new" title="A (page does not exist)">a</a>
 </p><p><br />
 </p>
-<h1><span class="mw-headline" id="b_2">b</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: b">edit</a><span class="mw-editsection-bracket">]</span></span></h1>
+<h1><a href="#b_2" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="b_2">b</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: b">edit</a><span class="mw-editsection-bracket">]</span></span></h1>
 
 !! end
 
@@ -425,7 +442,7 @@ Extra newlines between heading and content are swallowed
 
 [[a]]
 !! html
-<h1><span class="mw-headline" id="b">b</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: b">edit</a><span class="mw-editsection-bracket">]</span></span></h1>
+<h1><a href="#b" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="b">b</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: b">edit</a><span class="mw-editsection-bracket">]</span></span></h1>
 <p><a href="/index.php?title=A&amp;action=edit&amp;redlink=1" class="new" title="A (page does not exist)">a</a>
 </p>
 !! end
@@ -706,7 +723,7 @@ parsoid=wt2html
 !! test
 Italics and bold: 4-quote opening sequence: (4,4) w/ nowiki
 !! wikitext
-'<nowiki/>'''foo'<nowiki/>'''
+'<nowiki/>'''foo''''
 !! html
 <p>'<b>foo'</b>
 </p>
@@ -1188,28 +1205,49 @@ Ruby markup (W3C-style)
 </p>
 !! end
 
-# There is a tidy bug here: http://sourceforge.net/p/tidy/bugs/946/
+# The next two test different paths in the sanitizer.
 !! test
 Non-word characters don't terminate tag names (bug 17663, 40670, 52022)
 !! wikitext
-<b→> doesn't work! </b→>
+<b→> doesn't terminate </b→>
 
-<bä> doesn't work! </bä>
+<bä> doesn't terminate </bä>
 
-<boo> works fine </boo>
+<boo> doesn't terminate </boo>
 
-<s.foo>s.foo</s.foo>
+<s.foo> doesn't terminate </s.foo>
 
 <sub-ID#1>
 !! html
-<p>&lt;b→&gt; doesn't work! &lt;/b→&gt;
-</p><p>&lt;bä&gt; doesn't work! &lt;/bä&gt;
-</p><p>&lt;boo&gt; works fine &lt;/boo&gt;
-</p><p>&lt;s.foo&gt;s.foo&lt;/s.foo&gt;
+<p>&lt;b→&gt; doesn't terminate &lt;/b→&gt;
+</p><p>&lt;bä&gt; doesn't terminate &lt;/bä&gt;
+</p><p>&lt;boo&gt; doesn't terminate &lt;/boo&gt;
+</p><p>&lt;s.foo&gt; doesn't terminate &lt;/s.foo&gt;
 </p><p>&lt;sub-ID#1&gt;
 </p>
 !! end
 
+# There is a tidy bug here: http://sourceforge.net/p/tidy/bugs/946/
+!! test
+Non-word characters don't terminate tag names + tidy
+!! wikitext
+<b→> doesn't terminate </b→>
+
+<bä> doesn't terminate </bä>
+
+<boo> doesn't terminate </boo>
+
+<s.foo> doesn't terminate </s.foo>
+
+<sub-ID#1>
+!! html+tidy
+<p>&lt;b→&gt; doesn't terminate &lt;/b→&gt;</p>
+<p>&lt;bä&gt; doesn't terminate &lt;/bä&gt;</p>
+<p>&lt;boo&gt; doesn't terminate &lt;/boo&gt;</p>
+<p>&lt;s.foo&gt; doesn't terminate &lt;/s.foo&gt;</p>
+<p>&lt;sub-ID#1&gt;</p>
+!! end
+
 !! test
 Isolated close tags should be treated as literal text (bug 52760)
 !! wikitext
@@ -1322,10 +1360,10 @@ parsoid
 Properly escape nowiki when combined with other wiki markup
 !! options
 parsoid=html2wt
-!! wikitext
-<nowiki>* &lt;/nowiki&gt;</nowiki> tag
 !! html
 <p>* &lt;/nowiki&gt; tag</p>
+!! wikitext
+<nowiki>* &lt;/nowiki&gt;</nowiki> tag
 !! end
 
 ###
@@ -2519,6 +2557,18 @@ parsoid
 <p about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"a : b"}},"i":0}}]}'>a<span typeof="mw:Placeholder" data-parsoid='{"isDisplayHack":true}'> </span>: b</p>
 !! end
 
+## Bug T73412
+!! test
+Templates: Preserve blank parameter names
+!! wikitext
+{{echo|=foo}}
+!! html/php
+<p>{{{1}}}
+</p>
+!! html/parsoid
+<p about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"":{"wt":"foo"}},"i":0}}]}'>{{{1}}}</p>
+!! end
+
 ###
 ### Parsoid-centric tests for testing RT edge cases for pre
 ###
@@ -3201,10 +3251,12 @@ Definition list with wikilink containing colon
 Definition list with news link containing colon
 !! wikitext
 ;  news:alt.wikipedia.rox: This isn't even a real newsgroup!
-!! html
+!! html/php
 <dl><dt>  <a rel="nofollow" class="external free" href="news:alt.wikipedia.rox">news:alt.wikipedia.rox</a></dt>
 <dd> This isn't even a real newsgroup!</dd></dl>
 
+!! html/parsoid
+<dl><dt>  <a rel="mw:ExtLink" href="news:alt.wikipedia.rox" data-parsoid='{"stx":"url"}'>news:alt.wikipedia.rox</a></dt><dd data-parsoid='{"stx":"row"}'> This isn't even a real newsgroup!</dd></dl>
 !! end
 
 !! test
@@ -3894,7 +3946,7 @@ Definition Lists: Weird Ones: Test 1
 <dl>
 <dt>
 <dl>
-<dt> foo<span typeof="mw:Placeholder" data-parsoid='{"src":" "}'>&nbsp;</span></dt>
+<dt> foo<span typeof="mw:Placeholder">&nbsp;</span></dt>
 <dd data-parsoid='{"stx":"row"}'> bar (who uses this?)</dd>
 </dl></dt>
 </dl></dd>
@@ -4188,7 +4240,7 @@ 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
+!! html/php
 <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>;
 <a rel="nofollow" class="external free" href="http://example.com">http://example.com</a>\
@@ -4206,6 +4258,23 @@ http://example.com/url_with_entity&#60;
 <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>
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="http://example.com">http://example.com</a>,
+<a rel="mw:ExtLink" href="http://example.com">http://example.com</a>;
+<a rel="mw:ExtLink" href="http://example.com">http://example.com</a>\
+<a rel="mw:ExtLink" href="http://example.com">http://example.com</a>.
+<a rel="mw:ExtLink" href="http://example.com">http://example.com</a>:
+<a rel="mw:ExtLink" href="http://example.com">http://example.com</a>!
+<a rel="mw:ExtLink" href="http://example.com">http://example.com</a>?
+<a rel="mw:ExtLink" href="http://example.com">http://example.com</a>)
+<a rel="mw:ExtLink" href="http://example.com/url_with_(brackets)">http://example.com/url_with_(brackets)</a>
+(<a rel="mw:ExtLink" href="http://example.com/url_without_brackets">http://example.com/url_without_brackets</a>)
+<a rel="mw:ExtLink" href="http://example.com/url_with_entity ">http://example.com/url_with_entity </a>
+<a rel="mw:ExtLink" href="http://example.com/url_with_entity ">http://example.com/url_with_entity </a>
+<a rel="mw:ExtLink" href="http://example.com/url_with_entity ">http://example.com/url_with_entity </a>
+<a rel="mw:ExtLink" href="http://example.com/url_with_entity">http://example.com/url_with_entity</a><span typeof="mw:Entity">&lt;</span>
+<a rel="mw:ExtLink" href="http://example.com/url_with_entity&lt;">http://example.com/url_with_entity&lt;</a>
+<a rel="mw:ExtLink" href="http://example.com/url_with_entity&lt;">http://example.com/url_with_entity&lt;</a></p>
 !! end
 
 !! test
@@ -4310,10 +4379,12 @@ URL in text: [http://example.com http://example.com]
 External links: Clickable images
 !! wikitext
 ja-style clickable images: [http://example.com http://meta.wikimedia.org/upload/f/f1/Ncwikicol.png]
-!! html
+!! html/php
 <p>ja-style clickable images: <a rel="nofollow" class="external text" href="http://example.com"><img src="http://meta.wikimedia.org/upload/f/f1/Ncwikicol.png" alt="Ncwikicol.png" /></a>
 </p>
-!!end
+!! html/parsoid
+<p>ja-style clickable images: <a rel="mw:ExtLink" href="http://example.com"><img src="http://meta.wikimedia.org/upload/f/f1/Ncwikicol.png" alt="Ncwikicol.png" data-parsoid='{"type":"extlink"}'/></a></p>
+!! end
 
 !! test
 External links: raw ampersand
@@ -4503,10 +4574,12 @@ http://www.example.com/<hello>
 BUG 289: literal ">"-token in URL-tail
 !! wikitext
 http://www.example.com/<b>html</b>
-!! html
+!! html/php
 <p><a rel="nofollow" class="external free" href="http://www.example.com/">http://www.example.com/</a><b>html</b>
 </p>
-!!end
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="http://www.example.com/" data-parsoid='{"stx":"url"}'>http://www.example.com/</a><b data-parsoid='{"stx":"html"}'>html</b></p>
+!! end
 
 !! test
 BUG 289: ">"-token in bracketed URL
@@ -4625,7 +4698,7 @@ http://www.example.com/?title=AT%26T
 <p><a rel="mw:ExtLink" href="http://www.example.com/?title=AT%26T">http://www.example.com/?title=AT%26T</a></p>
 !! end
 
-# According to http://dev.w3.org/html5/spec/Overview.html#parsing-urls a plain
+# According to http://www.w3.org/TR/2011/WD-html5-20110525/Overview.html#parsing-urls a plain
 # % is actually legal in HTML5. Any change in output would need testing though.
 !! test
 Bug 4781, 5267: %25 in URL
@@ -5510,7 +5583,6 @@ Invalid attributes in table cell (bug 1830)
 
 !! end
 
-
 # The "|}" to close the table is missing from the input, so parsoid's
 # *2wt modes will fail.
 !! test
@@ -5535,6 +5607,25 @@ parsoid=wt2html,html2html
 <td><a rel="mw:ExtLink" href="ftp://|x||"></a>" onmouseover="alert(document.cookie)">test</td></tr></tbody></table>
 !! end
 
+# FIXME: The php output is broken.
+!! test
+! and || in td attributes should not be parsed as <th>/<td>
+!! wikitext
+{|
+| style="color: red !important;" data-contrived="put this here ||" | foo
+|}
+!! html/php
+<table>
+<tr>
+<td> style="color: red !important;" data-contrived="put this here </td>
+<td> foo
+</td></tr></table>
+
+!! html/parsoid
+<table>
+<tbody><tr><td style="color: red !important;" data-contrived="put this here ||" data-parsoid='{"autoInsertedEnd":true}'> foo</td></tr>
+</tbody></table>
+!! end
 
 !! test
 Indented table markup mixed with indented pre content (proposed in bug 6200)
@@ -5559,7 +5650,7 @@ Indented table markup mixed with indented pre content (proposed in bug 6200)
 !! end
 
 !! test
-Template-generated table cell attributes and cell content
+1. Template-generated table cell attributes and cell content
 !! wikitext
 {|
 |{{table_attribs}}
@@ -5571,33 +5662,67 @@ Template-generated table cell attributes and cell content
 !! html
 <table>
 <tr>
-<td style="color: red"> Foo
+<td style="color:red;">Foo
 </td>
-<td style="color: red"> Foo
+<td style="color:red;">Foo
 </td>
-<td style="color: red"> Foo
+<td style="color:red;">Foo
 </td>
-<td align="center" style="color: red"> Foo
+<td align="center" style="color:red;">Foo
+</td>
+<td align="center" style="color:red;">Foo
+</td></tr></table>
+
+!! end
+
+!! test
+2. Template-generated table cell attributes and cell content
+!! wikitext
+{|
+|{{table_attribs_2}}
+|}
+!! html/php
+<table>
+<tr>
+<td style="color:red;">Foo
 </td>
-<td align="center" style="color: red"> Foo
+<td>Bar</td>
+<td>Baz
 </td></tr></table>
 
+!! html/parsoid
+<table>
+<tbody><tr><td about="#mwt1" typeof="mw:Transclusion" style="color:red;" data-mw='{"parts":["|",{"template":{"target":{"wt":"table_attribs_2","href":"./Template:Table_attribs_2"},"params":{},"i":0}}]}'>Foo</td>
+<td about="#mwt1">Bar</td><td about="#mwt1">Baz</td></tr>
+</tbody></table>
 !! end
 
 !! test
-Template-generated table cell attributes and cell content (2)
+3. Template-generated table cell attributes and cell content
 !! wikitext
 {|
+!align=center {{table_header_cells}}
+|-
 |align=center {{table_cells}}
 |}
-!! html
+!! html/php
 <table>
 <tr>
-<td align="center" style="color: red"> Foo </td>
-<td> Bar </td>
-<td> Baz
+<th align="center" style="color:red;">Foo</th>
+<th style="color:red;"><i>Bar</i></th>
+<th style="color:brown;"><i>Foo</i> and Baz
+</th></tr>
+<tr>
+<td align="center" style="color:red;">Foo</td>
+<td style="color:red;"><i>Bar</i></td>
+<td style="color:brown;"><i>Foo</i> and Baz
 </td></tr></table>
 
+!! html/parsoid
+<table>
+<tbody><tr><th align="center" style="color:red;" typeof="mw:Transclusion" about="#mwt1" data-mw='{"parts":["!align=center ",{"template":{"target":{"wt":"table_header_cells","href":"./Template:Table_header_cells"},"params":{},"i":0}}]}'>Foo</th><th about="#mwt1" style="color:red;"><i about="#mwt1">Bar</i></th><th about="#mwt1" style="color:brown;"><i about="#mwt1">Foo</i> and Baz</th></tr><tr>
+<td align="center" style="color:red;" typeof="mw:Transclusion" about="#mwt1" data-mw='{"parts":["|align=center ",{"template":{"target":{"wt":"table_cells","href":"./Template:Table_cells"},"params":{},"i":0}}]}'>Foo</td><td about="#mwt1" style="color:red;"><i about="#mwt1">Bar</i></td><td about="#mwt1" style="color:brown;"><i about="#mwt1">Foo</i> and Baz</td></tr>
+</tbody></table>
 !! end
 
 !! test
@@ -5971,6 +6096,11 @@ parsoid=wt2html,wt2wt
 Parsoid: Default to a newline after tables in new content (bug 51219)
 !! options
 parsoid=html2wt
+!! html
+<table><tbody>
+<tr><td>foo</td></tr></tbody></table> bar
+<table><tbody>
+<tr><td>baz</td></tr></tbody></table><b>quux</b>
 !! wikitext
 {|
 |foo
@@ -5980,23 +6110,18 @@ parsoid=html2wt
 |baz
 |}
 '''quux'''
-!! html
-<table><tbody>
-<tr><td>foo</td></tr></tbody></table> bar
-<table><tbody>
-<tr><td>baz</td></tr></tbody></table><b>quux</b>
 !! end
 
 !! test
 Parsoid: newline inducing block nodes don't suppress <nowiki>
 !! options
 parsoid=html2wt
+!! html
+ a<h1>foo</h1>
 !! wikitext
 <nowiki> </nowiki>a
 
 = foo =
-!! html
- a<h1>foo</h1>
 !! end
 
 !! test
@@ -6231,9 +6356,11 @@ Bug 43661: Piped links with identical prefixes
 Link with HTML entity in suffix / tail
 !! wikitext
 [[Main Page]]&quot;, [[Main Page]]&#97;
-!! html
+!! html/php
 <p><a href="/wiki/Main_Page" title="Main Page">Main Page</a>&quot;, <a href="/wiki/Main_Page" title="Main Page">Main Page</a>&#97;
 </p>
+!! html/parsoid
+<p><a rel="mw:WikiLink" href="./Main_Page" title="Main Page">Main Page</a><span typeof="mw:Entity" data-parsoid='{"src":"&amp;quot;","srcContent":"\""}'>"</span>, <a rel="mw:WikiLink" href="./Main_Page" title="Main Page">Main Page</a><span typeof="mw:Entity" data-parsoid='{"src":"&amp;#97;","srcContent":"a"}'>a</span></p>
 !! end
 
 !! test
@@ -6268,10 +6395,13 @@ Piped link with extlink-like text
 !! wikitext
 [[Main Page|[bar]]]
 [[Main Page|This is a [bar]]]
-!! html
+!! html/php
 <p><a href="/wiki/Main_Page" title="Main Page">[bar]</a>
 <a href="/wiki/Main_Page" title="Main Page">This is a [bar]</a>
 </p>
+!! html/parsoid
+<p><a rel="mw:WikiLink" href="./Main_Page" title="Main Page" data-parsoid='{"stx":"piped"}'>[bar]</a>
+<a rel="mw:WikiLink" href="./Main_Page" title="Main Page" data-parsoid='{"stx":"piped"}'>This is a [bar]</a></p>
 !! end
 
 !! test
@@ -6336,11 +6466,10 @@ Namespace takes precedence over interwiki link (bug 51680)
 Link to namespace preferred over interwiki with correct rel attribute
 !! options
 parsoid=html2wt,html2html
+!! html
+<p><a rel="mw:WikiLink" href="./MemoryAlpha:AlphaTest" title="MemoryAlpha:AlphaTest">MemoryAlpha:AlphaTest</a></p>
 !! wikitext
 [[MemoryAlpha:AlphaTest]]
-!! html
-<p><a rel="mw:WikiLink" href="./MemoryAlpha:AlphaTest" title="MemoryAlpha:AlphaTest">MemoryAlpha:AlphaTest</a>
-</p>
 !! end
 
 !! test
@@ -6845,10 +6974,10 @@ mótmælenda[[söfnuður|söfnuðir]]xxx
 Parsoid link trail escaping
 !! options
 parsoid=html2wt,html2html
-!! wikitext
-[[apple]]<nowiki/>s
 !! html
 <p><a rel="mw:WikiLink" href="Apple" title="Apple">apple</a>s</p>
+!! wikitext
+[[apple]]<nowiki/>s
 !! end
 
 !! test
@@ -6856,10 +6985,10 @@ Parsoid link prefix escaping
 !! options
 language=is
 parsoid=html2wt,html2html
-!! wikitext
-Aðrir mótmælenda<nowiki/>[[söfnuður]]
 !! html
 <p>Aðrir mótmælenda<a rel="mw:WikiLink" href="Söfnuður" title="Söfnuður">söfnuður</a></p>
+!! wikitext
+Aðrir mótmælenda<nowiki/>[[söfnuður]]
 !! end
 
 !! test
@@ -7228,13 +7357,13 @@ language=ln
 Parsoid bug 53221: Wikilinks should be properly entity-escaped
 !! options
 parsoid=html2wt
+!! html
+<p>He&amp;nbsp;llo <a href="Foo" rel="mw:WikiLink">He&amp;nbsp;llo</a></p>
+<p>He&amp;nbsp;llo <a href="He&amp;nbsp;llo" rel="mw:WikiLink">He&amp;nbsp;llo</a></p>
 !! wikitext
 He&amp;nbsp;llo [[Foo|He&amp;nbsp;llo]]
 
 He&amp;nbsp;llo [[He&amp;nbsp;llo]]
-!! html
-<p>He&amp;nbsp;llo <a href="Foo" rel="mw:WikiLink">He&amp;nbsp;llo</a></p>
-<p>He&amp;nbsp;llo <a href="He&amp;nbsp;llo" rel="mw:WikiLink">He&amp;nbsp;llo</a></p>
 !! end
 
 !! test
@@ -7498,11 +7627,11 @@ language=is
 New redirect
 !! options
 parsoid=html2wt
+!! html
+<p>Foo<link rel="mw:PageProp/redirect" href="./Foo"></p>
 !! wikitext
 Foo
 #REDIRECT [[Foo]]
-!! html
-<p>Foo<link rel="mw:PageProp/redirect" href="./Foo"></p>
 !! end
 
 ##
@@ -7923,7 +8052,7 @@ List interrupted by empty line or heading
 !! html
 <ul><li> foo</li></ul>
 <ul><li><ul><li> bar</li></ul></li></ul>
-<h2><span class="mw-headline" id="A_heading">A heading</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: A heading">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><a href="#A_heading" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="A_heading">A heading</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: A heading">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 <ul><li> Another list item</li></ul>
 
 !!end
@@ -8745,6 +8874,23 @@ Aoeu
 </p>
 !! end
 
+# From plwiki:PLOS_ONE
+!! test
+Parsoid: Page property magic word with magic word contents
+!! wikitext
+{{DISPLAYTITLE:''{{PAGENAME}}''}}
+!! html/parsoid
+<meta property="mw:PageProp/displaytitle" content="Main Page" about="#mwt2" typeof="mw:ExpandedAttrs" data-mw='{"attribs":[[{"txt":"content"},{"html":"&lt;i data-parsoid=\"{&amp;quot;dsr&amp;quot;:[15,31,2,2]}\">&lt;span about=\"#mwt1\" typeof=\"mw:Transclusion\" data-parsoid=\"{&amp;quot;pi&amp;quot;:[[]],&amp;quot;dsr&amp;quot;:[17,29,null,null]}\" data-mw=\"{&amp;quot;parts&amp;quot;:[{&amp;quot;template&amp;quot;:{&amp;quot;target&amp;quot;:{&amp;quot;wt&amp;quot;:&amp;quot;PAGENAME&amp;quot;,&amp;quot;function&amp;quot;:&amp;quot;pagename&amp;quot;},&amp;quot;params&amp;quot;:{},&amp;quot;i&amp;quot;:0}}]}\">Main Page&lt;/span>&lt;/i>"}]]}'/>
+!! end
+
+!! test
+Parsoid: Template-generated DISPLAYTITLE
+!! wikitext
+{{{{echo|DISPLAYTITLE}}:Foo}}
+!! html/parsoid
+<meta property="mw:PageProp/displaytitle" content="Foo" about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"dsr":[0,29,null,null],"pi":[[]]}' data-mw='{"parts":[{"template":{"target":{"wt":"{{echo|DISPLAYTITLE}}:Foo"},"params":{},"i":0}}]}'/>
+!! end
+
 !! test
 Namespace 1 {{ns:1}}
 !! wikitext
@@ -8875,10 +9021,10 @@ hi+world%3F%21
 Magic Word: prioritize type info over data-parsoid
 !! options
 parsoid=html2wt
+!! html
+<meta property="mw:PageProp/forcetoc" data-parsoid='{"magicSrc":"__NOTOC__"}'/>
 !! wikitext
 __FORCETOC__
-!! html
-<meta property="mw:PageProp/forcetoc" data-parsoid='{"src":"__NOTOC__","magicSrc":"__NOTOC__"}'/>
 !! end
 
 !! test
@@ -8901,7 +9047,7 @@ language=de
 !! wikitext
 __NOEDITSECTION__
 !! html
-<meta property="mw:PageProp/noeditsection" data-parsoid='{"src":"__NOEDITSECTION__","magicSrc":"__NOEDITSECTION__"}'/>
+<meta property="mw:PageProp/noeditsection" data-parsoid='{"magicSrc":"__NOEDITSECTION__"}'/>
 !! end
 
 ###
@@ -8960,9 +9106,11 @@ ISBN 0-306-40615-2
 Magic links: ISBN (bug 65278)
 !! wikitext
 This is ISBN 978-0-316-09811-3 but thisISBN 978-0-316-09811-3 is not ISBN 978-0-316-09811-3linked.
-!! html
+!! html/php
 <p>This is <a href="/wiki/Special:BookSources/9780316098113" class="internal mw-magiclink-isbn">ISBN 978-0-316-09811-3</a> but thisISBN 978-0-316-09811-3 is not ISBN 978-0-316-09811-3linked.
 </p>
+!! html/parsoid
+<p>This is <a href="./Special:BookSources/9780316098113" rel="mw:ExtLink">ISBN 978-0-316-09811-3</a> but thisISBN 978-0-316-09811-3 is not ISBN 978-0-316-09811-3linked.</p>
 !! end
 
 !! test
@@ -9309,15 +9457,6 @@ Template parameter as link source
 </p>
 !! end
 
-!!test
-Template-generated attribute string (k='v')
-!! wikitext
-<span {{attr_str|id|v1}}>bar</span>
-!! html
-<p><span id="v1">bar</span>
-</p>
-!!end
-
 !!article
 Template:paramtest2
 !! text
@@ -9621,8 +9760,8 @@ Bug 6563: Edit link generation for section shown by <includeonly>
 !! wikitext
 {{includeonly section}}
 !! html
-<h2><span class="mw-headline" id="Includeonly_section">Includeonly section</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Template:Includeonly_section&amp;action=edit&amp;section=T-1" title="Template:Includeonly section">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
-<h2><span class="mw-headline" id="Section_T-1">Section T-1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Template:Includeonly_section&amp;action=edit&amp;section=T-2" title="Template:Includeonly section">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><a href="#Includeonly_section" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="Includeonly_section">Includeonly section</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Template:Includeonly_section&amp;action=edit&amp;section=T-1" title="Template:Includeonly section">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><a href="#Section_T-1" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="Section_T-1">Section T-1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Template:Includeonly_section&amp;action=edit&amp;section=T-2" title="Template:Includeonly section">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 
 !! end
 
@@ -9648,7 +9787,7 @@ Bug 6563: Edit link generation for section suppressed by <includeonly>
 </includeonly>
 ==Section 1==
 !! html
-<h2><span class="mw-headline" id="Section_1">Section 1</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: Section 1">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><a href="#Section_1" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="Section_1">Section 1</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: Section 1">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 
 !! end
 
@@ -9685,12 +9824,12 @@ some
 <includeonly>can have stuff</includeonly>=== here ===
 
 !! html/php
-<h2><span class="mw-headline" id="hu">hu</span></h2>
+<h2><a href="#hu" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="hu">hu</span></h2>
 <p>some
 </p>
 <ul><li> stuff</li>
 <li> here</li></ul>
-<h3><span class="mw-headline" id="here">here</span></h3>
+<h3><a href="#here" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="here">here</span></h3>
 
 !! html/parsoid
 <!-- comment --><meta typeof="mw:Includes/NoInclude" data-parsoid='{"src":"&lt;noinclude>"}'/><!-- comment --><meta typeof="mw:Includes/NoInclude/End" data-parsoid='{"src":"&lt;/noinclude>"}'/><!-- comment --><h2> hu </h2>
@@ -9863,7 +10002,7 @@ parsoid=wt2html,wt2wt
 |c
 |}
 !!html/parsoid
-<meta typeof="mw:Includes/IncludeOnly" data-parsoid='{"src":"&lt;includeonly>a&lt;/includeonly>"'/><meta typeof="mw:Includes/IncludeOnly/End" data-parsoid='{"src":""}'/><table about="#mwt2" typeof="mw:ExpandedAttrs" data-mw='{"attribs":[[{"txt":"{{{b}}}","html":"&lt;span about=\"#mwt1\" typeof=\"mw:Param\" data-parsoid=\"{&amp;quot;dsr&amp;quot;:[31,38,null,null],&amp;quot;src&amp;quot;:&amp;quot;{{{b}}}&amp;quot;}\">{{{b}}}&lt;/span>"},{"html":""}]]}' data-parsoid='{"a":{"{{{b}}}":null},"sa":{"{{{b}}}":""}}'>
+<meta typeof="mw:Includes/IncludeOnly"/><meta typeof="mw:Includes/IncludeOnly/End"/><table about="#mwt2" typeof="mw:ExpandedAttrs" data-mw='{"attribs":[[{"txt":"{{{b}}}","html":"&lt;span about=\"#mwt1\" typeof=\"mw:Param\" data-parsoid=\"{&amp;quot;dsr&amp;quot;:[31,38,null,null],&amp;quot;src&amp;quot;:&amp;quot;{{{b}}}&amp;quot;}\">{{{b}}}&lt;/span>"},{"html":""}]]}' data-parsoid='{"a":{"{{{b}}}":null},"sa":{"{{{b}}}":""}}'>
 <tbody><tr><td>c</td></tr>
 </tbody></table>
 
@@ -10160,6 +10299,9 @@ Templates: HTML Tag: 6. Generation of end piece of HTML attr value
 
 !!end
 
+# SSS FIXME: While it is great we added support for all this,
+# do we want to make this part of the spec? Maybe we want to
+# deprecate this kind of usage in the future?
 !!test
 Templates: HTML Tag: 7. Generation of partial attribute key string
 !! wikitext
@@ -10169,6 +10311,50 @@ Templates: HTML Tag: 7. Generation of partial attribute key string
 
 !!end
 
+!! test
+Templates: HTML Tag: 8. Template-generated attribute (k=v)
+!! wikitext
+<div {{echo|1=id="v1"}}>bar</div>
+!! html
+<div id="v1">bar</div>
+
+!!end
+
+!! test
+Templates: HTML Tag: 9. Multiple template-generated attributes
+!! wikitext
+<div {{echo|1=id="v1" title="foo"}}>bar</div>
+!! html
+<div id="v1" title="foo">bar</div>
+
+!!end
+
+!! test
+Templates: Support for templates generating attributes and content
+!! wikitext
+{| {{mixed_attr_content_template}}
+|-
+|bar
+|}
+!! html/php
+<table style="color:red;" title="T48811">
+
+<tr>
+<td>foo
+</td></tr>
+<tr>
+<td>bar
+</td></tr></table>
+
+!! html/parsoid
+<table style="color:red;" title="T48811" about="#mwt1" typeof="mw:Transclusion mw:ExpandedAttrs" data-mw='{"parts":["{| ",{"template":{"target":{"wt":"mixed_attr_content_template","href":"./Template:Mixed_attr_content_template"},"params":{},"i":0}},"\n|-\n|bar\n|}"]}'>
+<tbody><tr>
+<td>foo</td></tr>
+<tr>
+<td>bar</td></tr>
+</tbody></table>
+!!end
+
 !!test
 Templates: HTML Tables: 1. Generating start of a HTML table
 !! wikitext
@@ -11142,26 +11328,26 @@ parsoid=wt2html
 Parsoid: Escape nowiki with trailing space in tags
 !! options
 parsoid=html2wt
+!! html
+<p>&lt;nowiki &gt; foo &lt/nowiki ></p>
+<p>a&lt;nowiki /&gt;b</p>
+<p>c&lt;nowiki/ &gt;d</p>
 !! wikitext
 &lt;nowiki &gt; foo &lt;/nowiki &gt;
 
 a&lt;nowiki /&gt;b
 
 c&lt;nowiki/ &gt;d
-!! html
-<p>&lt;nowiki &gt; foo &lt/nowiki ></p>
-<p>a&lt;nowiki /&gt;b</p>
-<p>c&lt;nowiki/ &gt;d</p>
 !! end
 
 !! test
 Parsoid: Escape weird noWikI capitalizations
 !! options
 parsoid=html2wt
-!! wikitext
-&lt;noWikI &gt; foo &lt;/NoWikI &gt;
 !! html
 <p>&lt;noWikI &gt; foo &lt/NoWikI ></p>
+!! wikitext
+&lt;noWikI &gt; foo &lt;/NoWikI &gt;
 !! end
 
 ###
@@ -11389,6 +11575,17 @@ Link with empty target
 </p>
 !! end
 
+!! test
+Image with link trail
+!! wikitext
+Linktrails should not work for images: [[File:Foobar.jpg]]s
+!! html/php
+<p>Linktrails should not work for images: <a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>s
+</p>
+!! html/parsoid
+<p>Linktrails should not work for images: <span class="mw-default-size" typeof="mw:Image"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"/></a></span>s</p>
+!! end
+
 !! test
 Image with empty attribute
 !! options
@@ -12977,14 +13174,20 @@ parsoid=html2wt
 
 !! test
 Parsoid: Defaultsort
-!! options
-parsoid
 !! wikitext
 {{DEFAULTSORT:Foo}}
-!! html
+!! html/parsoid
 <meta property="mw:PageProp/categorydefaultsort" content="Foo"/>
 !! end
 
+!! test
+Parsoid: Defaultsort (template-generated)
+!! wikitext
+{{{{echo|DEFAULTSORT}}:Foo}}
+!! html/parsoid
+<meta property="mw:PageProp/categorydefaultsort" content="Foo" about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"dsr":[0,28,null,null],"pi":[[]]}' data-mw='{"parts":[{"template":{"target":{"wt":"{{echo|DEFAULTSORT}}:Foo"},"params":{},"i":0}}]}'/>
+!! end
+
 ###
 ### Inter-language links
 ###
@@ -13036,13 +13239,13 @@ More
 ===Smaller headline===
 Blah blah
 !! html
-<h2><span class="mw-headline" id="Headline_1">Headline 1</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: Headline 1">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><a href="#Headline_1" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="Headline_1">Headline 1</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: Headline 1">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 <p>Some text
 </p>
-<h2><span class="mw-headline" id="Headline_2">Headline 2</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Headline 2">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><a href="#Headline_2" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="Headline_2">Headline 2</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Headline 2">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 <p>More
 </p>
-<h3><span class="mw-headline" id="Smaller_headline">Smaller headline</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: Smaller headline">edit</a><span class="mw-editsection-bracket">]</span></span></h3>
+<h3><a href="#Smaller_headline" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="Smaller_headline">Smaller headline</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: Smaller headline">edit</a><span class="mw-editsection-bracket">]</span></span></h3>
 <p>Blah blah
 </p>
 !! end
@@ -13082,14 +13285,39 @@ Some text
 </ul>
 </div>
 
-<h2><span class="mw-headline" id="Headline_1">Headline 1</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: Headline 1">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
-<h3><span class="mw-headline" id="Subheadline_1">Subheadline 1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Subheadline 1">edit</a><span class="mw-editsection-bracket">]</span></span></h3>
-<h5><span class="mw-headline" id="Skipping_a_level">Skipping a level</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: Skipping a level">edit</a><span class="mw-editsection-bracket">]</span></span></h5>
-<h6><span class="mw-headline" id="Skipping_a_level_2">Skipping a level</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: Skipping a level">edit</a><span class="mw-editsection-bracket">]</span></span></h6>
-<h2><span class="mw-headline" id="Headline_2">Headline 2</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: Headline 2">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><a href="#Headline_1" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="Headline_1">Headline 1</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: Headline 1">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h3><a href="#Subheadline_1" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="Subheadline_1">Subheadline 1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Subheadline 1">edit</a><span class="mw-editsection-bracket">]</span></span></h3>
+<h5><a href="#Skipping_a_level" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="Skipping_a_level">Skipping a level</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: Skipping a level">edit</a><span class="mw-editsection-bracket">]</span></span></h5>
+<h6><a href="#Skipping_a_level_2" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="Skipping_a_level_2">Skipping a level</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: Skipping a level">edit</a><span class="mw-editsection-bracket">]</span></span></h6>
+<h2><a href="#Headline_2" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="Headline_2">Headline 2</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: Headline 2">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 <p>Some text
 </p>
-<h3><span class="mw-headline" id="Another_headline">Another headline</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: Another headline">edit</a><span class="mw-editsection-bracket">]</span></span></h3>
+<h3><a href="#Another_headline" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="Another_headline">Another headline</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: Another headline">edit</a><span class="mw-editsection-bracket">]</span></span></h3>
+
+!! end
+
+!! test
+TOC anchors don't collide
+!! wikitext
+__FORCETOC__
+== Headline 2 ==
+== Headline ==
+== Headline 2 ==
+== Headline ==
+!! html
+<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+<ul>
+<li class="toclevel-1 tocsection-1"><a href="#Headline_2"><span class="tocnumber">1</span> <span class="toctext">Headline 2</span></a></li>
+<li class="toclevel-1 tocsection-2"><a href="#Headline"><span class="tocnumber">2</span> <span class="toctext">Headline</span></a></li>
+<li class="toclevel-1 tocsection-3"><a href="#Headline_2_2"><span class="tocnumber">3</span> <span class="toctext">Headline 2</span></a></li>
+<li class="toclevel-1 tocsection-4"><a href="#Headline_3"><span class="tocnumber">4</span> <span class="toctext">Headline</span></a></li>
+</ul>
+</div>
+
+<h2><a href="#Headline_2" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="Headline_2">Headline 2</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: Headline 2">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><a href="#Headline" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="Headline">Headline</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Headline">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><a href="#Headline_2_2" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="Headline_2_2">Headline 2</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: Headline 2">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><a href="#Headline_3" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="Headline_3">Headline</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: Headline">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 
 !! end
 
@@ -13138,16 +13366,16 @@ Handling of sections up to level 6 and beyond
 </ul>
 </div>
 
-<h1><span class="mw-headline" id="Level_1_Heading">Level 1 Heading</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: Level 1 Heading">edit</a><span class="mw-editsection-bracket">]</span></span></h1>
-<h2><span class="mw-headline" id="Level_2_Heading">Level 2 Heading</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Level 2 Heading">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
-<h3><span class="mw-headline" id="Level_3_Heading">Level 3 Heading</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: Level 3 Heading">edit</a><span class="mw-editsection-bracket">]</span></span></h3>
-<h4><span class="mw-headline" id="Level_4_Heading">Level 4 Heading</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: Level 4 Heading">edit</a><span class="mw-editsection-bracket">]</span></span></h4>
-<h5><span class="mw-headline" id="Level_5_Heading">Level 5 Heading</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: Level 5 Heading">edit</a><span class="mw-editsection-bracket">]</span></span></h5>
-<h6><span class="mw-headline" id="Level_6_Heading">Level 6 Heading</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: Level 6 Heading">edit</a><span class="mw-editsection-bracket">]</span></span></h6>
-<h6><span class="mw-headline" id=".3D_Level_7_Heading.3D">= Level 7 Heading=</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=7" title="Edit section: = Level 7 Heading=">edit</a><span class="mw-editsection-bracket">]</span></span></h6>
-<h6><span class="mw-headline" id=".3D.3D_Level_8_Heading.3D.3D">== Level 8 Heading==</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=8" title="Edit section: == Level 8 Heading==">edit</a><span class="mw-editsection-bracket">]</span></span></h6>
-<h6><span class="mw-headline" id=".3D.3D.3D_Level_9_Heading.3D.3D.3D">=== Level 9 Heading===</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=9" title="Edit section: === Level 9 Heading===">edit</a><span class="mw-editsection-bracket">]</span></span></h6>
-<h6><span class="mw-headline" id=".3D.3D.3D.3D_Level_10_Heading.3D.3D.3D.3D">==== Level 10 Heading====</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=10" title="Edit section: ==== Level 10 Heading====">edit</a><span class="mw-editsection-bracket">]</span></span></h6>
+<h1><a href="#Level_1_Heading" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="Level_1_Heading">Level 1 Heading</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: Level 1 Heading">edit</a><span class="mw-editsection-bracket">]</span></span></h1>
+<h2><a href="#Level_2_Heading" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="Level_2_Heading">Level 2 Heading</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Level 2 Heading">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h3><a href="#Level_3_Heading" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="Level_3_Heading">Level 3 Heading</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: Level 3 Heading">edit</a><span class="mw-editsection-bracket">]</span></span></h3>
+<h4><a href="#Level_4_Heading" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="Level_4_Heading">Level 4 Heading</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: Level 4 Heading">edit</a><span class="mw-editsection-bracket">]</span></span></h4>
+<h5><a href="#Level_5_Heading" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="Level_5_Heading">Level 5 Heading</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: Level 5 Heading">edit</a><span class="mw-editsection-bracket">]</span></span></h5>
+<h6><a href="#Level_6_Heading" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="Level_6_Heading">Level 6 Heading</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: Level 6 Heading">edit</a><span class="mw-editsection-bracket">]</span></span></h6>
+<h6><a href="#.3D_Level_7_Heading.3D" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id=".3D_Level_7_Heading.3D">= Level 7 Heading=</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=7" title="Edit section: = Level 7 Heading=">edit</a><span class="mw-editsection-bracket">]</span></span></h6>
+<h6><a href="#.3D.3D_Level_8_Heading.3D.3D" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id=".3D.3D_Level_8_Heading.3D.3D">== Level 8 Heading==</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=8" title="Edit section: == Level 8 Heading==">edit</a><span class="mw-editsection-bracket">]</span></span></h6>
+<h6><a href="#.3D.3D.3D_Level_9_Heading.3D.3D.3D" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id=".3D.3D.3D_Level_9_Heading.3D.3D.3D">=== Level 9 Heading===</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=9" title="Edit section: === Level 9 Heading===">edit</a><span class="mw-editsection-bracket">]</span></span></h6>
+<h6><a href="#.3D.3D.3D.3D_Level_10_Heading.3D.3D.3D.3D" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id=".3D.3D.3D.3D_Level_10_Heading.3D.3D.3D.3D">==== Level 10 Heading====</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=10" title="Edit section: ==== Level 10 Heading====">edit</a><span class="mw-editsection-bracket">]</span></span></h6>
 
 !! end
 
@@ -13181,12 +13409,12 @@ TOC regression (bug 9764)
 </ul>
 </div>
 
-<h2><span class="mw-headline" id="title_1">title 1</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: title 1">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
-<h3><span class="mw-headline" id="title_1.1">title 1.1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: title 1.1">edit</a><span class="mw-editsection-bracket">]</span></span></h3>
-<h4><span class="mw-headline" id="title_1.1.1">title 1.1.1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: title 1.1.1">edit</a><span class="mw-editsection-bracket">]</span></span></h4>
-<h3><span class="mw-headline" id="title_1.2">title 1.2</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: title 1.2">edit</a><span class="mw-editsection-bracket">]</span></span></h3>
-<h2><span class="mw-headline" id="title_2">title 2</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: title 2">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
-<h3><span class="mw-headline" id="title_2.1">title 2.1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: title 2.1">edit</a><span class="mw-editsection-bracket">]</span></span></h3>
+<h2><a href="#title_1" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="title_1">title 1</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: title 1">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h3><a href="#title_1.1" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="title_1.1">title 1.1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: title 1.1">edit</a><span class="mw-editsection-bracket">]</span></span></h3>
+<h4><a href="#title_1.1.1" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="title_1.1.1">title 1.1.1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: title 1.1.1">edit</a><span class="mw-editsection-bracket">]</span></span></h4>
+<h3><a href="#title_1.2" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="title_1.2">title 1.2</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: title 1.2">edit</a><span class="mw-editsection-bracket">]</span></span></h3>
+<h2><a href="#title_2" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="title_2">title 2</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: title 2">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h3><a href="#title_2.1" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="title_2.1">title 2.1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: title 2.1">edit</a><span class="mw-editsection-bracket">]</span></span></h3>
 
 !! end
 
@@ -13218,12 +13446,12 @@ wgMaxTocLevel=3
 </ul>
 </div>
 
-<h2><span class="mw-headline" id="title_1">title 1</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: title 1">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
-<h3><span class="mw-headline" id="title_1.1">title 1.1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: title 1.1">edit</a><span class="mw-editsection-bracket">]</span></span></h3>
-<h4><span class="mw-headline" id="title_1.1.1">title 1.1.1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: title 1.1.1">edit</a><span class="mw-editsection-bracket">]</span></span></h4>
-<h3><span class="mw-headline" id="title_1.2">title 1.2</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: title 1.2">edit</a><span class="mw-editsection-bracket">]</span></span></h3>
-<h2><span class="mw-headline" id="title_2">title 2</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: title 2">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
-<h3><span class="mw-headline" id="title_2.1">title 2.1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: title 2.1">edit</a><span class="mw-editsection-bracket">]</span></span></h3>
+<h2><a href="#title_1" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="title_1">title 1</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: title 1">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h3><a href="#title_1.1" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="title_1.1">title 1.1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: title 1.1">edit</a><span class="mw-editsection-bracket">]</span></span></h3>
+<h4><a href="#title_1.1.1" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="title_1.1.1">title 1.1.1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: title 1.1.1">edit</a><span class="mw-editsection-bracket">]</span></span></h4>
+<h3><a href="#title_1.2" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="title_1.2">title 1.2</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: title 1.2">edit</a><span class="mw-editsection-bracket">]</span></span></h3>
+<h2><a href="#title_2" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="title_2">title 2</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: title 2">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h3><a href="#title_2.1" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="title_2.1">title 2.1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: title 2.1">edit</a><span class="mw-editsection-bracket">]</span></span></h3>
 
 !! end
 
@@ -13249,11 +13477,11 @@ wgMaxTocLevel=3
 </ul>
 </div>
 
-<h2><span class="mw-headline" id="Section_1">Section 1</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: Section 1">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
-<h3><span class="mw-headline" id="Section_1.1">Section 1.1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Section 1.1">edit</a><span class="mw-editsection-bracket">]</span></span></h3>
-<h4><span class="mw-headline" id="Section_1.1.1">Section 1.1.1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: Section 1.1.1">edit</a><span class="mw-editsection-bracket">]</span></span></h4>
-<h4><span class="mw-headline" id="Section_1.1.1.1">Section 1.1.1.1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: Section 1.1.1.1">edit</a><span class="mw-editsection-bracket">]</span></span></h4>
-<h2><span class="mw-headline" id="Section_2">Section 2</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: Section 2">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><a href="#Section_1" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="Section_1">Section 1</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: Section 1">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h3><a href="#Section_1.1" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="Section_1.1">Section 1.1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Section 1.1">edit</a><span class="mw-editsection-bracket">]</span></span></h3>
+<h4><a href="#Section_1.1.1" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="Section_1.1.1">Section 1.1.1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: Section 1.1.1">edit</a><span class="mw-editsection-bracket">]</span></span></h4>
+<h4><a href="#Section_1.1.1.1" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="Section_1.1.1.1">Section 1.1.1.1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: Section 1.1.1.1">edit</a><span class="mw-editsection-bracket">]</span></span></h4>
+<h2><a href="#Section_2" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="Section_2">Section 2</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: Section 2">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 
 !! end
 
@@ -13264,8 +13492,8 @@ Resolving duplicate section names
 == Foo bar ==
 == Foo bar ==
 !! html
-<h2><span class="mw-headline" id="Foo_bar">Foo bar</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 bar">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
-<h2><span class="mw-headline" id="Foo_bar_2">Foo bar</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Foo bar">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><a href="#Foo_bar" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="Foo_bar">Foo bar</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 bar">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><a href="#Foo_bar_2" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="Foo_bar_2">Foo bar</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Foo bar">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 
 !! end
 
@@ -13275,8 +13503,8 @@ Resolving duplicate section names with differing case (bug 10721)
 == Foo bar ==
 == Foo Bar ==
 !! html
-<h2><span class="mw-headline" id="Foo_bar">Foo bar</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 bar">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
-<h2><span class="mw-headline" id="Foo_Bar_2">Foo Bar</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Foo Bar">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><a href="#Foo_bar" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="Foo_bar">Foo bar</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 bar">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><a href="#Foo_Bar_2" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="Foo_Bar_2">Foo Bar</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Foo Bar">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 
 !! end
 
@@ -13295,10 +13523,10 @@ __NOTOC__
 {{sections}}
 ==Section 4==
 !! html
-<h2><span class="mw-headline" id="Section_0">Section 0</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: Section 0">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
-<h3><span class="mw-headline" id="Section_1">Section 1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Template:Sections&amp;action=edit&amp;section=T-1" title="Template:Sections">edit</a><span class="mw-editsection-bracket">]</span></span></h3>
-<h2><span class="mw-headline" id="Section_2">Section 2</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Template:Sections&amp;action=edit&amp;section=T-2" title="Template:Sections">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
-<h2><span class="mw-headline" id="Section_4">Section 4</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Section 4">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><a href="#Section_0" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="Section_0">Section 0</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: Section 0">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h3><a href="#Section_1" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="Section_1">Section 1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Template:Sections&amp;action=edit&amp;section=T-1" title="Template:Sections">edit</a><span class="mw-editsection-bracket">]</span></span></h3>
+<h2><a href="#Section_2" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="Section_2">Section 2</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Template:Sections&amp;action=edit&amp;section=T-2" title="Template:Sections">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><a href="#Section_4" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="Section_4">Section 4</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Section 4">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 
 !! end
 
@@ -13309,8 +13537,8 @@ __NOEDITSECTION__
 ==Section 1==
 ==Section 2==
 !! html
-<h2><span class="mw-headline" id="Section_1">Section 1</span></h2>
-<h2><span class="mw-headline" id="Section_2">Section 2</span></h2>
+<h2><a href="#Section_1" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="Section_1">Section 1</span></h2>
+<h2><a href="#Section_2" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="Section_2">Section 2</span></h2>
 
 !! end
 
@@ -13319,7 +13547,7 @@ Link inside a section heading
 !! wikitext
 ==Section with a [[Main Page|link]] in it==
 !! html
-<h2><span class="mw-headline" id="Section_with_a_link_in_it">Section with a <a href="/wiki/Main_Page" title="Main Page">link</a> in it</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: Section with a link in it">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><a href="#Section_with_a_link_in_it" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="Section_with_a_link_in_it">Section with a <a href="/wiki/Main_Page" title="Main Page">link</a> in it</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: Section with a link in it">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 
 !! end
 
@@ -13342,19 +13570,21 @@ __TOC__
 </ul>
 </div>
 
-<h2><span class="mw-headline" id="title_1">title 1</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: title 1">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
-<h3><span class="mw-headline" id="title_1.1">title 1.1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: title 1.1">edit</a><span class="mw-editsection-bracket">]</span></span></h3>
-<h2><span class="mw-headline" id="title_2">title 2</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: title 2">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><a href="#title_1" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="title_1">title 1</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: title 1">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h3><a href="#title_1.1" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="title_1.1">title 1.1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: title 1.1">edit</a><span class="mw-editsection-bracket">]</span></span></h3>
+<h2><a href="#title_2" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="title_2">title 2</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: title 2">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 
 !! end
 
 !! test
 BUG 1219 URL next to image (good)
 !! wikitext
-http://example.com [[Image:foobar.jpg]]
-!! html
+http://example.com [[File:Foobar.jpg]]
+!! html/php
 <p><a rel="nofollow" class="external free" href="http://example.com">http://example.com</a> <a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
 </p>
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="http://example.com">http://example.com</a> <span class="mw-default-size" typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"/></a></span></p>
 !!end
 
 !! test
@@ -13366,10 +13596,10 @@ The line above must have a trailing space!
 --> <!-- -->
 But just in case it doesn't...
 !! html
-<h1><span class="mw-headline" id=".3D">=</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: =">edit</a><span class="mw-editsection-bracket">]</span></span></h1>
+<h1><a href="#.3D" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id=".3D">=</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: =">edit</a><span class="mw-editsection-bracket">]</span></span></h1>
 <p>The line above must have a trailing space!
 </p>
-<h1><span class="mw-headline" id=".3D_2">=</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: =">edit</a><span class="mw-editsection-bracket">]</span></span></h1>
+<h1><a href="#.3D_2" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id=".3D_2">=</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: =">edit</a><span class="mw-editsection-bracket">]</span></span></h1>
 <p>But just in case it doesn't...
 </p>
 !! end
@@ -13406,19 +13636,19 @@ section 5
 </ul>
 </div>
 
-<h2><span class="mw-headline" id="text_.3E_text">text &gt; text</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: text > text">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><a href="#text_.3E_text" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="text_.3E_text">text &gt; text</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: text > text">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 <p>section 1
 </p>
-<h2><span class="mw-headline" id="text_.3C_text">text &lt; text</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: text &lt; text">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><a href="#text_.3C_text" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="text_.3C_text">text &lt; text</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: text &lt; text">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 <p>section 2
 </p>
-<h2><span class="mw-headline" id="text_.26_text">text &amp; text</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: text &amp; text">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><a href="#text_.26_text" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="text_.26_text">text &amp; text</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: text &amp; text">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 <p>section 3
 </p>
-<h2><span class="mw-headline" id="text_.27_text">text ' text</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: text ' text">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><a href="#text_.27_text" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="text_.27_text">text ' text</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: text ' text">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 <p>section 4
 </p>
-<h2><span class="mw-headline" id="text_.22_text">text " text</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: text &quot; text">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><a href="#text_.22_text" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="text_.22_text">text " text</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: text &quot; text">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 <p>section 5
 </p>
 !! end
@@ -13466,22 +13696,22 @@ section 6
 </ul>
 </div>
 
-<h2><span class="mw-headline" id="Space_between_Text">Space between Text</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: Space between Text">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><a href="#Space_between_Text" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="Space_between_Text">Space between Text</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: Space between Text">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 <p>section 1
 </p>
-<h2><span class="mw-headline" id="Space-Entity_between_Text">Space-Entity&#32;between&#32;Text</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Space-Entity between Text">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><a href="#Space-Entity_between_Text" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="Space-Entity_between_Text">Space-Entity&#32;between&#32;Text</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Space-Entity between Text">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 <p>section 2
 </p>
-<h2><span class="mw-headline" id="Plus.2Bbetween.2BText">Plus+between+Text</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: Plus+between+Text">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><a href="#Plus.2Bbetween.2BText" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="Plus.2Bbetween.2BText">Plus+between+Text</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: Plus+between+Text">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 <p>section 3
 </p>
-<h2><span class="mw-headline" id="Plus-Entity.2Bbetween.2BText">Plus-Entity&#43;between&#43;Text</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: Plus-Entity+between+Text">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><a href="#Plus-Entity.2Bbetween.2BText" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="Plus-Entity.2Bbetween.2BText">Plus-Entity&#43;between&#43;Text</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: Plus-Entity+between+Text">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 <p>section 4
 </p>
-<h2><span class="mw-headline" id="Underscore_between_Text">Underscore_between_Text</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: Underscore between Text">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><a href="#Underscore_between_Text" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="Underscore_between_Text">Underscore_between_Text</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: Underscore between Text">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 <p>section 5
 </p>
-<h2><span class="mw-headline" id="Underscore-Entity_between_Text">Underscore-Entity&#95;between&#95;Text</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: Underscore-Entity_between_Text">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><a href="#Underscore-Entity_between_Text" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="Underscore-Entity_between_Text">Underscore-Entity&#95;between&#95;Text</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: Underscore-Entity_between_Text">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 <p>section 6
 </p><p><a href="#Space_between_Text">#Space between Text</a>
 <a href="#Space-Entity_between_Text">#Space-Entity&#32;between&#32;Text</a>
@@ -13510,10 +13740,10 @@ Headers with excess '=' characters
 </ul>
 </div>
 
-<h1><span class="mw-headline" id="foo.3D">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>
-<h1><span class="mw-headline" id=".3Dfoo">=foo</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: =foo">edit</a><span class="mw-editsection-bracket">]</span></span></h1>
-<h1><span class="mw-headline" id="italic_heading.3D"><i>italic</i> heading=</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: italic heading=">edit</a><span class="mw-editsection-bracket">]</span></span></h1>
-<h1><span class="mw-headline" id=".3Ditalic_heading">=<i>italic</i> heading</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: =italic heading">edit</a><span class="mw-editsection-bracket">]</span></span></h1>
+<h1><a href="#foo.3D" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="foo.3D">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>
+<h1><a href="#.3Dfoo" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id=".3Dfoo">=foo</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: =foo">edit</a><span class="mw-editsection-bracket">]</span></span></h1>
+<h1><a href="#italic_heading.3D" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="italic_heading.3D"><i>italic</i> heading=</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: italic heading=">edit</a><span class="mw-editsection-bracket">]</span></span></h1>
+<h1><a href="#.3Ditalic_heading" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id=".3Ditalic_heading">=<i>italic</i> heading</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: =italic heading">edit</a><span class="mw-editsection-bracket">]</span></span></h1>
 
 !! end
 
@@ -13548,12 +13778,12 @@ __NOEDITSECTION__
 </ul>
 </div>
 
-<h1><span class="mw-headline" id="Header_1">Header 1</span></h1>
-<h2><span class="mw-headline" id="Header_1.1">Header 1.1</span></h2>
-<h2><span class="mw-headline" id="Header_1.2">Header 1.2</span></h2>
-<h1><span class="mw-headline" id="Header_2">Header 2</span></h1>
-<h2><span class="mw-headline" id="Header_2.1">Header 2.1</span></h2>
-<h2><span class="mw-headline" id="Header_2.2">Header 2.2</span></h2>
+<h1><a href="#Header_1" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="Header_1">Header 1</span></h1>
+<h2><a href="#Header_1.1" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="Header_1.1">Header 1.1</span></h2>
+<h2><a href="#Header_1.2" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="Header_1.2">Header 1.2</span></h2>
+<h1><a href="#Header_2" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="Header_2">Header 2</span></h1>
+<h2><a href="#Header_2.1" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="Header_2.1">Header 2.1</span></h2>
+<h2><a href="#Header_2.2" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="Header_2.2">Header 2.2</span></h2>
 
 !! end
 
@@ -13568,19 +13798,21 @@ parsoid=wt2html,wt2wt
 c2
 c3-->
 !! html
-<h2><span class="mw-headline" id="foo">foo</span></h2>
-<h2><span class="mw-headline" id="bar">bar</span></h2>
-<h2><span class="mw-headline" id="baz">baz</span></h2>
+<h2><a href="#foo" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="foo">foo</span></h2>
+<h2><a href="#bar" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="bar">bar</span></h2>
+<h2><a href="#baz" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="baz">baz</span></h2>
 
 !! end
 
 !! test
 BUG 1219 URL next to image (broken)
 !! wikitext
-http://example.com[[Image:foobar.jpg]]
-!! html
+http://example.com[[File:Foobar.jpg]]
+!! html/php
 <p><a rel="nofollow" class="external free" href="http://example.com">http://example.com</a><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
 </p>
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="http://example.com">http://example.com</a><span class="mw-default-size" typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"/></a></span></p>
 !!end
 
 !! test
@@ -14876,7 +15108,6 @@ Punctuation: CSS ! important (bug 11874; with space after)
 
 !!end
 
-
 !! test
 HTML bullet list, closed tags (bug 5497)
 !! wikitext
@@ -15150,7 +15381,7 @@ Fuzz testing: Parser14
 == onmouseover= ==
 http://__TOC__
 !! html
-<h2><span class="mw-headline" id="onmouseover.3D">onmouseover=</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: onmouseover=">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><a href="#onmouseover.3D" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="onmouseover.3D">onmouseover=</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: onmouseover=">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 http://<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#onmouseover.3D"><span class="tocnumber">1</span> <span class="toctext">onmouseover=</span></a></li>
@@ -15159,7 +15390,7 @@ http://<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
 
 
 !! html+tidy
-<h2><span class="mw-headline" id="onmouseover.3D">onmouseover=</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: onmouseover=">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><a href="#onmouseover.3D" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="onmouseover.3D">onmouseover=</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: onmouseover=">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 <p>http://</p>
 <div id="toc" class="toc">
 <div id="toctitle">
@@ -15177,13 +15408,13 @@ Fuzz testing: Parser14-table
 ==a==
 {| STYLE=__TOC__
 !! html
-<h2><span class="mw-headline" id="a">a</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: a">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><a href="#a" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="a">a</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: a">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 <table style="&#95;_TOC&#95;_">
 <tr><td></td></tr>
 </table>
 
 !! html+tidy
-<h2><span class="mw-headline" id="a">a</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: a">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><a href="#a" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="a">a</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: a">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 <table style="__TOC__">
 <tr>
 <td></td>
@@ -15308,32 +15539,38 @@ Fuzz testing: Parser25 (bug 6055)
 Fuzz testing: URL adjacent extension (with space, clean)
 !! wikitext
 http://example.com <nowiki>junk</nowiki>
-!! html
+!! html/php
 <p><a rel="nofollow" class="external free" href="http://example.com">http://example.com</a> junk
 </p>
-!!end
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="http://example.com" data-parsoid='{"stx":"url"}'>http://example.com</a> <span typeof="mw:Nowiki">junk</span></p>
+!! end
 
 !!test
 Fuzz testing: URL adjacent extension (no space, dirty; nowiki)
 !! wikitext
 http://example.com<nowiki>junk</nowiki>
-!! html
+!! html/php
 <p><a rel="nofollow" class="external free" href="http://example.com">http://example.com</a>junk
 </p>
-!!end
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="http://example.com" data-parsoid='{"stx":"url"}'>http://example.com</a><span typeof="mw:Nowiki">junk</span></p>
+!! end
 
 !!test
 Fuzz testing: URL adjacent extension (no space, dirty; pre)
 !! wikitext
 http://example.com<pre>junk</pre>
-!! html
+!! html/php
 <a rel="nofollow" class="external free" href="http://example.com">http://example.com</a><pre>junk</pre>
 
-!! html+tidy
+!! html/php+tidy
 <p><a rel="nofollow" class="external free" href="http://example.com">http://example.com</a></p>
 <pre>
 junk
 </pre>
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="http://example.com" data-parsoid='{"stx":"url"}'>http://example.com</a></p><pre data-parsoid='{"stx":"html"}'>junk</pre>
 !!end
 
 !!test
@@ -16792,6 +17029,8 @@ ISBN  978-0-1234-56&#x20;789
 </p>
 !! html+tidy
 <p><a href="/wiki/Special:BookSources/9780123456" class="internal mw-magiclink-isbn">ISBN 978-0-1234-56</a> 789</p>
+!! html/parsoid
+<p><a href="./Special:BookSources/9780123456" rel="mw:ExtLink" data-parsoid='{"stx":"magiclink"}'>ISBN 978-0-1234-56</a><span typeof="mw:Entity" data-parsoid='{"src":"&amp;#x20;","srcContent":" "}'> </span>789</p>
 !! end
 
 !! test
@@ -16807,24 +17046,37 @@ ISBN
 Double ISBN
 !! wikitext
 ISBN ISBN 1234567890
-!! html
+!! html/php
 <p>ISBN <a href="/wiki/Special:BookSources/1234567890" class="internal mw-magiclink-isbn">ISBN 1234567890</a>
 </p>
+!! html/parsoid
+<p>ISBN <a href="./Special:BookSources/1234567890" rel="mw:ExtLink" data-parsoid='{"stx":"magiclink"}'>ISBN 1234567890</a></p>
 !! end
 
 !! test
 ISBN with an X
 !! wikitext
 ISBN 3-462-04561-X
-!! html
+ISBN 080442957X
+ISBN 978080442957X
+!! html/php
 <p><a href="/wiki/Special:BookSources/346204561X" class="internal mw-magiclink-isbn">ISBN 3-462-04561-X</a>
+<a href="/wiki/Special:BookSources/080442957X" class="internal mw-magiclink-isbn">ISBN 080442957X</a>
+<a href="/wiki/Special:BookSources/978080442957X" class="internal mw-magiclink-isbn">ISBN 978080442957X</a>
 </p>
+!! html/parsoid
+<p><a href="./Special:BookSources/346204561X" rel="mw:ExtLink" data-parsoid='{"stx":"magiclink"}'>ISBN 3-462-04561-X</a>
+<a href="./Special:BookSources/080442957X" rel="mw:ExtLink" data-parsoid='{"stx":"magiclink"}'>ISBN 080442957X</a>
+<a href="./Special:BookSources/978080442957X" rel="mw:ExtLink" data-parsoid='{"stx":"magiclink"}'>ISBN 978080442957X</a></p>
 !! end
 
 !! test
 ISBN with empty prefix (parsoid test)
 !! wikitext
 ISBN 1234567890
+!! html/php
+<p><a href="/wiki/Special:BookSources/1234567890" class="internal mw-magiclink-isbn">ISBN 1234567890</a>
+</p>
 !! html/parsoid
 <p><a href="Special:BookSources/1234567890" rel="mw:ExtLink">ISBN 1234567890</a></p>
 !! end
@@ -16833,9 +17085,11 @@ ISBN 1234567890
 Bug 22905: <abbr> followed by ISBN followed by </a>
 !! wikitext
 <abbr>(fr)</abbr> ISBN 2753300917 [http://www.example.com example.com]
-!! html
+!! html/php
 <p><abbr>(fr)</abbr> <a href="/wiki/Special:BookSources/2753300917" class="internal mw-magiclink-isbn">ISBN 2753300917</a> <a rel="nofollow" class="external text" href="http://www.example.com">example.com</a>
 </p>
+!! html/parsoid
+<p><abbr data-parsoid='{"stx":"html"}'>(fr)</abbr> <a href="./Special:BookSources/2753300917" rel="mw:ExtLink" data-parsoid='{"stx":"magiclink"}'>ISBN 2753300917</a> <a rel="mw:ExtLink" href="http://www.example.com">example.com</a></p>
 !! end
 
 !! test
@@ -17169,7 +17423,7 @@ Inclusion of !userCanEdit() content
 !! wikitext
 {{MediaWiki:Fake}}
 !! html
-<h2><span class="mw-headline" id="header">header</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=MediaWiki:Fake&amp;action=edit&amp;section=T-1" title="MediaWiki:Fake">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><a href="#header" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="header">header</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=MediaWiki:Fake&amp;action=edit&amp;section=T-1" title="MediaWiki:Fake">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 
 !! end
 
@@ -17201,12 +17455,12 @@ Out-of-order TOC heading levels
 </ul>
 </div>
 
-<h2><span class="mw-headline" id="2">2</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: 2">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
-<h6><span class="mw-headline" id="6">6</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: 6">edit</a><span class="mw-editsection-bracket">]</span></span></h6>
-<h3><span class="mw-headline" id="3">3</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: 3">edit</a><span class="mw-editsection-bracket">]</span></span></h3>
-<h1><span class="mw-headline" id="1">1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: 1">edit</a><span class="mw-editsection-bracket">]</span></span></h1>
-<h5><span class="mw-headline" id="5">5</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: 5">edit</a><span class="mw-editsection-bracket">]</span></span></h5>
-<h2><span class="mw-headline" id="2_2">2</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: 2">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><a href="#2" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="2">2</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: 2">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h6><a href="#6" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="6">6</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: 6">edit</a><span class="mw-editsection-bracket">]</span></span></h6>
+<h3><a href="#3" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="3">3</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: 3">edit</a><span class="mw-editsection-bracket">]</span></span></h3>
+<h1><a href="#1" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="1">1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: 1">edit</a><span class="mw-editsection-bracket">]</span></span></h1>
+<h5><a href="#5" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="5">5</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: 5">edit</a><span class="mw-editsection-bracket">]</span></span></h5>
+<h2><a href="#2_2" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="2_2">2</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: 2">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 
 !! end
 
@@ -17313,7 +17567,7 @@ anchorencode encodes like the TOC generator: (bug 18431)
 {{anchorencode: _ +:.3A%3A&&amp;]] }}
 __NOEDITSECTION__
 !! html
-<h3><span class="mw-headline" id=".2B:.3A.253A.26.26.5D.5D">_ +:.3A%3A&amp;&amp;]]</span></h3>
+<h3><a href="#.2B:.3A.253A.26.26.5D.5D" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id=".2B:.3A.253A.26.26.5D.5D">_ +:.3A%3A&amp;&amp;]]</span></h3>
 <p>.2B:.3A.253A.26.26.5D.5D
 </p>
 !! end
@@ -17563,7 +17817,7 @@ language=sr variant=sr-ec
 !! wikitext
 == -{Naslov}- ==
 !! html
-<h2><span class="mw-headline" id="-.7BNaslov.7D-">Naslov</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="Уредите одељак „Naslov“">уреди</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><a href="#-.7BNaslov.7D-" class="mw-headline-anchor" title="Линк то тхис сецтион">§</a><span class="mw-headline" id="-.7BNaslov.7D-">Naslov</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="Уредите одељак „Naslov“">уреди</a><span class="mw-editsection-bracket">]</span></span></h2>
 
 !! end
 
@@ -17953,7 +18207,7 @@ Morwen/13: Unclosed link followed by heading
 !! html
 <p>[[link
 </p>
-<h2><span class="mw-headline" id="heading">heading</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: heading">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><a href="#heading" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="heading">heading</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: heading">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 
 !! end
 
@@ -17965,7 +18219,7 @@ HHP2.1: Heuristics for headings in preprocessor parenthetical structures
 !! html
 <p>{{foo|
 </p>
-<h1><span class="mw-headline" id="heading">heading</span></h1>
+<h1><a href="#heading" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="heading">heading</span></h1>
 
 !! end
 
@@ -17977,7 +18231,7 @@ HHP2.2: Heuristics for headings in preprocessor parenthetical structures
 !! html
 <p>{{foo|
 </p>
-<h2><span class="mw-headline" id="heading">heading</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: heading">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><a href="#heading" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="heading">heading</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: heading">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 
 !! end
 
@@ -18677,10 +18931,10 @@ Play a bit with r67090 and bug 3158
 <div style="border&#160;: solid;">&#160;</div>
 
 !! html/parsoid
-<div style="width:50% !important" data-parsoid='{"stx":"html"}'><span typeof="mw:Entity" data-parsoid='{"src":"&amp;nbsp;","srcContent":" "}'> </span></div>
-<div style="width:50% !important" data-parsoid='{"stx":"html","a":{"style":"width:50% !important"},"sa":{"style":"width:50%&amp;nbsp;!important"}}'><span typeof="mw:Entity" data-parsoid='{"src":"&amp;nbsp;","srcContent":" "}'> </span></div>
-<div style="width:50% !important" data-parsoid='{"stx":"html","a":{"style":"width:50% !important"},"sa":{"style":"width:50%&amp;#160;!important"}}'><span typeof="mw:Entity" data-parsoid='{"src":"&amp;nbsp;","srcContent":" "}'> </span></div>
-<div style="border : solid;" data-parsoid='{"stx":"html"}'><span typeof="mw:Entity" data-parsoid='{"src":"&amp;nbsp;","srcContent":" "}'> </span></div>
+<div style="width:50% !important" data-parsoid='{"stx":"html"}'><span typeof="mw:Entity" data-parsoid='{"srcContent":" "}'> </span></div>
+<div style="width:50% !important" data-parsoid='{"stx":"html","a":{"style":"width:50% !important"},"sa":{"style":"width:50%&amp;nbsp;!important"}}'><span typeof="mw:Entity" data-parsoid='{"srcContent":" "}'> </span></div>
+<div style="width:50% !important" data-parsoid='{"stx":"html","a":{"style":"width:50% !important"},"sa":{"style":"width:50%&amp;#160;!important"}}'><span typeof="mw:Entity" data-parsoid='{"srcContent":" "}'> </span></div>
+<div style="border : solid;" data-parsoid='{"stx":"html"}'><span typeof="mw:Entity" data-parsoid='{"srcContent":" "}'> </span></div>
 
 !! end
 
@@ -18861,7 +19115,7 @@ __TOC__
 </ul>
 </div>
 
-<h2><span class="mw-headline" id="Lost_episodes"><i>Lost</i> episodes</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Lost episodes">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><a href="#Lost_episodes" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="Lost_episodes"><i>Lost</i> episodes</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Lost episodes">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 
 !! end
 
@@ -18879,7 +19133,7 @@ __TOC__
 </ul>
 </div>
 
-<h2><span class="mw-headline" id="should_be_bold_then_normal_text"><b>should be bold</b> then normal text</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: should be bold then normal text">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><a href="#should_be_bold_then_normal_text" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="should_be_bold_then_normal_text"><b>should be bold</b> then normal text</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: should be bold then normal text">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 
 !! end
 
@@ -18897,7 +19151,7 @@ __TOC__
 </ul>
 </div>
 
-<h2><span class="mw-headline" id="Image">Image <a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Image">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><a href="#Image" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="Image">Image <a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Image">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 
 !! end
 
@@ -18915,7 +19169,7 @@ __TOC__
 </ul>
 </div>
 
-<h2><span class="mw-headline" id="Quote"><blockquote>Quote</blockquote></span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Quote">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><a href="#Quote" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="Quote"><blockquote>Quote</blockquote></span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Quote">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 
 !! html+tidy
 <div id="toc" class="toc">
@@ -18926,7 +19180,7 @@ __TOC__
 <li class="toclevel-1 tocsection-1"><a href="#Quote"><span class="tocnumber">1</span> <span class="toctext">Quote</span></a></li>
 </ul>
 </div>
-<h2><span class="mw-headline" id="Quote"></span></h2>
+<h2><a href="#Quote" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="Quote"></span></h2>
 <blockquote>
 <p><span class="mw-headline" id="Quote">Quote</span></p>
 </blockquote>
@@ -18949,7 +19203,7 @@ QED
 </ul>
 </div>
 
-<h2><span class="mw-headline" id="Proof:_2_.3C_3">Proof: 2 &lt; 3</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Proof: 2 &lt; 3">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><a href="#Proof:_2_.3C_3" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="Proof:_2_.3C_3">Proof: 2 &lt; 3</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Proof: 2 &lt; 3">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 <p><small>Hanc marginis exiguitas non caperet.</small>
 QED
 </p>
@@ -18970,8 +19224,8 @@ __TOC__
 </ul>
 </div>
 
-<h2><span class="mw-headline" id="Foo_Bar"><i>Foo</i> <b>Bar</b></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 Bar">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
-<h2><span class="mw-headline" id="Foo_Bar_2"><i>Foo</i> <blockquote>Bar</blockquote></span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Foo Bar">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><a href="#Foo_Bar" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="Foo_Bar"><i>Foo</i> <b>Bar</b></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 Bar">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><a href="#Foo_Bar_2" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="Foo_Bar_2"><i>Foo</i> <blockquote>Bar</blockquote></span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Foo Bar">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 
 !! html+tidy
 <div id="toc" class="toc">
@@ -18983,8 +19237,8 @@ __TOC__
 <li class="toclevel-1 tocsection-2"><a href="#Foo_Bar_2"><span class="tocnumber">2</span> <span class="toctext"><i>Foo</i> Bar</span></a></li>
 </ul>
 </div>
-<h2><span class="mw-headline" id="Foo_Bar"><i>Foo</i> <b>Bar</b></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 Bar">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
-<h2><span class="mw-headline" id="Foo_Bar_2"><i>Foo</i></span></h2>
+<h2><a href="#Foo_Bar" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="Foo_Bar"><i>Foo</i> <b>Bar</b></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 Bar">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><a href="#Foo_Bar_2" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="Foo_Bar_2"><i>Foo</i></span></h2>
 <blockquote>
 <p><span class="mw-headline" id="Foo_Bar_2">Bar</span></p>
 </blockquote>
@@ -19006,8 +19260,8 @@ __TOC__
 </ul>
 </div>
 
-<h2><span class="mw-headline" id="Hello"><sup class="in-h2">Hello</sup></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: Hello">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
-<h2><span class="mw-headline" id="b.22.3EEvilbye"><sup> b"&gt;Evilbye</sup></span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: b&quot;>Evilbye">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><a href="#Hello" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="Hello"><sup class="in-h2">Hello</sup></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: Hello">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><a href="#b.22.3EEvilbye" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="b.22.3EEvilbye"><sup> b"&gt;Evilbye</sup></span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: b&quot;>Evilbye">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 
 !! end
 
@@ -19035,11 +19289,11 @@ __TOC__
 </ul>
 </div>
 
-<h2><span class="mw-headline" id="C.2B.2B"><span dir="ltr">C++</span></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: C++">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
-<h2><span class="mw-headline" id=".D7.96.D7.91.D7.A0.D7.92.21"><span dir="rtl">זבנג!</span></span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: זבנג!">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
-<h2><span class="mw-headline" id="The_attributes_on_these_span_tags_must_be_deleted_from_the_TOC"><span style="font-style: italic">The attributes on these span tags must be deleted from the TOC</span></span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: The attributes on these span tags must be deleted from the TOC">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
-<h2><span class="mw-headline" id="All_attributes_on_these_span_tags_must_be_deleted_from_the_TOC"><span style="font-style: italic" dir="ltr">All attributes on these span tags must be deleted from the TOC</span></span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: All attributes on these span tags must be deleted from the TOC">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
-<h2><span class="mw-headline" id="Attributes_after_dir_on_these_span_tags_must_be_deleted_from_the_TOC"><span dir="ltr" style="font-style: italic">Attributes after dir on these span tags must be deleted from the TOC</span></span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: Attributes after dir on these span tags must be deleted from the TOC">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><a href="#C.2B.2B" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="C.2B.2B"><span dir="ltr">C++</span></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: C++">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><a href="#.D7.96.D7.91.D7.A0.D7.92.21" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id=".D7.96.D7.91.D7.A0.D7.92.21"><span dir="rtl">זבנג!</span></span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: זבנג!">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><a href="#The_attributes_on_these_span_tags_must_be_deleted_from_the_TOC" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="The_attributes_on_these_span_tags_must_be_deleted_from_the_TOC"><span style="font-style: italic">The attributes on these span tags must be deleted from the TOC</span></span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: The attributes on these span tags must be deleted from the TOC">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><a href="#All_attributes_on_these_span_tags_must_be_deleted_from_the_TOC" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="All_attributes_on_these_span_tags_must_be_deleted_from_the_TOC"><span style="font-style: italic" dir="ltr">All attributes on these span tags must be deleted from the TOC</span></span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: All attributes on these span tags must be deleted from the TOC">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><a href="#Attributes_after_dir_on_these_span_tags_must_be_deleted_from_the_TOC" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="Attributes_after_dir_on_these_span_tags_must_be_deleted_from_the_TOC"><span dir="ltr" style="font-style: italic">Attributes after dir on these span tags must be deleted from the TOC</span></span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: Attributes after dir on these span tags must be deleted from the TOC">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 
 !! end
 
@@ -19055,7 +19309,7 @@ __TOC__
 </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>
+<h2><a href="#test" class="mw-headline-anchor" title="Link to this section">§</a><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
 
@@ -19072,7 +19326,7 @@ title=[[Main Page]]
 !! wikitext
 {{int:Bug32057}}
 !! html
-<h2><span class="mw-headline" id="Headline_text">Headline text</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Headline text">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><a href="#Headline_text" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="Headline_text">Headline text</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Headline text">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 
 !! end
 
@@ -19187,7 +19441,7 @@ nowiki inside link inside heading (bug 18295)
 !! wikitext
 ==[[foo|x<nowiki>y</nowiki>z]]==
 !! html
-<h2><span class="mw-headline" id="xyz"><a href="/wiki/Foo" title="Foo">xyz</a></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: xyz">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><a href="#xyz" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="xyz"><a href="/wiki/Foo" title="Foo">xyz</a></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: xyz">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 
 !! end
 
@@ -19372,11 +19626,11 @@ Lead
 <p>Lead
 </p>
 
-<h2><span class="mw-headline" id="Section_1">Section 1</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: Section 1">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
-<h2><span class="mw-headline" id="Section_2">Section 2</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Section 2">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
-<h2><span class="mw-headline" id="Section_3">Section 3</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: Section 3">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
-<h2><span class="mw-headline" id="Section_4">Section 4</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: Section 4">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
-<h2><span class="mw-headline" id="Section_5">Section 5</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: Section 5">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><a href="#Section_1" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="Section_1">Section 1</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: Section 1">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><a href="#Section_2" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="Section_2">Section 2</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Section 2">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><a href="#Section_3" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="Section_3">Section 3</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: Section 3">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><a href="#Section_4" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="Section_4">Section 4</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: Section 4">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><a href="#Section_5" class="mw-headline-anchor" title="Link to this section">§</a><span class="mw-headline" id="Section_5">Section 5</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: Section 5">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 
 !! end
 
@@ -19464,10 +19718,16 @@ parsoid
 A <ref>foo</ref>
 B <ref name="x">foo</ref>
 C <ref name="y" />
+<references />
 !! html
-<p>A <span about="#mwt2" class="reference" id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{}}'><a href="#cite_note-1">[1]</a></span>
-B <span about="#mwt4" class="reference" id="cite_ref-x-2-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{"name":"x"}}'><a href="#cite_note-x-2">[2]</a></span>
-C <span about="#mwt6" class="reference" id="cite_ref-y-3-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"y"}}'><a href="#cite_note-y-3">[3]</a></span></p>
+<p>A <span about="#mwt2" class="reference" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{}}'><a href="#cite_note-1">[1]</a></span>
+B <span about="#mwt4" class="reference" id="cite_ref-x_2-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{"name":"x"}}'><a href="#cite_note-x-2">[2]</a></span>
+C <span about="#mwt6" class="reference" id="cite_ref-y_3-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"y"}}'><a href="#cite_note-y-3">[3]</a></span></p>
+<ol class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{}}'>
+<li id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1">↑</a></span> foo</li>
+<li id="cite_note-x-2"><span rel="mw:referencedBy"><a href="#cite_ref-x_2-0">↑</a></span> foo</li>
+<li id="cite_note-y-3"><span rel="mw:referencedBy"><a href="#cite_ref-y_3-0">↑</a></span></li>
+</ol>
 !!end
 
 !!test
@@ -19477,9 +19737,13 @@ parsoid
 !! wikitext
 A <ref name="x">foo</ref>
 B <ref name="x" />
+<references />
 !! html
-<p>A <span about="#mwt2" class="reference" id="cite_ref-x-1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{"name":"x"}}'><a href="#cite_note-x-1">[1]</a></span>
-B <span about="#mwt4" class="reference" id="cite_ref-x-1-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"x"}}'><a href="#cite_note-x-1">[1]</a></span></p>
+<p>A <span about="#mwt2" class="reference" id="cite_ref-x_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{"name":"x"}}'><a href="#cite_note-x-1">[1]</a></span>
+B <span about="#mwt4" class="reference" id="cite_ref-x_1-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"x"}}'><a href="#cite_note-x-1">[1]</a></span></p>
+<ol class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{}}'>
+<li id="cite_note-x-1"><span rel="mw:referencedBy">↑ <a href="#cite_ref-x_1-0">1.0</a> <a href="#cite_ref-x_1-1">1.1</a></span> foo</li>
+</ol>
 !!end
 
 !!test
@@ -19490,10 +19754,14 @@ parsoid
 A <ref name="x">foo</ref>
 B <ref name=" x " />
 C <ref name= x  />
+<references />
 !! html
-<p>A <span about="#mwt2" class="reference" id="cite_ref-x-1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{"name":"x"}}'><a href="#cite_note-x-1">[1]</a></span>
-B <span about="#mwt4" class="reference" id="cite_ref-x-1-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"x"}}'><a href="#cite_note-x-1">[1]</a></span>
-C <span about="#mwt6" class="reference" id="cite_ref-x-1-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"x"}}'><a href="#cite_note-x-1">[1]</a></span></p>
+<p>A <span about="#mwt2" class="reference" id="cite_ref-x_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{"name":"x"}}'><a href="#cite_note-x-1">[1]</a></span>
+B <span about="#mwt4" class="reference" id="cite_ref-x_1-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"x"}}'><a href="#cite_note-x-1">[1]</a></span>
+C <span about="#mwt6" class="reference" id="cite_ref-x_1-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"x"}}'><a href="#cite_note-x-1">[1]</a></span></p>
+<ol class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{}}'>
+<li id="cite_note-x-1"><span rel="mw:referencedBy">↑ <a href="#cite_ref-x_1-0">1.0</a> <a href="#cite_ref-x_1-1">1.1</a> <a href="#cite_ref-x_1-2">1.2</a></span> foo</li>
+</ol>
 !!end
 
 # NOTE: constructor is a predefined property in JS and constructor as a ref-name can clash with it if not handled properly)
@@ -19503,8 +19771,12 @@ Ref: 4. 'constructor' should be accepted as a valid ref-name
 parsoid
 !! wikitext
 A <ref name="constructor">foo</ref>
+<references />
 !! html
-<p>A <span about="#mwt2" class="reference" id="cite_ref-constructor-1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{"name":"constructor"}}'><a href="#cite_note-constructor-1">[1]</a></span></p>
+<p>A <span about="#mwt2" class="reference" id="cite_ref-constructor_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{"name":"constructor"}}'><a href="#cite_note-constructor-1">[1]</a></span></p>
+<ol class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{}}'>
+<li id="cite_note-constructor-1"><span rel="mw:referencedBy"><a href="#cite_ref-constructor_1-0">↑</a></span> foo</li>
+</ol>
 !!end
 
 !!test
@@ -19518,10 +19790,10 @@ A <ref>
 
 <references />
 !! html
-<p>A <span about="#mwt2" class="reference" id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"This is a &lt;b data-parsoid=&#39;{\"dsr\":[19,40,3,3]}&#39;>&lt;a rel=\"mw:WikiLink\" href=\"./Bolded_link\" title=\"Bolded link\" data-parsoid=&#39;{\"stx\":\"simple\",\"a\":{\"href\":\"./Bolded_link\"},\"sa\":{\"href\":\"bolded link\"},\"dsr\":[22,37,2,2]}&#39;>bolded link&lt;/a>&lt;/b> and this is a &lt;span about=\"#mwt3\" typeof=\"mw:Transclusion\" data-parsoid=&#39;{\"pi\":[[{\"k\":\"1\",\"spc\":[\"\",\"\",\"\",\"\"]}]],\"dsr\":[55,76,null,null]}&#39; data-mw=&#39;{\"parts\":[{\"template\":{\"target\":{\"wt\":\"echo\",\"href\":\"./Template:Echo\"},\"params\":{\"1\":{\"wt\":\"transclusion\"}},\"i\":0}}]}&#39;>transclusion&lt;/span>\n"},"attrs":{}}'><a href="#cite_note-1">[1]</a></span></p>
+<p>A <span about="#mwt2" class="reference" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"This is a &lt;b data-parsoid=&#39;{\"dsr\":[19,40,3,3]}&#39;>&lt;a rel=\"mw:WikiLink\" href=\"./Bolded_link\" title=\"Bolded link\" data-parsoid=&#39;{\"stx\":\"simple\",\"a\":{\"href\":\"./Bolded_link\"},\"sa\":{\"href\":\"bolded link\"},\"dsr\":[22,37,2,2]}&#39;>bolded link&lt;/a>&lt;/b> and this is a &lt;span about=\"#mwt3\" typeof=\"mw:Transclusion\" data-parsoid=&#39;{\"pi\":[[{\"k\":\"1\",\"spc\":[\"\",\"\",\"\",\"\"]}]],\"dsr\":[55,76,null,null]}&#39; data-mw=&#39;{\"parts\":[{\"template\":{\"target\":{\"wt\":\"echo\",\"href\":\"./Template:Echo\"},\"params\":{\"1\":{\"wt\":\"transclusion\"}},\"i\":0}}]}&#39;>transclusion&lt;/span>\n"},"attrs":{}}'><a href="#cite_note-1">[1]</a></span></p>
 
 <ol class="references" typeof="mw:Extension/references" about="#mwt5" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> This is a <b><a rel="mw:WikiLink" href="./Bolded_link" title="Bolded link">bolded link</a></b> and this is a <span about="#mwt3" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"transclusion"}},"i":0}}]}'>transclusion</span>
+<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1">↑</a></span> This is a <b><a rel="mw:WikiLink" href="./Bolded_link" title="Bolded link">bolded link</a></b> and this is a <span about="#mwt3" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"transclusion"}},"i":0}}]}'>transclusion</span>
 </li>
 </ol>
 !!end
@@ -19539,10 +19811,10 @@ A <ref>
 
 <references />
 !! html
-<p>A <span about="#mwt2" class="reference" id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"foo\n bar\n baz\n"},"attrs":{}}'><a href="#cite_note-1">[1]</a></span></p>
+<p>A <span about="#mwt2" class="reference" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"foo\n bar\n baz\n"},"attrs":{}}'><a href="#cite_note-1">[1]</a></span></p>
 
 <ol class="references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> foo
+<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1">↑</a></span> foo
  bar
  baz
 </li>
@@ -19569,10 +19841,10 @@ booz
 
 <references />
 !! html
-<p>A <span about="#mwt2" class="reference" id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"foo\n\nbar\n\n\nbaz\n\n\n\nbooz\n"},"attrs":{}}'><a href="#cite_note-1">[1]</a></span></p>
+<p>A <span about="#mwt2" class="reference" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"foo\n\nbar\n\n\nbaz\n\n\n\nbooz\n"},"attrs":{}}'><a href="#cite_note-1">[1]</a></span></p>
 
 <ol class="references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> foo
+<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1">↑</a></span> foo
 
 bar
 
@@ -19595,9 +19867,9 @@ A <ref> foo {{echo|</ref> B C}}
 
 <references />
 !! html
-<p>A <span about="#mwt2" class="reference" id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"foo &lt;span typeof=\"mw:Nowiki\" data-parsoid=&#39;{\"src\":\"{{\",\"dsr\":[12,14,0,0]}&#39;>{{&lt;/span>echo|"},"attrs":{}}'><a href="#cite_note-1">[1]</a></span> B C<span typeof="mw:Nowiki">}}</span></p>
+<p>A <span about="#mwt2" class="reference" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"foo &lt;span typeof=\"mw:Nowiki\" data-parsoid=&#39;{\"src\":\"{{\",\"dsr\":[12,14,0,0]}&#39;>{{&lt;/span>echo|"},"attrs":{}}'><a href="#cite_note-1">[1]</a></span> B C<span typeof="mw:Nowiki">}}</span></p>
 <ol class="references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> foo <span typeof="mw:Nowiki">{{</span>echo|</li>
+<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1">↑</a></span> foo <span typeof="mw:Nowiki">{{</span>echo|</li>
 </ol>
 !!end
 
@@ -19609,9 +19881,9 @@ parsoid
 A <ref> foo <!--</ref> B C
 <references />
 !! html
-<p>A <span about="#mwt2" class="reference" id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"foo &lt;!---->"},"attrs":{}}'><a href="#cite_note-1">[1]</a></span> B C</p>
+<p>A <span about="#mwt2" class="reference" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"foo &lt;!---->"},"attrs":{}}'><a href="#cite_note-1">[1]</a></span> B C</p>
 <ol class="references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> foo <!----></li>
+<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1">↑</a></span> foo <!----></li>
 </ol>
 !!end
 
@@ -19624,11 +19896,11 @@ A <ref> <b> foo </ref> B C
 
 <references />
 !! html
-<p>A <span about="#mwt2" class="reference" id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"&lt;b data-parsoid=&#39;{\"stx\":\"html\",\"autoInsertedEnd\":true,\"dsr\":[8,16,3,0]}&#39;> foo &lt;/b>"},"attrs":{}}'><a href="#cite_note-1">[1]</a></span> B C</p>
+<p>A <span about="#mwt2" class="reference" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"&lt;b data-parsoid=&#39;{\"stx\":\"html\",\"autoInsertedEnd\":true,\"dsr\":[8,16,3,0]}&#39;> foo &lt;/b>"},"attrs":{}}'><a href="#cite_note-1">[1]</a></span> B C</p>
 
 
 <ol class="references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> <b data-parsoid='{"stx":"html","autoInsertedEnd":true}'> foo </b></li>
+<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1">↑</a></span> <b data-parsoid='{"stx":"html","autoInsertedEnd":true}'> foo </b></li>
 </ol>
 !!end
 
@@ -19639,9 +19911,14 @@ parsoid
 !! wikitext
 A <ref>foo</ref> B
 C <ref>bar</ref> D
+<references />
 !! html
-<p>A <span about="#mwt2" class="reference" id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{}}'><a href="#cite_note-1">[1]</a></span> B
-C <span about="#mwt4" class="reference" id="cite_ref-2-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"bar"},"attrs":{}}'><a href="#cite_note-2">[2]</a></span> D</p>
+<p>A <span about="#mwt2" class="reference" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{}}'><a href="#cite_note-1">[1]</a></span> B
+C <span about="#mwt4" class="reference" id="cite_ref-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"bar"},"attrs":{}}'><a href="#cite_note-2">[2]</a></span> D</p>
+<ol class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{}}'>
+<li id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1">↑</a></span> foo</li>
+<li id="cite_note-2"><span rel="mw:referencedBy"><a href="#cite_ref-2">↑</a></span> bar</li>
+</ol>
 !!end
 
 !!test
@@ -19655,14 +19932,19 @@ b<!--the newline at the end of this line stays inside the p-tag--> <ref />
 <ref />
 
 c
+<references />
 !! html
 <p><!--the newline at the end of this line moves out of the p-tag-->a</p>
 
 
-<p>b<!--the newline at the end of this line stays inside the p-tag--> <span about="#mwt2" class="reference" id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{}}'><a href="#cite_note-1">[1]</a></span>
-<span about="#mwt4" class="reference" id="cite_ref-2-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{}}'><a href="#cite_note-2">[2]</a></span></p>
+<p>b<!--the newline at the end of this line stays inside the p-tag--> <span about="#mwt2" class="reference" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{}}'><a href="#cite_note-1">[1]</a></span>
+<span about="#mwt4" class="reference" id="cite_ref-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{}}'><a href="#cite_note-2">[2]</a></span></p>
 
 <p>c</p>
+<ol class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{}}'>
+<li id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1">↑</a></span></li>
+<li id="cite_note-2"><span rel="mw:referencedBy"><a href="#cite_ref-2">↑</a></span></li>
+</ol>
 !!end
 
 !!test
@@ -19673,9 +19955,14 @@ parsoid
 <ref>foo</ref> A
 <ref>bar
 </ref> B
+<references />
 !! html
-<p><span about="#mwt2" class="reference" id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{}}'><a href="#cite_note-1">[1]</a></span> A
-<span about="#mwt4" class="reference" id="cite_ref-2-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"bar\n"},"attrs":{}}'><a href="#cite_note-2">[2]</a></span> B</p>
+<p><span about="#mwt2" class="reference" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{}}'><a href="#cite_note-1">[1]</a></span> A
+<span about="#mwt4" class="reference" id="cite_ref-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"bar\n"},"attrs":{}}'><a href="#cite_note-2">[2]</a></span> B</p>
+<ol class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{}}'>
+<li id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1">↑</a></span> foo</li>
+<li id="cite_note-2"><span rel="mw:referencedBy"><a href="#cite_ref-2">↑</a></span> bar</li>
+</ol>
 !!end
 
 !!test
@@ -19687,10 +19974,10 @@ parsoid
 
 <references />
 !! html
-<p><span about="#mwt2" class="reference" id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"foo &amp;lt;ref>bar&amp;lt;/ref> baz"},"attrs":{}}'><a href="#cite_note-1">[1]</a></span></p>
+<p><span about="#mwt2" class="reference" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"foo &amp;lt;ref>bar&amp;lt;/ref> baz"},"attrs":{}}'><a href="#cite_note-1">[1]</a></span></p>
 
 <ol class="references" typeof="mw:Extension/references" about="#mwt5" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> foo &lt;ref>bar&lt;/ref> baz</li>
+<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1">↑</a></span> foo &lt;ref>bar&lt;/ref> baz</li>
 </ol>
 !!end
 
@@ -19704,10 +19991,10 @@ B1 <ref name="b" /> B2 <ref name="b">bar</ref>
 
 <references />
 !! html
-<p>A1 <span about="#mwt3" class="reference" id="cite_ref-a-1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{"name":"a"}}'><a href="#cite_note-a-1">[1]</a></span> A2 <span about="#mwt4" class="reference" id="cite_ref-a-1-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"a"}}'><a href="#cite_note-a-1">[1]</a></span>
-B1 <span about="#mwt7" class="reference" id="cite_ref-b-2-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"b"}}'><a href="#cite_note-b-2">[2]</a></span> B2 <span about="#mwt8" class="reference" id="cite_ref-b-2-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"bar"},"attrs":{"name":"b"}}'><a href="#cite_note-b-2">[2]</a></span></p>
+<p>A1 <span about="#mwt3" class="reference" id="cite_ref-a_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{"name":"a"}}'><a href="#cite_note-a-1">[1]</a></span> A2 <span about="#mwt4" class="reference" id="cite_ref-a_1-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"a"}}'><a href="#cite_note-a-1">[1]</a></span>
+B1 <span about="#mwt7" class="reference" id="cite_ref-b_2-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"b"}}'><a href="#cite_note-b-2">[2]</a></span> B2 <span about="#mwt8" class="reference" id="cite_ref-b_2-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"bar"},"attrs":{"name":"b"}}'><a href="#cite_note-b-2">[2]</a></span></p>
 
-<ol class="references" typeof="mw:Extension/references" about="#mwt10" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-a-1" id="cite_note-a-1"><span rel="mw:referencedBy">↑ <a href="#cite_ref-a-1-0">1.0</a> <a href="#cite_ref-a-1-1">1.1</a></span> foo</li><li about="#cite_note-b-2" id="cite_note-b-2"><span rel="mw:referencedBy">↑ <a href="#cite_ref-b-2-0">2.0</a> <a href="#cite_ref-b-2-1">2.1</a></span> bar</li>
+<ol class="references" typeof="mw:Extension/references" about="#mwt10" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-a-1" id="cite_note-a-1"><span rel="mw:referencedBy">↑ <a href="#cite_ref-a_1-0">1.0</a> <a href="#cite_ref-a_1-1">1.1</a></span> foo</li><li about="#cite_note-b-2" id="cite_note-b-2"><span rel="mw:referencedBy">↑ <a href="#cite_ref-b_2-0">2.0</a> <a href="#cite_ref-b_2-1">2.1</a></span> bar</li>
 </ol>
 !!end
 
@@ -19721,10 +20008,10 @@ A <ref >foo</ref >
 
 <references />
 !! html
-<p>A <span about="#mwt2" class="reference" id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{}}'><a href="#cite_note-1">[1]</a></span></p>
+<p>A <span about="#mwt2" class="reference" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{}}'><a href="#cite_note-1">[1]</a></span></p>
 
 <ol class="references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> foo</li></ol>
+<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1">↑</a></span> foo</li></ol>
 !!end
 
 !!test
@@ -19736,11 +20023,42 @@ parsoid
 
 <references />
 !!html
-<p><span class="reference" id="cite_ref-a_b-1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{"name":"a b"}}'><a href="#cite_note-a_b-1">[1]</a></span>
+<p><span class="reference" id="cite_ref-a_b_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{"name":"a b"}}'><a href="#cite_note-a_b-1">[1]</a></span>
+</p>
+
+<ol class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{}}'>
+<li id="cite_note-a_b-1"><span rel="mw:referencedBy"><a href="#cite_ref-a_b_1-0">↑</a></span> foo</li>
+!!end
+
+!!test
+Ref: 18. T58916: Extension attributes should be parsed as plain text
+!!options
+parsoid
+!!wikitext
+<ref name="{{echo|a}}">foo</ref>
+
+<references />
+!!html
+<p><span class="reference" id="cite_ref-.7B.7Becho.7Ca.7D.7D_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{"name":"{{echo|a}}"}}'><a href="#cite_note-.7B.7Becho.7Ca.7D.7D-1">[1]</a></span>
 </p>
 
 <ol class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{}}'>
-<li id="cite_note-a_b-1"><span rel="mw:referencedBy"><a href="#cite_ref-a_b-1-0">↑</a></span> foo</li>
+<li id="cite_note-.7B.7Becho.7Ca.7D.7D-1"><span rel="mw:referencedBy"><a href="#cite_ref-.7B.7Becho.7Ca.7D.7D_1-0">↑</a></span> foo</li>
+!!end
+
+!!test
+Ref: 19. ref-tags with identical name encodings should get identical indexes
+!!options
+parsoid
+!! wikitext
+1 <ref name="a & b">foo</ref> 2 <ref name="a &amp; b" />
+
+<references />
+!! html
+<p>1 <span about="#mwt3" class="reference" id="cite_ref-a_.26_b_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{"name":"a &amp; b"}}'><a href="#cite_note-a_.26_b-1">[1]</a></span> 2 <span about="#mwt4" class="reference" id="cite_ref-a_.26_b_1-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"a &amp;amp; b"}}'><a href="#cite_note-a_.26_b-1">[1]</a></span>
+
+<ol class="references" typeof="mw:Extension/references" about="#mwt10" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-a_.26_b-1" id="cite_note-a_.26_b-1"><span rel="mw:referencedBy">↑ <a href="#cite_ref-a_.26_b_1-0">1.0</a> <a href="#cite_ref-a_.26_b_1-1">1.1</a></span> foo</li>
+</ol>
 !!end
 
 !!test
@@ -19760,13 +20078,22 @@ parsoid
 !! wikitext
 A <ref group="a">foo</ref>
 B <ref group="b">bar</ref>
+C <ref>baz</ref>
 
 <references group="a" />
+<references />
+<references group="b" />
 !! html
-<p>A <span about="#mwt2" class="reference" id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{"group":"a"}}'><a href="#cite_note-1">[a 1]</a></span>
-B <span about="#mwt4" class="reference" id="cite_ref-2-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"bar"},"attrs":{"group":"b"}}'><a href="#cite_note-2">[b 1]</a></span></p>
+<p>A <span about="#mwt2" class="reference" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{"group":"a"}}'><a href="#cite_note-1">[a 1]</a></span>
+B <span about="#mwt4" class="reference" id="cite_ref-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"bar"},"attrs":{"group":"b"}}'><a href="#cite_note-2">[b 1]</a></span>
+C <span class="reference" id="cite_ref-3" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"baz"},"attrs":{}}'><a href="#cite_note-3">[1]</a></span></p>
 
-<ol class="references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{"group":"a"}}'><li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> foo</li>
+<ol class="references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{"group":"a"}}'><li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1">↑</a></span> foo</li>
+</ol>
+<ol class="references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-3" id="cite_note-3"><span rel="mw:referencedBy"><a href="#cite_ref-3">↑</a></span> baz</li>
+</ol>
+<ol class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{"group":"b"}}'>
+<li id="cite_note-2"><span rel="mw:referencedBy"><a href="#cite_ref-2">↑</a></span> bar</li>
 </ol>
 !!end
 
@@ -19783,14 +20110,14 @@ B <ref>bar</ref>
 
 <references />
 !! html
-<p>A <span about="#mwt2" class="reference" id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{}}'><a href="#cite_note-1">[1]</a></span></p>
+<p>A <span about="#mwt2" class="reference" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{}}'><a href="#cite_note-1">[1]</a></span></p>
 
-<ol class="references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> foo</li>
+<ol class="references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1">↑</a></span> foo</li>
 </ol>
 
-<p>B <span about="#mwt6" class="reference" id="cite_ref-2-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"bar"},"attrs":{}}'><a href="#cite_note-2">[1]</a></span></p>
+<p>B <span about="#mwt6" class="reference" id="cite_ref-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"bar"},"attrs":{}}'><a href="#cite_note-2">[1]</a></span></p>
 
-<ol class="references" typeof="mw:Extension/references" about="#mwt8" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-2" id="cite_note-2"><span rel="mw:referencedBy"><a href="#cite_ref-2-0">↑</a></span> bar</li>
+<ol class="references" typeof="mw:Extension/references" about="#mwt8" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-2" id="cite_note-2"><span rel="mw:referencedBy"><a href="#cite_ref-2">↑</a></span> bar</li>
 </ol>
 !!end
 
@@ -19808,15 +20135,15 @@ C <ref>cfoo</ref>
 
 <references />
 !! html
-<p>A <span about="#mwt2" class="reference" id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"afoo"},"attrs":{"group":"a"}}'><a href="#cite_note-1">[a 1]</a></span>
-B <span about="#mwt4" class="reference" id="cite_ref-2-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"bfoo"},"attrs":{}}'><a href="#cite_note-2">[1]</a></span></p>
+<p>A <span about="#mwt2" class="reference" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"afoo"},"attrs":{"group":"a"}}'><a href="#cite_note-1">[a 1]</a></span>
+B <span about="#mwt4" class="reference" id="cite_ref-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"bfoo"},"attrs":{}}'><a href="#cite_note-2">[1]</a></span></p>
 
-<ol class="references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{"group":"a"}}'><li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> afoo</li>
+<ol class="references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{"group":"a"}}'><li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1">↑</a></span> afoo</li>
 </ol>
 
-<p>C <span about="#mwt8" class="reference" id="cite_ref-3-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"cfoo"},"attrs":{}}'><a href="#cite_note-3">[2]</a></span></p>
+<p>C <span about="#mwt8" class="reference" id="cite_ref-3" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"cfoo"},"attrs":{}}'><a href="#cite_note-3">[2]</a></span></p>
 
-<ol class="references" typeof="mw:Extension/references" about="#mwt10" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-2" id="cite_note-2"><span rel="mw:referencedBy"><a href="#cite_ref-2-0">↑</a></span> bfoo</li><li about="#cite_note-3" id="cite_note-3"><span rel="mw:referencedBy"><a href="#cite_ref-3-0">↑</a></span> cfoo</li>
+<ol class="references" typeof="mw:Extension/references" about="#mwt10" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-2" id="cite_note-2"><span rel="mw:referencedBy"><a href="#cite_ref-2">↑</a></span> bfoo</li><li about="#cite_note-3" id="cite_note-3"><span rel="mw:referencedBy"><a href="#cite_ref-3">↑</a></span> cfoo</li>
 </ol>
 !!end
 
@@ -19833,11 +20160,11 @@ B <ref name="b">bar</ref>
 This should just get lost.
 </references>
 !! html
-<p>A <span about="#mwt2" class="reference" id="cite_ref-a-1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"a"}}'><a href="#cite_note-a-1">[1]</a></span>
-B <span about="#mwt4" class="reference" id="cite_ref-b-2-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"bar"},"attrs":{"name":"b"}}'><a href="#cite_note-b-2">[2]</a></span></p>
+<p>A <span about="#mwt2" class="reference" id="cite_ref-a_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"a"}}'><a href="#cite_note-a-1">[1]</a></span>
+B <span about="#mwt4" class="reference" id="cite_ref-b_2-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"bar"},"attrs":{"name":"b"}}'><a href="#cite_note-b-2">[2]</a></span></p>
 
 
-<ol class="references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","body":{"extsrc":"&lt;ref name=\"a\">foo&lt;/ref>\nThis should just get lost.","html":"\n&lt;span about=\"#mwt8\" class=\"reference\" rel=\"dc:references\" typeof=\"mw:Extension/ref\" data-parsoid=&#39;{\"src\":\"&amp;lt;ref name=\\\"a\\\">foo&amp;lt;/ref>\",\"dsr\":[59,82,14,6]}&#39; data-mw=&#39;{\"name\":\"ref\",\"body\":{\"html\":\"foo\"},\"attrs\":{\"name\":\"a\"}}&#39;>&lt;a href=\"#cite_note-a-1\">[1]&lt;/a>&lt;/span>\n"},"attrs":{}}'><li about="#cite_note-a-1" id="cite_note-a-1"><span rel="mw:referencedBy"><a href="#cite_ref-a-1-0">↑</a></span> foo</li><li about="#cite_note-b-2" id="cite_note-b-2"><span rel="mw:referencedBy"><a href="#cite_ref-b-2-0">↑</a></span> bar</li>
+<ol class="references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","body":{"extsrc":"&lt;ref name=\"a\">foo&lt;/ref>\nThis should just get lost.","html":"\n&lt;span about=\"#mwt8\" class=\"reference\" rel=\"dc:references\" typeof=\"mw:Extension/ref\" data-parsoid=&#39;{\"src\":\"&amp;lt;ref name=\\\"a\\\">foo&amp;lt;/ref>\",\"dsr\":[59,82,14,6]}&#39; data-mw=&#39;{\"name\":\"ref\",\"body\":{\"html\":\"foo\"},\"attrs\":{\"name\":\"a\"}}&#39;>&lt;a href=\"#cite_note-a-1\">[1]&lt;/a>&lt;/span>\n"},"attrs":{}}'><li about="#cite_note-a-1" id="cite_note-a-1"><span rel="mw:referencedBy"><a href="#cite_ref-a_1-0">↑</a></span> foo</li><li about="#cite_note-b-2" id="cite_note-b-2"><span rel="mw:referencedBy"><a href="#cite_ref-b_2-0">↑</a></span> bar</li>
 </ol>
 !!end
 
@@ -19848,7 +20175,7 @@ parsoid
 !! wikitext
 <ref>Foo</ref> {{echo|<references />}}
 !! html
-<p><span about="#mwt3" class="reference" id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"Foo"},"attrs":{}}'><a href="#cite_note-1">[1]</a></span></p> <ol class="references" typeof="mw:Extension/references mw:Transclusion" about="#mwt4" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"&lt;references />"}},"i":0}}]}'><li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> Foo</li></ol>
+<p><span about="#mwt3" class="reference" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"Foo"},"attrs":{}}'><a href="#cite_note-1">[1]</a></span></p> <ol class="references" typeof="mw:Extension/references mw:Transclusion" about="#mwt4" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"&lt;references />"}},"i":0}}]}'><li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1">↑</a></span> Foo</li></ol>
 !!end
 
 !! test
@@ -19865,12 +20192,45 @@ B <ref group="X" name="b" />
 <ref name="b">foo</ref>
 </references>
 !! html
-<p>A <span about="#mwt2" class="reference" id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"foo bar for a"},"attrs":{}}'><a href="#cite_note-1">[1]</a></span>
-B <span about="#mwt4" class="reference" id="cite_ref-b-2-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"group":"X","name":"b"}}'><a href="#cite_note-b-2">[X 1]</a></span></p>
+<p>A <span about="#mwt2" class="reference" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"foo bar for a"},"attrs":{}}'><a href="#cite_note-1">[1]</a></span>
+B <span about="#mwt4" class="reference" id="cite_ref-b_2-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"group":"X","name":"b"}}'><a href="#cite_note-b-2">[X 1]</a></span></p>
+
+<ol class="references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1">↑</a></span> foo bar for a</li></ol>
+
+<ol class="references" typeof="mw:Extension/references" about="#mwt8" data-mw='{"name":"references","body":{"extsrc":"&lt;ref name=\"b\">foo&lt;/ref>","html":"\n&lt;span about=\"#mwt10\" class=\"reference\" rel=\"dc:references\" typeof=\"mw:Extension/ref\" data-parsoid=&#39;{\"src\":\"&amp;lt;ref name=\\\"b\\\">foo&amp;lt;/ref>\",\"dsr\":[96,119,14,6]}&#39; data-mw=&#39;{\"name\":\"ref\",\"body\":{\"html\":\"foo\"},\"attrs\":{\"name\":\"b\"}}&#39;>&lt;a href=\"#cite_note-b-2\">[X 1]&lt;/a>&lt;/span>\n"},"attrs":{"group":"X"}}'><li about="#cite_note-b-2" id="cite_note-b-2"><span rel="mw:referencedBy"><a href="#cite_ref-b_2-0">↑</a></span> foo</li></ol>
+!! end
 
-<ol class="references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> foo bar for a</li></ol>
+!! test
+References: 8. T88019: Remove <meta>s from templates inside <ref> that's itself inside a template
+!! options
+parsoid
+!! wikitext
+X{{echo|<ref>foo {{echo|<b>bar</b>}} and {{echo|baz}} boo</ref>}}
+<references />
+!! html
+<p>X<span about="#mwt2" class="reference" id="cite_ref-1" rel="dc:references" typeof="mw:Transclusion  mw:Extension/ref" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"&lt;ref>foo {{echo|&lt;b>bar&lt;/b>}} and {{echo|baz}} boo&lt;/ref>"}},"i":0}}]}'><a href="#cite_note-1">[1]</a></span></p>
+<ol class="references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1">↑</a></span> foo <b data-parsoid='{"stx":"html"}'>bar</b> and baz boo</li></ol>
+!!end
 
-<ol class="references" typeof="mw:Extension/references" about="#mwt8" data-mw='{"name":"references","body":{"extsrc":"&lt;ref name=\"b\">foo&lt;/ref>","html":"\n&lt;span about=\"#mwt10\" class=\"reference\" rel=\"dc:references\" typeof=\"mw:Extension/ref\" data-parsoid=&#39;{\"src\":\"&amp;lt;ref name=\\\"b\\\">foo&amp;lt;/ref>\",\"dsr\":[96,119,14,6]}&#39; data-mw=&#39;{\"name\":\"ref\",\"body\":{\"html\":\"foo\"},\"attrs\":{\"name\":\"b\"}}&#39;>&lt;a href=\"#cite_note-b-2\">[X 1]&lt;/a>&lt;/span>\n"},"attrs":{"group":"X"}}'><li about="#cite_note-b-2" id="cite_note-b-2"><span rel="mw:referencedBy"><a href="#cite_ref-b-2-0">↑</a></span> foo</li></ol>
+# This test only works in wt2html now as the <references /> are always generated
+# unless selser is active. Once T72722 is fixed, we should add a changes test
+# here to ensure that unrelated changes don't add the new <references /> in
+# wt2wt.
+!! test
+References: 9. Generate missing references list at the end
+!! options
+parsoid
+!! wikitext
+A <ref>foo</ref>
+B <ref group="inexistent">bar</ref>
+!! html
+<p>A <span class="reference" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{}}'><a href="#cite_note-1">[1]</a></span> B <span class="reference" id="cite_ref-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"bar"},"attrs":{"group":"inexistent"}}'><a href="#cite_note-2">[inexistent 1]</a></span></</p>
+<ol class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{}}'>
+<li id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1">↑</a></span> foo</li>
+</ol>
+<ol class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{"group":"inexistent"}}'>
+<li id="cite_note-2"><span rel="mw:referencedBy"><a href="#cite_ref-2">↑</a></span> bar</li>
+</ol>
 !! end
 
 !! test
@@ -19879,8 +20239,12 @@ Entities in ref name
 parsoid
 !! wikitext
 <ref name="test &amp; me">hi</ref>
+<references />
 !! html
-<p><span about="#mwt2" class="reference" id="cite_ref-test_&amp;_me-1-0" rel="dc:references" typeof="mw:Extension/ref" data-parsoid='{"src":"&lt;ref name=\"test &amp;amp; me\">hi&lt;/ref>"}' data-mw='{"name":"ref","body":{"html":"hi"},"attrs":{"name":"test &amp; me"}}'><a href="#cite_note-test_&amp;_me-1">[1]</a></span></p>
+<p><span about="#mwt2" class="reference" id="cite_ref-test_.26_me_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"hi"},"attrs":{"name":"test &amp;amp; me"}}'><a href="#cite_note-test_.26_me-1">[1]</a></span></p>
+<ol class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{}}'>
+<li id="cite_note-test_.26_me-1"><span rel="mw:referencedBy"><a href="#cite_ref-test_.26_me_1-0">↑</a></span> hi</li>
+</ol>
 !! end
 
 # This test is wt2html only because we're permitting the serializer to produce
@@ -19894,11 +20258,11 @@ a<ref>foo</ref>
 
 <references>
 !! html
-<p>a<span about="#mwt2" class="reference" id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{}}'><a href="#cite_note-1">[1]</a></span></p>
+<p>a<span about="#mwt2" class="reference" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{}}'><a href="#cite_note-1">[1]</a></span></p>
 
 
 <ol class="references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> foo</li></ol>
+<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1">↑</a></span> foo</li></ol>
 !! end
 
 !! test
@@ -20024,6 +20388,17 @@ parsoid
 Headings: 1. Nested inside html
 !! options
 parsoid=html2wt
+!! html
+<h1>=foo=</h1>
+<h2>=foo=</h2>
+<h3>=foo=</h3>
+
+<h1 data-parsoid=''>=foo=</h1>
+<h2 data-parsoid=''>=foo=</h2>
+<h3 data-parsoid=''>=foo=</h3>
+<h4 data-parsoid=''>=foo=</h4>
+<h5 data-parsoid=''>=foo=</h5>
+<h6 data-parsoid=''>=foo=</h6>
 !! wikitext
 = =foo= =
 
@@ -20038,23 +20413,16 @@ parsoid=html2wt
 =====<nowiki>=foo=</nowiki>=====
 ======<nowiki>=foo=</nowiki>======
 
-!! html
-<h1>=foo=</h1>
-<h2>=foo=</h2>
-<h3>=foo=</h3>
-
-<h1 data-parsoid=''>=foo=</h1>
-<h2 data-parsoid=''>=foo=</h2>
-<h3 data-parsoid=''>=foo=</h3>
-<h4 data-parsoid=''>=foo=</h4>
-<h5 data-parsoid=''>=foo=</h5>
-<h6 data-parsoid=''>=foo=</h6>
 !!end
 
 !! test
 Headings: 2. Outside heading nest on a single line <h1>foo</h1>*bar
 !! options
 parsoid=html2wt
+!! html
+<h1>foo</h1>*bar
+<h1>foo</h1>=bar
+<h1>foo</h1>=bar=
 !! wikitext
 = foo =
 <nowiki>*</nowiki>bar
@@ -20064,10 +20432,6 @@ parsoid=html2wt
 
 = foo =
 <nowiki>=bar=</nowiki>
-!! html
-<h1>foo</h1>*bar
-<h1>foo</h1>=bar
-<h1>foo</h1>=bar=
 !!end
 
 !! test
@@ -20096,6 +20460,8 @@ Headings: 4a. No escaping needed (testing just h1 and h2)
 == foo= ==
 
 = = =
+
+= ''=''foo= =
 !! html/parsoid
 <h1>=foo</h1>
 <h1>foo=</h1>
@@ -20104,32 +20470,22 @@ Headings: 4a. No escaping needed (testing just h1 and h2)
 <h2>=foo</h2>
 <h2>foo=</h2>
 <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
+!!end
 
 !! test
 Headings: 4b. No escaping needed (inside p-tags)
 !! options
 parsoid=html2wt
-!! wikitext
-===
-=foo= x
-=foo= <s></s>
 !! html
 <p>===
 =foo= x
 =foo= <s></s>
 </p>
+!! wikitext
+===
+=foo= x
+=foo= <s></s>
 !!end
 
 !! test
@@ -20233,12 +20589,30 @@ parsoid
 Headings: 6d. Heading chars in SOL context (No escaping needed)
 !! options
 parsoid=html2wt
-!! wikitext
-=a=<div>b</div>
 !! html
 =a=<div>b</div>
+!! wikitext
+=a=<div>b</div>
 !!end
 
+!! test
+Headings: 7. Insert a newline between new content and headings
+!! options
+parsoid=html2wt
+!! html
+<h2>NEW</h2>
+<p>new</p>
+<h2 data-parsoid='{"dsr":[0,5,2,2]}'>A</h2>
+<p data-parsoid='{"dsr":[6,7,0,0]}'>a</p>
+!! wikitext
+== NEW ==
+new
+
+==A==
+a
+
+!! end
+
 #### --------------- Lists ---------------
 #### 0. Outside nests (*foo, etc.)
 #### 1. Nested inside html <ul><li>*foo</li></ul>
@@ -20389,10 +20763,10 @@ Lists: 5. No unnecessary escapes
 Lists: 6. Escape bullets in SOL position
 !! options
 parsoid=html2wt
-!! wikitext
-<!--cmt--><nowiki>*</nowiki>foo
 !! html
 <p><!--cmt-->*foo</p>
+!! wikitext
+<!--cmt--><nowiki>*</nowiki>foo
 !!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>
+!! wikitext
+; <nowiki>a:b</nowiki>''c:d''
 !! end
 
 #### --------------- HRs ---------------
@@ -20640,14 +21014,6 @@ parsoid=html2wt
 Tables: 4a. Escape -
 !! options
 parsoid=html2wt
-!! wikitext
-{|
-
-!-bar
-
-|-
-|<nowiki>-bar</nowiki>
-|}
 !! html/*
 <table>
 
@@ -20658,20 +21024,20 @@ parsoid=html2wt
 <td>-bar
 </td></tr></table>
 
-!! end
-
-!! test
-Tables: 4b. Escape +
-!! options
-parsoid=html2wt
 !! wikitext
 {|
 
-!+bar
+!-bar
 
 |-
-|<nowiki>+bar</nowiki>
+|<nowiki>-bar</nowiki>
 |}
+!! end
+
+!! test
+Tables: 4b. Escape +
+!! options
+parsoid=html2wt
 !! html/*
 <table>
 
@@ -20682,6 +21048,14 @@ parsoid=html2wt
 <td>+bar
 </td></tr></table>
 
+!! wikitext
+{|
+
+!+bar
+
+|-
+|<nowiki>+bar</nowiki>
+|}
 !! end
 
 !! test
@@ -20790,23 +21164,39 @@ parsoid=wt2html
 #### 5. Extlinks: No escapes needed
 #### --------------------------------------
 !! test
-Links 1. Quote marks in link text
-!! options
-parsoid
+Links 1. WikiLinks: No escapes needed
 !! wikitext
-[[Foo|Foo<nowiki>''boo''</nowiki>]]
-!! html
-<a rel="mw:WikiLink" href="Foo">Foo''boo''</a>
+[[Foo|Foo''boo'']]
+[[Foo|[Foobar]]]
+[[Foo|x [Foobar] x]]
+!! html/php
+<p><a href="/wiki/Foo" title="Foo">Foo<i>boo</i></a>
+<a href="/wiki/Foo" title="Foo">[Foobar]</a>
+<a href="/wiki/Foo" title="Foo">x [Foobar] x</a>
+</p>
+!! html/parsoid
+<p><a rel="mw:WikiLink" href="Foo" title="Foo">Foo<i>boo</i></a>
+<a rel="mw:WikiLink" href="Foo" title="Foo">[Foobar]</a>
+<a rel="mw:WikiLink" href="Foo" title="Foo">x [Foobar] x</a></p>
 !! end
 
 !! test
 Links 2. WikiLinks: Escapes needed
 !! options
-parsoid
+parsoid=html2wt
+!! html/parsoid
+<a href="Foo" rel="mw:WikiLink">Foobar]</a>
+<a href="Foo" rel="mw:WikiLink">x [http://google.com g] x</a>
+<a href="Foo" rel="mw:WikiLink">[[Bar]]</a>
+<a href="Foo" rel="mw:WikiLink">x [[Bar]] x</a>
+<a href="Foo" rel="mw:WikiLink">|Bar</a>
+<a href="Foo" rel="mw:WikiLink">]]bar</a>
+<a href="Foo" rel="mw:WikiLink">[[bar</a>
+<a href="Foo" rel="mw:WikiLink">x [[ y</a>
+<a href="Foo" rel="mw:WikiLink">x ]] y</a>
+<a href="Foo" rel="mw:WikiLink">x ]] y [[ z</a>
 !! wikitext
-[[Foo|[Foobar]]]
 [[Foo|<nowiki>Foobar]</nowiki>]]
-[[Foo|x [Foobar] x]]
 [[Foo|x <nowiki>[http://google.com g]</nowiki> x]]
 [[Foo|<nowiki>[[Bar]]</nowiki>]]
 [[Foo|<nowiki>x [[Bar]] x</nowiki>]]
@@ -20816,37 +21206,43 @@ parsoid
 [[Foo|<nowiki>x [[ y</nowiki>]]
 [[Foo|<nowiki>x ]] y</nowiki>]]
 [[Foo|<nowiki>x ]] y [[ z</nowiki>]]
-!! html
-<a href="Foo" rel="mw:WikiLink">[Foobar]</a>
-<a href="Foo" rel="mw:WikiLink">Foobar]</a>
-<a href="Foo" rel="mw:WikiLink">x [Foobar] x</a>
-<a href="Foo" rel="mw:WikiLink">x [http://google.com g] x</a>
-<a href="Foo" rel="mw:WikiLink">[[Bar]]</a>
-<a href="Foo" rel="mw:WikiLink">x [[Bar]] x</a>
-<a href="Foo" rel="mw:WikiLink">|Bar</a>
-<a href="Foo" rel="mw:WikiLink">]]bar</a>
-<a href="Foo" rel="mw:WikiLink">[[bar</a>
-<a href="Foo" rel="mw:WikiLink">x [[ y</a>
-<a href="Foo" rel="mw:WikiLink">x ]] y</a>
-<a href="Foo" rel="mw:WikiLink">x ]] y [[ z</a>
+!! html/php
+<p><a href="/wiki/Foo" title="Foo">Foobar]</a>
+<a href="/wiki/Foo" title="Foo">x [http://google.com g] x</a>
+<a href="/wiki/Foo" title="Foo">[[Bar]]</a>
+<a href="/wiki/Foo" title="Foo">x [[Bar]] x</a>
+<a href="/wiki/Foo" title="Foo">|Bar</a>
+<a href="/wiki/Foo" title="Foo">]]bar</a>
+<a href="/wiki/Foo" title="Foo">[[bar</a>
+<a href="/wiki/Foo" title="Foo">x [[ y</a>
+<a href="/wiki/Foo" title="Foo">x ]] y</a>
+<a href="/wiki/Foo" title="Foo">x ]] y [[ z</a>
+</p>
 !! end
 
 !! test
 Links 3. WikiLinks: No escapes needed
-!! options
-parsoid
 !! wikitext
 [[Foo|[Foobar]]
 [[Foo|foo|bar]]
-!! html
-<a href="Foo" rel="mw:WikiLink">[Foobar</a>
-<a href="Foo" rel="mw:WikiLink">foo|bar</a>
+!! html/php
+<p><a href="/wiki/Foo" title="Foo">[Foobar</a>
+<a href="/wiki/Foo" title="Foo">foo|bar</a>
+</p>
+!! html/parsoid
+<p><a rel="mw:WikiLink" href="Foo">[Foobar</a>
+<a rel="mw:WikiLink" href="Foo" title="Foo">foo|bar</a></p>
 !! end
 
 !! test
 Links 4. ExtLinks: Escapes needed
 !! options
-parsoid
+parsoid=html2wt
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="http://google.com">[google]</a>
+<a rel="mw:ExtLink" href="http://google.com">google]</a></p>
+<p>[http://google.com]</p>
+<p>[http://google.com google]</p>
 !! wikitext
 [http://google.com <nowiki>[google]</nowiki>]
 [http://google.com <nowiki>google]</nowiki>]
@@ -20855,21 +21251,23 @@ parsoid
 
 <nowiki>[http://google.com google]</nowiki>
 
-!! html
-<p><a href="http://google.com" rel="mw:ExtLink">[google]</a>
-<a href="http://google.com" rel="mw:ExtLink">google]</a></p>
-<p>[http://google.com]</p>
-<p>[http://google.com google]</p>
+!! html/php
+<p><a rel="nofollow" class="external text" href="http://google.com">[google]</a>
+<a rel="nofollow" class="external text" href="http://google.com">google]</a>
+</p><p>[http://google.com]
+</p><p>[http://google.com google]
+</p>
 !! end
 
 !! test
 Links 5. ExtLinks: No escapes needed
-!! options
-parsoid
 !! wikitext
 [http://google.com [google]
-!! html
-<a href="http://google.com" rel="mw:ExtLink">[google</a>
+!! html/php
+<p><a rel="nofollow" class="external text" href="http://google.com">[google</a>
+</p>
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="http://google.com">[google</a></p>
 !! end
 
 !! test
 (http://example.com) foo
 http://example.com,
 http://example.com, foo
+!! html/php
+<p>x
+<a rel="nofollow" class="external free" href="http://example.com">http://example.com</a>
+y
+"<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">http://example.com</a>) foo
+<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>, foo
+</p>
 !! end
 
-## Parsoid currently fails wt2html on this one!
 !! test
 Links 7b. Don't add spurious <nowiki/>s between text-nodes and url-links (bug 64300)
 !! html/parsoid
-<p><a rel="mw:ExtLink" href="http://example.com" data-parsoid='{"stx":"url"}'>http://example.com</a>.,;:!?</p>
+<p><a rel="mw:ExtLink" href="http://example.com" data-parsoid='{"stx":"url"}'>http://example.com</a>.,;:!?\
+-<a rel="mw:ExtLink" href="http://example.com">http://example.com</a>:</p>
 !! wikitext
-http://example.com.,;:!?
+http://example.com.,;:!?\
+-http://example.com:
+!! html/php
+<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>:
+</p>
 !! end
 
 !! test
 Links 8. Add <nowiki/>s between text-nodes and RFC-links when required (bug 64300)
 !! html/parsoid
-<p><a href="//tools.ietf.org/html/rfc123" rel="mw:ExtLink" data-parsoid='{"stx":"magiclink"}'>RFC 123</a>4</p>
+<p><a href="//tools.ietf.org/html/rfc123" rel="mw:ExtLink" data-parsoid='{"stx":"magiclink"}'>RFC 123</a>4
+<a href="//tools.ietf.org/html/rfc123" rel="mw:ExtLink" data-parsoid='{"stx":"magiclink"}'>RFC 123</a>y
+X<a href="//tools.ietf.org/html/rfc123" rel="mw:ExtLink" data-parsoid='{"stx":"magiclink"}'>RFC 123</a>y</p>
 !! wikitext
 RFC 123<nowiki/>4
+RFC 123<nowiki/>y
+X<nowiki/>RFC 123<nowiki/>y
 !! end
 
 !! test
 Links 9. Don't add spurious <nowiki/>s between text-nodes and RFC-links (bug 64300)
 !! html/parsoid
-<p>x<a href="//tools.ietf.org/html/rfc123" rel="mw:ExtLink" data-parsoid='{"stx":"magiclink"}'>RFC 123</a>y
-X<a href="//tools.ietf.org/html/rfc123" rel="mw:ExtLink" data-parsoid='{"stx":"magiclink"}'>RFC 123</a>y
-<a href="//tools.ietf.org/html/rfc123" rel="mw:ExtLink" data-parsoid='{"stx":"magiclink"}'>RFC 123</a>?foo
+<p><a href="//tools.ietf.org/html/rfc123" rel="mw:ExtLink" data-parsoid='{"stx":"magiclink"}'>RFC 123</a>?foo
 <a href="//tools.ietf.org/html/rfc123" rel="mw:ExtLink" data-parsoid='{"stx":"magiclink"}'>RFC 123</a>&amp;foo
+-<a href="//tools.ietf.org/html/rfc123" rel="mw:ExtLink" data-parsoid='{"stx":"magiclink"}'>RFC 123</a>-
 </p>
 !! wikitext
-xRFC 123y
-XRFC 123y
 RFC 123?foo
 RFC 123&foo
+-RFC 123-
+!! html/php
+<p><a class="external mw-magiclink-rfc" rel="nofollow" href="//tools.ietf.org/html/rfc123">RFC 123</a>?foo
+<a class="external mw-magiclink-rfc" rel="nofollow" href="//tools.ietf.org/html/rfc123">RFC 123</a>&amp;foo
+-<a class="external mw-magiclink-rfc" rel="nofollow" href="//tools.ietf.org/html/rfc123">RFC 123</a>-
+</p>
 !! end
 
 !! test
 Links 10. Add <nowiki/>s between text-nodes and PMID-links when required (bug 64300)
 !! html/parsoid
 <p><a href="//www.ncbi.nlm.nih.gov/pubmed/123?dopt=Abstract" rel="mw:ExtLink" data-parsoid='{"stx":"magiclink"}'>PMID 123</a>4
+<a href="//www.ncbi.nlm.nih.gov/pubmed/123?dopt=Abstract" rel="mw:ExtLink" data-parsoid='{"stx":"magiclink"}'>PMID 123</a>y
+X<a href="//www.ncbi.nlm.nih.gov/pubmed/123?dopt=Abstract" rel="mw:ExtLink" data-parsoid='{"stx":"magiclink"}'>PMID 123</a>y
 !! wikitext
 PMID 123<nowiki/>4
+PMID 123<nowiki/>y
+X<nowiki/>PMID 123<nowiki/>y
 !! end
 
 !! test
 Links 11. Don't add spurious <nowiki/>s between text-nodes and PMID-links (bug 64300)
 !! html/parsoid
-<p>x<a href="//www.ncbi.nlm.nih.gov/pubmed/123?dopt=Abstract" rel="mw:ExtLink" data-parsoid='{"stx":"magiclink"}'>PMID 123</a>y
-X<a href="//www.ncbi.nlm.nih.gov/pubmed/123?dopt=Abstract" rel="mw:ExtLink" data-parsoid='{"stx":"magiclink"}'>PMID 123</a>y
-<a href="//www.ncbi.nlm.nih.gov/pubmed/123?dopt=Abstract" rel="mw:ExtLink" data-parsoid='{"stx":"magiclink"}'>PMID 123</a>?foo
+<p><a href="//www.ncbi.nlm.nih.gov/pubmed/123?dopt=Abstract" rel="mw:ExtLink" data-parsoid='{"stx":"magiclink"}'>PMID 123</a>?foo
 <a href="//www.ncbi.nlm.nih.gov/pubmed/123?dopt=Abstract" rel="mw:ExtLink" data-parsoid='{"stx":"magiclink"}'>PMID 123</a>&foo
+-<a href="//www.ncbi.nlm.nih.gov/pubmed/123?dopt=Abstract" rel="mw:ExtLink" data-parsoid='{"stx":"magiclink"}'>PMID 123</a>-
 </p>
 !! wikitext
-xPMID 123y
-XPMID 123y
 PMID 123?foo
 PMID 123&foo
+-PMID 123-
+!! html/php
+<p><a class="external mw-magiclink-pmid" rel="nofollow" href="//www.ncbi.nlm.nih.gov/pubmed/123?dopt=Abstract">PMID 123</a>?foo
+<a class="external mw-magiclink-pmid" rel="nofollow" href="//www.ncbi.nlm.nih.gov/pubmed/123?dopt=Abstract">PMID 123</a>&amp;foo
+-<a class="external mw-magiclink-pmid" rel="nofollow" href="//www.ncbi.nlm.nih.gov/pubmed/123?dopt=Abstract">PMID 123</a>-
+</p>
 !! end
 
 !! test
@@ -20988,24 +21415,27 @@ Links 12. Add <nowiki/>s between text-nodes and ISBN-links when required (bug 64
 !! html/parsoid
 <p><a href="./Special:BookSources/1234567890" rel="mw:ExtLink" data-parsoid='{"stx":"magiclink"}'>ISBN 1234567890</a>1
 <a href="./Special:BookSources/1234567890" rel="mw:ExtLink" data-parsoid='{"stx":"magiclink"}'>ISBN 1234567890</a>x
-<a href="./Special:BookSources/1234567890" rel="mw:ExtLink" data-parsoid='{"stx":"magiclink"}'>ISBN 1234567890</a>b
+a<a href="./Special:BookSources/1234567890" rel="mw:ExtLink" data-parsoid='{"stx":"magiclink"}'>ISBN 1234567890</a>b
 </p>
 !! wikitext
 ISBN 1234567890<nowiki/>1
 ISBN 1234567890<nowiki/>x
-ISBN 1234567890<nowiki/>b
+a<nowiki/>ISBN 1234567890<nowiki/>b
 !! end
 
 !! test
-Links 12. Don't add spurious <nowiki/>s between text-nodes and ISBN-links (bug 64300)
+Links 13. Don't add spurious <nowiki/>s between text-nodes and ISBN-links (bug 64300)
 !! html/parsoid
-<p><a href="./Special:BookSources/1234567890" rel="mw:ExtLink" data-parsoid='{"stx":"magiclink"}'>ISBN 1234567890</a>'s
+<p>-<a href="./Special:BookSources/1234567890" rel="mw:ExtLink" data-parsoid='{"stx":"magiclink"}'>ISBN 1234567890</a>'s
 !! wikitext
-ISBN 1234567890's
+-ISBN 1234567890's
+!! html/php
+<p>-<a href="/wiki/Special:BookSources/1234567890" class="internal mw-magiclink-isbn">ISBN 1234567890</a>'s
+</p>
 !! end
 
 !! test
-Links 13: Protect link-like plain text. (Parsoid bug T78425)
+Links 14. Protect link-like plain text. (Parsoid bug T78425)
 !! options
 parsoid=html2wt
 !! html/*
@@ -21015,10 +21445,22 @@ parsoid=html2wt
 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
+!! test
+Links 15. Link trails can't become link prefixes.
+!! options
+language=is
+!! wikitext
+[[Söfnuður]]-[[00]]
+!! html/php
+<p><a href="/wiki/S%C3%B6fnu%C3%B0ur" title="Söfnuður">Söfnuður-</a><a href="/wiki/00" title="00">00</a>
+</p>
+!! html/parsoid
+<p><a rel="mw:WikiLink" href="Söfnuður" title="Söfnuður" data-parsoid='{"stx":"simple","tail":"-"}'>Söfnuður-</a><a rel="mw:WikiLink" href="00" title="00">00</a></p>
+!! end
+
+#### --------------- Quotes ---------------
+#### 1. Quotes inside <b> and <i>
+#### 2. Link fragments separated by <i> and <b> tags
 #### 3. Link fragments inside <i> and <b>
 #### 4. No escaping needed
 #### --------------------------------------
@@ -21027,24 +21469,25 @@ this is not a link: <nowiki>http://example.com</nowiki>
 !! options
 parsoid=html2wt,wt2wt
 !! wikitext
-''<nowiki/>'foo'<nowiki/>''
+''<nowiki/>'foo'''
 ''<nowiki>''foo''</nowiki>''
 ''<nowiki>'''foo'''</nowiki>''
 ''foo''<nowiki/>'s
-'''<nowiki/>'foo'<nowiki/>'''
+'''<nowiki/>'foo''''
 '''<nowiki>''foo''</nowiki>'''
 '''<nowiki>'''foo'''</nowiki>'''
 '''foo'<nowiki/>''bar'<nowiki/>''baz'''
 '''foo'''<nowiki/>'s
 '''foo''
 ''foo''<nowiki/>'
-''foo'<nowiki/>''<nowiki/>'
-'<nowiki/>''foo''<nowiki/>'
+''foo'''<nowiki/>'
+'''foo''<nowiki/>'
 ''''foo'''
 '''foo'''<nowiki/>'
-'<nowiki/>'''foo'''<nowiki/>'
+''''foo'''<nowiki/>'
 ''fools'<span> errand</span>''
 ''<span>fool</span>'s errand''
+'<nowiki/>''foo'' bar '''baz''
 a|!*#-:;+-~[]{}b'''x''
 !! html/*
 <p><i>'foo'</i>
@@ -21065,12 +21508,13 @@ a|!*#-:;+-~[]{}b'''x''
 '<b>foo</b>'
 <i>fools'<span> errand</span></i>
 <i><span>fool</span>'s errand</i>
+'<i>foo</i> bar '<i>baz</i>
 a|!*#-:;+-~[]{}b'<i>x</i>
 </p>
 !! end
 
 !! test
-1b. Quotes inside <b> and <i> with other chars
+1b. Quotes inside <b> and <i> with other tags on same line
 !! options
 parsoid=html2wt,wt2wt
 !! wikitext
@@ -21078,11 +21522,21 @@ parsoid=html2wt,wt2wt
 ''a''' foo ''[[bar]]''
 ''a''' foo '''{{echo|[[bar]]}}'''
 [[foo]] x'''[[bar]]''
+'''foo'' <ref>test</ref>
+'''foo'' <div title="name">test</div>
+'''foo'' and <br> bar
+<references />
 !! 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>
+'<i>foo</i> <span class="reference" id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"test"},"attrs":{}}'><a href="#cite_note-1">[1]</a></span>
+'<i>foo</i> <div title="name">test</div>
+'<i>foo</i> and <br data-parsoid='{"stx":"html","noClose":true}'/> bar
+<ol class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{}}'>
+<li id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1">↑</a></span> test</li>
+</ol>
 !! end
 
 !! test
@@ -21196,8 +21650,12 @@ parsoid
 !! wikitext
 foo <ref>''a''
  b</ref>
+<references />
 !! html
-<p>foo <span about="#mwt2" class="reference" id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"&lt;i data-parsoid=&#39;{\"dsr\":[9,14,2,2]}&#39;>a&lt;/i>\n b"},"attrs":{}}'><a href="#cite_note-1">[1]</a></span></p>
+<p>foo <span about="#mwt2" class="reference" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"&lt;i data-parsoid=&#39;{\"dsr\":[9,14,2,2]}&#39;>a&lt;/i>\n b"},"attrs":{}}'><a href="#cite_note-1">[1]</a></span></p>
+<ol class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{}}'>
+<li id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1">↑</a></span> <i>a</i> b</li>
+</ol>
 !! end
 
 !! test
@@ -21245,22 +21703,22 @@ parsoid=html2wt
 1. Valid behavior switches should be escaped
 !! options
 parsoid=html2wt
-!! wikitext
-<nowiki>__TOC__</nowiki>
-''<nowiki>__TOC__</nowiki>''
 !! html
 __TOC__
 <i>__TOC__</i>
+!! wikitext
+<nowiki>__TOC__</nowiki>
+''<nowiki>__TOC__</nowiki>''
 !! end
 
 !! test
 2. Invalid behavior switches should not be escaped
 !! options
 parsoid=html2wt
-!! wikitext
+!! html
 __TOO__
 __|__
-!! html
+!! wikitext
 __TOO__
 __|__
 !! end
@@ -21634,6 +22092,29 @@ Indented table with an empty td
 
 !!end
 
+## We have some newline diffs RT-ing this edge case
+## and it is not important enough -- we seem to be emitting
+## at most 2 newlines after a </tr> and this is unrelated to
+## the issue from T85627 that this is testing.
+!!test
+Indented table with blank lines in between (T85627)
+!! options
+parsoid=wt2html
+!! wikitext
+ {|
+ |foo
+ |}
+!! html
+<table>
+
+<tr>
+<td>foo
+</td></tr></table>
+
+!!end
+
 !!test
 Indented block & table
 !! wikitext
@@ -21733,6 +22214,10 @@ Multi-line image caption generated by templates with/without trailing newlines
 New element inserted (without intervening newlines) after an old sol-transparent node should serialize correctly
 !! options
 parsoid=html2wt
+!! html
+<meta typeof="mw:Includes/IncludeOnly" data-parsoid='{"src":"&lt;includeonly>foo&lt;/includeonly>"}'/><meta typeof="mw:Includes/IncludeOnly/End" data-parsoid='{"src":""}'/><p>new para</p>
+
+<link rel="mw:PageProp/Category" href="./Category:Foo" data-parsoid=''/><h1>new heading</h1>
 !! wikitext
 <includeonly>foo</includeonly>
 new para
@@ -21740,10 +22225,6 @@ new para
 [[./Category:Foo]]
 
 = new heading =
-!! html
-<meta typeof="mw:Includes/IncludeOnly" data-parsoid='{"src":"&lt;includeonly>foo&lt;/includeonly>"}'/><meta typeof="mw:Includes/IncludeOnly/End" data-parsoid='{"src":""}'/><p>new para</p>
-
-<link rel="mw:PageProp/Category" href="./Category:Foo" data-parsoid=''/><h1>new heading</h1>
 !! end
 
 ## PHP emits broken html for this, and since this is primarily
@@ -22015,7 +22496,7 @@ Properly encapsulate empty-content transclusions in fosterable positions
 }}
 </table>
 !! html/parsoid
-<table about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":["&lt;table>\n",{"template":{"target":{"wt":"#if:","function":"#if"},"params":{"1":{"wt":"\n&lt;td>foo&lt;/td>\n"}},"i":0}},"\n&lt;/table>"]}' data-parsoid='{"stx":"html","pi":[[{"k":"1","spc":["","","",""]}]],"src":"&lt;table>\n{{#if:|\n&lt;td>foo&lt;/td>\n}}\n&lt;/table>"}'>
+<table about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":["&lt;table>\n",{"template":{"target":{"wt":"#if:","function":"#if"},"params":{"1":{"wt":"\n&lt;td>foo&lt;/td>\n"}},"i":0}},"\n&lt;/table>"]}' data-parsoid='{"stx":"html","pi":[[{"k":"1","spc":["","","",""]}]]}'>
 
 </table>
 !! end
@@ -22024,10 +22505,10 @@ Properly encapsulate empty-content transclusions in fosterable positions
 Support <object> element with .data attribute
 !!options
 parsoid=html2wt
-!! wikitext
-<object data="test.swf"></object>
 !! html
 <object data="test.swf"></object>
+!! wikitext
+<object data="test.swf"></object>
 !!end
 
 !! test
@@ -22053,10 +22534,10 @@ Don't block XML namespace declaration
 Serialize interwiki links pointing to the current wiki as plain wiki links (bug 65869)
 !! options
 parsoid=html2wt
-!! wikitext
-[[Foo]]
 !! html
 <p><a rel="mw:ExtLink" href="http://mi.wikipedia.org/wiki/Foo">Foo</a></p>
+!! wikitext
+[[Foo]]
 !! end
 
 !! test
@@ -22103,6 +22584,21 @@ parsoid=html2wt
 [[Category:Toxine bactérienne]]
 !! end
 
+!! test
+New sol transparent links don't need indent-pre nowiki protection
+!! options
+parsoid=html2wt
+language=de
+!! html
+         <link rel="mw:PageProp/redirect" href="./Main_Page">
+<!-- this is good  -->    <link rel="mw:PageProp/Category" href="./Category:Good" />
+<!-- this is great -->    <link rel="mw:PageProp/Category" href="./Kategorie:Great" />
+!! wikitext
+         #WEITERLEITUNG [[Main Page]]
+<!-- this is good  -->    [[Category:Good]]
+<!-- this is great -->    [[Kategorie:Great]]
+!! end
+
 !! test
 New interlanguage links (href variations)
 !! options
@@ -22259,10 +22755,10 @@ parsoid
 #!! options
 #parsoid=html2wt
 #language=ar
-#!! wikitext
-#[[Imagen:Foobar.jpg|derecha|miniaturadeimagen]]
 #!! html
 #<figure class="mw-default-size mw-halign-right" typeof="mw:Image/Thumb"><a href="Imagen:Foobar.jpg"><img resource="./Imagen:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="20" width="180"/></a></figure>
+#!! wikitext
+#[[Imagen:Foobar.jpg|derecha|miniaturadeimagen]]
 #!! end
 
 !! test
@@ -22359,28 +22855,41 @@ parsoid=html2wt
 Lists: Serialize correctly even when list content is wrapped in p-tags (like VE does)
 !! options
 parsoid=html2wt
-!! wikitext
-* foo
 !! html
 <ul>
 <li><p>foo</p></li>
 </ul>
+!! wikitext
+* foo
 !! end
 
 !! test
 Lists: Serialize correctly even when list tags has unneeded whitespace between tags
 !! options
 parsoid=html2wt
-!! wikitext
-* foo
 !! html
 <ul> <li>foo</li></ul>
+!! wikitext
+* foo
 !! end
 
 !! test
 Don't strip leading whitespace when handling indent-pre suppressing tags
 !! options
 parsoid=html2wt
+!! html
+<table>
+  <tr><td> indented row</td></tr>
+</table>
+<blockquote><p>
+ <b>This is very bold of you!</b>
+</p>
+<table><tr><td>
+ indented cell (no pre-wrapping!)
+</td></tr></table>
+</blockquote>
+<p>foo</p>
+ <div>bar</div>
 !! wikitext
 {|
   | indented row
@@ -22395,19 +22904,6 @@ parsoid=html2wt
 </blockquote>
 foo
  <div>bar</div>
-!! html
-<table>
-  <tr><td> indented row</td></tr>
-</table>
-<blockquote><p>
- <b>This is very bold of you!</b>
-</p>
-<table><tr><td>
- indented cell (no pre-wrapping!)
-</td></tr></table>
-</blockquote>
-<p>foo</p>
- <div>bar</div>
 !! end
 
 !! test
@@ -22446,33 +22942,38 @@ foo
 Lists: Add space after bullets
 !! options
 parsoid=html2wt
-!! wikitext
-* foo
-* bar
-* <span> baz</span>
 !! html
 <ul>
 <li>foo</li>
 <li> bar</li>
 <li><span> baz</span></li>
 </ul>
+!! wikitext
+* foo
+* bar
+* <span> baz</span>
 !! end
 
 !! test
 Lists: Dont insert newlines in a serialized list item.
 !! options
 parsoid=html2wt
+!! html
+<ul><li>a<br>b</li><li>c</li></ul>
 !! wikitext
 * a<br>b
 * c
-!! html
-<ul><li>a<br>b</li><li>c</li></ul>
 !! end
 
 !! test
 Headings: Add space before/after == (Bug 51744)
 !! options
 parsoid=html2wt
+!! html
+<h2>foo</h2>
+<h2> bar</h2>
+<h2>baz </h2>
+<h2><span> baz</span></h2>
 !! wikitext
 == foo ==
 
@@ -22481,25 +22982,32 @@ parsoid=html2wt
 == baz ==
 
 == <span> baz</span> ==
-!! html
-<h2>foo</h2>
-<h2> bar</h2>
-<h2>baz </h2>
-<h2><span> baz</span></h2>
 !! end
 
 !! test
-Parsoid: Serialize positional parameters with = in them as named parameter
+Headings: Force metas to serialize before/after
 !! options
 parsoid=html2wt
+!! html
+<h2>hello there<link href="Category:A1" rel="mw:PageProp/Category" /></h2>
+<h2><link href="Category:A2" rel="mw:PageProp/Category" />hi pal</h2>
+
+<h2><!--foo-->  <link href="Category:A3" rel="mw:PageProp/Category" />   how goes it</h2>
 !! wikitext
-{{echo|1 = f=oo}}
+== hello there ==
+[[Category:A1]]
 
-{{echo|1 = f=oo|2 = bar}}
+[[Category:A2]]
+== hi pal ==
 
-<!--Orig params with data-parsoid has heuristics for handling = chars-->
-<!--FIXME: But maybe the heuristic needs fixing to apply to new params as well-->
-{{echo|<nowiki>f=oo</nowiki>|bar}}
+<!--foo-->  [[Category:A3]]
+== how goes it ==
+!! end
+
+!! test
+Parsoid: Serialize positional parameters with = in them as named parameter
+!! options
+parsoid=html2wt
 !! html
 <p about="#mwt1" typeof="mw:Transclusion"
 data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"f=oo"}},"i":0}}]}'>foo</p>
@@ -22510,12 +23018,37 @@ data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},
 <!--Orig params with data-parsoid has heuristics for handling = chars-->
 <!--FIXME: But maybe the heuristic needs fixing to apply to new params as well-->
 <p data-parsoid='{"pi":[[{"k":"1","spc":["","","",""]},{"k":"2","spc":["","","",""]}]]}' about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"f=oo"},"2":{"wt":"bar"}},"i":0}}]}'>foo</p>
+!! wikitext
+{{echo|1 = f=oo}}
+
+{{echo|1 = f=oo|2 = bar}}
+
+<!--Orig params with data-parsoid has heuristics for handling = chars-->
+<!--FIXME: But maybe the heuristic needs fixing to apply to new params as well-->
+{{echo|<nowiki>f=oo</nowiki>|bar}}
+!! end
+
+!! test
+Parsoid: Serialize positional parameters with = in extlink as named parameter
+!! options
+parsoid=html2wt
+!! html
+<p><a rel="mw:ExtLink" href="http://stuff?is=ok" about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"http://stuff?is=ok"}},"i":0}}]}'>http://stuff?is=ok</a></p>
+!! wikitext
+{{echo|1 = http://stuff?is=ok}}
 !! end
 
 !! test
 Parsoid: Correctly serialize block-node children when they are a combination of text and p-nodes
 !! options
 parsoid=html2wt
+!! html
+<div>a<p>b</p></div>
+<div>a
+<p>b</p></div>
+<div>
+a
+<p>b</p></div>
 !! wikitext
 <div>a
 b
 
 b
 </div>
-!! html
-<div>a<p>b</p></div>
-<div>a
-<p>b</p></div>
-<div>
-a
-<p>b</p></div>
 !! end
 
 !! test
 Substrings resembling wikitext in hrefs should not get nowiki escapes
 !! options
 parsoid=html2wt
-!! wikitext
-[[Foo''bar''baz]]
 !! html
 <a rel="mw:WikiLink" href="./Foo''bar''baz">Foo''bar''baz</a>
+!! wikitext
+[[Foo''bar''baz]]
 !! end
 
 #-----------------------------
@@ -22555,6 +23081,15 @@ parsoid=html2wt
 1. I/B quote minimization: wikitext-only tags should be combined
 !! options
 parsoid=html2wt
+!! html
+<p><i>A</i><i>B</i></p>
+<p><b>A</b><b>B</b></p>
+<p><i>A</i><b><i>B</i></b></p>
+<p><b>A</b><i><b>B</b></i></p>
+<p><b>A</b><i><b>B</b><b>C</b></i><b>D</b></p>
+<p><i><b>A</b></i><i><b>B</b></i></p>
+<p><i><b>A</b></i><b><i>B</i></b></p>
+<p><b><i>A</i></b><i><b>B</b></i></p>
 !! wikitext
 ''AB''
 
@@ -22571,57 +23106,48 @@ parsoid=html2wt
 '''''AB'''''
 
 '''''AB'''''
-!! html
-<p><i>A</i><i>B</i></p>
-<p><b>A</b><b>B</b></p>
-<p><i>A</i><b><i>B</i></b></p>
-<p><b>A</b><i><b>B</b></i></p>
-<p><b>A</b><i><b>B</b><b>C</b></i><b>D</b></p>
-<p><i><b>A</b></i><i><b>B</b></i></p>
-<p><i><b>A</b></i><b><i>B</i></b></p>
-<p><b><i>A</i></b><i><b>B</b></i></p>
 !! end
 
 !! test
 2. I/B quote minimization: wikitext and html tags should not be combined
 !! options
 parsoid=html2wt
+!! html
+<p><i>A</i><i data-parsoid='{"stx":"html"}'>B</i></p>
+<p><i>A</i><b><i data-parsoid='{"stx":"html"}'>B</i></b></p>
 !! wikitext
 ''A''<i>B</i>
 
 ''A''<nowiki/>'''<i>B</i>'''
-!! html
-<p><i>A</i><i data-parsoid='{"stx":"html"}'>B</i></p>
-<p><i>A</i><b><i data-parsoid='{"stx":"html"}'>B</i></b></p>
 !! end
 
 !! test
 3. I/B quote minimization: templated content stops minimization
 !! options
 parsoid=html2wt
+!! html
+<p><i>A</i><i about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"&#39;&#39;B&#39;&#39;"}},"i":0}}]}'>B</i>
+<p><i>A</i><b about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"&#39;&#39;&#39;&#39;&#39;B&#39;&#39;&#39;&#39;&#39;"}},"i":0}}]}'><i>B</i></b>
 !! wikitext
 ''A''{{echo|''B''}}
 
 ''A''{{echo|'''''B'''''}}
-!! html
-<p><i>A</i><i about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"&#39;&#39;B&#39;&#39;"}},"i":0}}]}'>B</i>
-<p><i>A</i><b about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"&#39;&#39;&#39;&#39;&#39;B&#39;&#39;&#39;&#39;&#39;"}},"i":0}}]}'><i>B</i></b>
 !! end
 
 !! test
 4. I/B quote minimization: new content should be mimimized with adjacent old content
 !! options
 parsoid=html2wt
+!! html
+<p><i>A</i><i>B</i></p>
+<p><b>A</b><b>B</b></p>
+<p><i>A</i><b><i>B</i></b></p>
 !! wikitext
 ''AB''
 
 '''AB'''
 
 ''A'''B'''''
-!! html
-<p><i>A</i><i>B</i></p>
-<p><b>A</b><b>B</b></p>
-<p><i>A</i><b><i>B</i></b></p>
 !! end
 
 !! test
@@ -22675,16 +23201,6 @@ parsoid=html2wt
 Magic words
 !! options
 parsoid=html2wt
-!! wikitext
-__TOC__
-__NOTOC__
-__FORCETOC__
-__INDEX__
-__NOINDEX__
-__NOGALLERY__
-__NOEDITSECTION__
-__NOTITLECONVERT__
-__NOCONTENTCONVERT__
 !! html
 <meta property='mw:PageProp/toc' />
 <meta property='mw:PageProp/notoc' />
@@ -22696,12 +23212,34 @@ __NOCONTENTCONVERT__
 <meta property='mw:PageProp/notitleconvert' />
 <meta property='mw:PageProp/nocontentconvert' />
 <meta property='mw:PageProp/unknownproperty' />
+!! wikitext
+__TOC__
+__NOTOC__
+__FORCETOC__
+__INDEX__
+__NOINDEX__
+__NOGALLERY__
+__NOEDITSECTION__
+__NOTITLECONVERT__
+__NOCONTENTCONVERT__
 !! end
 
 !! test
 Consecutive <pre>s should not get merged
 !! options
 parsoid=html2wt,html2html
+!! html
+<pre>a</pre><pre>b</pre>
+
+<pre>c
+</pre><pre>
+d</pre>
+
+<pre>e
+
+</pre><pre>
+
+f</pre>
 !! wikitext
  a
 
@@ -22716,68 +23254,106 @@ parsoid=html2wt,html2html
 
  
  f
-!! html
-<pre>a</pre><pre>b</pre>
-
-<pre>c
-</pre><pre>
-d</pre>
-
-<pre>e
-
-</pre><pre>
-
-f</pre>
 !! end
 
 !! test
 Edited ISBN links not serializable as ISBN links should serialize as wikilinks
 !! options
 parsoid=html2wt
-!! wikitext
-[[Special:BookSources/1234567890|ISBN 1234567895]]
 !! html
 <a rel="mw:ExtLink" href="./Special:BookSources/1234567890">ISBN 1234567895</a>
+!! wikitext
+[[Special:BookSources/1234567890|ISBN 1234567895]]
 !! end
 
 !! test
 Edited RFC links not serializable as RFC links should serialize as extlinks
 !! options
 parsoid=html2wt
-!! wikitext
-[//tools.ietf.org/html/rfc123 New RFC]
 !! html
 <a href="//tools.ietf.org/html/rfc123" rel="mw:ExtLink">New RFC</a>
+!! wikitext
+[//tools.ietf.org/html/rfc123 New RFC]
 !! end
 
 !! test
 Edited PMID links not serializable as PMID links should serialize as extlinks
 !! options
 parsoid=html2wt
-!! wikitext
-[//www.ncbi.nlm.nih.gov/pubmed/123?dopt=Abstract New PMID]
 !! html
 <a href="//www.ncbi.nlm.nih.gov/pubmed/123?dopt=Abstract" rel="mw:ExtLink">New PMID</a>
+!! wikitext
+[//www.ncbi.nlm.nih.gov/pubmed/123?dopt=Abstract New PMID]
+!! end
+
+!! test
+WTS of autolinks with trailing/surrounding context
+!! options
+parsoid=html2wt
+!! html/parsoid
+<p><a href="http://cscott.net">http://cscott.net</a><b>foo</b></p>
+<p><a href="http://cscott.net">http://cscott.net</a><b data-parsoid='{"stx":"html"}'>foo</b></p>
+<p><b><a href="http://cscott.net">http://cscott.net</a></b></p>
+<p><b><a href="http://cscott.net">http://cscott.net</a> </b></p>
+<p><b><a href="http://cscott.net">http://cscott.net</a>x</b></p>
+<p><a href="http://cscott.net">http://cscott.net</a>x</p>
+!! wikitext
+http://cscott.net<nowiki/>'''foo'''
+
+http://cscott.net<b>foo</b>
+
+'''http://cscott.net<nowiki/>'''
+
+'''http://cscott.net '''
+
+'''http://cscott.net<nowiki/>x'''
+
+http://cscott.net<nowiki/>x
+!! end
+
+!! test
+WTS of autolinks with nowikis (round-trip)
+!! wikitext
+x<nowiki/>http://cscott.net<nowiki/>x
+!! html/parsoid
+<p>x<a rel="mw:ExtLink" href="http://cscott.net">http://cscott.net</a>x</p>
+!! end
+
+# this is the "easy" test because it leaves in place all the
+# data-parsoid information indicating this is an autolink
+!! test
+WTS of autolinks with escapes (editing)
+!! options
+parsoid={
+  "modes": ["wt2wt"],
+  "changes": [
+    [ "meta", "remove" ]
+  ]
+}
+!! wikitext
+x<nowiki/>http://cscott.net<nowiki/>x
+!! wikitext/edited
+x<nowiki/>http://cscott.net<nowiki/>x
 !! end
 
 !! test
 Edited Redirect link should emit a non-piped wikitext link
 !! options
 parsoid=html2wt
+!! html
+<link rel="mw:PageProp/redirect" href="Bar" data-parsoid='{"a":{"href":"./Foo"},"sa":{"href":"Foo"}}'>
 !! wikitext
 #REDIRECT [[Bar]]
-!! html
-<link rel="mw:PageProp/redirect" href="Bar" data-parsoid='{"src":"#REDIRECT ","a":{"href":"./Foo"},"sa":{"href":"Foo"}}'>
 !! end
 
 !! test
 T75121: Infer extension name from typeOf if data-mw is not present
 !! options
 parsoid=html2wt
-!! wikitext
-<foo />
 !! html
 <div typeOf="mw:Extension/foo"></div>
+!! wikitext
+<foo />
 !! end
 
 # -----------------------------------------------------------------
index 7e07823..e49c391 100644 (file)
@@ -117,34 +117,22 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                        $this->checkDbIsSupported();
 
                        if ( !self::$dbSetup ) {
-                               wfProfileIn( $logName . ' (clone-db)' );
-
                                // switch to a temporary clone of the database
                                self::setupTestDB( $this->db, $this->dbPrefix() );
 
                                if ( ( $this->db->getType() == 'oracle' || !self::$useTemporaryTables ) && self::$reuseDB ) {
                                        $this->resetDB();
                                }
-
-                               wfProfileOut( $logName . ' (clone-db)' );
                        }
-
-                       wfProfileIn( $logName . ' (prepare-db)' );
                        $this->addCoreDBData();
                        $this->addDBData();
-                       wfProfileOut( $logName . ' (prepare-db)' );
-
                        $needsResetDB = true;
                }
 
-               wfProfileIn( $logName );
                parent::run( $result );
-               wfProfileOut( $logName );
 
                if ( $needsResetDB ) {
-                       wfProfileIn( $logName . ' (reset-db)' );
                        $this->resetDB();
-                       wfProfileOut( $logName . ' (reset-db)' );
                }
        }
 
@@ -226,8 +214,11 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
 
        }
 
-       protected function tearDown() {
+       protected function addTmpFiles( $files ) {
+               $this->tmpFiles = array_merge( $this->tmpFiles, (array)$files );
+       }
 
+       protected function tearDown() {
                $this->called['tearDown'] = true;
                // Cleaning up temporary files
                foreach ( $this->tmpFiles as $fileName ) {
index 121aade..a5c8ef6 100644 (file)
@@ -15,14 +15,7 @@ EOF;
 }
 
 class MediaWikiPHPUnitBootstrap {
-
-       public function __construct() {
-               wfProfileIn( __CLASS__ );
-       }
-
        public function __destruct() {
-               wfProfileOut( __CLASS__ );
-
                // Return to real wiki db, so profiling data is preserved
                MediaWikiTestCase::teardownTestDB();
 
diff --git a/tests/phpunit/data/normal/UTF-8-test.txt b/tests/phpunit/data/normal/UTF-8-test.txt
new file mode 100644 (file)
index 0000000..abd16f7
Binary files /dev/null and b/tests/phpunit/data/normal/UTF-8-test.txt differ
index 2bfabe4..331fb3b 100644 (file)
@@ -7,7 +7,7 @@ class GlobalTest extends MediaWikiTestCase {
        protected function setUp() {
                parent::setUp();
 
-               $readOnlyFile = tempnam( wfTempDir(), "mwtest_readonly" );
+               $readOnlyFile = $this->getNewTempFile();
                unlink( $readOnlyFile );
 
                $this->setMwGlobals( array(
@@ -22,16 +22,6 @@ class GlobalTest extends MediaWikiTestCase {
                ) );
        }
 
-       protected function tearDown() {
-               global $wgReadOnlyFile;
-
-               if ( file_exists( $wgReadOnlyFile ) ) {
-                       unlink( $wgReadOnlyFile );
-               }
-
-               parent::tearDown();
-       }
-
        /**
         * @dataProvider provideForWfArrayDiff2
         * @covers ::wfArrayDiff2
@@ -312,46 +302,42 @@ class GlobalTest extends MediaWikiTestCase {
         * @covers ::wfDebugMem
         */
        public function testDebugFunctionTest() {
+               $debugLogFile = $this->getNewTempFile();
 
-               global $wgDebugLogFile, $wgDebugTimestamps;
-
-               $old_log_file = $wgDebugLogFile;
-               $wgDebugLogFile = tempnam( wfTempDir(), 'mw-' );
-               # @todo FIXME: $wgDebugTimestamps should be tested
-               $old_wgDebugTimestamps = $wgDebugTimestamps;
-               $wgDebugTimestamps = false;
+               $this->setMwGlobals( array(
+                       'wgDebugLogFile' => $debugLogFile,
+                       # @todo FIXME: $wgDebugTimestamps should be tested
+                       'wgDebugTimestamps' => false
+               ) );
 
                wfDebug( "This is a normal string" );
-               $this->assertEquals( "This is a normal string\n", file_get_contents( $wgDebugLogFile ) );
-               unlink( $wgDebugLogFile );
+               $this->assertEquals( "This is a normal string\n", file_get_contents( $debugLogFile ) );
+               unlink( $debugLogFile );
 
                wfDebug( "This is nöt an ASCII string" );
-               $this->assertEquals( "This is nöt an ASCII string\n", file_get_contents( $wgDebugLogFile ) );
-               unlink( $wgDebugLogFile );
+               $this->assertEquals( "This is nöt an ASCII string\n", file_get_contents( $debugLogFile ) );
+               unlink( $debugLogFile );
 
                wfDebug( "\00305This has böth UTF and control chars\003" );
                $this->assertEquals(
                        " 05This has böth UTF and control chars \n",
-                       file_get_contents( $wgDebugLogFile )
+                       file_get_contents( $debugLogFile )
                );
-               unlink( $wgDebugLogFile );
+               unlink( $debugLogFile );
 
                wfDebugMem();
                $this->assertGreaterThan(
                        1000,
-                       preg_replace( '/\D/', '', file_get_contents( $wgDebugLogFile ) )
+                       preg_replace( '/\D/', '', file_get_contents( $debugLogFile ) )
                );
-               unlink( $wgDebugLogFile );
+               unlink( $debugLogFile );
 
                wfDebugMem( true );
                $this->assertGreaterThan(
                        1000000,
-                       preg_replace( '/\D/', '', file_get_contents( $wgDebugLogFile ) )
+                       preg_replace( '/\D/', '', file_get_contents( $debugLogFile ) )
                );
-               unlink( $wgDebugLogFile );
-
-               $wgDebugLogFile = $old_log_file;
-               $wgDebugTimestamps = $old_wgDebugTimestamps;
+               unlink( $debugLogFile );
        }
 
        /**
diff --git a/tests/phpunit/includes/GlobalFunctions/wfThumbIsStandardTest.php b/tests/phpunit/includes/GlobalFunctions/wfThumbIsStandardTest.php
new file mode 100644 (file)
index 0000000..448250a
--- /dev/null
@@ -0,0 +1,104 @@
+<?php
+
+/**
+ * @group GlobalFunctions
+ * @covers ::wfThumbIsStandard
+ */
+class WfThumbIsStandardTest extends MediaWikiTestCase {
+
+       protected function setUp() {
+               parent::setUp();
+
+               $this->setMwGlobals( array(
+                       'wgThumbLimits' => array(
+                               100,
+                               401
+                       ),
+                       'wgImageLimits' => array(
+                               array( 300, 225 ),
+                               array( 800, 600 ),
+                       ),
+                       'wgMediaHandlers' => array(
+                               'unknown/unknown' => 'MockBitmapHandler',
+                       ),
+               ) );
+       }
+
+       public static function provideThumbParams() {
+               return array(
+                       // Thumb limits
+                       array(
+                               'Standard thumb width',
+                               true,
+                               array( 'width' => 100 ),
+                       ),
+                       array(
+                               'Standard thumb width',
+                               true,
+                               array( 'width' => 401 ),
+                       ),
+                       // wfThumbIsStandard should match Linker::processResponsiveImages
+                       // in its rounding behaviour.
+                       array(
+                               'Standard thumb width (HiDPI 1.5x) - incorrect rounding',
+                               false,
+                               array( 'width' => 601 ),
+                       ),
+                       array(
+                               'Standard thumb width (HiDPI 1.5x)',
+                               true,
+                               array( 'width' => 602 ),
+                       ),
+                       array(
+                               'Standard thumb width (HiDPI 2x)',
+                               true,
+                               array( 'width' => 802 ),
+                       ),
+                       array(
+                               'Non-standard thumb width',
+                               false,
+                               array( 'width' => 300 ),
+                       ),
+                       // Image limits
+                       // Note: Image limits are measured as pairs. Individual values
+                       // may be non-standard based on the aspect ratio.
+                       array(
+                               'Standard image width/height pair',
+                               true,
+                               array( 'width' => 250, 'height' => 225 ),
+                       ),
+                       array(
+                               'Standard image width/height pair',
+                               true,
+                               array( 'width' => 667, 'height' => 600 ),
+                       ),
+                       array(
+                               'Standard image width where image does not fit aspect ratio',
+                               false,
+                               array( 'width' => 300 ),
+                       ),
+                       array(
+                               'Implicit width from image width/height pair aspect ratio fit',
+                               true,
+                               // 2000x1800 fit inside 300x225 makes w=250
+                               array( 'width' => 250 ),
+                       ),
+                       array(
+                               'Height-only is always non-standard',
+                               false,
+                               array( 'height' => 225 ),
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider provideThumbParams
+        */
+       public function testIsStandard( $message, $expected, $params ) {
+               $this->assertSame(
+                       $expected,
+                       wfThumbIsStandard( new FakeDimensionFile( array( 2000, 1800 ) ), $params ),
+                       $message
+               );
+       }
+}
index 6341bf0..823c933 100644 (file)
@@ -231,6 +231,11 @@ class LinkerTest extends MediaWikiLangTestCase {
                                'foo bar [[Special:BlankPage]]',
                                null,
                        ),
+                       array(
+                               '<a class="external" rel="nofollow" href="//en.example.org/w/Foo%27bar">Foo\'bar</a>',
+                               "[[Foo'bar]]",
+                               'enwiki',
+                       ),
                        array(
                                'foo bar <a class="external" rel="nofollow" href="//en.example.org/w/Special:BlankPage">Special:BlankPage</a>',
                                'foo bar [[Special:BlankPage]]',
index 027b877..9501e45 100644 (file)
@@ -1,5 +1,8 @@
 <?php
 
+/**
+ * @group Database
+ */
 class MovePageTest extends MediaWikiTestCase {
 
        /**
@@ -36,4 +39,25 @@ class MovePageTest extends MediaWikiTestCase {
                        array( 'File:Test.jpg', 'Page', 'imagenocrossnamespace' ),
                );
        }
+
+       /**
+        * Integration test to catch regressions like T74870. Taken and modified
+        * from SemanticMediaWiki
+        */
+       public function testTitleMoveCompleteIntegrationTest() {
+               $oldTitle = Title::newFromText( 'Help:Some title' );
+               WikiPage::factory( $oldTitle )->doEditContent( new WikitextContent( 'foo' ), 'bar' );
+               $newTitle = Title::newFromText( 'Help:Some other title' );
+               $this->assertNull(
+                       WikiPage::factory( $newTitle )->getRevision()
+               );
+
+               $this->assertTrue( $oldTitle->moveTo( $newTitle, false, 'test1', true ) );
+               $this->assertNotNull(
+                       WikiPage::factory( $oldTitle )->getRevision()
+               );
+               $this->assertNotNull(
+                       WikiPage::factory( $newTitle)->getRevision()
+               );
+       }
 }
index 628c59b..c013f4f 100644 (file)
@@ -56,6 +56,17 @@ class StatusTest extends MediaWikiLangTestCase {
                $this->assertEquals( $message, $status->getMessage()->getKey() );
        }
 
+       /**
+        *
+        */
+       public function testOkAndErrors() {
+               $status = Status::newGood( 'foo' );
+               $this->assertTrue( $status->ok );
+               $status = Status::newFatal( 'foo', 1, 2 );
+               $this->assertFalse( $status->ok );
+               $this->assertArrayEquals( array( array( 'type' => 'error', 'message' => 'foo', 'params' => array( 1, 2 ) ) ), $status->errors );
+       }
+
        /**
         * @dataProvider provideSetResult
         * @covers Status::setResult
@@ -109,7 +120,9 @@ class StatusTest extends MediaWikiLangTestCase {
        public function testIsGood( $ok, $errors, $expected ) {
                $status = new Status();
                $status->ok = $ok;
-               $status->errors = $errors;
+               foreach ( $errors as $error ) {
+                       $status->warning( $error );
+               }
                $this->assertEquals( $expected, $status->isGood() );
        }
 
diff --git a/tests/phpunit/includes/TemplateParserTest.php b/tests/phpunit/includes/TemplateParserTest.php
new file mode 100644 (file)
index 0000000..ccfccd1
--- /dev/null
@@ -0,0 +1,30 @@
+<?php
+
+/**
+ * @group Templates
+ */
+class TemplateParserTest extends MediaWikiTestCase {
+       /**
+        * @covers TemplateParser::compile
+        */
+       public function testTemplateCompilation() {
+               $this->assertRegExp(
+                       '/^<\?php return function/',
+                       TemplateParser::compile( "test" ),
+                       'compile a simple mustache template'
+               );
+       }
+
+       /**
+        * @covers TemplateParser::compile
+        */
+       public function testTemplateCompilationWithVariable() {
+               $this->assertRegExp(
+                       '/return \'\'\.htmlentities\(\(string\)\(\(isset\(\$in\[\'value\'\]\) && '
+                               . 'is_array\(\$in\)\) \? \$in\[\'value\'\] : null\), ENT_QUOTES, '
+                               . '\'UTF-8\'\)\.\'\';/',
+                       TemplateParser::compile( "{{value}}" ),
+                       'compile a mustache template with an escaped variable'
+               );
+       }
+}
index 6af1862..022c7d5 100644 (file)
@@ -326,6 +326,10 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                        $this->setUserPerm( null );
                        $this->assertEquals( $check[$action][0],
                                $this->title->getUserPermissionsErrors( $action, $this->user, true ) );
+                       $this->assertEquals( $check[$action][0],
+                               $this->title->getUserPermissionsErrors( $action, $this->user, 'full' ) );
+                       $this->assertEquals( $check[$action][0],
+                               $this->title->getUserPermissionsErrors( $action, $this->user, 'secure' ) );
 
                        global $wgGroupPermissions;
                        $old = $wgGroupPermissions;
@@ -333,11 +337,19 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
 
                        $this->assertEquals( $check[$action][1],
                                $this->title->getUserPermissionsErrors( $action, $this->user, true ) );
+                       $this->assertEquals( $check[$action][1],
+                               $this->title->getUserPermissionsErrors( $action, $this->user, 'full' ) );
+                       $this->assertEquals( $check[$action][1],
+                               $this->title->getUserPermissionsErrors( $action, $this->user, 'secure' ) );
                        $wgGroupPermissions = $old;
 
                        $this->setUserPerm( $action );
                        $this->assertEquals( $check[$action][2],
                                $this->title->getUserPermissionsErrors( $action, $this->user, true ) );
+                       $this->assertEquals( $check[$action][2],
+                               $this->title->getUserPermissionsErrors( $action, $this->user, 'full' ) );
+                       $this->assertEquals( $check[$action][2],
+                               $this->title->getUserPermissionsErrors( $action, $this->user, 'secure' ) );
 
                        $this->setUserPerm( $action );
                        $this->assertEquals( $check[$action][3],
index 7e51339..d4d9651 100644 (file)
@@ -21,12 +21,6 @@ abstract class ApiTestCaseUpload extends ApiTestCase {
                $this->clearFakeUploads();
        }
 
-       protected function tearDown() {
-               $this->clearTempUpload();
-
-               parent::tearDown();
-       }
-
        /**
         * Helper function -- remove files and associated articles by Title
         *
@@ -105,7 +99,7 @@ abstract class ApiTestCaseUpload extends ApiTestCase {
         * @return bool
         */
        function fakeUploadFile( $fieldName, $fileName, $type, $filePath ) {
-               $tmpName = tempnam( wfTempDir(), "" );
+               $tmpName = $this->getNewTempFile();
                if ( !file_exists( $filePath ) ) {
                        throw new Exception( "$filePath doesn't exist!" );
                }
@@ -132,7 +126,7 @@ abstract class ApiTestCaseUpload extends ApiTestCase {
        }
 
        function fakeUploadChunk( $fieldName, $fileName, $type, & $chunkData ) {
-               $tmpName = tempnam( wfTempDir(), "" );
+               $tmpName = $this->getNewTempFile();
                // copy the chunk data to temp location:
                if ( !file_put_contents( $tmpName, $chunkData ) ) {
                        throw new Exception( "couldn't copy chunk data to $tmpName" );
@@ -153,15 +147,6 @@ abstract class ApiTestCaseUpload extends ApiTestCase {
                );
        }
 
-       function clearTempUpload() {
-               if ( isset( $_FILES['file']['tmp_name'] ) ) {
-                       $tmp = $_FILES['file']['tmp_name'];
-                       if ( file_exists( $tmp ) ) {
-                               unlink( $tmp );
-                       }
-               }
-       }
-
        /**
         * Remove traces of previous fake uploads
         */
index 7fdefb6..b4b1bf3 100644 (file)
@@ -103,7 +103,7 @@ class ApiUploadTest extends ApiTestCaseUpload {
 
                try {
                        $randomImageGenerator = new RandomImageGenerator();
-                       $filePaths = $randomImageGenerator->writeImages( 1, $extension, wfTempDir() );
+                       $filePaths = $randomImageGenerator->writeImages( 1, $extension, $this->getNewTempDirectory() );
                } catch ( Exception $e ) {
                        $this->markTestIncomplete( $e->getMessage() );
                }
@@ -143,7 +143,6 @@ class ApiUploadTest extends ApiTestCaseUpload {
 
                // clean up
                $this->deleteFileByFilename( $fileName );
-               unlink( $filePath );
        }
 
        /**
@@ -152,7 +151,7 @@ class ApiUploadTest extends ApiTestCaseUpload {
        public function testUploadZeroLength( $session ) {
                $mimeType = 'image/png';
 
-               $filePath = tempnam( wfTempDir(), "" );
+               $filePath = $this->getNewTempFile();
                $fileName = "apiTestUploadZeroLength.png";
 
                $this->deleteFileByFileName( $fileName );
@@ -180,7 +179,6 @@ class ApiUploadTest extends ApiTestCaseUpload {
 
                // clean up
                $this->deleteFileByFilename( $fileName );
-               unlink( $filePath );
        }
 
        /**
@@ -192,7 +190,7 @@ class ApiUploadTest extends ApiTestCaseUpload {
 
                try {
                        $randomImageGenerator = new RandomImageGenerator();
-                       $filePaths = $randomImageGenerator->writeImages( 2, $extension, wfTempDir() );
+                       $filePaths = $randomImageGenerator->writeImages( 2, $extension, $this->getNewTempDirectory() );
                } catch ( Exception $e ) {
                        $this->markTestIncomplete( $e->getMessage() );
                }
@@ -251,8 +249,6 @@ class ApiUploadTest extends ApiTestCaseUpload {
 
                // clean up
                $this->deleteFileByFilename( $fileName );
-               unlink( $filePaths[0] );
-               unlink( $filePaths[1] );
        }
 
        /**
@@ -264,7 +260,7 @@ class ApiUploadTest extends ApiTestCaseUpload {
 
                try {
                        $randomImageGenerator = new RandomImageGenerator();
-                       $filePaths = $randomImageGenerator->writeImages( 1, $extension, wfTempDir() );
+                       $filePaths = $randomImageGenerator->writeImages( 1, $extension, $this->getNewTempDirectory() );
                } catch ( Exception $e ) {
                        $this->markTestIncomplete( $e->getMessage() );
                }
@@ -333,7 +329,6 @@ class ApiUploadTest extends ApiTestCaseUpload {
                // clean up
                $this->deleteFileByFilename( $fileNames[0] );
                $this->deleteFileByFilename( $fileNames[1] );
-               unlink( $filePaths[0] );
        }
 
        /**
@@ -349,7 +344,7 @@ class ApiUploadTest extends ApiTestCaseUpload {
 
                try {
                        $randomImageGenerator = new RandomImageGenerator();
-                       $filePaths = $randomImageGenerator->writeImages( 1, $extension, wfTempDir() );
+                       $filePaths = $randomImageGenerator->writeImages( 1, $extension, $this->getNewTempDirectory() );
                } catch ( Exception $e ) {
                        $this->markTestIncomplete( $e->getMessage() );
                }
@@ -417,7 +412,6 @@ class ApiUploadTest extends ApiTestCaseUpload {
 
                // clean up
                $this->deleteFileByFilename( $fileName );
-               unlink( $filePath );
        }
 
        /**
@@ -431,16 +425,14 @@ class ApiUploadTest extends ApiTestCaseUpload {
 
                $chunkSize = 1048576;
                // Download a large image file
-               // ( using RandomImageGenerator for large files is not stable )
+               // (using RandomImageGenerator for large files is not stable)
+               // @todo Don't download files from wikimedia.org
                $mimeType = 'image/jpeg';
                $url = 'http://upload.wikimedia.org/wikipedia/commons/'
                        . 'e/ed/Oberaargletscher_from_Oberaar%2C_2010_07.JPG';
-               $filePath = wfTempDir() . '/Oberaargletscher_from_Oberaar.jpg';
+               $filePath = $this->getNewTempDirectory() . '/Oberaargletscher_from_Oberaar.jpg';
                try {
-                       // Only download if the file is not avaliable in the temp location:
-                       if ( !is_file( $filePath ) ) {
-                               copy( $url, $filePath );
-                       }
+                       copy( $url, $filePath );
                } catch ( Exception $e ) {
                        $this->markTestIncomplete( $e->getMessage() );
                }
@@ -564,7 +556,5 @@ class ApiUploadTest extends ApiTestCaseUpload {
 
                // clean up
                $this->deleteFileByFilename( $fileName );
-               // don't remove downloaded temporary file for fast subquent tests.
-               //unlink( $filePath );
        }
 }
index 9558cc7..b40d2d2 100644 (file)
@@ -13,14 +13,13 @@ class FileBackendTest extends MediaWikiTestCase {
        private $multiBackend;
        /** @var FSFileBackend */
        public $singleBackend;
-       private $filesToPrune = array();
        private static $backendToUse;
 
        protected function setUp() {
                global $wgFileBackends;
                parent::setUp();
                $uniqueId = time() . '-' . mt_rand();
-               $tmpPrefix = wfTempDir() . '/filebackend-unittest-' . $uniqueId;
+               $tmpDir = $this->getNewTempDirectory();
                if ( $this->getCliArg( 'use-filebackend' ) ) {
                        if ( self::$backendToUse ) {
                                $this->singleBackend = self::$backendToUse;
@@ -51,8 +50,8 @@ class FileBackendTest extends MediaWikiTestCase {
                                'lockManager' => LockManagerGroup::singleton()->get( 'fsLockManager' ),
                                'wikiId' => wfWikiID(),
                                'containerPaths' => array(
-                                       'unittest-cont1' => "{$tmpPrefix}-localtesting-cont1",
-                                       'unittest-cont2' => "{$tmpPrefix}-localtesting-cont2" )
+                                       'unittest-cont1' => "{$tmpDir}/localtesting-cont1",
+                                       'unittest-cont2' => "{$tmpDir}/localtesting-cont2" )
                        ) );
                }
                $this->multiBackend = new FileBackendMultiWrite( array(
@@ -65,21 +64,20 @@ class FileBackendTest extends MediaWikiTestCase {
                                        'name' => 'localmultitesting1',
                                        'class' => 'FSFileBackend',
                                        'containerPaths' => array(
-                                               'unittest-cont1' => "{$tmpPrefix}-localtestingmulti1-cont1",
-                                               'unittest-cont2' => "{$tmpPrefix}-localtestingmulti1-cont2" ),
+                                               'unittest-cont1' => "{$tmpDir}/localtestingmulti1-cont1",
+                                               'unittest-cont2' => "{$tmpDir}/localtestingmulti1-cont2" ),
                                        'isMultiMaster' => false
                                ),
                                array(
                                        'name' => 'localmultitesting2',
                                        'class' => 'FSFileBackend',
                                        'containerPaths' => array(
-                                               'unittest-cont1' => "{$tmpPrefix}-localtestingmulti2-cont1",
-                                               'unittest-cont2' => "{$tmpPrefix}-localtestingmulti2-cont2" ),
+                                               'unittest-cont1' => "{$tmpDir}/localtestingmulti2-cont1",
+                                               'unittest-cont2' => "{$tmpDir}/localtestingmulti2-cont2" ),
                                        'isMultiMaster' => true
                                )
                        )
                ) );
-               $this->filesToPrune = array();
        }
 
        private static function baseStorePath() {
@@ -214,7 +212,7 @@ class FileBackendTest extends MediaWikiTestCase {
         * @dataProvider provider_testStore
         */
        public function testStore( $op ) {
-               $this->filesToPrune[] = $op['src'];
+               $this->addTmpFiles( $op['src'] );
 
                $this->backend = $this->singleBackend;
                $this->tearDownFiles();
@@ -224,7 +222,6 @@ class FileBackendTest extends MediaWikiTestCase {
                $this->backend = $this->multiBackend;
                $this->tearDownFiles();
                $this->doTestStore( $op );
-               $this->filesToPrune[] = $op['src']; # avoid file leaking
                $this->tearDownFiles();
        }
 
@@ -275,27 +272,15 @@ class FileBackendTest extends MediaWikiTestCase {
                $tmpName = TempFSFile::factory( "unittests_", 'txt' )->getPath();
                $toPath = self::baseStorePath() . '/unittest-cont1/e/fun/obj1.txt';
                $op = array( 'op' => 'store', 'src' => $tmpName, 'dst' => $toPath );
-               $cases[] = array(
-                       $op, // operation
-                       $tmpName, // source
-                       $toPath, // dest
-               );
+               $cases[] = array( $op );
 
                $op2 = $op;
                $op2['overwrite'] = true;
-               $cases[] = array(
-                       $op2, // operation
-                       $tmpName, // source
-                       $toPath, // dest
-               );
+               $cases[] = array( $op2 );
 
-               $op2 = $op;
-               $op2['overwriteSame'] = true;
-               $cases[] = array(
-                       $op2, // operation
-                       $tmpName, // source
-                       $toPath, // dest
-               );
+               $op3 = $op;
+               $op3['overwriteSame'] = true;
+               $cases[] = array( $op3 );
 
                return $cases;
        }
@@ -948,18 +933,14 @@ class FileBackendTest extends MediaWikiTestCase {
         * @dataProvider provider_testConcatenate
         */
        public function testConcatenate( $op, $srcs, $srcsContent, $alreadyExists, $okStatus ) {
-               $this->filesToPrune[] = $op['dst'];
-
                $this->backend = $this->singleBackend;
                $this->tearDownFiles();
                $this->doTestConcatenate( $op, $srcs, $srcsContent, $alreadyExists, $okStatus );
-               $this->filesToPrune[] = $op['dst']; # avoid file leaking
                $this->tearDownFiles();
 
                $this->backend = $this->multiBackend;
                $this->tearDownFiles();
                $this->doTestConcatenate( $op, $srcs, $srcsContent, $alreadyExists, $okStatus );
-               $this->filesToPrune[] = $op['dst']; # avoid file leaking
                $this->tearDownFiles();
        }
 
@@ -983,7 +964,7 @@ class FileBackendTest extends MediaWikiTestCase {
                $this->assertGoodStatus( $status,
                        "Creation of source files succeeded ($backendName)." );
 
-               $dest = $params['dst'];
+               $dest = $params['dst'] = $this->getNewTempFile();
                if ( $alreadyExists ) {
                        $ok = file_put_contents( $dest, 'blah...blah...waahwaah' ) !== false;
                        $this->assertEquals( true, $ok,
@@ -1029,8 +1010,6 @@ class FileBackendTest extends MediaWikiTestCase {
        public static function provider_testConcatenate() {
                $cases = array();
 
-               $rand = mt_rand( 0, 2000000000 ) . time();
-               $dest = wfTempDir() . "/randomfile!$rand.txt";
                $srcs = array(
                        self::baseStorePath() . '/unittest-cont1/e/file1.txt',
                        self::baseStorePath() . '/unittest-cont1/e/file2.txt',
@@ -1055,7 +1034,7 @@ class FileBackendTest extends MediaWikiTestCase {
                        'lkaem;a',
                        'legma'
                );
-               $params = array( 'srcs' => $srcs, 'dst' => $dest );
+               $params = array( 'srcs' => $srcs );
 
                $cases[] = array(
                        $params, // operation
@@ -1761,16 +1740,13 @@ class FileBackendTest extends MediaWikiTestCase {
                $fileCContents = 'eigna[ogmewt 3qt g3qg flew[ag';
 
                $tmpNameA = TempFSFile::factory( "unittests_", 'txt' )->getPath();
-               file_put_contents( $tmpNameA, $fileAContents );
                $tmpNameB = TempFSFile::factory( "unittests_", 'txt' )->getPath();
-               file_put_contents( $tmpNameB, $fileBContents );
                $tmpNameC = TempFSFile::factory( "unittests_", 'txt' )->getPath();
+               $this->addTmpFiles( array( $tmpNameA, $tmpNameB, $tmpNameC ) );
+               file_put_contents( $tmpNameA, $fileAContents );
+               file_put_contents( $tmpNameB, $fileBContents );
                file_put_contents( $tmpNameC, $fileCContents );
 
-               $this->filesToPrune[] = $tmpNameA; # avoid file leaking
-               $this->filesToPrune[] = $tmpNameB; # avoid file leaking
-               $this->filesToPrune[] = $tmpNameC; # avoid file leaking
-
                $fileA = "$base/unittest-cont1/e/a/b/fileA.txt";
                $fileB = "$base/unittest-cont1/e/a/b/fileB.txt";
                $fileC = "$base/unittest-cont1/e/a/b/fileC.txt";
@@ -2434,16 +2410,10 @@ class FileBackendTest extends MediaWikiTestCase {
        }
 
        function tearDownFiles() {
-               foreach ( $this->filesToPrune as $file ) {
-                       if ( is_file( $file ) ) {
-                               unlink( $file );
-                       }
-               }
                $containers = array( 'unittest-cont1', 'unittest-cont2', 'unittest-cont-bad' );
                foreach ( $containers as $container ) {
                        $this->deleteFiles( $container );
                }
-               $this->filesToPrune = array();
        }
 
        private function deleteFiles( $container ) {
index 9cc2efb..86bfe12 100644 (file)
@@ -16,7 +16,7 @@ class StoreBatchTest extends MediaWikiTestCase {
                parent::setUp();
 
                # Forge a FSRepo object to not have to rely on local wiki settings
-               $tmpPrefix = wfTempDir() . '/storebatch-test-' . time() . '-' . mt_rand();
+               $tmpPrefix = $this->getNewTempDirectory();
                if ( $this->getCliArg( 'use-filebackend' ) ) {
                        $name = $this->getCliArg( 'use-filebackend' );
                        $useConfig = array();
@@ -35,10 +35,10 @@ class StoreBatchTest extends MediaWikiTestCase {
                                'name' => 'local-testing',
                                'wikiId' => wfWikiID(),
                                'containerPaths' => array(
-                                       'unittests-public' => "{$tmpPrefix}-public",
-                                       'unittests-thumb' => "{$tmpPrefix}-thumb",
-                                       'unittests-temp' => "{$tmpPrefix}-temp",
-                                       'unittests-deleted' => "{$tmpPrefix}-deleted",
+                                       'unittests-public' => "{$tmpPrefix}/public",
+                                       'unittests-thumb' => "{$tmpPrefix}/thumb",
+                                       'unittests-temp' => "{$tmpPrefix}/temp",
+                                       'unittests-deleted' => "{$tmpPrefix}/deleted",
                                )
                        ) );
                }
@@ -52,13 +52,8 @@ class StoreBatchTest extends MediaWikiTestCase {
        }
 
        protected function tearDown() {
-               $this->repo->cleanupBatch( $this->createdFiles ); // delete files
-               foreach ( $this->createdFiles as $tmp ) { // delete dirs
-                       $tmp = $this->repo->resolveVirtualUrl( $tmp );
-                       while ( $tmp = FileBackend::parentStoragePath( $tmp ) ) {
-                               $this->repo->getBackend()->clean( array( 'dir' => $tmp ) );
-                       }
-               }
+               // Delete files
+               $this->repo->cleanupBatch( $this->createdFiles );
                parent::tearDown();
        }
 
index 6fa3acf..6142f96 100644 (file)
@@ -141,6 +141,45 @@ class CSSMinTest extends MediaWikiTestCase {
                );
        }
 
+       public static function provideIsRemoteUrl() {
+               return array(
+                       array( true, 'http://localhost/w/red.gif?123' ),
+                       array( true, 'https://example.org/x.png' ),
+                       array( true, '//example.org/x.y.z/image.png' ),
+                       array( true, '//localhost/styles.css?query=yes' ),
+                       array( true, 'data:image/gif;base64,R0lGODlhAQABAIAAAP8AADAAACwAAAAAAQABAAACAkQBADs=' ),
+                       array( false, 'x.gif' ),
+                       array( false, '/x.gif' ),
+                       array( false, './x.gif' ),
+                       array( false, '../x.gif' ),
+               );
+       }
+
+       /**
+        * @dataProvider provideIsRemoteUrl
+        * @cover CSSMin::isRemoteUrl
+        */
+       public function testIsRemoteUrl( $expect, $url ) {
+               $this->assertEquals( CSSMin::isRemoteUrl( $url ), $expect );
+       }
+
+       public static function provideIsLocalUrls() {
+               return array(
+                       array( false, 'x.gif' ),
+                       array( true, '/x.gif' ),
+                       array( false, './x.gif' ),
+                       array( false, '../x.gif' ),
+               );
+       }
+
+       /**
+        * @dataProvider provideIsLocalUrls
+        * @cover CSSMin::isLocalUrl
+        */
+       public function testIsLocalUrl( $expect, $url ) {
+               $this->assertEquals( CSSMin::isLocalUrl( $url ), $expect );
+       }
+
        public static function provideRemapRemappingCases() {
                // red.gif and green.gif are one-pixel 35-byte GIFs.
                // large.png is a 35K PNG that should be non-embeddable.
index 9aaf113..8b7610a 100644 (file)
@@ -15,13 +15,24 @@ class DeferredStringifierTest extends PHPUnit_Framework_TestCase {
        public static function provideToString() {
                return array(
                        // No args
-                       array( array( function() {
-                               return 'foo';
-                       } ), 'foo' ),
+                       array(
+                               array(
+                                       function() {
+                                               return 'foo';
+                                       }
+                               ),
+                               'foo'
+                       ),
                        // Has args
-                       array( array( function( $i ) {
-                               return $i;
-                       }, 'bar' ), 'bar' ),
+                       array(
+                               array(
+                                       function( $i ) {
+                                               return $i;
+                                       },
+                                       'bar'
+                               ),
+                               'bar'
+                       ),
                );
        }
 
index de4ac4b..4300197 100644 (file)
@@ -15,14 +15,14 @@ class ProcessCacheLRUTest extends PHPUnit_Framework_TestCase {
         * Helper to verify emptiness of a cache object.
         * Compare against an array so we get the cache content difference.
         */
-       function assertCacheEmpty( $cache, $msg = 'Cache should be empty' ) {
+       protected function assertCacheEmpty( $cache, $msg = 'Cache should be empty' ) {
                $this->assertAttributeEquals( array(), 'cache', $cache, $msg );
        }
 
        /**
         * Helper to fill a cache object passed by reference
         */
-       function fillCache( &$cache, $numEntries ) {
+       protected function fillCache( &$cache, $numEntries ) {
                // Fill cache with three values
                for ( $i = 1; $i <= $numEntries; $i++ ) {
                        $cache->set( "cache-key-$i", "prop-$i", "value-$i" );
@@ -33,17 +33,17 @@ class ProcessCacheLRUTest extends PHPUnit_Framework_TestCase {
         * Generates an array of what would be expected in cache for a given cache
         * size and a number of entries filled in sequentially
         */
-       function getExpectedCache( $cacheMaxEntries, $entryToFill ) {
+       protected function getExpectedCache( $cacheMaxEntries, $entryToFill ) {
                $expected = array();
 
                if ( $entryToFill === 0 ) {
-                       # The cache is empty!
+                       // The cache is empty!
                        return array();
                } elseif ( $entryToFill <= $cacheMaxEntries ) {
-                       # Cache is not fully filled
+                       // Cache is not fully filled
                        $firstKey = 1;
                } else {
-                       # Cache overflowed
+                       // Cache overflowed
                        $firstKey = 1 + $entryToFill - $cacheMaxEntries;
                }
 
@@ -62,13 +62,16 @@ class ProcessCacheLRUTest extends PHPUnit_Framework_TestCase {
        public function testPhpUnitArrayEquality() {
                $one = array( 'A' => 1, 'B' => 2 );
                $two = array( 'B' => 2, 'A' => 1 );
-               $this->assertEquals( $one, $two ); // ==
-               $this->assertNotSame( $one, $two ); // ===
+               // ==
+               $this->assertEquals( $one, $two );
+               // ===
+               $this->assertNotSame( $one, $two );
        }
 
        /**
         * @dataProvider provideInvalidConstructorArg
         * @expectedException UnexpectedValueException
+        * @covers ProcessCacheLRU::__construct
         */
        public function testConstructorGivenInvalidValue( $maxSize ) {
                new ProcessCacheLRUTestable( $maxSize );
@@ -88,6 +91,11 @@ class ProcessCacheLRUTest extends PHPUnit_Framework_TestCase {
                );
        }
 
+       /**
+        * @covers ProcessCacheLRU::get
+        * @covers ProcessCacheLRU::set
+        * @covers ProcessCacheLRU::het
+        */
        public function testAddAndGetAKey() {
                $oneCache = new ProcessCacheLRUTestable( 1 );
                $this->assertCacheEmpty( $oneCache );
@@ -99,6 +107,10 @@ class ProcessCacheLRUTest extends PHPUnit_Framework_TestCase {
                $this->assertEquals( 'value1', $oneCache->get( 'cache-key', 'prop1' ) );
        }
 
+       /**
+        * @covers ProcessCacheLRU::set
+        * @covers ProcessCacheLRU::get
+        */
        public function testDeleteOldKey() {
                $oneCache = new ProcessCacheLRUTestable( 1 );
                $this->assertCacheEmpty( $oneCache );
@@ -113,6 +125,7 @@ class ProcessCacheLRUTest extends PHPUnit_Framework_TestCase {
         * a sequence of always different cache-keys. Meant to verify we correclty
         * delete the older key.
         *
+        * @covers ProcessCacheLRU::set
         * @dataProvider provideCacheFilling
         * @param int $cacheMaxEntries Maximum entry the created cache will hold
         * @param int $entryToFill Number of entries to insert in the created cache.
@@ -136,14 +149,18 @@ class ProcessCacheLRUTest extends PHPUnit_Framework_TestCase {
                return array(
                        array( 1, 0 ),
                        array( 1, 1 ),
-                       array( 1, 2 ), # overflow
-                       array( 5, 33 ), # overflow
+                       // overflow
+                       array( 1, 2 ),
+                       // overflow
+                       array( 5, 33 ),
                );
        }
 
        /**
         * Create a cache with only one remaining entry then update
         * the first inserted entry. Should bump it to the top.
+        *
+        * @covers ProcessCacheLRU::set
         */
        public function testReplaceExistingKeyShouldBumpEntryToTop() {
                $maxEntries = 3;
@@ -164,6 +181,11 @@ class ProcessCacheLRUTest extends PHPUnit_Framework_TestCase {
                );
        }
 
+       /**
+        * @covers ProcessCacheLRU::get
+        * @covers ProcessCacheLRU::set
+        * @covers ProcessCacheLRU::het
+        */
        public function testRecentlyAccessedKeyStickIn() {
                $cache = new ProcessCacheLRUTestable( 2 );
                $cache->set( 'first', 'prop1', 'value1' );
@@ -182,6 +204,9 @@ class ProcessCacheLRUTest extends PHPUnit_Framework_TestCase {
         * filled entry.
         * Given a cache having 1,2,3 as key, updating 2 should bump 2 to
         * the top of the queue with the new value: 1,3,2* (* = updated).
+        *
+        * @covers ProcessCacheLRU::set
+        * @covers ProcessCacheLRU::get
         */
        public function testReplaceExistingKeyInAFullCacheShouldBumpToTop() {
                $maxEntries = 3;
@@ -204,6 +229,9 @@ class ProcessCacheLRUTest extends PHPUnit_Framework_TestCase {
                );
        }
 
+       /**
+        * @covers ProcessCacheLRU::set
+        */
        public function testBumpExistingKeyToTop() {
                $cache = new ProcessCacheLRUTestable( 3 );
                $this->fillCache( $cache, 3 );
diff --git a/tests/phpunit/includes/libs/StringUtilsTest.php b/tests/phpunit/includes/libs/StringUtilsTest.php
new file mode 100644 (file)
index 0000000..7c24fae
--- /dev/null
@@ -0,0 +1,149 @@
+<?php
+
+class StringUtilsTest extends PHPUnit_Framework_TestCase {
+
+       /**
+        * This tests StringUtils::isUtf8 whenever we have the mbstring extension
+        * loaded.
+        *
+        * @covers StringUtils::isUtf8
+        * @dataProvider provideStringsForIsUtf8Check
+        */
+       public function testIsUtf8WithMbstring( $expected, $string ) {
+               if ( !function_exists( 'mb_check_encoding' ) ) {
+                       $this->markTestSkipped( 'Test requires the mbstring PHP extension' );
+               }
+               $this->assertEquals( $expected,
+                       StringUtils::isUtf8( $string ),
+                       'Testing string "' . $this->escaped( $string ) . '" with mb_check_encoding'
+               );
+       }
+
+       /**
+        * This tests StringUtils::isUtf8 making sure we use the pure PHP
+        * implementation used as a fallback when mb_check_encoding() is
+        * not available.
+        *
+        * @covers StringUtils::isUtf8
+        * @dataProvider provideStringsForIsUtf8Check
+        */
+       public function testIsUtf8WithPhpFallbackImplementation( $expected, $string ) {
+               $this->assertEquals( $expected,
+                       StringUtils::isUtf8( $string, /** disable mbstring: */true ),
+                       'Testing string "' . $this->escaped( $string ) . '" with pure PHP implementation'
+               );
+       }
+
+       /**
+        * Print high range characters as a hexadecimal
+        * @param string $string
+        * @return string
+        */
+       function escaped( $string ) {
+               $escaped = '';
+               $length = strlen( $string );
+               for ( $i = 0; $i < $length; $i++ ) {
+                       $char = $string[$i];
+                       $val = ord( $char );
+                       if ( $val > 127 ) {
+                               $escaped .= '\x' . dechex( $val );
+                       } else {
+                               $escaped .= $char;
+                       }
+               }
+
+               return $escaped;
+       }
+
+       /**
+        * See also "UTF-8 decoder capability and stress test" by
+        * Markus Kuhn:
+        * http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt
+        */
+       public static function provideStringsForIsUtf8Check() {
+               // Expected return values for StringUtils::isUtf8()
+               $PASS = true;
+               $FAIL = false;
+
+               return array(
+                       'some ASCII' => array( $PASS, 'Some ASCII' ),
+                       'euro sign' => array( $PASS, "Euro sign €" ),
+
+                       'first possible sequence 1 byte' => array( $PASS, "\x00" ),
+                       'first possible sequence 2 bytes' => array( $PASS, "\xc2\x80" ),
+                       'first possible sequence 3 bytes' => array( $PASS, "\xe0\xa0\x80" ),
+                       'first possible sequence 4 bytes' => array( $PASS, "\xf0\x90\x80\x80" ),
+                       'first possible sequence 5 bytes' => array( $FAIL, "\xf8\x88\x80\x80\x80" ),
+                       'first possible sequence 6 bytes' => array( $FAIL, "\xfc\x84\x80\x80\x80\x80" ),
+
+                       'last possible sequence 1 byte' => array( $PASS, "\x7f" ),
+                       'last possible sequence 2 bytes' => array( $PASS, "\xdf\xbf" ),
+                       'last possible sequence 3 bytes' => array( $PASS, "\xef\xbf\xbf" ),
+                       'last possible sequence 4 bytes (U+1FFFFF)' => array( $FAIL, "\xf7\xbf\xbf\xbf" ),
+                       'last possible sequence 5 bytes' => array( $FAIL, "\xfb\xbf\xbf\xbf\xbf" ),
+                       'last possible sequence 6 bytes' => array( $FAIL, "\xfd\xbf\xbf\xbf\xbf\xbf" ),
+
+                       'boundary 1' => array( $PASS, "\xed\x9f\xbf" ),
+                       'boundary 2' => array( $PASS, "\xee\x80\x80" ),
+                       'boundary 3' => array( $PASS, "\xef\xbf\xbd" ),
+                       'boundary 4' => array( $PASS, "\xf2\x80\x80\x80" ),
+                       'boundary 5 (U+FFFFF)' => array( $PASS, "\xf3\xbf\xbf\xbf" ),
+                       'boundary 6 (U+100000)' => array( $PASS, "\xf4\x80\x80\x80" ),
+                       'boundary 7 (U+10FFFF)' => array( $PASS, "\xf4\x8f\xbf\xbf" ),
+                       'boundary 8 (U+110000)' => array( $FAIL, "\xf4\x90\x80\x80" ),
+
+                       'malformed 1' => array( $FAIL, "\x80" ),
+                       'malformed 2' => array( $FAIL, "\xbf" ),
+                       'malformed 3' => array( $FAIL, "\x80\xbf" ),
+                       'malformed 4' => array( $FAIL, "\x80\xbf\x80" ),
+                       'malformed 5' => array( $FAIL, "\x80\xbf\x80\xbf" ),
+                       'malformed 6' => array( $FAIL, "\x80\xbf\x80\xbf\x80" ),
+                       'malformed 7' => array( $FAIL, "\x80\xbf\x80\xbf\x80\xbf" ),
+                       'malformed 8' => array( $FAIL, "\x80\xbf\x80\xbf\x80\xbf\x80" ),
+
+                       'last byte missing 1' => array( $FAIL, "\xc0" ),
+                       'last byte missing 2' => array( $FAIL, "\xe0\x80" ),
+                       'last byte missing 3' => array( $FAIL, "\xf0\x80\x80" ),
+                       'last byte missing 4' => array( $FAIL, "\xf8\x80\x80\x80" ),
+                       'last byte missing 5' => array( $FAIL, "\xfc\x80\x80\x80\x80" ),
+                       'last byte missing 6' => array( $FAIL, "\xdf" ),
+                       'last byte missing 7' => array( $FAIL, "\xef\xbf" ),
+                       'last byte missing 8' => array( $FAIL, "\xf7\xbf\xbf" ),
+                       'last byte missing 9' => array( $FAIL, "\xfb\xbf\xbf\xbf" ),
+                       'last byte missing 10' => array( $FAIL, "\xfd\xbf\xbf\xbf\xbf" ),
+
+                       'extra continuation byte 1' => array( $FAIL, "e\xaf" ),
+                       'extra continuation byte 2' => array( $FAIL, "\xc3\x89\xaf" ),
+                       'extra continuation byte 3' => array( $FAIL, "\xef\xbc\xa5\xaf" ),
+                       'extra continuation byte 4' => array( $FAIL, "\xf0\x9d\x99\xb4\xaf" ),
+
+                       'impossible bytes 1' => array( $FAIL, "\xfe" ),
+                       'impossible bytes 2' => array( $FAIL, "\xff" ),
+                       'impossible bytes 3' => array( $FAIL, "\xfe\xfe\xff\xff" ),
+
+                       'overlong sequences 1' => array( $FAIL, "\xc0\xaf" ),
+                       'overlong sequences 2' => array( $FAIL, "\xc1\xaf" ),
+                       'overlong sequences 3' => array( $FAIL, "\xe0\x80\xaf" ),
+                       'overlong sequences 4' => array( $FAIL, "\xf0\x80\x80\xaf" ),
+                       'overlong sequences 5' => array( $FAIL, "\xf8\x80\x80\x80\xaf" ),
+                       'overlong sequences 6' => array( $FAIL, "\xfc\x80\x80\x80\x80\xaf" ),
+
+                       'maximum overlong sequences 1' => array( $FAIL, "\xc1\xbf" ),
+                       'maximum overlong sequences 2' => array( $FAIL, "\xe0\x9f\xbf" ),
+                       'maximum overlong sequences 3' => array( $FAIL, "\xf0\x8f\xbf\xbf" ),
+                       'maximum overlong sequences 4' => array( $FAIL, "\xf8\x87\xbf\xbf" ),
+                       'maximum overlong sequences 5' => array( $FAIL, "\xfc\x83\xbf\xbf\xbf\xbf" ),
+
+                       'surrogates 1 (U+D799)' => array( $PASS, "\xed\x9f\xbf" ),
+                       'surrogates 2 (U+E000)' => array( $PASS, "\xee\x80\x80" ),
+                       'surrogates 3 (U+D800)' => array( $FAIL, "\xed\xa0\x80" ),
+                       'surrogates 4 (U+DBFF)' => array( $FAIL, "\xed\xaf\xbf" ),
+                       'surrogates 5 (U+DC00)' => array( $FAIL, "\xed\xb0\x80" ),
+                       'surrogates 6 (U+DFFF)' => array( $FAIL, "\xed\xbf\xbf" ),
+                       'surrogates 7 (U+D800 U+DC00)' => array( $FAIL, "\xed\xa0\x80\xed\xb0\x80" ),
+
+                       'noncharacters 1' => array( $PASS, "\xef\xbf\xbe" ),
+                       'noncharacters 2' => array( $PASS, "\xef\xbf\xbf" ),
+               );
+       }
+}
diff --git a/tests/phpunit/includes/libs/normal/CleanUpTest.php b/tests/phpunit/includes/libs/normal/CleanUpTest.php
new file mode 100644 (file)
index 0000000..909b0fe
--- /dev/null
@@ -0,0 +1,394 @@
+<?php
+/**
+ * Tests for UtfNormal::cleanUp() function.
+ *
+ * Copyright © 2004 Brion Vibber <brion@pobox.com>
+ * https://www.mediawiki.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * Additional tests for UtfNormal::cleanUp() function, inclusion
+ * regression checks for known problems.
+ * Requires PHPUnit.
+ *
+ * @ingroup UtfNormal
+ * @group Large
+ *
+ * @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 PHPUnit_Framework_TestCase {
+       public function testAscii() {
+               $text = 'This is plain ASCII text.';
+               $this->assertEquals( $text, UtfNormal::cleanUp( $text ) );
+       }
+
+       public function testNull() {
+               $text = "a \x00 null";
+               $expect = "a \xef\xbf\xbd null";
+               $this->assertEquals(
+                       bin2hex( $expect ),
+                       bin2hex( UtfNormal::cleanUp( $text ) ) );
+       }
+
+       public function testLatin() {
+               $text = "L'\xc3\xa9cole";
+               $this->assertEquals( $text, UtfNormal::cleanUp( $text ) );
+       }
+
+       public function testLatinNormal() {
+               $text = "L'e\xcc\x81cole";
+               $expect = "L'\xc3\xa9cole";
+               $this->assertEquals( $expect, UtfNormal::cleanUp( $text ) );
+       }
+
+       /**
+        * This test is *very* expensive!
+        */
+       function XtestAllChars() {
+               $rep = UTF8_REPLACEMENT;
+               for ( $i = 0x0; $i < UNICODE_MAX; $i++ ) {
+                       $char = codepointToUtf8( $i );
+                       $clean = UtfNormal::cleanUp( $char );
+                       $x = sprintf( "%04X", $i );
+
+                       if ( $i % 0x1000 == 0 ) {
+                               echo "U+$x\n";
+                       }
+
+                       if ( $i == 0x0009 ||
+                               $i == 0x000a ||
+                               $i == 0x000d ||
+                               ( $i > 0x001f && $i < UNICODE_SURROGATE_FIRST ) ||
+                               ( $i > UNICODE_SURROGATE_LAST && $i < 0xfffe ) ||
+                               ( $i > 0xffff && $i <= UNICODE_MAX )
+                       ) {
+                               if ( isset( UtfNormal::$utfCanonicalComp[$char] )
+                                       || isset( UtfNormal::$utfCanonicalDecomp[$char] )
+                               ) {
+                                       $comp = UtfNormal::NFC( $char );
+                                       $this->assertEquals(
+                                               bin2hex( $comp ),
+                                               bin2hex( $clean ),
+                                               "U+$x should be decomposed" );
+                               } else {
+                                       $this->assertEquals(
+                                               bin2hex( $char ),
+                                               bin2hex( $clean ),
+                                               "U+$x should be intact" );
+                               }
+                       } else {
+                               $this->assertEquals( bin2hex( $rep ), bin2hex( $clean ), $x );
+                       }
+               }
+       }
+
+       public static function provideAllBytes() {
+               return array(
+                       array( '', '' ),
+                       array( 'x', '' ),
+                       array( '', 'x' ),
+                       array( 'x', 'x' ),
+               );
+       }
+
+       /**
+        * @dataProvider provideAllBytes
+        */
+       function testBytes( $head, $tail ) {
+               for ( $i = 0x0; $i < 256; $i++ ) {
+                       $char = $head . chr( $i ) . $tail;
+                       $clean = UtfNormal::cleanUp( $char );
+                       $x = sprintf( "%02X", $i );
+
+                       if ( $i == 0x0009 ||
+                               $i == 0x000a ||
+                               $i == 0x000d ||
+                               ( $i > 0x001f && $i < 0x80 )
+                       ) {
+                               $this->assertEquals(
+                                       bin2hex( $char ),
+                                       bin2hex( $clean ),
+                                       "ASCII byte $x should be intact" );
+                               if ( $char != $clean ) {
+                                       return;
+                               }
+                       } else {
+                               $norm = $head . UTF8_REPLACEMENT . $tail;
+                               $this->assertEquals(
+                                       bin2hex( $norm ),
+                                       bin2hex( $clean ),
+                                       "Forbidden byte $x should be rejected" );
+                               if ( $norm != $clean ) {
+                                       return;
+                               }
+                       }
+               }
+       }
+
+       /**
+        * @dataProvider provideAllBytes
+        */
+       function testDoubleBytes( $head, $tail ) {
+               for ( $first = 0xc0; $first < 0x100; $first += 2 ) {
+                       for ( $second = 0x80; $second < 0x100; $second += 2 ) {
+                               $char = $head . chr( $first ) . chr( $second ) . $tail;
+                               $clean = UtfNormal::cleanUp( $char );
+                               $x = sprintf( "%02X,%02X", $first, $second );
+                               if ( $first > 0xc1 &&
+                                       $first < 0xe0 &&
+                                       $second < 0xc0
+                               ) {
+                                       $norm = UtfNormal::NFC( $char );
+                                       $this->assertEquals(
+                                               bin2hex( $norm ),
+                                               bin2hex( $clean ),
+                                               "Pair $x should be intact" );
+                                       if ( $norm != $clean ) {
+                                               return;
+                                       }
+                               } elseif ( $first > 0xfd || $second > 0xbf ) {
+                                       # fe and ff are not legal head bytes -- expect two replacement chars
+                                       $norm = $head . UTF8_REPLACEMENT . UTF8_REPLACEMENT . $tail;
+                                       $this->assertEquals(
+                                               bin2hex( $norm ),
+                                               bin2hex( $clean ),
+                                               "Forbidden pair $x should be rejected" );
+                                       if ( $norm != $clean ) {
+                                               return;
+                                       }
+                               } else {
+                                       $norm = $head . UTF8_REPLACEMENT . $tail;
+                                       $this->assertEquals(
+                                               bin2hex( $norm ),
+                                               bin2hex( $clean ),
+                                               "Forbidden pair $x should be rejected" );
+                                       if ( $norm != $clean ) {
+                                               return;
+                                       }
+                               }
+                       }
+               }
+       }
+
+       /**
+        * @dataProvider provideAllBytes
+        */
+       function testTripleBytes( $head, $tail ) {
+               for ( $first = 0xc0; $first < 0x100; $first += 2 ) {
+                       for ( $second = 0x80; $second < 0x100; $second += 2 ) {
+                               #for( $third = 0x80; $third < 0x100; $third++ ) {
+                               for ( $third = 0x80; $third < 0x81; $third++ ) {
+                                       $char = $head . chr( $first ) . chr( $second ) . chr( $third ) . $tail;
+                                       $clean = UtfNormal::cleanUp( $char );
+                                       $x = sprintf( "%02X,%02X,%02X", $first, $second, $third );
+
+                                       if ( $first >= 0xe0 &&
+                                               $first < 0xf0 &&
+                                               $second < 0xc0 &&
+                                               $third < 0xc0
+                                       ) {
+                                               if ( $first == 0xe0 && $second < 0xa0 ) {
+                                                       $this->assertEquals(
+                                                               bin2hex( $head . UTF8_REPLACEMENT . $tail ),
+                                                               bin2hex( $clean ),
+                                                               "Overlong triplet $x should be rejected" );
+                                               } elseif ( $first == 0xed &&
+                                                       ( chr( $first ) . chr( $second ) . chr( $third ) ) >= UTF8_SURROGATE_FIRST
+                                               ) {
+                                                       $this->assertEquals(
+                                                               bin2hex( $head . UTF8_REPLACEMENT . $tail ),
+                                                               bin2hex( $clean ),
+                                                               "Surrogate triplet $x should be rejected" );
+                                               } else {
+                                                       $this->assertEquals(
+                                                               bin2hex( UtfNormal::NFC( $char ) ),
+                                                               bin2hex( $clean ),
+                                                               "Triplet $x should be intact" );
+                                               }
+                                       } elseif ( $first > 0xc1 && $first < 0xe0 && $second < 0xc0 ) {
+                                               $this->assertEquals(
+                                                       bin2hex( UtfNormal::NFC( $head . chr( $first ) .
+                                                                       chr( $second ) ) . UTF8_REPLACEMENT . $tail ),
+                                                       bin2hex( $clean ),
+                                                       "Valid 2-byte $x + broken tail" );
+                                       } elseif ( $second > 0xc1 && $second < 0xe0 && $third < 0xc0 ) {
+                                               $this->assertEquals(
+                                                       bin2hex( $head . UTF8_REPLACEMENT .
+                                                               UtfNormal::NFC( chr( $second ) . chr( $third ) . $tail ) ),
+                                                       bin2hex( $clean ),
+                                                       "Broken head + valid 2-byte $x" );
+                                       } elseif ( ( $first > 0xfd || $second > 0xfd ) &&
+                                               ( ( $second > 0xbf && $third > 0xbf ) ||
+                                                       ( $second < 0xc0 && $third < 0xc0 ) ||
+                                                       ( $second > 0xfd ) ||
+                                                       ( $third > 0xfd ) )
+                                       ) {
+                                               # fe and ff are not legal head bytes -- expect three replacement chars
+                                               $this->assertEquals(
+                                                       bin2hex( $head . UTF8_REPLACEMENT . UTF8_REPLACEMENT . UTF8_REPLACEMENT . $tail ),
+                                                       bin2hex( $clean ),
+                                                       "Forbidden triplet $x should be rejected" );
+                                       } elseif ( $first > 0xc2 && $second < 0xc0 && $third < 0xc0 ) {
+                                               $this->assertEquals(
+                                                       bin2hex( $head . UTF8_REPLACEMENT . $tail ),
+                                                       bin2hex( $clean ),
+                                                       "Forbidden triplet $x should be rejected" );
+                                       } else {
+                                               $this->assertEquals(
+                                                       bin2hex( $head . UTF8_REPLACEMENT . UTF8_REPLACEMENT . $tail ),
+                                                       bin2hex( $clean ),
+                                                       "Forbidden triplet $x should be rejected" );
+                                       }
+                               }
+                       }
+               }
+       }
+
+       public function testChunkRegression() {
+               # Check for regression against a chunking bug
+               $text = "\x46\x55\xb8" .
+                       "\xdc\x96" .
+                       "\xee" .
+                       "\xe7" .
+                       "\x44" .
+                       "\xaa" .
+                       "\x2f\x25";
+               $expect = "\x46\x55\xef\xbf\xbd" .
+                       "\xdc\x96" .
+                       "\xef\xbf\xbd" .
+                       "\xef\xbf\xbd" .
+                       "\x44" .
+                       "\xef\xbf\xbd" .
+                       "\x2f\x25";
+
+               $this->assertEquals(
+                       bin2hex( $expect ),
+                       bin2hex( UtfNormal::cleanUp( $text ) ) );
+       }
+
+       public function testInterposeRegression() {
+               $text = "\x4e\x30" .
+                       "\xb1" . # bad tail
+                       "\x3a" .
+                       "\x92" . # bad tail
+                       "\x62\x3a" .
+                       "\x84" . # bad tail
+                       "\x43" .
+                       "\xc6" . # bad head
+                       "\x3f" .
+                       "\x92" . # bad tail
+                       "\xad" . # bad tail
+                       "\x7d" .
+                       "\xd9\x95";
+
+               $expect = "\x4e\x30" .
+                       "\xef\xbf\xbd" .
+                       "\x3a" .
+                       "\xef\xbf\xbd" .
+                       "\x62\x3a" .
+                       "\xef\xbf\xbd" .
+                       "\x43" .
+                       "\xef\xbf\xbd" .
+                       "\x3f" .
+                       "\xef\xbf\xbd" .
+                       "\xef\xbf\xbd" .
+                       "\x7d" .
+                       "\xd9\x95";
+
+               $this->assertEquals(
+                       bin2hex( $expect ),
+                       bin2hex( UtfNormal::cleanUp( $text ) ) );
+       }
+
+       public function testOverlongRegression() {
+               $text = "\x67" .
+                       "\x1a" . # forbidden ascii
+                       "\xea" . # bad head
+                       "\xc1\xa6" . # overlong sequence
+                       "\xad" . # bad tail
+                       "\x1c" . # forbidden ascii
+                       "\xb0" . # bad tail
+                       "\x3c" .
+                       "\x9e"; # bad tail
+               $expect = "\x67" .
+                       "\xef\xbf\xbd" .
+                       "\xef\xbf\xbd" .
+                       "\xef\xbf\xbd" .
+                       "\xef\xbf\xbd" .
+                       "\xef\xbf\xbd" .
+                       "\xef\xbf\xbd" .
+                       "\x3c" .
+                       "\xef\xbf\xbd";
+               $this->assertEquals(
+                       bin2hex( $expect ),
+                       bin2hex( UtfNormal::cleanUp( $text ) ) );
+       }
+
+       public function testSurrogateRegression() {
+               $text = "\xed\xb4\x96" . # surrogate 0xDD16
+                       "\x83" . # bad tail
+                       "\xb4" . # bad tail
+                       "\xac"; # bad head
+               $expect = "\xef\xbf\xbd" .
+                       "\xef\xbf\xbd" .
+                       "\xef\xbf\xbd" .
+                       "\xef\xbf\xbd";
+               $this->assertEquals(
+                       bin2hex( $expect ),
+                       bin2hex( UtfNormal::cleanUp( $text ) ) );
+       }
+
+       public function testBomRegression() {
+               $text = "\xef\xbf\xbe" . # U+FFFE, illegal char
+                       "\xb2" . # bad tail
+                       "\xef" . # bad head
+                       "\x59";
+               $expect = "\xef\xbf\xbd" .
+                       "\xef\xbf\xbd" .
+                       "\xef\xbf\xbd" .
+                       "\x59";
+               $this->assertEquals(
+                       bin2hex( $expect ),
+                       bin2hex( UtfNormal::cleanUp( $text ) ) );
+       }
+
+       public function testForbiddenRegression() {
+               $text = "\xef\xbf\xbf"; # U+FFFF, illegal char
+               $expect = "\xef\xbf\xbd";
+               $this->assertEquals(
+                       bin2hex( $expect ),
+                       bin2hex( UtfNormal::cleanUp( $text ) ) );
+       }
+
+       public function testHangulRegression() {
+               $text = "\xed\x9c\xaf" . # Hangul char
+                       "\xe1\x87\x81"; # followed by another final jamo
+               $expect = $text; # Should *not* change.
+               $this->assertEquals(
+                       bin2hex( $expect ),
+                       bin2hex( UtfNormal::cleanUp( $text ) ) );
+       }
+}
diff --git a/tests/phpunit/includes/libs/normal/Utf8Test.php b/tests/phpunit/includes/libs/normal/Utf8Test.php
new file mode 100644 (file)
index 0000000..6d8457d
--- /dev/null
@@ -0,0 +1,123 @@
+<?php
+/**
+ * Runs the UTF-8 decoder test at:
+ * http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt
+ *
+ * Copyright © 2004 Brion Vibber <brion@pobox.com>
+ * https://www.mediawiki.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup UtfNormal
+ */
+
+class Utf8Test extends PHPUnit_Framework_TestCase {
+       public static function provideLines() {
+               global $IP;
+               $in = fopen( "$IP/tests/phpunit/data/normal/UTF-8-test.txt", "rt" );
+
+               $columns = 0;
+               while ( false !== ( $line = fgets( $in ) ) ) {
+                       $matches = array();
+                       if ( preg_match( '/^(Here come the tests:\s*)\|$/', $line, $matches ) ) {
+                               $columns = strpos( $line, '|' );
+                               break;
+                       }
+               }
+
+               if ( !$columns ) {
+                       print "Something seems to be wrong; couldn't extract line length.\n";
+                       print "Check that UTF-8-test.txt was downloaded correctly from\n";
+                       print "http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt\n";
+                       exit( -1 );
+               }
+
+
+               $ignore = array(
+                       # These two lines actually seem to be corrupt
+                       '2.1.1', '2.2.1' );
+
+               $exceptions = array(
+                       # Tests that should mark invalid characters due to using long
+                       # sequences beyond what is now considered legal.
+                       '2.1.5', '2.1.6', '2.2.4', '2.2.5', '2.2.6', '2.3.5',
+
+                       # Literal 0xffff, which is illegal
+                       '2.2.3' );
+
+               $longTests = array(
+                       # These tests span multiple lines
+                       '3.1.9', '3.2.1', '3.2.2', '3.2.3', '3.2.4', '3.2.5',
+                       '3.4' );
+
+               $testCases = array();
+
+               $section = null;
+               while ( false !== ( $line = fgets( $in ) ) ) {
+                       $matches = array();
+                       if ( preg_match( '/^(\d+)\s+(.*?)\s*\|/', $line, $matches ) ) {
+                               continue;
+                       }
+                       if ( preg_match( '/^(\d+\.\d+\.\d+)\s*/', $line, $matches ) ) {
+                               $test = $matches[1];
+
+                               if ( in_array( $test, $ignore ) ) {
+                                       continue;
+                               }
+                               if ( in_array( $test, $longTests ) ) {
+                                       fgets( $in );
+
+                                       // @codingStandardsIgnoreStart Generic.CodeAnalysis.ForLoopWithTestFunctionCall.NotAllowed
+                                       for ( $line = fgets( $in ); !preg_match( '/^\s+\|/', $line ); $line = fgets( $in ) ) {
+                                               // @codingStandardsIgnoreEnd
+
+                                               $testCases[] = array( $test, $line, $columns, $exceptions );
+                                       }
+                               } else {
+                                       $testCases[] = array( $test, $line, $columns, $exceptions );
+                               }
+                       }
+               }
+
+               return $testCases;
+       }
+
+
+       /**
+        * @dataProvider provideLines
+        * @covers UtfNormal::quickisNFCVerify
+        */
+       function testLine( $test, $line, $columns, $exceptions ) {
+               $stripped = $line;
+               UtfNormal::quickisNFCVerify( $stripped );
+
+               $same = ( $line == $stripped );
+               $len = mb_strlen( substr( $stripped, 0, strpos( $stripped, '|' ) ) );
+               if ( $len == 0 ) {
+                       $len = strlen( substr( $stripped, 0, strpos( $stripped, '|' ) ) );
+               }
+
+               $ok = $same ^ ( $test >= 3 );
+
+               $ok ^= in_array( $test, $exceptions );
+
+               $ok &= ( $columns == $len );
+
+               $this->assertEquals( 1, $ok );
+       }
+
+}
index 5fa609a..78ea953 100644 (file)
@@ -19,24 +19,24 @@ class MediaHandlerTest extends MediaWikiTestCase {
                        "($width, $height, $max) wanted: {$expected}x$y, got: {z$result}x$y2" );
        }
 
-       public function provideTestFitBoxWidth() {
+       public static function provideTestFitBoxWidth() {
                return array_merge(
-                       $this->provideTestFitBoxWidthSingle( 50, 50, array(
+                       static::generateTestFitBoxWidthData( 50, 50, array(
                                        50 => 50,
                                        17 => 17,
                                        18 => 18 )
                        ),
-                       $this->provideTestFitBoxWidthSingle( 366, 300, array(
+                       static::generateTestFitBoxWidthData( 366, 300, array(
                                        50 => 61,
                                        17 => 21,
                                        18 => 22 )
                        ),
-                       $this->provideTestFitBoxWidthSingle( 300, 366, array(
+                       static::generateTestFitBoxWidthData( 300, 366, array(
                                        50 => 41,
                                        17 => 14,
                                        18 => 15 )
                        ),
-                       $this->provideTestFitBoxWidthSingle( 100, 400, array(
+                       static::generateTestFitBoxWidthData( 100, 400, array(
                                        50 => 12,
                                        17 => 4,
                                        18 => 4 )
@@ -44,7 +44,21 @@ class MediaHandlerTest extends MediaWikiTestCase {
                );
        }
 
-       private function provideTestFitBoxWidthSingle( $width, $height, $tests ) {
+       /**
+        * Generate single test cases by combining the dimensions and tests contents
+        *
+        * It creates:
+        * [$width, $height, $max, $expected],
+        * [$width, $height, $max2, $expected2], ...
+        * out of parameters:
+        * $width, $height, { $max => $expected, $max2 => $expected2, ... }
+        *
+        * @param $width int
+        * @param $height int
+        * @param $tests array associative array of $max => $expected values
+        * @return array
+        */
+       private static function generateTestFitBoxWidthData( $width, $height, $tests ) {
                $result = array();
                foreach ( $tests as $max => $expected ) {
                        $result[] = array( $width, $height, $max, $expected );
diff --git a/tests/phpunit/includes/normal/CleanUpTest.php b/tests/phpunit/includes/normal/CleanUpTest.php
deleted file mode 100644 (file)
index af83767..0000000
+++ /dev/null
@@ -1,394 +0,0 @@
-<?php
-/**
- * Tests for UtfNormal::cleanUp() function.
- *
- * Copyright © 2004 Brion Vibber <brion@pobox.com>
- * https://www.mediawiki.org/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- */
-
-/**
- * Additional tests for UtfNormal::cleanUp() function, inclusion
- * regression checks for known problems.
- * Requires PHPUnit.
- *
- * @ingroup UtfNormal
- * @group Large
- *
- * @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 {
-       public function testAscii() {
-               $text = 'This is plain ASCII text.';
-               $this->assertEquals( $text, UtfNormal::cleanUp( $text ) );
-       }
-
-       public function testNull() {
-               $text = "a \x00 null";
-               $expect = "a \xef\xbf\xbd null";
-               $this->assertEquals(
-                       bin2hex( $expect ),
-                       bin2hex( UtfNormal::cleanUp( $text ) ) );
-       }
-
-       public function testLatin() {
-               $text = "L'\xc3\xa9cole";
-               $this->assertEquals( $text, UtfNormal::cleanUp( $text ) );
-       }
-
-       public function testLatinNormal() {
-               $text = "L'e\xcc\x81cole";
-               $expect = "L'\xc3\xa9cole";
-               $this->assertEquals( $expect, UtfNormal::cleanUp( $text ) );
-       }
-
-       /**
-        * This test is *very* expensive!
-        */
-       function XtestAllChars() {
-               $rep = UTF8_REPLACEMENT;
-               for ( $i = 0x0; $i < UNICODE_MAX; $i++ ) {
-                       $char = codepointToUtf8( $i );
-                       $clean = UtfNormal::cleanUp( $char );
-                       $x = sprintf( "%04X", $i );
-
-                       if ( $i % 0x1000 == 0 ) {
-                               echo "U+$x\n";
-                       }
-
-                       if ( $i == 0x0009 ||
-                               $i == 0x000a ||
-                               $i == 0x000d ||
-                               ( $i > 0x001f && $i < UNICODE_SURROGATE_FIRST ) ||
-                               ( $i > UNICODE_SURROGATE_LAST && $i < 0xfffe ) ||
-                               ( $i > 0xffff && $i <= UNICODE_MAX )
-                       ) {
-                               if ( isset( UtfNormal::$utfCanonicalComp[$char] )
-                                       || isset( UtfNormal::$utfCanonicalDecomp[$char] )
-                               ) {
-                                       $comp = UtfNormal::NFC( $char );
-                                       $this->assertEquals(
-                                               bin2hex( $comp ),
-                                               bin2hex( $clean ),
-                                               "U+$x should be decomposed" );
-                               } else {
-                                       $this->assertEquals(
-                                               bin2hex( $char ),
-                                               bin2hex( $clean ),
-                                               "U+$x should be intact" );
-                               }
-                       } else {
-                               $this->assertEquals( bin2hex( $rep ), bin2hex( $clean ), $x );
-                       }
-               }
-       }
-
-       public static function provideAllBytes() {
-               return array(
-                       array( '', '' ),
-                       array( 'x', '' ),
-                       array( '', 'x' ),
-                       array( 'x', 'x' ),
-               );
-       }
-
-       /**
-        * @dataProvider provideAllBytes
-        */
-       function testBytes( $head, $tail ) {
-               for ( $i = 0x0; $i < 256; $i++ ) {
-                       $char = $head . chr( $i ) . $tail;
-                       $clean = UtfNormal::cleanUp( $char );
-                       $x = sprintf( "%02X", $i );
-
-                       if ( $i == 0x0009 ||
-                               $i == 0x000a ||
-                               $i == 0x000d ||
-                               ( $i > 0x001f && $i < 0x80 )
-                       ) {
-                               $this->assertEquals(
-                                       bin2hex( $char ),
-                                       bin2hex( $clean ),
-                                       "ASCII byte $x should be intact" );
-                               if ( $char != $clean ) {
-                                       return;
-                               }
-                       } else {
-                               $norm = $head . UTF8_REPLACEMENT . $tail;
-                               $this->assertEquals(
-                                       bin2hex( $norm ),
-                                       bin2hex( $clean ),
-                                       "Forbidden byte $x should be rejected" );
-                               if ( $norm != $clean ) {
-                                       return;
-                               }
-                       }
-               }
-       }
-
-       /**
-        * @dataProvider provideAllBytes
-        */
-       function testDoubleBytes( $head, $tail ) {
-               for ( $first = 0xc0; $first < 0x100; $first += 2 ) {
-                       for ( $second = 0x80; $second < 0x100; $second += 2 ) {
-                               $char = $head . chr( $first ) . chr( $second ) . $tail;
-                               $clean = UtfNormal::cleanUp( $char );
-                               $x = sprintf( "%02X,%02X", $first, $second );
-                               if ( $first > 0xc1 &&
-                                       $first < 0xe0 &&
-                                       $second < 0xc0
-                               ) {
-                                       $norm = UtfNormal::NFC( $char );
-                                       $this->assertEquals(
-                                               bin2hex( $norm ),
-                                               bin2hex( $clean ),
-                                               "Pair $x should be intact" );
-                                       if ( $norm != $clean ) {
-                                               return;
-                                       }
-                               } elseif ( $first > 0xfd || $second > 0xbf ) {
-                                       # fe and ff are not legal head bytes -- expect two replacement chars
-                                       $norm = $head . UTF8_REPLACEMENT . UTF8_REPLACEMENT . $tail;
-                                       $this->assertEquals(
-                                               bin2hex( $norm ),
-                                               bin2hex( $clean ),
-                                               "Forbidden pair $x should be rejected" );
-                                       if ( $norm != $clean ) {
-                                               return;
-                                       }
-                               } else {
-                                       $norm = $head . UTF8_REPLACEMENT . $tail;
-                                       $this->assertEquals(
-                                               bin2hex( $norm ),
-                                               bin2hex( $clean ),
-                                               "Forbidden pair $x should be rejected" );
-                                       if ( $norm != $clean ) {
-                                               return;
-                                       }
-                               }
-                       }
-               }
-       }
-
-       /**
-        * @dataProvider provideAllBytes
-        */
-       function testTripleBytes( $head, $tail ) {
-               for ( $first = 0xc0; $first < 0x100; $first += 2 ) {
-                       for ( $second = 0x80; $second < 0x100; $second += 2 ) {
-                               #for( $third = 0x80; $third < 0x100; $third++ ) {
-                               for ( $third = 0x80; $third < 0x81; $third++ ) {
-                                       $char = $head . chr( $first ) . chr( $second ) . chr( $third ) . $tail;
-                                       $clean = UtfNormal::cleanUp( $char );
-                                       $x = sprintf( "%02X,%02X,%02X", $first, $second, $third );
-
-                                       if ( $first >= 0xe0 &&
-                                               $first < 0xf0 &&
-                                               $second < 0xc0 &&
-                                               $third < 0xc0
-                                       ) {
-                                               if ( $first == 0xe0 && $second < 0xa0 ) {
-                                                       $this->assertEquals(
-                                                               bin2hex( $head . UTF8_REPLACEMENT . $tail ),
-                                                               bin2hex( $clean ),
-                                                               "Overlong triplet $x should be rejected" );
-                                               } elseif ( $first == 0xed &&
-                                                       ( chr( $first ) . chr( $second ) . chr( $third ) ) >= UTF8_SURROGATE_FIRST
-                                               ) {
-                                                       $this->assertEquals(
-                                                               bin2hex( $head . UTF8_REPLACEMENT . $tail ),
-                                                               bin2hex( $clean ),
-                                                               "Surrogate triplet $x should be rejected" );
-                                               } else {
-                                                       $this->assertEquals(
-                                                               bin2hex( UtfNormal::NFC( $char ) ),
-                                                               bin2hex( $clean ),
-                                                               "Triplet $x should be intact" );
-                                               }
-                                       } elseif ( $first > 0xc1 && $first < 0xe0 && $second < 0xc0 ) {
-                                               $this->assertEquals(
-                                                       bin2hex( UtfNormal::NFC( $head . chr( $first ) .
-                                                                       chr( $second ) ) . UTF8_REPLACEMENT . $tail ),
-                                                       bin2hex( $clean ),
-                                                       "Valid 2-byte $x + broken tail" );
-                                       } elseif ( $second > 0xc1 && $second < 0xe0 && $third < 0xc0 ) {
-                                               $this->assertEquals(
-                                                       bin2hex( $head . UTF8_REPLACEMENT .
-                                                               UtfNormal::NFC( chr( $second ) . chr( $third ) . $tail ) ),
-                                                       bin2hex( $clean ),
-                                                       "Broken head + valid 2-byte $x" );
-                                       } elseif ( ( $first > 0xfd || $second > 0xfd ) &&
-                                               ( ( $second > 0xbf && $third > 0xbf ) ||
-                                                       ( $second < 0xc0 && $third < 0xc0 ) ||
-                                                       ( $second > 0xfd ) ||
-                                                       ( $third > 0xfd ) )
-                                       ) {
-                                               # fe and ff are not legal head bytes -- expect three replacement chars
-                                               $this->assertEquals(
-                                                       bin2hex( $head . UTF8_REPLACEMENT . UTF8_REPLACEMENT . UTF8_REPLACEMENT . $tail ),
-                                                       bin2hex( $clean ),
-                                                       "Forbidden triplet $x should be rejected" );
-                                       } elseif ( $first > 0xc2 && $second < 0xc0 && $third < 0xc0 ) {
-                                               $this->assertEquals(
-                                                       bin2hex( $head . UTF8_REPLACEMENT . $tail ),
-                                                       bin2hex( $clean ),
-                                                       "Forbidden triplet $x should be rejected" );
-                                       } else {
-                                               $this->assertEquals(
-                                                       bin2hex( $head . UTF8_REPLACEMENT . UTF8_REPLACEMENT . $tail ),
-                                                       bin2hex( $clean ),
-                                                       "Forbidden triplet $x should be rejected" );
-                                       }
-                               }
-                       }
-               }
-       }
-
-       public function testChunkRegression() {
-               # Check for regression against a chunking bug
-               $text = "\x46\x55\xb8" .
-                       "\xdc\x96" .
-                       "\xee" .
-                       "\xe7" .
-                       "\x44" .
-                       "\xaa" .
-                       "\x2f\x25";
-               $expect = "\x46\x55\xef\xbf\xbd" .
-                       "\xdc\x96" .
-                       "\xef\xbf\xbd" .
-                       "\xef\xbf\xbd" .
-                       "\x44" .
-                       "\xef\xbf\xbd" .
-                       "\x2f\x25";
-
-               $this->assertEquals(
-                       bin2hex( $expect ),
-                       bin2hex( UtfNormal::cleanUp( $text ) ) );
-       }
-
-       public function testInterposeRegression() {
-               $text = "\x4e\x30" .
-                       "\xb1" . # bad tail
-                       "\x3a" .
-                       "\x92" . # bad tail
-                       "\x62\x3a" .
-                       "\x84" . # bad tail
-                       "\x43" .
-                       "\xc6" . # bad head
-                       "\x3f" .
-                       "\x92" . # bad tail
-                       "\xad" . # bad tail
-                       "\x7d" .
-                       "\xd9\x95";
-
-               $expect = "\x4e\x30" .
-                       "\xef\xbf\xbd" .
-                       "\x3a" .
-                       "\xef\xbf\xbd" .
-                       "\x62\x3a" .
-                       "\xef\xbf\xbd" .
-                       "\x43" .
-                       "\xef\xbf\xbd" .
-                       "\x3f" .
-                       "\xef\xbf\xbd" .
-                       "\xef\xbf\xbd" .
-                       "\x7d" .
-                       "\xd9\x95";
-
-               $this->assertEquals(
-                       bin2hex( $expect ),
-                       bin2hex( UtfNormal::cleanUp( $text ) ) );
-       }
-
-       public function testOverlongRegression() {
-               $text = "\x67" .
-                       "\x1a" . # forbidden ascii
-                       "\xea" . # bad head
-                       "\xc1\xa6" . # overlong sequence
-                       "\xad" . # bad tail
-                       "\x1c" . # forbidden ascii
-                       "\xb0" . # bad tail
-                       "\x3c" .
-                       "\x9e"; # bad tail
-               $expect = "\x67" .
-                       "\xef\xbf\xbd" .
-                       "\xef\xbf\xbd" .
-                       "\xef\xbf\xbd" .
-                       "\xef\xbf\xbd" .
-                       "\xef\xbf\xbd" .
-                       "\xef\xbf\xbd" .
-                       "\x3c" .
-                       "\xef\xbf\xbd";
-               $this->assertEquals(
-                       bin2hex( $expect ),
-                       bin2hex( UtfNormal::cleanUp( $text ) ) );
-       }
-
-       public function testSurrogateRegression() {
-               $text = "\xed\xb4\x96" . # surrogate 0xDD16
-                       "\x83" . # bad tail
-                       "\xb4" . # bad tail
-                       "\xac"; # bad head
-               $expect = "\xef\xbf\xbd" .
-                       "\xef\xbf\xbd" .
-                       "\xef\xbf\xbd" .
-                       "\xef\xbf\xbd";
-               $this->assertEquals(
-                       bin2hex( $expect ),
-                       bin2hex( UtfNormal::cleanUp( $text ) ) );
-       }
-
-       public function testBomRegression() {
-               $text = "\xef\xbf\xbe" . # U+FFFE, illegal char
-                       "\xb2" . # bad tail
-                       "\xef" . # bad head
-                       "\x59";
-               $expect = "\xef\xbf\xbd" .
-                       "\xef\xbf\xbd" .
-                       "\xef\xbf\xbd" .
-                       "\x59";
-               $this->assertEquals(
-                       bin2hex( $expect ),
-                       bin2hex( UtfNormal::cleanUp( $text ) ) );
-       }
-
-       public function testForbiddenRegression() {
-               $text = "\xef\xbf\xbf"; # U+FFFF, illegal char
-               $expect = "\xef\xbf\xbd";
-               $this->assertEquals(
-                       bin2hex( $expect ),
-                       bin2hex( UtfNormal::cleanUp( $text ) ) );
-       }
-
-       public function testHangulRegression() {
-               $text = "\xed\x9c\xaf" . # Hangul char
-                       "\xe1\x87\x81"; # followed by another final jamo
-               $expect = $text; # Should *not* change.
-               $this->assertEquals(
-                       bin2hex( $expect ),
-                       bin2hex( UtfNormal::cleanUp( $text ) ) );
-       }
-}
index 010ae66..3ce3e1f 100644 (file)
@@ -124,7 +124,7 @@ class NewParserTest extends MediaWikiTestCase {
                $tmpGlobals['wgFileExtensions'][] = 'svg';
                $tmpGlobals['wgSVGConverter'] = 'rsvg';
                $tmpGlobals['wgSVGConverters']['rsvg'] =
-                       '$path/rsvg-convert -w $width -h $height $input -o $output';
+                       '$path/rsvg-convert -w $width -h $height -o $output $input';
 
                if ( $GLOBALS['wgStyleDirectory'] === false ) {
                        $tmpGlobals['wgStyleDirectory'] = "$IP/skins";
@@ -480,16 +480,16 @@ class NewParserTest extends MediaWikiTestCase {
         */
        protected function getUploadDir() {
                if ( $this->keepUploads ) {
+                       // Don't use getNewTempDirectory() as this is meant to persist
                        $dir = wfTempDir() . '/mwParser-images';
 
                        if ( is_dir( $dir ) ) {
                                return $dir;
                        }
                } else {
-                       $dir = wfTempDir() . "/mwParser-" . mt_rand() . "-images";
+                       $dir = $this->getNewTempDirectory();
                }
 
-               // wfDebug( "Creating upload directory $dir\n" );
                if ( file_exists( $dir ) ) {
                        wfDebug( "Already exists!\n" );
 
index 221c258..b4c225c 100644 (file)
@@ -18,6 +18,23 @@ class ExtensionProcessorTest extends MediaWikiTestCase {
                'name' => 'FooBar',
        );
 
+       /**
+        * @covers ExtensionProcessor::extractInfo
+        */
+       public function testExtractInfo() {
+               // Test that attributes that begin with @ are ignored
+               $processor = new ExtensionProcessor();
+               $processor->extractInfo( $this->dir, self::$default + array(
+                       '@metadata' => array( 'foobarbaz' ),
+                       'AnAttribute' => array( 'omg' ),
+               ) );
+
+               $extracted = $processor->getExtractedInfo();
+               $attributes = $extracted['attributes'];
+               $this->assertArrayHasKey( 'AnAttribute', $attributes );
+               $this->assertArrayNotHasKey( '@metadata', $attributes );
+       }
+
        public static function provideRegisterHooks() {
                return array(
                        // No hooks
@@ -70,12 +87,181 @@ class ExtensionProcessorTest extends MediaWikiTestCase {
                        'config' => array(
                                'Bar' => 'somevalue',
                                'Foo' => 10,
+                               '@IGNORED' => 'yes',
                        ),
                ) + self::$default;
                $processor->extractInfo( $this->dir, $info );
                $extracted = $processor->getExtractedInfo();
                $this->assertEquals( 'somevalue', $extracted['globals']['wgBar'] );
                $this->assertEquals( 10, $extracted['globals']['wgFoo'] );
+               $this->assertArrayNotHasKey( 'wg@IGNORED', $extracted['globals'] );
+       }
+
+       public static function provideExtracttExtensionMessagesFiles() {
+               $dir = __DIR__ . '/FooBar/';
+               return array(
+                       array(
+                               array( 'ExtensionMessagesFiles' => array( 'FooBarAlias' => 'FooBar.alias.php' ) ),
+                               array( 'wgExtensionMessagesFiles' => array( 'FooBarAlias' => $dir . 'FooBar.alias.php' ) )
+                       ),
+                       array(
+                               array(
+                                       'ExtensionMessagesFiles' => array(
+                                               'FooBarAlias' => 'FooBar.alias.php',
+                                               'FooBarMagic' => 'FooBar.magic.i18n.php',
+                                       ),
+                               ),
+                               array(
+                                       'wgExtensionMessagesFiles' => array(
+                                               'FooBarAlias' => $dir . 'FooBar.alias.php',
+                                               'FooBarMagic' => $dir . 'FooBar.magic.i18n.php',
+                                       ),
+                               ),
+                       ),
+               );
+       }
+
+       /**
+        * @covers ExtensionProcessor::extracttExtensionMessagesFiles
+        * @dataProvider provideExtracttExtensionMessagesFiles
+        */
+       public function testExtracttExtensionMessagesFiles( $input, $expected ) {
+               $processor = new ExtensionProcessor();
+               $processor->extractInfo( $this->dir, $input + self::$default );
+               $out = $processor->getExtractedInfo();
+               foreach ( $expected as $key => $value ) {
+                       $this->assertEquals( $value, $out['globals'][$key] );
+               }
+       }
+
+
+       public static function provideExtractMessagesDirs() {
+               $dir = __DIR__ . '/FooBar/';
+               return array(
+                       array(
+                               array( 'MessagesDirs' => array( 'VisualEditor' => 'i18n' ) ),
+                               array( 'wgMessagesDirs' => array( 'VisualEditor' => array( $dir . 'i18n' ) ) )
+                       ),
+                       array(
+                               array( 'MessagesDirs' => array( 'VisualEditor' => array( 'i18n', 'foobar' ) ) ),
+                               array( 'wgMessagesDirs' => array( 'VisualEditor' => array( $dir . 'i18n', $dir . 'foobar' ) ) )
+                       ),
+               );
+       }
+
+       /**
+        * @covers ExtensionProcessor::extractMessagesDirs
+        * @dataProvider provideExtractMessagesDirs
+        */
+       public function testExtractMessagesDirs( $input, $expected ) {
+               $processor = new ExtensionProcessor();
+               $processor->extractInfo( $this->dir, $input + self::$default );
+               $out = $processor->getExtractedInfo();
+               foreach ( $expected as $key => $value ) {
+                       $this->assertEquals( $value, $out['globals'][$key] );
+               }
+       }
+
+       /**
+        * @covers ExtensionProcessor::extractResourceLoaderModules
+        * @dataProvider provideExtractResourceLoaderModules
+        */
+       public function testExtractResourceLoaderModules( $input, $expected ) {
+               $processor = new ExtensionProcessor();
+               $processor->extractInfo( $this->dir, $input + self::$default );
+               $out = $processor->getExtractedInfo();
+               foreach ( $expected as $key => $value ) {
+                       $this->assertEquals( $value, $out['globals'][$key] );
+               }
+       }
+
+       public static function provideExtractResourceLoaderModules() {
+               $dir = __DIR__ . '/FooBar/';
+               return array(
+                       // Generic module with localBasePath/remoteExtPath specified
+                       array(
+                               // Input
+                               array(
+                                       'ResourceModules' => array(
+                                               'test.foo' => array(
+                                                       'styles' => 'foobar.js',
+                                                       'localBasePath' => '',
+                                                       'remoteExtPath' => 'FooBar',
+                                               ),
+                                       ),
+                               ),
+                               // Expected
+                               array(
+                                       'wgResourceModules' => array(
+                                               'test.foo' => array(
+                                                       'styles' => 'foobar.js',
+                                                       'localBasePath' => $dir,
+                                                       'remoteExtPath' => 'FooBar',
+                                               ),
+                                       ),
+                               ),
+                       ),
+                       // ResourceFileModulePaths specified:
+                       array(
+                               // Input
+                               array(
+                                       'ResourceFileModulePaths' => array(
+                                               'localBasePath' => '',
+                                               'remoteExtPath' => 'FooBar',
+                                       ),
+                                       'ResourceModules' => array(
+                                               // No paths
+                                               'test.foo' => array(
+                                                       'styles' => 'foo.js',
+                                               ),
+                                               // Different paths set
+                                               'test.bar' => array(
+                                                       'styles' => 'bar.js',
+                                                       'localBasePath' => 'subdir',
+                                                       'remoteExtPath' => 'FooBar/subdir',
+                                               ),
+                                               // Custom class with no paths set
+                                               'test.class' => array(
+                                                       'class' => 'FooBarModule',
+                                                       'extra' => 'argument',
+                                               ),
+                                               // Custom class with a localBasePath
+                                               'test.class.with.path' => array(
+                                                       'class' => 'FooBarPathModule',
+                                                       'extra' => 'argument',
+                                                       'localBasePath' => '',
+                                               )
+                                       ),
+                               ),
+                               // Expected
+                               array(
+                                       'wgResourceModules' => array(
+                                               'test.foo' => array(
+                                                       'styles' => 'foo.js',
+                                                       'localBasePath' => $dir,
+                                                       'remoteExtPath' => 'FooBar',
+                                               ),
+                                               'test.bar' => array(
+                                                       'styles' => 'bar.js',
+                                                       'localBasePath' => $dir . 'subdir',
+                                                       'remoteExtPath' => 'FooBar/subdir',
+                                               ),
+                                               'test.class' => array(
+                                                       'class' => 'FooBarModule',
+                                                       'extra' => 'argument',
+                                                       'localBasePath' => $dir,
+                                                       'remoteExtPath' => 'FooBar',
+                                               ),
+                                               'test.class.with.path' => array(
+                                                       'class' => 'FooBarPathModule',
+                                                       'extra' => 'argument',
+                                                       'localBasePath' => $dir,
+                                                       'remoteExtPath' => 'FooBar',
+                                               )
+                                       ),
+                               ),
+                       ),
+               );
        }
 
        public static function provideSetToGlobal() {
diff --git a/tests/phpunit/includes/registration/ExtensionRegistryTest.php b/tests/phpunit/includes/registration/ExtensionRegistryTest.php
new file mode 100644 (file)
index 0000000..421cab5
--- /dev/null
@@ -0,0 +1,180 @@
+<?php
+
+class ExtensionRegistryTest extends MediaWikiTestCase {
+
+       /**
+        * @covers ExtensionRegistry::exportExtractedData
+        * @dataProvider provideExportExtractedDataGlobals
+        * @@backupGlobals enabled
+        */
+       public function testExportExtractedDataGlobals( $desc, $before, $globals, $expected ) {
+               if ( $before ) {
+                       foreach ( $before as $key => $value ) {
+                               $GLOBALS[$key] = $value;
+                       }
+               }
+               $info = array(
+                       'globals' => $globals,
+                       'callbacks' => array(),
+                       'defines' => array(),
+                       'credits' => array(),
+                       'attributes' => array(),
+               );
+               $registry = new ExtensionRegistry();
+               $class = new ReflectionClass( 'ExtensionRegistry' );
+               $method = $class->getMethod( 'exportExtractedData' );
+               $method->setAccessible( true );
+               $method->invokeArgs( $registry, array( $info ) );
+               foreach ( $expected as $name => $value ) {
+                       $this->assertArrayHasKey( $name, $GLOBALS, $desc );
+                       $this->assertEquals( $value, $GLOBALS[$name], $desc );
+               }
+       }
+
+       public static function provideExportExtractedDataGlobals() {
+               // "mwtest" prefix used instead of "$wg" to avoid potential conflicts
+               return array(
+                       array(
+                               'Simple non-array values',
+                               array(
+                                       'mwtestFooBarConfig' => true,
+                                       'mwtestFooBarConfig2' => 'string',
+                               ),
+                               array(
+                                       'mwtestFooBarDefault' => 1234,
+                                       'mwtestFooBarConfig' => false,
+                               ),
+                               array(
+                                       'mwtestFooBarConfig' => true,
+                                       'mwtestFooBarConfig2' => 'string',
+                                       'mwtestFooBarDefault' => 1234,
+                               ),
+                       ),
+                       array(
+                               'No global already set, simple array',
+                               null,
+                               array(
+                                       'mwtestDefaultOptions' => array(
+                                               'foobar' => true,
+                                       )
+                               ),
+                               array(
+                                       'mwtestDefaultOptions' => array(
+                                               'foobar' => true,
+                                       )
+                               ),
+                       ),
+                       array(
+                               'Global already set, simple array',
+                               array(
+                                       'mwtestDefaultOptions' => array(
+                                               'foobar' => true,
+                                               'foo' => 'string'
+                                       ),
+                               ),
+                               array(
+                                       'mwtestDefaultOptions' => array(
+                                               'barbaz' => 12345,
+                                               'foobar' => false,
+                                       ),
+                               ),
+                               array(
+                                       'mwtestDefaultOptions' => array(
+                                               'barbaz' => 12345,
+                                               'foo' => 'string',
+                                               'foobar' => true,
+                                       ),
+                               )
+                       ),
+                       array(
+                               'No global already set, $wgHooks',
+                               array(
+                                       'wgHooks' => array(),
+                               ),
+                               array(
+                                       'wgHooks' => array(
+                                               'FooBarEvent' => array(
+                                                       'FooBarClass::onFooBarEvent'
+                                               ),
+                                       ),
+                               ),
+                               array(
+                                       'wgHooks' => array(
+                                               'FooBarEvent' => array(
+                                                       'FooBarClass::onFooBarEvent'
+                                               ),
+                                       ),
+                               ),
+                       ),
+                       array(
+                               'Global already set, $wgHooks',
+                               array(
+                                       'wgHooks' => array(
+                                               'FooBarEvent' => array(
+                                                       'FooBarClass::onFooBarEvent'
+                                               ),
+                                               'BazBarEvent' => array(
+                                                       'FooBarClass::onBazBarEvent',
+                                               ),
+                                       ),
+                               ),
+                               array(
+                                       'wgHooks' => array(
+                                               'FooBarEvent' => array(
+                                                       'BazBarClass::onFooBarEvent',
+                                               ),
+                                       ),
+                               ),
+                               array(
+                                       'wgHooks' => array(
+                                               'FooBarEvent' => array(
+                                                       'FooBarClass::onFooBarEvent',
+                                                       'BazBarClass::onFooBarEvent',
+                                               ),
+                                               'BazBarEvent' => array(
+                                                       'FooBarClass::onBazBarEvent',
+                                               ),
+                                       ),
+                               ),
+                       ),
+                       array(
+                               'Global already set, $wgGroupPermissions',
+                               array(
+                                       'wgGroupPermissions' => array(
+                                               'sysop' => array(
+                                                       'something' => true,
+                                               ),
+                                               'user' => array(
+                                                       'somethingtwo' => true,
+                                               )
+                                       ),
+                               ),
+                               array(
+                                       'wgGroupPermissions' => array(
+                                               'customgroup' => array(
+                                                       'right' => true,
+                                               ),
+                                               'user' => array(
+                                                       'right' => true,
+                                                       'somethingtwo' => false,
+                                               )
+                                       ),
+                               ),
+                               array(
+                                       'wgGroupPermissions' => array(
+                                               'customgroup' => array(
+                                                       'right' => true,
+                                               ),
+                                               'sysop' => array(
+                                                       'something' => true,
+                                               ),
+                                               'user' => array(
+                                                       'somethingtwo' => true,
+                                                       'right' => true,
+                                               )
+                                       ),
+                               ),
+                       )
+               );
+       }
+}
index f23b264..63ad8c0 100644 (file)
@@ -93,7 +93,7 @@ class UploadBaseTest extends MediaWikiTestCase {
 
        // Helper used to create an empty file of size $size.
        private function createFileOfSize( $size ) {
-               $filename = tempnam( wfTempDir(), "mwuploadtest" );
+               $filename = $this->getNewTempFile();
 
                $fh = fopen( $filename, 'w' );
                ftruncate( $fh, $size );
@@ -118,7 +118,6 @@ class UploadBaseTest extends MediaWikiTestCase {
                $filename = $this->createFileOfSize( 100 );
                $this->upload->initializePathInfo( basename( $filename ) . '.txt', $filename, 100 );
                $result = $this->upload->verifyUpload();
-               unlink( $filename );
 
                $this->assertEquals(
                        array( 'status' => UploadBase::OK ),
diff --git a/tests/phpunit/includes/utils/StringUtilsTest.php b/tests/phpunit/includes/utils/StringUtilsTest.php
deleted file mode 100644 (file)
index 7c24fae..0000000
+++ /dev/null
@@ -1,149 +0,0 @@
-<?php
-
-class StringUtilsTest extends PHPUnit_Framework_TestCase {
-
-       /**
-        * This tests StringUtils::isUtf8 whenever we have the mbstring extension
-        * loaded.
-        *
-        * @covers StringUtils::isUtf8
-        * @dataProvider provideStringsForIsUtf8Check
-        */
-       public function testIsUtf8WithMbstring( $expected, $string ) {
-               if ( !function_exists( 'mb_check_encoding' ) ) {
-                       $this->markTestSkipped( 'Test requires the mbstring PHP extension' );
-               }
-               $this->assertEquals( $expected,
-                       StringUtils::isUtf8( $string ),
-                       'Testing string "' . $this->escaped( $string ) . '" with mb_check_encoding'
-               );
-       }
-
-       /**
-        * This tests StringUtils::isUtf8 making sure we use the pure PHP
-        * implementation used as a fallback when mb_check_encoding() is
-        * not available.
-        *
-        * @covers StringUtils::isUtf8
-        * @dataProvider provideStringsForIsUtf8Check
-        */
-       public function testIsUtf8WithPhpFallbackImplementation( $expected, $string ) {
-               $this->assertEquals( $expected,
-                       StringUtils::isUtf8( $string, /** disable mbstring: */true ),
-                       'Testing string "' . $this->escaped( $string ) . '" with pure PHP implementation'
-               );
-       }
-
-       /**
-        * Print high range characters as a hexadecimal
-        * @param string $string
-        * @return string
-        */
-       function escaped( $string ) {
-               $escaped = '';
-               $length = strlen( $string );
-               for ( $i = 0; $i < $length; $i++ ) {
-                       $char = $string[$i];
-                       $val = ord( $char );
-                       if ( $val > 127 ) {
-                               $escaped .= '\x' . dechex( $val );
-                       } else {
-                               $escaped .= $char;
-                       }
-               }
-
-               return $escaped;
-       }
-
-       /**
-        * See also "UTF-8 decoder capability and stress test" by
-        * Markus Kuhn:
-        * http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt
-        */
-       public static function provideStringsForIsUtf8Check() {
-               // Expected return values for StringUtils::isUtf8()
-               $PASS = true;
-               $FAIL = false;
-
-               return array(
-                       'some ASCII' => array( $PASS, 'Some ASCII' ),
-                       'euro sign' => array( $PASS, "Euro sign €" ),
-
-                       'first possible sequence 1 byte' => array( $PASS, "\x00" ),
-                       'first possible sequence 2 bytes' => array( $PASS, "\xc2\x80" ),
-                       'first possible sequence 3 bytes' => array( $PASS, "\xe0\xa0\x80" ),
-                       'first possible sequence 4 bytes' => array( $PASS, "\xf0\x90\x80\x80" ),
-                       'first possible sequence 5 bytes' => array( $FAIL, "\xf8\x88\x80\x80\x80" ),
-                       'first possible sequence 6 bytes' => array( $FAIL, "\xfc\x84\x80\x80\x80\x80" ),
-
-                       'last possible sequence 1 byte' => array( $PASS, "\x7f" ),
-                       'last possible sequence 2 bytes' => array( $PASS, "\xdf\xbf" ),
-                       'last possible sequence 3 bytes' => array( $PASS, "\xef\xbf\xbf" ),
-                       'last possible sequence 4 bytes (U+1FFFFF)' => array( $FAIL, "\xf7\xbf\xbf\xbf" ),
-                       'last possible sequence 5 bytes' => array( $FAIL, "\xfb\xbf\xbf\xbf\xbf" ),
-                       'last possible sequence 6 bytes' => array( $FAIL, "\xfd\xbf\xbf\xbf\xbf\xbf" ),
-
-                       'boundary 1' => array( $PASS, "\xed\x9f\xbf" ),
-                       'boundary 2' => array( $PASS, "\xee\x80\x80" ),
-                       'boundary 3' => array( $PASS, "\xef\xbf\xbd" ),
-                       'boundary 4' => array( $PASS, "\xf2\x80\x80\x80" ),
-                       'boundary 5 (U+FFFFF)' => array( $PASS, "\xf3\xbf\xbf\xbf" ),
-                       'boundary 6 (U+100000)' => array( $PASS, "\xf4\x80\x80\x80" ),
-                       'boundary 7 (U+10FFFF)' => array( $PASS, "\xf4\x8f\xbf\xbf" ),
-                       'boundary 8 (U+110000)' => array( $FAIL, "\xf4\x90\x80\x80" ),
-
-                       'malformed 1' => array( $FAIL, "\x80" ),
-                       'malformed 2' => array( $FAIL, "\xbf" ),
-                       'malformed 3' => array( $FAIL, "\x80\xbf" ),
-                       'malformed 4' => array( $FAIL, "\x80\xbf\x80" ),
-                       'malformed 5' => array( $FAIL, "\x80\xbf\x80\xbf" ),
-                       'malformed 6' => array( $FAIL, "\x80\xbf\x80\xbf\x80" ),
-                       'malformed 7' => array( $FAIL, "\x80\xbf\x80\xbf\x80\xbf" ),
-                       'malformed 8' => array( $FAIL, "\x80\xbf\x80\xbf\x80\xbf\x80" ),
-
-                       'last byte missing 1' => array( $FAIL, "\xc0" ),
-                       'last byte missing 2' => array( $FAIL, "\xe0\x80" ),
-                       'last byte missing 3' => array( $FAIL, "\xf0\x80\x80" ),
-                       'last byte missing 4' => array( $FAIL, "\xf8\x80\x80\x80" ),
-                       'last byte missing 5' => array( $FAIL, "\xfc\x80\x80\x80\x80" ),
-                       'last byte missing 6' => array( $FAIL, "\xdf" ),
-                       'last byte missing 7' => array( $FAIL, "\xef\xbf" ),
-                       'last byte missing 8' => array( $FAIL, "\xf7\xbf\xbf" ),
-                       'last byte missing 9' => array( $FAIL, "\xfb\xbf\xbf\xbf" ),
-                       'last byte missing 10' => array( $FAIL, "\xfd\xbf\xbf\xbf\xbf" ),
-
-                       'extra continuation byte 1' => array( $FAIL, "e\xaf" ),
-                       'extra continuation byte 2' => array( $FAIL, "\xc3\x89\xaf" ),
-                       'extra continuation byte 3' => array( $FAIL, "\xef\xbc\xa5\xaf" ),
-                       'extra continuation byte 4' => array( $FAIL, "\xf0\x9d\x99\xb4\xaf" ),
-
-                       'impossible bytes 1' => array( $FAIL, "\xfe" ),
-                       'impossible bytes 2' => array( $FAIL, "\xff" ),
-                       'impossible bytes 3' => array( $FAIL, "\xfe\xfe\xff\xff" ),
-
-                       'overlong sequences 1' => array( $FAIL, "\xc0\xaf" ),
-                       'overlong sequences 2' => array( $FAIL, "\xc1\xaf" ),
-                       'overlong sequences 3' => array( $FAIL, "\xe0\x80\xaf" ),
-                       'overlong sequences 4' => array( $FAIL, "\xf0\x80\x80\xaf" ),
-                       'overlong sequences 5' => array( $FAIL, "\xf8\x80\x80\x80\xaf" ),
-                       'overlong sequences 6' => array( $FAIL, "\xfc\x80\x80\x80\x80\xaf" ),
-
-                       'maximum overlong sequences 1' => array( $FAIL, "\xc1\xbf" ),
-                       'maximum overlong sequences 2' => array( $FAIL, "\xe0\x9f\xbf" ),
-                       'maximum overlong sequences 3' => array( $FAIL, "\xf0\x8f\xbf\xbf" ),
-                       'maximum overlong sequences 4' => array( $FAIL, "\xf8\x87\xbf\xbf" ),
-                       'maximum overlong sequences 5' => array( $FAIL, "\xfc\x83\xbf\xbf\xbf\xbf" ),
-
-                       'surrogates 1 (U+D799)' => array( $PASS, "\xed\x9f\xbf" ),
-                       'surrogates 2 (U+E000)' => array( $PASS, "\xee\x80\x80" ),
-                       'surrogates 3 (U+D800)' => array( $FAIL, "\xed\xa0\x80" ),
-                       'surrogates 4 (U+DBFF)' => array( $FAIL, "\xed\xaf\xbf" ),
-                       'surrogates 5 (U+DC00)' => array( $FAIL, "\xed\xb0\x80" ),
-                       'surrogates 6 (U+DFFF)' => array( $FAIL, "\xed\xbf\xbf" ),
-                       'surrogates 7 (U+D800 U+DC00)' => array( $FAIL, "\xed\xa0\x80\xed\xb0\x80" ),
-
-                       'noncharacters 1' => array( $PASS, "\xef\xbf\xbe" ),
-                       'noncharacters 2' => array( $PASS, "\xef\xbf\xbf" ),
-               );
-       }
-}
index 6ef2e23..0a977dc 100644 (file)
@@ -415,7 +415,10 @@ class TextPassDumperTest extends DumpTestCase {
        }
 
        /**
+        * Broken per T70653.
+        *
         * @group large
+        * @group Broken
         */
        function testCheckpointPlain() {
                $this->checkpointHelper();
@@ -431,7 +434,10 @@ class TextPassDumperTest extends DumpTestCase {
         * PHP extensions, we go for gzip instead, which triggers the same relevant code
         * paths while still being testable on more systems.
         *
+        * Broken per T70653.
+        *
         * @group large
+        * @group Broken
         */
        function testCheckpointGzip() {
                $this->checkHasGzip();
index 860408f..1acbc24 100644 (file)
@@ -58,7 +58,6 @@ phpunit.php enables colors for other OSs at runtime
                        <directory suffix=".php">../../includes</directory>
                        <directory suffix=".php">../../languages</directory>
                        <directory suffix=".php">../../maintenance</directory>
-                       <directory suffix=".php">../../resources</directory>
                        <directory suffix=".php">../../skins</directory>
                </whitelist>
        </filter>
index 29834c1..4bcd814 100644 (file)
@@ -60,6 +60,7 @@ return array(
                        'tests/qunit/suites/resources/jquery/jquery.placeholder.test.js',
                        'tests/qunit/suites/resources/jquery/jquery.tabIndex.test.js',
                        'tests/qunit/suites/resources/jquery/jquery.tablesorter.test.js',
+                       'tests/qunit/suites/resources/jquery/jquery.tablesorter.parsers.test.js',
                        'tests/qunit/suites/resources/jquery/jquery.textSelection.test.js',
                        'tests/qunit/data/mediawiki.jqueryMsg.data.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js',
index f6ea1b4..4484467 100644 (file)
@@ -7,7 +7,7 @@
        } ) );
 
        var getAccessKeyPrefixTestData = [
-                       //ua string, platform string, expected prefix
+                       // ua string, platform string, expected prefix
                        // Internet Explorer
                        ['Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)', 'Win32', 'alt-'],
                        ['Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)', 'Win32', 'alt-'],
                        ['Mozilla/5.0 (Macintosh; Intel Mac OS X 10_5_8) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.112 Safari/534.30', 'MacIntel', 'ctrl-option-'],
                        ['Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.68 Safari/534.30', 'Linux i686', 'alt-shift-']
                ],
-               //strings appended to title to make sure updateTooltipAccessKeys handles them correctly
+               // strings appended to title to make sure updateTooltipAccessKeys handles them correctly
                updateTooltipAccessKeysTestData = [ '', ' [a]', ' [test-a]', ' [alt-b]' ];
 
        function makeInput( title, accessKey ) {
-               //The properties aren't escaped, so make sure you don't call this function with values that need to be escaped!
+               // The properties aren't escaped, so make sure you don't call this function with values that need to be escaped!
                return '<input title="' + title + '" ' + ( accessKey ? 'accessKey="' + accessKey + '" ' : '' ) + ' />';
        }
 
        } );
 
        QUnit.test( 'updateTooltipAccessKeys - current browser', 2, function ( assert ) {
-               var title = $( makeInput ( 'Title', 'a' ) ).updateTooltipAccessKeys().prop( 'title' ),
-                       //The new title should be something like "Title [alt-a]", but the exact label will depend on the browser.
-                       //The "a" could be capitalized, and the prefix could be anything, e.g. a simple "^" for ctrl-
-                       //(no browser is known using such a short prefix, though) or "Alt+Umschalt+" in German Firefox.
+               var title = $( makeInput( 'Title', 'a' ) ).updateTooltipAccessKeys().prop( 'title' ),
+                       // The new title should be something like "Title [alt-a]", but the exact label will depend on the browser.
+                       // The "a" could be capitalized, and the prefix could be anything, e.g. a simple "^" for ctrl-
+                       // (no browser is known using such a short prefix, though) or "Alt+Umschalt+" in German Firefox.
                        result = /^Title \[(.+)[aA]\]$/.exec( title );
                assert.ok( result, 'title should match expected structure.' );
                assert.notEqual( result[1], 'test-', 'Prefix used for testing shouldn\'t be used in production.' );
index bbea829..78c185f 100644 (file)
@@ -1,10 +1,10 @@
-(function ($) {
+( function ($) {
 
        QUnit.module('jquery.placeholder', QUnit.newMwEnvironment());
 
        QUnit.test('caches results of feature tests', 2, function (assert) {
-               assert.strictEqual(typeof $.fn.placeholder.input, 'boolean', '$.fn.placeholder.input');
-               assert.strictEqual(typeof $.fn.placeholder.textarea, 'boolean', '$.fn.placeholder.textarea');
+               assert.strictEqual( typeof $.fn.placeholder.input, 'boolean', '$.fn.placeholder.input');
+               assert.strictEqual( typeof $.fn.placeholder.textarea, 'boolean', '$.fn.placeholder.textarea');
        });
 
        if ($.fn.placeholder.input && $.fn.placeholder.textarea) {
diff --git a/tests/qunit/suites/resources/jquery/jquery.tablesorter.parsers.test.js b/tests/qunit/suites/resources/jquery/jquery.tablesorter.parsers.test.js
new file mode 100644 (file)
index 0000000..2c56eea
--- /dev/null
@@ -0,0 +1,200 @@
+( function ( $, mw ) {
+       /**
+        * This module tests the input/output capabilities of the parsers of tablesorter.
+        * It does not test actual sorting.
+        */
+
+       var text, ipv4,
+               simpleMDYDatesInMDY, simpleMDYDatesInDMY, oldMDYDates, complexMDYDates, clobberedDates, MYDates, YDates,
+               currencyData, transformedCurrencyData,
+               config = {
+                       wgContentLanguage: 'en',
+                       /* default date format of the content language */
+                       wgDefaultDateFormat: 'dmy',
+                       /* These two are important for numeric interpretations */
+                       wgSeparatorTransformTable: ['', ''],
+                       wgDigitTransformTable: ['', '']
+               };
+
+       QUnit.module( 'jquery.tablesorter.parsers', QUnit.newMwEnvironment( { config: config } ) );
+
+       /**
+        * For a value, check if the parser recognizes it and how it transforms it
+        *
+        * @param {String} msg text to pass on to qunit describing the test case
+        * @param {String[]} parserId of the parser that will be tested
+        * @param {String[][]} data Array of testcases. Each testcase, array of
+        *              inputValue: The string value that we want to test the parser for
+        *              recognized: If we expect that this value's type is detectable by the parser
+        *              outputValue: The value the parser has converted the input to
+        *              msg: describing the testcase
+        * @param {function($table)} callback something to do before we start the testcase
+        */
+       function parserTest( msg, parserId, data, callback ) {
+               QUnit.test( msg, data.length * 2, function ( assert ) {
+                       var extractedR, extractedF, parser;
+
+                       if (callback !== undefined ) {
+                               callback();
+                       }
+
+                       parser = $.tablesorter.getParser( parserId );
+                       $.each( data, function ( index, testcase ) {
+                               extractedR = parser.is( testcase[0] );
+                               extractedF = parser.format( testcase[0] );
+
+                               assert.strictEqual( extractedR, testcase[1], 'Detect: ' + testcase[3] );
+                               assert.strictEqual( extractedF, testcase[2], 'Sortkey: ' + testcase[3] );
+                       } );
+
+               } );
+       }
+
+       text  = [
+               [ 'Mars', true, 'mars', 'Simple text' ],
+               [ 'Mẘas', true, 'mẘas', 'Non ascii character' ],
+               [ 'A sentence', true, 'a sentence', 'A sentence with space chars' ]
+       ];
+       parserTest( 'Textual keys', 'text', text );
+
+       ipv4 = [
+               // Some randomly generated fake IPs
+               ['0.0.0.0', true, 0, 'An IP address' ],
+               ['255.255.255.255', true, 255255255255, 'An IP address' ],
+               ['45.238.27.109', true, 45238027109, 'An IP address' ],
+               ['1.238.27.1', true, 1238027001, 'An IP address with small numbers' ],
+               ['238.27.1', false, 238027001, 'A malformed IP Address' ],
+               ['1', false, 1, 'A super malformed IP Address' ],
+               ['Just text', false, 0, 'A line with just text' ],
+               ['45.238.27.109Postfix', false, 45238027109, 'An IP address with a connected postfix' ],
+               ['45.238.27.109 postfix', false, 45238027109, 'An IP address with a seperated postfix' ]
+       ];
+       parserTest( 'IPv4', 'IPAddress', ipv4 );
+
+       simpleMDYDatesInMDY = [
+               ['January 17, 2010',    true, 20100117, 'Long middle endian date'],
+               ['Jan 17, 2010',        true, 20100117, 'Short middle endian date'],
+               ['1/17/2010',           true, 20100117, 'Numeric middle endian date'],
+               ['01/17/2010',          true, 20100117, 'Numeric middle endian date with padding on month'],
+               ['01/07/2010',          true, 20100107, 'Numeric middle endian date with padding on day'],
+               ['01/07/0010',          true, 20100107, 'Numeric middle endian date with padding on year'],
+               ['5.12.1990',           true, 19900512, 'Numeric middle endian date with . separator']
+       ];
+       parserTest( 'MDY Dates using mdy content language', 'date', simpleMDYDatesInMDY );
+
+       simpleMDYDatesInDMY = [
+               ['January 17, 2010',    true, 20100117, 'Long middle endian date'],
+               ['Jan 17, 2010',        true, 20100117, 'Short middle endian date'],
+               ['1/17/2010',           true, 20101701, 'Numeric middle endian date'],
+               ['01/17/2010',          true, 20101701, 'Numeric middle endian date with padding on month'],
+               ['01/07/2010',          true, 20100701, 'Numeric middle endian date with padding on day'],
+               ['01/07/0010',          true, 20100701, 'Numeric middle endian date with padding on year'],
+               ['5.12.1990',           true, 19901205, 'Numeric middle endian date with . separator']
+       ];
+       parserTest( 'MDY Dates using dmy content language', 'date', simpleMDYDatesInDMY, function () {
+               mw.config.set( {
+                       'wgDefaultDateFormat': 'dmy',
+                       'wgContentLanguage': 'de'
+               } );
+       } );
+
+       oldMDYDates = [
+               ['January 19, 1400 BC',         false, '99999999', 'BC'],
+               ['January 19, 1400BC',          false, '99999999', 'Connected BC'],
+               ['January, 19 1400 B.C.',       false, '99999999', 'B.C.'],
+               ['January 19, 1400 AD',         false, '99999999', 'AD'],
+               ['January, 19 10',                      true, 20100119, 'AD'],
+               ['January, 19 1',                       false, '99999999', 'AD']
+       ];
+       parserTest( 'Very old MDY dates', 'date', oldMDYDates );
+
+       complexMDYDates = [
+               ['January, 19 2010',    true, 20100119, 'Comma after month'],
+               ['January 19, 2010',    true, 20100119, 'Comma after day'],
+               ['January/19/2010',             true, 20100119, 'Forward slash separator'],
+               ['04 22 1991',                  true, 19910422, 'Month with 0 padding'],
+               ['April 21 1991',               true, 19910421, 'Space separation'],
+               ['04 22 1991',                  true, 19910422, 'Month with 0 padding'],
+               ['December 12 \'10',    true, 20101212, ''],
+               ['Dec 12 \'10',                 true, 20101212, ''],
+               ['Dec. 12 \'10',                true, 20101212, '']
+       ];
+       parserTest( 'MDY Dates', 'date', complexMDYDates );
+
+       clobberedDates = [
+               ['January, 19 2010 - January, 20 2010', false, '99999999', 'Date range with hyphen'],
+               ['January, 19 2010 — January, 20 2010',       false, '99999999', 'Date range with mdash'],
+               ['prefixJanuary, 19 2010',      false, '99999999', 'Connected prefix'],
+               ['prefix January, 19 2010',     false, '99999999', 'Prefix'],
+               ['December 12 2010postfix',     false, '99999999', 'ConnectedPostfix'],
+               ['December 12 2010 postfix',    false, '99999999', 'Postfix'],
+               ['A simple text',               false, '99999999', 'Plain text in date sort'],
+               ['04l22l1991',                  false, '99999999', 'l char as separator'],
+               ['January\\19\\2010',   false, '99999999', 'backslash as date separator']
+       ];
+       parserTest( 'Clobbered Dates', 'date', clobberedDates );
+
+       MYDates = [
+               ['December 2010',       false, '99999999', 'Plain month year'],
+               ['Dec 2010',            false, '99999999', 'Abreviated month year'],
+               ['12 2010',                     false, '99999999', 'Numeric month year']
+       ];
+       parserTest( 'MY Dates', 'date', MYDates );
+
+       YDates = [
+               ['2010',        false, '99999999', 'Plain 4-digit year'],
+               ['876',         false, '99999999', '3-digit year'],
+               ['76',          false, '99999999', '2-digit year'],
+               ['\'76',        false, '99999999', '2-digit millenium bug year'],
+               ['2010 BC',     false, '99999999', '4-digit year BC']
+       ];
+       parserTest( 'Y Dates', 'date', YDates );
+
+       currencyData = [
+               ['1.02 $',      true, 1.02, ''],
+               ['$ 3.00',      true, 3, ''],
+               ['€ 2,99',    true, 299, ''],
+               ['$ 1.00',      true, 1, ''],
+               ['$3.50',       true, 3.50, ''],
+               ['$ 1.50',      true, 1.50, ''],
+               ['€ 0.99',    true, 0.99, ''],
+               ['$ 299.99',    true, 299.99, ''],
+               ['$ 2,299.99',  true, 2299.99, ''],
+               ['$ 2,989',     true, 2989, ''],
+               ['$ 2 299.99',  true, 2299.99, ''],
+               ['$ 2 989',     true, 2989, ''],
+               ['$ 2.989',     true, 2.989, '']
+       ];
+       parserTest( 'Currency', 'currency', currencyData );
+
+       transformedCurrencyData = [
+               ['1.02 $',      true, 102, ''],
+               ['$ 3.00',      true, 300, ''],
+               ['€ 2,99',    true, 2.99, ''],
+               ['$ 1.00',      true, 100, ''],
+               ['$3.50',       true, 350, ''],
+               ['$ 1.50',      true, 150, ''],
+               ['€ 0.99',    true, 99, ''],
+               ['$ 299.99',    true, 29999, ''],
+               ['$ 2\'299,99', true, 2299.99, ''],
+               ['$ 2,989',     true, 2.989, ''],
+               ['$ 2 299.99',  true, 229999, ''],
+               ['2 989 $',     true, 2989, ''],
+               ['299.99 $',    true, 29999, ''],
+               ['2\'299,99 $', true, 2299.99, ''],
+               ['2,989 $',     true, 2.989, ''],
+               ['2 299.99 $',  true, 229999, ''],
+               ['2 989 $',     true, 2989, '']
+       ];
+       parserTest( 'Currency with european separators', 'currency', transformedCurrencyData, function () {
+               mw.config.set( {
+                       // We expect 22'234.444,22
+                       // Map from ascii separators => localized separators
+                       wgSeparatorTransformTable: [',  .       ,', '\' ,       .'],
+                       wgDigitTransformTable: ['', '']
+               } );
+       } );
+
+       // TODO add numbers sorting tests for bug 8115 with a different language
+
+}( jQuery, mediaWiki ) );
index 5464d22..f7700f8 100644 (file)
        // bug 53211 - exploding rowspans in more complex cases
        QUnit.test(
                'Rowspan exploding with row headers and colspans', 1, function ( assert ) {
-               var $table = $( '<table class="sortable">' +
-                       '<thead><tr><th rowspan="2">n</th><th colspan="2">foo</th><th rowspan="2">baz</th></tr>' +
-                       '<tr><th>foo</th><th>bar</th></tr></thead>' +
-                       '<tbody>' +
-                       '<tr><td>1</td><td>foo</td><td>bar</td><td>baz</td></tr>' +
-                       '<tr><td>2</td><td>foo</td><td>bar</td><td>baz</td></tr>' +
-                       '</tbody></table>' );
+                       var $table = $( '<table class="sortable">' +
+                               '<thead><tr><th rowspan="2">n</th><th colspan="2">foo</th><th rowspan="2">baz</th></tr>' +
+                               '<tr><th>foo</th><th>bar</th></tr></thead>' +
+                               '<tbody>' +
+                               '<tr><td>1</td><td>foo</td><td>bar</td><td>baz</td></tr>' +
+                               '<tr><td>2</td><td>foo</td><td>bar</td><td>baz</td></tr>' +
+                               '</tbody></table>' );
 
                        $table.tablesorter();
                        assert.equal( $table.find( 'tr:eq(1) th:eq(1)').data('headerIndex'),
index 7ab309a..c0afe07 100644 (file)
@@ -46,8 +46,8 @@
                        // Note: The ones with # are commented out as those are interpreted as fragment and
                        // as such end up being valid.
                        'A &eacute; B',
-                       //'A &#233; B',
-                       //'A &#x00E9; B',
+                       // 'A &#233; B',
+                       // 'A &#x00E9; B',
                        // Subject of NS_TALK does not roundtrip to NS_MAIN
                        'Talk:File:Example.svg',
                        // Directory navigation
        } );
 
        QUnit.test( 'getRelativeText', 5, function ( assert ) {
-               var cases = [
-                       {
-                               text: 'asd',
-                               relativeTo: 123,
-                               expectedResult: ':Asd'
-                       },
-                       {
-                               text: 'dfg',
-                               relativeTo: 0,
-                               expectedResult: 'Dfg'
-                       },
-                       {
-                               text: 'Template:Ghj',
-                               relativeTo: 0,
-                               expectedResult: 'Template:Ghj'
-                       },
-                       {
-                               text: 'Template:1',
-                               relativeTo: 10,
-                               expectedResult: '1'
-                       },
-                       {
-                               text: 'User:Hi',
-                               relativeTo: 10,
-                               expectedResult: 'User:Hi'
-                       }
-               ], i, thisCase, title;
+               var i, thisCase, title,
+                       cases = [
+                               {
+                                       text: 'asd',
+                                       relativeTo: 123,
+                                       expectedResult: ':Asd'
+                               },
+                               {
+                                       text: 'dfg',
+                                       relativeTo: 0,
+                                       expectedResult: 'Dfg'
+                               },
+                               {
+                                       text: 'Template:Ghj',
+                                       relativeTo: 0,
+                                       expectedResult: 'Template:Ghj'
+                               },
+                               {
+                                       text: 'Template:1',
+                                       relativeTo: 10,
+                                       expectedResult: '1'
+                               },
+                               {
+                                       text: 'User:Hi',
+                                       relativeTo: 10,
+                                       expectedResult: 'User:Hi'
+                               }
+                       ];
 
                for ( i = 0; i < cases.length; i++ ) {
                        thisCase = cases[i];
index c9653da..f5f199e 100644 (file)
@@ -53,7 +53,7 @@
                assert.strictEqual( call[ 1 ], '0', '0 is value' );
        } );
 
-       QUnit.test( 'set( key, value, expires )', 5, function ( assert ) {
+       QUnit.test( 'set( key, value, expires )', 6, function ( assert ) {
                var date, options;
 
                date = new Date();
 
                mw.cookie.set( 'foo', 'bar' );
                options = $.cookie.lastCall.args[ 2 ];
-               assert.deepEqual( options.expires, expiryDate, 'Default cookie expiration is used' );
+               assert.deepEqual( options.expires, expiryDate, 'default expiration' );
 
                mw.cookie.set( 'foo', 'bar', date );
                options = $.cookie.lastCall.args[ 2 ];
-               assert.strictEqual( options.expires, date, 'Custom expiration date' );
+               assert.strictEqual( options.expires, date, 'custom expiration as Date' );
+
+               date = new Date();
+               date.setDate( date.getDate() + 1 );
+
+               mw.cookie.set( 'foo', 'bar', 86400 );
+               options = $.cookie.lastCall.args[ 2 ];
+               assert.deepEqual( options.expires, date, 'custom expiration as lifetime in seconds' );
 
                mw.cookie.set( 'foo', 'bar', null );
                options = $.cookie.lastCall.args[ 2 ];
-               assert.strictEqual( options.expires, undefined, 'Expiry null forces session cookie' );
+               assert.strictEqual( options.expires, undefined, 'null forces session cookie' );
 
                // Per DefaultSettings.php, when wgCookieExpiration is 0, the default should
                // be session cookies
@@ -81,7 +88,7 @@
 
                mw.cookie.set( 'foo', 'bar', date );
                options = $.cookie.lastCall.args[ 2 ];
-               assert.strictEqual( options.expires, date, 'Custom expiration when default is session cookies' );
+               assert.strictEqual( options.expires, date, 'custom expiration (with wgCookieExpiration=0)' );
        } );
 
        QUnit.test( 'set( key, value, options )', 4, function ( assert ) {
                assert.strictEqual( key, 'barfoo' );
        } );
 
-} ( mediaWiki, jQuery ) );
+}( mediaWiki, jQuery ) );
index ece5116..38a9b51 100644 (file)
@@ -1,6 +1,7 @@
 ( function ( mw, $ ) {
-       var mwLanguageCache = {}, formatText, formatParse, formatnumTests, specialCharactersPageName,
-               expectedListUsers, expectedEntrypoints;
+       var formatText, formatParse, formatnumTests, specialCharactersPageName, expectedListUsers, expectedEntrypoints,
+               mwLanguageCache = {},
+               hasOwn = Object.hasOwnProperty;
 
        // When the expected result is the same in both modes
        function assertBothModes( assert, parserArguments, expectedResult, assertMessage ) {
                }
        } ) );
 
-       function getMwLanguage( langCode, cb ) {
-               if ( mwLanguageCache[langCode] !== undefined ) {
-                       mwLanguageCache[langCode].add( cb );
-                       return;
-               }
-               mwLanguageCache[langCode] = $.Callbacks( 'once memory' );
-               mwLanguageCache[langCode].add( cb );
-               $.ajax( {
-                       url: mw.util.wikiScript( 'load' ),
-                       data: {
-                               skin: mw.config.get( 'skin' ),
-                               lang: langCode,
-                               debug: mw.config.get( 'debug' ),
-                               modules: [
-                                       'mediawiki.language.data',
-                                       'mediawiki.language'
-                               ].join( '|' ),
-                               only: 'scripts'
-                       },
-                       dataType: 'script'
-               } ).done(function () {
-                               mwLanguageCache[langCode].fire( mw.language );
-                       } ).fail( function () {
-                               mwLanguageCache[langCode].fire( false );
+       /**
+        * Be careful to no run this in parallel as it uses a global identifier (mw.language)
+        * to transport the module back to the test. It musn't be overwritten concurrentely.
+        *
+        * This function caches the mw.language data to avoid having to request the same module
+        * multiple times. There is more than one test case for any given language.
+        */
+       function getMwLanguage( langCode ) {
+               if ( !hasOwn.call( mwLanguageCache, langCode ) ) {
+                       mwLanguageCache[langCode] = $.ajax( {
+                               url: mw.util.wikiScript( 'load' ),
+                               data: {
+                                       skin: mw.config.get( 'skin' ),
+                                       lang: langCode,
+                                       debug: mw.config.get( 'debug' ),
+                                       modules: [
+                                               'mediawiki.language.data',
+                                               'mediawiki.language'
+                                       ].join( '|' ),
+                                       only: 'scripts'
+                               },
+                               dataType: 'script',
+                               cache: true
+                       } ).then( function () {
+                               return mw.language;
                        } );
+               }
+               return mwLanguageCache[langCode];
+       }
+
+       /**
+        * @param {Function[]} tasks List of functions that perform tasks
+        *  that may be asynchronous. Invoke the callback parameter when done.
+        * @param {Function} done When all tasks are done.
+        * @return
+        */
+       function process( tasks, done ) {
+               function run() {
+                       var task = tasks.shift();
+                       if ( task ) {
+                               task( run );
+                       } else {
+                               done();
+                       }
+               }
+               run();
        }
 
        QUnit.test( 'Replace', 16, function ( assert ) {
 
        QUnit.test( 'Match PHP parser', mw.libs.phpParserData.tests.length, function ( assert ) {
                mw.messages.set( mw.libs.phpParserData.messages );
-               $.each( mw.libs.phpParserData.tests, function ( i, test ) {
-                       QUnit.stop();
-                       getMwLanguage( test.lang, function ( langClass ) {
-                               QUnit.start();
-                               if ( !langClass ) {
-                                       assert.ok( false, 'Language "' + test.lang + '" failed to load' );
-                                       return;
-                               }
-                               mw.config.set( 'wgUserLanguage', test.lang );
-                               var parser = new mw.jqueryMsg.parser( { language: langClass } );
-                               assert.equal(
-                                       parser.parse( test.key, test.args ).html(),
-                                       test.result,
-                                       test.name
-                               );
-                       } );
+               var tasks = $.map( mw.libs.phpParserData.tests, function ( test ) {
+                       return function ( next ) {
+                               getMwLanguage( test.lang )
+                                       .done( function ( langClass ) {
+                                               mw.config.set( 'wgUserLanguage', test.lang );
+                                               var parser = new mw.jqueryMsg.parser( { language: langClass } );
+                                               assert.equal(
+                                                       parser.parse( test.key, test.args ).html(),
+                                                       test.result,
+                                                       test.name
+                                               );
+                                       } )
+                                       .fail( function () {
+                                               assert.ok( false, 'Language "' + test.lang + '" failed to load.' );
+                                       } )
+                                       .always( next );
+                       };
                } );
+
+               QUnit.stop();
+               process( tasks, QUnit.start );
        } );
 
        QUnit.test( 'Links', 6, function ( assert ) {
                );
        } );
 
-// Tests that getMessageFunction is used for non-plain messages with curly braces or
-// square brackets, but not otherwise.
+       // Tests that getMessageFunction is used for non-plain messages with curly braces or
+       // square brackets, but not otherwise.
        QUnit.test( 'mw.Message.prototype.parser monkey-patch', 22, function ( assert ) {
                var oldGMF, outerCalled, innerCalled;
 
                mw.jqueryMsg.getMessageFunction = oldGMF;
        } );
 
-formatnumTests = [
-       {
-               lang: 'en',
-               number: 987654321.654321,
-               result: '987,654,321.654',
-               description: 'formatnum test for English, decimal seperator'
-       },
-       {
-               lang: 'ar',
-               number: 987654321.654321,
-               result: '٩٨٧٬٦٥٤٬٣٢١٫٦٥٤',
-               description: 'formatnum test for Arabic, with decimal seperator'
-       },
-       {
-               lang: 'ar',
-               number: '٩٨٧٦٥٤٣٢١٫٦٥٤٣٢١',
-               result: 987654321,
-               integer: true,
-               description: 'formatnum test for Arabic, with decimal seperator, reverse'
-       },
-       {
-               lang: 'ar',
-               number: -12.89,
-               result: '-١٢٫٨٩',
-               description: 'formatnum test for Arabic, negative number'
-       },
-       {
-               lang: 'ar',
-               number: '-١٢٫٨٩',
-               result: -12,
-               integer: true,
-               description: 'formatnum test for Arabic, negative number, reverse'
-       },
-       {
-               lang: 'nl',
-               number: 987654321.654321,
-               result: '987.654.321,654',
-               description: 'formatnum test for Nederlands, decimal seperator'
-       },
-       {
-               lang: 'nl',
-               number: -12.89,
-               result: '-12,89',
-               description: 'formatnum test for Nederlands, negative number'
-       },
-       {
-               lang: 'nl',
-               number: '.89',
-               result: '0,89',
-               description: 'formatnum test for Nederlands'
-       },
-       {
-               lang: 'nl',
-               number: 'invalidnumber',
-               result: 'invalidnumber',
-               description: 'formatnum test for Nederlands, invalid number'
-       },
-       {
-               lang: 'ml',
-               number: '1000000000',
-               result: '1,00,00,00,000',
-               description: 'formatnum test for Malayalam'
-       },
-       {
-               lang: 'ml',
-               number: '-1000000000',
-               result: '-1,00,00,00,000',
-               description: 'formatnum test for Malayalam, negative number'
-       },
-       /*
-        * This will fail because of wrong pattern for ml in MW(different from CLDR)
-       {
-               lang: 'ml',
-               number: '1000000000.000',
-               result: '1,00,00,00,000.000',
-               description: 'formatnum test for Malayalam with decimal place'
-       },
-       */
-       {
-               lang: 'hi',
-               number: '123456789.123456789',
-               result: '१२,३४,५६,७८९',
-               description: 'formatnum test for Hindi'
-       },
-       {
-               lang: 'hi',
-               number: '१२,३४,५६,७८९',
-               result: '१२,३४,५६,७८९',
-               description: 'formatnum test for Hindi, Devanagari digits passed'
-       },
-       {
-               lang: 'hi',
-               number: '१२३४५६,७८९',
-               result: '123456',
-               integer: true,
-               description: 'formatnum test for Hindi, Devanagari digits passed to get integer value'
-       }
-];
-
-QUnit.test( 'formatnum', formatnumTests.length, function ( assert ) {
-       mw.messages.set( 'formatnum-msg', '{{formatnum:$1}}' );
-       mw.messages.set( 'formatnum-msg-int', '{{formatnum:$1|R}}' );
-       $.each( formatnumTests, function ( i, test ) {
-               QUnit.stop();
-               getMwLanguage( test.lang, function ( langClass ) {
-                       QUnit.start();
-                       if ( !langClass ) {
-                               assert.ok( false, 'Language "' + test.lang + '" failed to load' );
-                               return;
-                       }
-                       mw.messages.set(test.message );
-                       mw.config.set( 'wgUserLanguage', test.lang );
-                       var parser = new mw.jqueryMsg.parser( { language: langClass } );
-                       assert.equal(
-                               parser.parse( test.integer ? 'formatnum-msg-int' : 'formatnum-msg',
-                                       [ test.number ] ).html(),
-                               test.result,
-                               test.description
-                       );
+       formatnumTests = [
+               {
+                       lang: 'en',
+                       number: 987654321.654321,
+                       result: '987,654,321.654',
+                       description: 'formatnum test for English, decimal seperator'
+               },
+               {
+                       lang: 'ar',
+                       number: 987654321.654321,
+                       result: '٩٨٧٬٦٥٤٬٣٢١٫٦٥٤',
+                       description: 'formatnum test for Arabic, with decimal seperator'
+               },
+               {
+                       lang: 'ar',
+                       number: '٩٨٧٦٥٤٣٢١٫٦٥٤٣٢١',
+                       result: 987654321,
+                       integer: true,
+                       description: 'formatnum test for Arabic, with decimal seperator, reverse'
+               },
+               {
+                       lang: 'ar',
+                       number: -12.89,
+                       result: '-١٢٫٨٩',
+                       description: 'formatnum test for Arabic, negative number'
+               },
+               {
+                       lang: 'ar',
+                       number: '-١٢٫٨٩',
+                       result: -12,
+                       integer: true,
+                       description: 'formatnum test for Arabic, negative number, reverse'
+               },
+               {
+                       lang: 'nl',
+                       number: 987654321.654321,
+                       result: '987.654.321,654',
+                       description: 'formatnum test for Nederlands, decimal seperator'
+               },
+               {
+                       lang: 'nl',
+                       number: -12.89,
+                       result: '-12,89',
+                       description: 'formatnum test for Nederlands, negative number'
+               },
+               {
+                       lang: 'nl',
+                       number: '.89',
+                       result: '0,89',
+                       description: 'formatnum test for Nederlands'
+               },
+               {
+                       lang: 'nl',
+                       number: 'invalidnumber',
+                       result: 'invalidnumber',
+                       description: 'formatnum test for Nederlands, invalid number'
+               },
+               {
+                       lang: 'ml',
+                       number: '1000000000',
+                       result: '1,00,00,00,000',
+                       description: 'formatnum test for Malayalam'
+               },
+               {
+                       lang: 'ml',
+                       number: '-1000000000',
+                       result: '-1,00,00,00,000',
+                       description: 'formatnum test for Malayalam, negative number'
+               },
+               /*
+                * This will fail because of wrong pattern for ml in MW(different from CLDR)
+               {
+                       lang: 'ml',
+                       number: '1000000000.000',
+                       result: '1,00,00,00,000.000',
+                       description: 'formatnum test for Malayalam with decimal place'
+               },
+               */
+               {
+                       lang: 'hi',
+                       number: '123456789.123456789',
+                       result: '१२,३४,५६,७८९',
+                       description: 'formatnum test for Hindi'
+               },
+               {
+                       lang: 'hi',
+                       number: '१२,३४,५६,७८९',
+                       result: '१२,३४,५६,७८९',
+                       description: 'formatnum test for Hindi, Devanagari digits passed'
+               },
+               {
+                       lang: 'hi',
+                       number: '१२३४५६,७८९',
+                       result: '123456',
+                       integer: true,
+                       description: 'formatnum test for Hindi, Devanagari digits passed to get integer value'
+               }
+       ];
+
+       QUnit.test( 'formatnum', formatnumTests.length, function ( assert ) {
+               mw.messages.set( 'formatnum-msg', '{{formatnum:$1}}' );
+               mw.messages.set( 'formatnum-msg-int', '{{formatnum:$1|R}}' );
+               var queue = $.map( formatnumTests, function ( test ) {
+                       return function ( next ) {
+                               getMwLanguage( test.lang )
+                                       .done( function ( langClass ) {
+                                               mw.config.set( 'wgUserLanguage', test.lang );
+                                               var parser = new mw.jqueryMsg.parser( { language: langClass } );
+                                               assert.equal(
+                                                       parser.parse( test.integer ? 'formatnum-msg-int' : 'formatnum-msg',
+                                                               [ test.number ] ).html(),
+                                                       test.result,
+                                                       test.description
+                                               );
+                                       } )
+                                       .fail( function () {
+                                               assert.ok( false, 'Language "' + test.lang + '" failed to load' );
+                                       } )
+                                       .always( next );
+                       };
                } );
+               QUnit.stop();
+               process( queue, QUnit.start );
+       } );
+
+       // HTML in wikitext
+       QUnit.test( 'HTML', 26, function ( assert ) {
+               mw.messages.set( 'jquerymsg-italics-msg', '<i>Very</i> important' );
+
+               assertBothModes( assert, ['jquerymsg-italics-msg'], mw.messages.get( 'jquerymsg-italics-msg' ), 'Simple italics unchanged' );
+
+               mw.messages.set( 'jquerymsg-bold-msg', '<b>Strong</b> speaker' );
+               assertBothModes( assert, ['jquerymsg-bold-msg'], mw.messages.get( 'jquerymsg-bold-msg' ), 'Simple bold unchanged' );
+
+               mw.messages.set( 'jquerymsg-bold-italics-msg', 'It is <b><i>key</i></b>' );
+               assertBothModes( assert, ['jquerymsg-bold-italics-msg'], mw.messages.get( 'jquerymsg-bold-italics-msg' ), 'Bold and italics nesting order preserved' );
+
+               mw.messages.set( 'jquerymsg-italics-bold-msg', 'It is <i><b>vital</b></i>' );
+               assertBothModes( assert, ['jquerymsg-italics-bold-msg'], mw.messages.get( 'jquerymsg-italics-bold-msg' ), 'Italics and bold nesting order preserved' );
+
+               mw.messages.set( 'jquerymsg-italics-with-link', 'An <i>italicized [[link|wiki-link]]</i>' );
+
+               assert.htmlEqual(
+                       formatParse( 'jquerymsg-italics-with-link' ),
+                       'An <i>italicized <a title="link" href="' + mw.html.escape( mw.util.getUrl( 'link' ) ) + '">wiki-link</i>',
+                       'Italics with link inside in parse mode'
+               );
+
+               assert.equal(
+                       formatText( 'jquerymsg-italics-with-link' ),
+                       mw.messages.get( 'jquerymsg-italics-with-link' ),
+                       'Italics with link unchanged in text mode'
+               );
+
+               mw.messages.set( 'jquerymsg-italics-id-class', '<i id="foo" class="bar">Foo</i>' );
+               assert.htmlEqual(
+                       formatParse( 'jquerymsg-italics-id-class' ),
+                       mw.messages.get( 'jquerymsg-italics-id-class' ),
+                       'ID and class are allowed'
+               );
+
+               mw.messages.set( 'jquerymsg-italics-onclick', '<i onclick="alert(\'foo\')">Foo</i>' );
+               assert.htmlEqual(
+                       formatParse( 'jquerymsg-italics-onclick' ),
+                       '&lt;i onclick=&quot;alert(\'foo\')&quot;&gt;Foo&lt;/i&gt;',
+                       'element with onclick is escaped because it is not allowed'
+               );
+
+               mw.messages.set( 'jquerymsg-script-msg', '<script  >alert( "Who put this tag here?" );</script>' );
+               assert.htmlEqual(
+                       formatParse( 'jquerymsg-script-msg' ),
+                       '&lt;script  &gt;alert( &quot;Who put this tag here?&quot; );&lt;/script&gt;',
+                       'Tag outside whitelist escaped in parse mode'
+               );
+
+               assert.equal(
+                       formatText( 'jquerymsg-script-msg' ),
+                       mw.messages.get( 'jquerymsg-script-msg' ),
+                       'Tag outside whitelist unchanged in text mode'
+               );
+
+               mw.messages.set( 'jquerymsg-script-link-msg', '<script>[[Foo|bar]]</script>' );
+               assert.htmlEqual(
+                       formatParse( 'jquerymsg-script-link-msg' ),
+                       '&lt;script&gt;<a title="Foo" href="' + mw.html.escape( mw.util.getUrl( 'Foo' ) ) + '">bar</a>&lt;/script&gt;',
+                       'Script tag text is escaped because that element is not allowed, but link inside is still HTML'
+               );
+
+               mw.messages.set( 'jquerymsg-mismatched-html', '<i class="important">test</b>' );
+               assert.htmlEqual(
+                       formatParse( 'jquerymsg-mismatched-html' ),
+                       '&lt;i class=&quot;important&quot;&gt;test&lt;/b&gt;',
+                       'Mismatched HTML start and end tag treated as text'
+               );
+
+               // TODO (mattflaschen, 2013-03-18): It's not a security issue, but there's no real
+               // reason the htmlEmitter span needs to be here. It's an artifact of how emitting works.
+               mw.messages.set( 'jquerymsg-script-and-external-link', '<script>alert( "jquerymsg-script-and-external-link test" );</script> [http://example.com <i>Foo</i> bar]' );
+               assert.htmlEqual(
+                       formatParse( 'jquerymsg-script-and-external-link' ),
+                       '&lt;script&gt;alert( "jquerymsg-script-and-external-link test" );&lt;/script&gt; <a href="http://example.com"><span class="mediaWiki_htmlEmitter"><i>Foo</i> bar</span></a>',
+                       'HTML tags in external links not interfering with escaping of other tags'
+               );
+
+               mw.messages.set( 'jquerymsg-link-script', '[http://example.com <script>alert( "jquerymsg-link-script test" );</script>]' );
+               assert.htmlEqual(
+                       formatParse( 'jquerymsg-link-script' ),
+                       '<a href="http://example.com"><span class="mediaWiki_htmlEmitter">&lt;script&gt;alert( "jquerymsg-link-script test" );&lt;/script&gt;</span></a>',
+                       'Non-whitelisted HTML tag in external link anchor treated as text'
+               );
+
+               // Intentionally not using htmlEqual for the quote tests
+               mw.messages.set( 'jquerymsg-double-quotes-preserved', '<i id="double">Double</i>' );
+               assert.equal(
+                       formatParse( 'jquerymsg-double-quotes-preserved' ),
+                       mw.messages.get( 'jquerymsg-double-quotes-preserved' ),
+                       'Attributes with double quotes are preserved as such'
+               );
+
+               mw.messages.set( 'jquerymsg-single-quotes-normalized-to-double', '<i id=\'single\'>Single</i>' );
+               assert.equal(
+                       formatParse( 'jquerymsg-single-quotes-normalized-to-double' ),
+                       '<i id="single">Single</i>',
+                       'Attributes with single quotes are normalized to double'
+               );
+
+               mw.messages.set( 'jquerymsg-escaped-double-quotes-attribute', '<i style="font-family:&quot;Arial&quot;">Styled</i>' );
+               assert.htmlEqual(
+                       formatParse( 'jquerymsg-escaped-double-quotes-attribute' ),
+                       mw.messages.get( 'jquerymsg-escaped-double-quotes-attribute' ),
+                       'Escaped attributes are parsed correctly'
+               );
+
+               mw.messages.set( 'jquerymsg-escaped-single-quotes-attribute', '<i style=\'font-family:&#039;Arial&#039;\'>Styled</i>' );
+               assert.htmlEqual(
+                       formatParse( 'jquerymsg-escaped-single-quotes-attribute' ),
+                       mw.messages.get( 'jquerymsg-escaped-single-quotes-attribute' ),
+                       'Escaped attributes are parsed correctly'
+               );
+
+               mw.messages.set( 'jquerymsg-wikitext-contents-parsed', '<i>[http://example.com Example]</i>' );
+               assert.htmlEqual(
+                       formatParse( 'jquerymsg-wikitext-contents-parsed' ),
+                       '<i><a href="http://example.com">Example</a></i>',
+                       'Contents of valid tag are treated as wikitext, so external link is parsed'
+               );
+
+               mw.messages.set( 'jquerymsg-wikitext-contents-script', '<i><script>Script inside</script></i>' );
+               assert.htmlEqual(
+                       formatParse( 'jquerymsg-wikitext-contents-script' ),
+                       '<i><span class="mediaWiki_htmlEmitter">&lt;script&gt;Script inside&lt;/script&gt;</span></i>',
+                       'Contents of valid tag are treated as wikitext, so invalid HTML element is treated as text'
+               );
+
+               mw.messages.set( 'jquerymsg-unclosed-tag', 'Foo<tag>bar' );
+               assert.htmlEqual(
+                       formatParse( 'jquerymsg-unclosed-tag' ),
+                       'Foo&lt;tag&gt;bar',
+                       'Nonsupported unclosed tags are escaped'
+               );
+
+               mw.messages.set( 'jquerymsg-self-closing-tag', 'Foo<tag/>bar' );
+               assert.htmlEqual(
+                       formatParse( 'jquerymsg-self-closing-tag' ),
+                       'Foo&lt;tag/&gt;bar',
+                       'Self-closing tags don\'t cause a parse error'
+               );
        } );
-} );
-
-// HTML in wikitext
-QUnit.test( 'HTML', 26, function ( assert ) {
-       mw.messages.set( 'jquerymsg-italics-msg', '<i>Very</i> important' );
-
-       assertBothModes( assert, ['jquerymsg-italics-msg'], mw.messages.get( 'jquerymsg-italics-msg' ), 'Simple italics unchanged' );
-
-       mw.messages.set( 'jquerymsg-bold-msg', '<b>Strong</b> speaker' );
-       assertBothModes( assert, ['jquerymsg-bold-msg'], mw.messages.get( 'jquerymsg-bold-msg' ), 'Simple bold unchanged' );
-
-       mw.messages.set( 'jquerymsg-bold-italics-msg', 'It is <b><i>key</i></b>' );
-       assertBothModes( assert, ['jquerymsg-bold-italics-msg'], mw.messages.get( 'jquerymsg-bold-italics-msg' ), 'Bold and italics nesting order preserved' );
-
-       mw.messages.set( 'jquerymsg-italics-bold-msg', 'It is <i><b>vital</b></i>' );
-       assertBothModes( assert, ['jquerymsg-italics-bold-msg'], mw.messages.get( 'jquerymsg-italics-bold-msg' ), 'Italics and bold nesting order preserved' );
-
-       mw.messages.set( 'jquerymsg-italics-with-link', 'An <i>italicized [[link|wiki-link]]</i>' );
-
-       assert.htmlEqual(
-               formatParse( 'jquerymsg-italics-with-link' ),
-               'An <i>italicized <a title="link" href="' + mw.html.escape( mw.util.getUrl( 'link' ) ) + '">wiki-link</i>',
-               'Italics with link inside in parse mode'
-       );
-
-       assert.equal(
-               formatText( 'jquerymsg-italics-with-link' ),
-               mw.messages.get( 'jquerymsg-italics-with-link' ),
-               'Italics with link unchanged in text mode'
-       );
-
-       mw.messages.set( 'jquerymsg-italics-id-class', '<i id="foo" class="bar">Foo</i>' );
-       assert.htmlEqual(
-               formatParse( 'jquerymsg-italics-id-class' ),
-               mw.messages.get( 'jquerymsg-italics-id-class' ),
-               'ID and class are allowed'
-       );
-
-       mw.messages.set( 'jquerymsg-italics-onclick', '<i onclick="alert(\'foo\')">Foo</i>' );
-       assert.htmlEqual(
-               formatParse( 'jquerymsg-italics-onclick' ),
-               '&lt;i onclick=&quot;alert(\'foo\')&quot;&gt;Foo&lt;/i&gt;',
-               'element with onclick is escaped because it is not allowed'
-       );
-
-       mw.messages.set( 'jquerymsg-script-msg', '<script  >alert( "Who put this tag here?" );</script>' );
-       assert.htmlEqual(
-               formatParse( 'jquerymsg-script-msg' ),
-               '&lt;script  &gt;alert( &quot;Who put this tag here?&quot; );&lt;/script&gt;',
-               'Tag outside whitelist escaped in parse mode'
-       );
-
-       assert.equal(
-               formatText( 'jquerymsg-script-msg' ),
-               mw.messages.get( 'jquerymsg-script-msg' ),
-               'Tag outside whitelist unchanged in text mode'
-       );
-
-       mw.messages.set( 'jquerymsg-script-link-msg', '<script>[[Foo|bar]]</script>' );
-       assert.htmlEqual(
-               formatParse( 'jquerymsg-script-link-msg' ),
-               '&lt;script&gt;<a title="Foo" href="' + mw.html.escape( mw.util.getUrl( 'Foo' ) ) + '">bar</a>&lt;/script&gt;',
-               'Script tag text is escaped because that element is not allowed, but link inside is still HTML'
-       );
-
-       mw.messages.set( 'jquerymsg-mismatched-html', '<i class="important">test</b>' );
-       assert.htmlEqual(
-               formatParse( 'jquerymsg-mismatched-html' ),
-               '&lt;i class=&quot;important&quot;&gt;test&lt;/b&gt;',
-               'Mismatched HTML start and end tag treated as text'
-       );
-
-       // TODO (mattflaschen, 2013-03-18): It's not a security issue, but there's no real
-       // reason the htmlEmitter span needs to be here. It's an artifact of how emitting works.
-       mw.messages.set( 'jquerymsg-script-and-external-link', '<script>alert( "jquerymsg-script-and-external-link test" );</script> [http://example.com <i>Foo</i> bar]' );
-       assert.htmlEqual(
-               formatParse( 'jquerymsg-script-and-external-link' ),
-               '&lt;script&gt;alert( "jquerymsg-script-and-external-link test" );&lt;/script&gt; <a href="http://example.com"><span class="mediaWiki_htmlEmitter"><i>Foo</i> bar</span></a>',
-               'HTML tags in external links not interfering with escaping of other tags'
-       );
-
-       mw.messages.set( 'jquerymsg-link-script', '[http://example.com <script>alert( "jquerymsg-link-script test" );</script>]' );
-       assert.htmlEqual(
-               formatParse( 'jquerymsg-link-script' ),
-               '<a href="http://example.com"><span class="mediaWiki_htmlEmitter">&lt;script&gt;alert( "jquerymsg-link-script test" );&lt;/script&gt;</span></a>',
-               'Non-whitelisted HTML tag in external link anchor treated as text'
-       );
-
-       // Intentionally not using htmlEqual for the quote tests
-       mw.messages.set( 'jquerymsg-double-quotes-preserved', '<i id="double">Double</i>' );
-       assert.equal(
-               formatParse( 'jquerymsg-double-quotes-preserved' ),
-               mw.messages.get( 'jquerymsg-double-quotes-preserved' ),
-               'Attributes with double quotes are preserved as such'
-       );
-
-       mw.messages.set( 'jquerymsg-single-quotes-normalized-to-double', '<i id=\'single\'>Single</i>' );
-       assert.equal(
-               formatParse( 'jquerymsg-single-quotes-normalized-to-double' ),
-               '<i id="single">Single</i>',
-               'Attributes with single quotes are normalized to double'
-       );
-
-       mw.messages.set( 'jquerymsg-escaped-double-quotes-attribute', '<i style="font-family:&quot;Arial&quot;">Styled</i>' );
-       assert.htmlEqual(
-               formatParse( 'jquerymsg-escaped-double-quotes-attribute' ),
-               mw.messages.get( 'jquerymsg-escaped-double-quotes-attribute' ),
-               'Escaped attributes are parsed correctly'
-       );
-
-       mw.messages.set( 'jquerymsg-escaped-single-quotes-attribute', '<i style=\'font-family:&#039;Arial&#039;\'>Styled</i>' );
-       assert.htmlEqual(
-               formatParse( 'jquerymsg-escaped-single-quotes-attribute' ),
-               mw.messages.get( 'jquerymsg-escaped-single-quotes-attribute' ),
-               'Escaped attributes are parsed correctly'
-       );
-
-       mw.messages.set( 'jquerymsg-wikitext-contents-parsed', '<i>[http://example.com Example]</i>' );
-       assert.htmlEqual(
-               formatParse( 'jquerymsg-wikitext-contents-parsed' ),
-               '<i><a href="http://example.com">Example</a></i>',
-               'Contents of valid tag are treated as wikitext, so external link is parsed'
-       );
-
-       mw.messages.set( 'jquerymsg-wikitext-contents-script', '<i><script>Script inside</script></i>' );
-       assert.htmlEqual(
-               formatParse( 'jquerymsg-wikitext-contents-script' ),
-               '<i><span class="mediaWiki_htmlEmitter">&lt;script&gt;Script inside&lt;/script&gt;</span></i>',
-               'Contents of valid tag are treated as wikitext, so invalid HTML element is treated as text'
-       );
-
-       mw.messages.set( 'jquerymsg-unclosed-tag', 'Foo<tag>bar' );
-       assert.htmlEqual(
-               formatParse( 'jquerymsg-unclosed-tag' ),
-               'Foo&lt;tag&gt;bar',
-               'Nonsupported unclosed tags are escaped'
-       );
-
-       mw.messages.set( 'jquerymsg-self-closing-tag', 'Foo<tag/>bar' );
-       assert.htmlEqual(
-               formatParse( 'jquerymsg-self-closing-tag' ),
-               'Foo&lt;tag/&gt;bar',
-               'Self-closing tags don\'t cause a parse error'
-       );
-} );
 
        QUnit.test( 'Behavior in case of invalid wikitext', 3, function ( assert ) {
                mw.messages.set( 'invalid-wikitext', '<b>{{FAIL}}</b>' );
index 16f90df..a068846 100644 (file)
                }
        } ) );
 
-       QUnit.test( 'mw.language getData and setData', 2, function ( assert ) {
+       QUnit.test( 'mw.language getData and setData', 3, function ( assert ) {
                mw.language.setData( 'en', 'testkey', 'testvalue' );
                assert.equal( mw.language.getData( 'en', 'testkey' ), 'testvalue', 'Getter setter test for mw.language' );
                assert.equal( mw.language.getData( 'en', 'invalidkey' ), undefined, 'Getter setter test for mw.language with invalid key' );
+               mw.language.setData( 'en-us', 'testkey', 'testvalue' );
+               assert.equal( mw.language.getData( 'en-US', 'testkey' ), 'testvalue', 'Case insensitive test for mw.language' );
        } );
 
        QUnit.test( 'mw.language.commafy test', 9, function ( assert ) {
index ee33ade..8a7470c 100644 (file)
 
                // Convenience method for asserting the same result for multiple formats
                function assertMultipleFormats( messageArguments, formats, expectedResult, assertMessage ) {
-                       var len = formats.length, format, i;
+                       var format, i,
+                               len = formats.length;
+
                        for ( i = 0; i < len; i++ ) {
                                format = formats[i];
                                assert.equal( mw.message.apply( null, messageArguments )[format](), expectedResult, assertMessage + ' when format is ' + format );
index 91321a2..04e002d 100644 (file)
@@ -1,7 +1,17 @@
-( function ( mw ) {
+( function ( mw, $ ) {
        QUnit.module( 'mediawiki.user', QUnit.newMwEnvironment( {
                setup: function () {
                        this.server = this.sandbox.useFakeServer();
+                       this.crypto = window.crypto;
+                       this.msCrypto = window.msCrypto;
+               },
+               teardown: function () {
+                       if ( this.crypto ) {
+                               window.crypto = this.crypto;
+                       }
+                       if ( this.msCrypto ) {
+                               window.msCrypto = this.msCrypto;
+                       }
                }
        } ) );
 
 
                this.server.respond();
        } );
-}( mediaWiki ) );
+
+       QUnit.test( 'generateRandomSessionId', 4, function ( assert ) {
+               var result, result2;
+
+               result = mw.user.generateRandomSessionId();
+               assert.equal( typeof result, 'string', 'type' );
+               assert.equal( $.trim( result ), result, 'no whitespace at beginning or end' );
+               assert.equal( result.length, 16, 'size' );
+
+               result2 = mw.user.generateRandomSessionId();
+               assert.notEqual( result, result2, 'different when called multiple times' );
+
+       } );
+
+       QUnit.test( 'generateRandomSessionId (fallback)', 4, function ( assert ) {
+               var result, result2;
+
+               // Pretend crypto API is not there to test the Math.random fallback
+               if ( window.crypto ) {
+                       window.crypto = undefined;
+               }
+               if ( window.msCrypto ) {
+                       window.msCrypto = undefined;
+               }
+
+               result = mw.user.generateRandomSessionId();
+               assert.equal( typeof result, 'string', 'type' );
+               assert.equal( $.trim( result ), result, 'no whitespace at beginning or end' );
+               assert.equal( result.length, 16, 'size' );
+
+               result2 = mw.user.generateRandomSessionId();
+               assert.notEqual( result, result2, 'different when called multiple times' );
+
+       } );
+}( mediaWiki, jQuery ) );
index 7aa9133..3f19a64 100644 (file)
                } );
        } );
 
-       QUnit.test( 'getUrl', 4, function ( assert ) {
+       QUnit.test( 'getUrl', 5, function ( assert ) {
                // Not part of startUp module
                mw.config.set( 'wgArticlePath', '/wiki/$1' );
                mw.config.set( 'wgPageName', 'Foobar' );
 
                var href = mw.util.getUrl( 'Sandbox' );
-               assert.equal( href, '/wiki/Sandbox', 'Simple title; Get link for "Sandbox"' );
+               assert.equal( href, '/wiki/Sandbox', 'simple title' );
 
-               href = mw.util.getUrl( 'Foo:Sandbox ? 5+5=10 ! (test)/subpage' );
-               assert.equal( href, '/wiki/Foo:Sandbox_%3F_5%2B5%3D10_!_(test)/subpage',
-                       'Advanced title; Get link for "Foo:Sandbox ? 5+5=10 ! (test)/subpage"' );
+               href = mw.util.getUrl( 'Foo:Sandbox? 5+5=10! (test)/sub ' );
+               assert.equal( href, '/wiki/Foo:Sandbox%3F_5%2B5%3D10!_(test)/sub_', 'advanced title' );
 
                href = mw.util.getUrl();
-               assert.equal( href, '/wiki/Foobar', 'Default title; Get link for current page ("Foobar")' );
+               assert.equal( href, '/wiki/Foobar', 'default title' );
+
+               href = mw.util.getUrl( null, { action: 'edit' } );
+               assert.equal( href, '/wiki/Foobar?action=edit', 'default title with query string' );
 
                href = mw.util.getUrl( 'Sandbox', { action: 'edit' } );
-               assert.equal( href, '/wiki/Sandbox?action=edit',
-                       'Simple title with query string; Get link for "Sandbox" with action=edit' );
+               assert.equal( href, '/wiki/Sandbox?action=edit', 'simple title with query string' );
        } );
 
        QUnit.test( 'wikiScript', 4, function ( assert ) {
index 7352dc4..70cd1e6 100644 (file)
--- a/thumb.php
+++ b/thumb.php
@@ -252,10 +252,12 @@ function wfStreamThumb( array $params ) {
        try {
                $thumbName = $img->thumbName( $params );
                if ( !strlen( $thumbName ) ) { // invalid params?
-                       wfThumbError( 400, 'The specified thumbnail parameters are not valid.' );
-                       return;
+                       throw new MediaTransformInvalidParametersException( 'Empty return from File::thumbName' );
                }
                $thumbName2 = $img->thumbName( $params, File::THUMB_FULL_NAME ); // b/c; "long" style
+       } catch ( MediaTransformInvalidParametersException $e ) {
+               wfThumbError( 400, 'The specified thumbnail parameters are not valid: ' . $e->getMessage() );
+               return;
        } catch ( MWException $e ) {
                wfThumbError( 500, $e->getHTML() );
                return;
@@ -321,6 +323,7 @@ function wfStreamThumb( array $params ) {
 
        // Check for thumbnail generation errors...
        $msg = wfMessage( 'thumbnail_error' );
+       $errorCode = 500;
        if ( !$thumb ) {
                $errorMsg = $errorMsg ?: $msg->rawParams( 'File::transform() returned false' )->escaped();
        } elseif ( $thumb->isError() ) {
@@ -330,10 +333,11 @@ function wfStreamThumb( array $params ) {
        } elseif ( $thumb->fileIsSource() ) {
                $errorMsg = $msg->
                        rawParams( 'Image was not scaled, is the requested width bigger than the source?' )->escaped();
+               $errorCode = 400;
        }
 
        if ( $errorMsg !== false ) {
-               wfThumbError( 500, $errorMsg );
+               wfThumbError( $errorCode, $errorMsg );
        } else {
                // Stream the file if there were no errors
                $thumb->streamFile( $headers );
@@ -424,66 +428,6 @@ function wfGenerateThumbnail( File $file, array $params, $thumbName, $thumbPath
        return array( $thumb, $errorHtml );
 }
 
-/**
- * Returns true if this thumbnail is one that MediaWiki generates
- * links to on file description pages and possibly parser output.
- *
- * $params is considered non-standard if they involve a non-standard
- * width or any non-default parameters aside from width and page number.
- * The number of possible files with standard parameters is far less than
- * that of all combinations; rate-limiting for them can thus be more generious.
- *
- * @param File $file
- * @param array $params
- * @return bool
- */
-function wfThumbIsStandard( File $file, array $params ) {
-       global $wgThumbLimits, $wgImageLimits;
-
-       $handler = $file->getHandler();
-       if ( !$handler || !isset( $params['width'] ) ) {
-               return false;
-       }
-
-       $basicParams = array();
-       if ( isset( $params['page'] ) ) {
-               $basicParams['page'] = $params['page'];
-       }
-
-       // Check if the width matches one of $wgThumbLimits
-       if ( in_array( $params['width'], $wgThumbLimits ) ) {
-               $normalParams = $basicParams + array( 'width' => $params['width'] );
-               // Append any default values to the map (e.g. "lossy", "lossless", ...)
-               $handler->normaliseParams( $file, $normalParams );
-       } else {
-               // If not, then check if the width matchs one of $wgImageLimits
-               $match = false;
-               foreach ( $wgImageLimits as $pair ) {
-                       $normalParams = $basicParams + array( 'width' => $pair[0], 'height' => $pair[1] );
-                       // Decide whether the thumbnail should be scaled on width or height.
-                       // Also append any default values to the map (e.g. "lossy", "lossless", ...)
-                       $handler->normaliseParams( $file, $normalParams );
-                       // Check if this standard thumbnail size maps to the given width
-                       if ( $normalParams['width'] == $params['width'] ) {
-                               $match = true;
-                               break;
-                       }
-               }
-               if ( !$match ) {
-                       return false; // not standard for description pages
-               }
-       }
-
-       // Check that the given values for non-page, non-width, params are just defaults
-       foreach ( $params as $key => $value ) {
-               if ( !isset( $normalParams[$key] ) || $normalParams[$key] != $value ) {
-                       return false;
-               }
-       }
-
-       return true;
-}
-
 /**
  * Convert pathinfo type parameter, into normal request parameters
  *
@@ -605,7 +549,9 @@ function wfThumbError( $status, $msg ) {
 
        header( 'Cache-Control: no-cache' );
        header( 'Content-Type: text/html; charset=utf-8' );
-       if ( $status == 404 ) {
+       if ( $status == 400 ) {
+               header( 'HTTP/1.1 400 Bad request' );
+       } elseif ( $status == 404 ) {
                header( 'HTTP/1.1 404 Not found' );
        } elseif ( $status == 403 ) {
                header( 'HTTP/1.1 403 Forbidden' );
@@ -622,7 +568,11 @@ function wfThumbError( $status, $msg ) {
                $debug = '';
        }
        echo <<<EOT
-<html><head><title>Error generating thumbnail</title></head>
+<!DOCTYPE html>
+<html><head>
+<meta charset="UTF-8" />
+<title>Error generating thumbnail</title>
+</head>
 <body>
 <h1>Error generating thumbnail</h1>
 <p>